一条磁盘告警在群里出现四条,时间戳差 2 秒,内容完全一样。Alertmanager 配置里 route 有两个子路由,default 和 critical 都指向同一个 webhook 地址。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
amtool config routes show amtool alert add test severity=critical --annotation=summary=x
route 没有写 continue: false,匹配上第一个子路由后继续往下走,第二个子路由又发一次。两个 receiver 的 url 相同,看起来是四遍其实是两条路由乘上重试。告警分组键里带了 instance,实例多的规则一次发更多。这一点先确认清楚,后面就不用反复试。
「receiver 重复投递」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
具体做法是,打印 amtool config routes show 看实际匹配路径;子路由加 continue: false 命中就停;不同级别用不同 webhook 别共用地址;改完发一条测试告警 数群里出现几次。
改完照着核一遍,测试告警在群里只出现一次,路由树里没有两条路径指向同一个 receiver。
