现场是这样的。自建 Prometheus 2.45 配 Alertmanager 0.25,磁盘告警恢复后钉钉群里没有任何通知,值班同事以为还没好,登机器确认才发现早就恢复,receiver 用的是同一个 webhook。
中间走过弯路,把「webhook 端只处理 firing 事件,忽略 resolved」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。receiver 的 send_resolved 设成了 false;告警规则没有 for,状态来回跳导致恢复被覆盖;告警被静默,恢复通知也被一起抑制。
动手时先看 receiver 的实际配置
amtool config routes show --alertmanager.url=http://127.0.0.1:9093
手动加一条带结束时间的测试告警
amtool alert add test alertname=DiskFull severity=warning --end=1m
再往下确认 send_resolved 是否开启
grep -n send_resolved /etc/alertmanager/alertmanager.yml
末了在日志里确认恢复事件已发出
journalctl -u alertmanager -n 50 | grep resolved
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
恢复的判定其实很直接。测试告警在钉钉里收到已恢复消息,真实磁盘告警恢复时同样有通知。
提醒一点。静默和抑制会同时压掉恢复通知,排查时先看 amtool silence query,别只盯着 receiver 配置。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
