prometheus 报警流程

大番茄 2019年12月18日 439次浏览

就是一个大致的流程,没有看过源码,所以细节不一定正确。

告警状态:
Inactive: 没有触发报警阈值。
Pending: 已触发阈值,但没有满足for的时间。
Firing: 已发送报警。

首先,prometheus这边:
来一个报警规则的配置:

groups:
- name: physical machin
  rules:
  - alert: Instance_is_Down
    expr: up == 0
    for: 1m
    labels:
      severity: crit
      author: low
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

prometheus中的主配置文件里的evaluation_interval 参数表示计算报警规则的间隔时间。到达时间以后就会通过设置的报警规则计算是否有到达报警状态的。
这个过程就是执行expr参数后面的promQL, 如果查到样本数据,判断样本的活动状态(触发报警)的时间是否大于for指定的,如果大于则发送报警信息给alertmanager并且告警状态改为Firing, 如果小于则告警状态改为Pending

这里如果evaluation_interval间隔为1m, 而for是10s, 并不是10s就能发送,而是要2分钟。

alertmanager:

route:
  receiver: 'email.qfpay'
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 2m
  repeat_interval: 5m

- name: 'email.163'
  email_configs:
  - to: ******
    send_resolved: true

inhibit_rules:
  - target_match_re:
      severity: warning|info|error
    source_match_re:
      severity: crit|alert|emerg
    equal:
    - instance

在alertmanager这里, 查看是否在静默期限里面, 有没有被inhibit_rules规则抑制,

都没有的话 有三个参数: repeat_interval, group_interval, group_wait

如果报警信息是第一次发送,会经过group_wait时间等待把相同的报警放到同一个分组(就是把有相同group_by参数的报警信息放到同以此发送里)。

如果刚发送过其他的报警信息, 跟本次报警不一样, 则等待group_inerval时间以后在发送。

如果刚发送过相同的报警信息, 则等待repeat_interval时间以后在发送。