本文使用 Prometheus v2.18.1 ,Alertmanager v0.20.0
本文主要分析 Alertmanager 什么情况下会发送告警消息,避免对用户造成消息轰炸。
Alertmanager 的一般工作流程
- Prometheus 每隔 interval 时长执行一次 alert rule 。如果执行结果包含 n 个时间序列,则认为存在 n 个警报,通过 HTTP 通信发送 alerting 状态的消息给 Alertmanager 。
- Alertmanager 收到之后,
- 先根据 route 判断它属于哪个 group 、应该发送给哪个 receiver 。
- 再判断该 group 当前是否处于冷却阶段、是否被 Silence 静音、是否被 Inhibit 抑制。如果都没有,则立即发送告警消息给用户。
- 如果 Prometheus 再次执行 alert rule 时,发现执行结果为空,则认为警报已解决,立即产生 resolved 状态的消息,发送给 Alertmanager 。
- Alertmanager 收到之后,立即发送给用户。
如何控制发送 resolved 消息?
- 如果一个指标不再满足告警条件,或者 Prometheus 不再抓取相应的指标,或者不再执行相应的 alert rule ,都会让 Prometheus 认为该警报已解决,产生一个 resolved 状态的消息,发送给 Alertmanager 。
- 目前在 Prometheus 端并不能控制是否产生 resolved 消息,只能在 Alertmanager 端控制是否发送 resolved 消息。
- 如下,在 Alertmanager 端配置是否对某个 receiver 发送 resolved 消息:
receivers: - name: 'email_to_leo' email_configs: - to: '123456@qq.com' send_resolved: true
发送频率?
route 示例:
route:
receiver: 'email_to_leo'
group_wait: 1m
group_interval: 1m
repeat_interval: 24h
group_by:
- alertname
Alertmanager 根据 route 将警报分组管理,分为多个 group 。然后以 group 为单位发送告警消息。
- 每次发送一个 group 的消息时,总是会将该 group 内现有的所有警报合并成一个告警消息,一起发送。
- 当一个 group 中出现第一个警报时,会先等待
group_wait
时长再发送该 group 。- 延长 group_wait 时间有利于收集属于同一 group 的其它警报,一起发送。
- 当一个 group 的警报一直存在时,要至少冷却
repeat_interval
时长才能重复发送该 group 。- 实际上,是要求当前时刻与上一次发送时刻的差值大于 repeat_interval 。
因此,即使重启 Alertmanager ,也不会影响 repeat_interval 的计时。
不过,在配置文件中修改 group_wait、repeat_interval 等参数的值时,会立即生效。
- 实际上,是要求当前时刻与上一次发送时刻的差值大于 repeat_interval 。
- 当一个 group 处于冷却阶段时:
- 如果收到一个属于该 group 的新警报,则会等待
group_interval
时长之后让该 group 解除冷却,发送一次消息,并且从当前时刻开始重新计算 repeat_interval 。 - 如果一个警报被解决了,也会让该 group 解除冷却,发送一次 resolved 消息。
- 如果一个被解决的警报再次出现,也会让该 group 解除冷却,发送一次消息。
- 因此,如果一个警报反复被解决又再次出现,则会绕过 repeat_interval 的限制,导致 Alertmanager 频繁发送消息给用户。
- 如果收到一个属于该 group 的新警报,则会等待
特殊情况
-
假设 Prometheus 与 Alertmanager 正常连接,且存在一些警报:
- 如果两者断开连接,则大概两分钟之后 Alertmanager 会自行认为所有警报已解决,发送 resolved 状态的消息给用户。
- 如果两者重新连接,则 Alertmanager 会认为这些警报的 group 是新出现的,立即发送 alerting 状态的消息给用户。
- 因此,如果两者反复断开连接又重新连接,则会绕过 repeat_interval 的限制,导致 Alertmanager 频繁发送消息给用户。
-
假设一个新警报出现,Alertmanager 正常地发送一次告警消息给用户。
- 如果此时用 Silence 隐藏该警报,则 Alertmanager 的首页上不会显示该警报,但并不会发送 resolved 消息给用户。
- 如果接着在 Prometheus 端解决该警报,则 Alertmanager 也不会发送 resolved 消息。
- 如果接着取消 Silence ,则 Alertmanager 依然不会发送 resolved 消息。