在 Alertmanager 中有三个跟周期相关的参数,分别是 group_wait, group_interval, repeat_interval。合理地配置参数,有利于降低告警频率,避免告警风暴产生。

在深入了解这三个参数之前,首先需要关注到 Prometheus 中也有两个周期函数,scrape_interval 与 evaluation_interval。

Prometheus 每间隔一个 scrape_interval 完成一次指标的拉取,并将指标数据存储到 TSDB 数据库,并且在另外一个协程里,每间隔一个 evaluation_interval 完成一次告警评估。具体流程如下图所示:

当完成一次规则评估后,它的状态会变成 inactive, pending, firing 三种中的一种。并且它的状态会发送到 Alertmanager 用于开启或终止告警通知。

为了避免持续发送相似的告警信息,Alertmanager 对相关的告警进行了分组。

1
group_by: ['alertname', 'job']

上述配置,会将具有相同的 alertname 及 job 的告警信息放到一个组里,一次性地推送出来。group_wait 就是用来等待分组的时间。一个组就相当于一趟班车,只要超过了 group_wait 不管车里面装了多少人,都要进行发车。相反,如果 group_wait 配置的时间太长,即使车装满了,还需要等待别人上车。因此,合理地配置 group_wait 有利于告警的管理。

完成分组之后,告警推送给下游环节。如果一个告警之前已经加到分组内了,那么该告警不是立即进行推送的,而是等待 group_interval 后,才会进行推送。这进一步地延长了告警时间,降低了告警风暴的风险。

推送告警时,有的告警会推送失败,有的会成功。如果推送成功了之后,在很短的时间又收到了相同的告警,那么则需要使用 repeat_interval 进行抑制。避免相同的告警重复推送。

总结

group_wait

在最初发送通知之前等待缓冲同一组的警报的时间。

group_interval

在发送已添加到已经有通知的组中的警报之前等待多长时间。

repeat_interval

在重新发送已在通知中发送的给定警报之前等待多长时间。