就是一个大致的流程,没有看过源码,所以细节不一定正确。
告警状态:
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时间以后在发送。