记录一下那天晚上的排查过程。Prometheus 加 Alertmanager 0.24,一次机房网络抖动,钉钉群一晚上刷了三千多条消息,值班同事直接把群静音,第二天真正的磁盘故障通知被埋在里面没人看到。
真正麻烦的地方在于,几个原因的现象几乎一样。route 里没写 group_by,每条告警各发一条,同一故障的几十个实例全在刷屏。也可能是没有 inhibit_rules,节点 down 之后它上面所有服务的告警照样一起发。
少数情况下是group_wait 用了 0s,首批告警立刻出站,聚合根本没机会生效。
第一件事是把同一类告警聚起来
route: {group_by: ['alertname','instance'], group_wait: 30s, group_interval: 5m, repeat_interval: 4h}
接着配一条抑制规则压掉连带告警
inhibit_rules: [{source_matchers: ['alertname="NodeDown"'], target_matchers: ['severity="warning"']}]
再往下改完先校验语法
amtool check-config /etc/alertmanager/alertmanager.yml
等前面都确认过,再看当前告警条数与分组
curl -s localhost:9093/api/v2/alerts | jq 'length'
别只看报错消失,验证要多做一步。同样的抖动场景下钉钉只收到两条聚合消息,api/v2/alerts 里同一组的告警共享同一个 groupKey,抑制生效后连带告警状态为 suppressed。
分组按 alertname 加 instance 聚,跨度太大反而看不出是哪台机器;抑制关系要单向配,互相抑制会让整片告警静默。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
