跳转至

Prometheus-config

总览

  • 对于prometheus的配置有以下几大块
# 全局刮取配置,如果scrape_configs中没有再定义,则继承此配置
global:
  scrape_interval: 10s
  scrape_timeout: 5s
  evaluation_interval: 10s
---
# 告警规则配置,此为prometheus产生告警的规则,告警产生后将推送给alertmanager
rule_files:
- /path/to/rules.yml
---
# 警报器,另外的服务,为prometheus产生的告警提供接收、处理、发送的服务,此配置为该服务的地址
alerting:
  alertmanagers:
  - static_configs:
    - targets: ["alertmanager.monitor.svc.cluster.local:9093"]
---
# 刮取规则,定义从何处取到数据
scrape_configs:



# 以下为可选配置
---
# 远程写入地址,如有外部存储,则需要配置此配置
remote_write:
---
# 远程读取地址,如有外部存储,则需要配置此配置
remote_read:
---
# 存储配置,定义prometheus的数据存储位置
storage:
---
# 查询配置,定义prometheus的查询配置,如开启追踪等
tracing:

scrape_configs

  • 当我们使用exporter产生数据以后,就需要配置 scrape_configs 取到数据,然后存储到prometheus中

  • 使用固定的地址

    yaml scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']

  • 使用服务发现

yaml - job_name: 'kubernetes-node' kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' target_label: __address__ action: replace - action: labelmap regex: __meta_kubernetes_node_label_(.+)

  • 对于服务发现,通常我们使用服务发现的形式,此方式灵活性更高,便于使用

  • k8s中我们通常使用 kubernetes_sd_configs 来实现服务发现,动态的发现k8s中需要监控的组件

  • 外部的服务通畅使用 consul_sd_configs 来实现服务发现,动态的发现外部需要监控的组件

relabel_configs

  • relabel_configs 可以在目标被刮取前进行修改,通常用于修改目标的标签,或者修改目标的地址

```yaml # 一个job通常由四个部分组成,job_name,服务发现方式,relabel_configs,metric_relabel_configs

  • job_name: 'kubernetes-service-endpoints' kubernetes_sd_configs:
    • role: endpoints relabel_configs: # 此处的配置为,如果目标的标签中有prometheus.io/scrape=true,则保留此目标
    • source_labels: [meta_kubernetes_service_annotation_prometheus_io_scrape] action: keep regex: true # 此处的配置为,如果目标的标签中有prometheus.io/scheme,则将此标签的值赋值给__scheme
    • source_labels: [meta_kubernetes_service_annotation_prometheus_io_scheme] action: replace target_label: __scheme regex: (https?) # 此处的配置为,如果目标的标签中有prometheus.io/path,则将此标签的值赋值给__metrics_path__
    • source_labels: [meta_kubernetes_service_annotation_prometheus_io_path] action: replace target_label: __metrics_path regex: (.+) # 此处的配置为,如果目标的标签中有prometheus.io/port,则将此标签的值赋值给__address__,并将__meta_kubernetes_service_annotation_prometheus_io_port标签的值赋值给__metrics_path__
    • source_labels: [address, meta_kubernetes_service_annotation_prometheus_io_port] action: replace target_label: __address regex: ([^:]+)(?::\d+)?;(\d+) replacement: \(1:\)2 # metric_relabel_configs:
    • source_labels: [name] regex: 'node_disk_(.*)_bytes_total' target_label: disk replacement: '${1}' ```
  • __scheme__ __metrics_path__ __address__都是 prometheus 的内置标签
  • 通过组合这三个标签即可拼接处需要拉取metrics的地址:__scheme__ 为协议,__metrics_path__ 为路径,__address__ 为地址
# relabel_configs 中 action 的类型有以下几种:

replace: 替换目标,默认值,匹配到label后,将目标的label替换为匹配到的label
keep: 保留目标,如果没有该label,则丢弃目标
drop: 删除目标,如果有该label,则丢弃目标
labelmap: 将目标的label映射到新的label上,标签重命名,值不变
hashmod: 根据label的值,对目标进行hash,然后根据hash的值,对目标进行分组
labeldrop: 删除目标的label
labelkeep: 保留目标的label

metric_relabel_configs

  • metric_relabel_configs 在刮取目标后对数据进行处理,然后存到 prometheus,通常用来删除不需要的指标
     metric_relabel_configs:
     - source_labels: [__name__]
       regex: 'DEMO.*'
       action: drop
  • 也可以用来对旧标签重命名,例如老版的 exporter 指标和新版的有差别
     - source_labels: [__name__]
       regex: 'DEMO(.*)'
       action: replace
       target_label: __name__
       replacement: '${1}'
  • 查询最大的20个时间序列 topk(20,count by (__name__,job)({__name__=~".+"}))
  • 如果不需要则可以在收集端进行过滤,减少 prometheus 的压力

consul

- job_name: 'consul'
  consul_sd_configs:
    - server: 'consul-server:8500'
      services: []  #匹配所有service
  relabel_configs:
    - source_labels: [__meta_consul_service] #service 源标签
      regex: "consul"  #匹配为"consul" 的service
      action: drop       # 执行的动作
    - source_labels: [__meta_consul_service]  # 将service 的label重写为appname
      target_label: job
    - source_labels: [__meta_consul_service_address]
      target_label: instance
      # 以下可以根据我们自定义的metadata来进行替换,将其注册至consul后便可以在此处读取到
    - source_labels: [__meta_consul_service_metadata_url]
      action: replace
      target_label: __metrics_path__
      regex: (.+)
    - source_labels: [__meta_consul_service_metadata_params]
      action: replace
      # 将consul中的metadata中的params替换为__param_target,此处的效果为 ?target=xxx
      # 在prometheus中不可以直接将 ? 作为url,否则将会因为字符集变成%3F,导致无法访问
      target_label: __param_target
      regex: (.+)
# 将exporter注册至consul
curl -X PUT -d '{"id": "192.168.108.91:9221","name": "pve-exporter",
"address": "192.168.108.91","port": '9221',
"Meta": {"url": "pve","params":"192.168.1.126:8006"}},
"checks": [{"http": "http://192.168.108.91:9221/pve#target=192.168.1.126:8006","interval": "30s"}]}' \
http://192.168.108.93:32685/v1/agent/service/register

# 从consul中删除exporter
curl --request PUT http://192.168.108.93:32685/v1/agent/service/deregister/<ID>
# curl --request PUT http://192.168.108.93:32685/v1/agent/service/deregister/192.168.108.110

rule_files

  • 用于加载规则文件,可以是单个文件,也可以是目录,目录下的所有文件都会被加载
  • 该配置项可以多次配置,用于加载多个规则文件
# 匹配以.rules结尾的文件
rule_files:
  - "rules/*.rules"
---
# 指定文件
rule_files:
  - "first.rules"
  - "second.rules"

recording rules

  • recording rules 用于将 prometheus 中的数据进行处理,然后存储到 prometheus 中,效率比外部直接使用表达式查询高,可以节约 prometheus 的资源,提升用户体验
  • 通常用于计算一些复杂的指标,例如:计算某个指标的平均值、计算某个指标的百分位数等
groups:
# 组名必须唯一
- name: 记录规则
  rules:
  # 规则可以有多条
  - record: node_cpu_seconds_total:avg_rate5m
    expr: avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)*100
    # 通过labels可以为指标添加标签,可选
    labels:
      severity: warning

alert rules

  • alert rules 用于将 prometheus 中的数据进行处理,然后发送到 alertmanager,通常用于告警

groups:
# 组名必须唯一
- name: 物理节点状态-监控告警
  rules:
  # 规则可以有多条
  - alert: 物理节点cpu使用率
    expr: 100-avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)*100 > 90
    for: 30s
    labels:
      severity: warning
    annotations:
      summary: "节点:{{ $labels.instance }}cpu使用率过高"
      description: "节点:{{ $labels.instance }}的cpu使用率超过90%,当前使用率[{{ $value }}]"