数据库连接数打满,告警短信在故障开始 9 分钟后才到。规则里 for: 5m,抓取间隔 2m,evaluation_interval 也是 2m,首次触发时间戳比异常开始晚了 8 分 40 秒。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
promtool test rules alert_test.yml # expr: rate(mysql_connections_used[2m]) > 0.9 # for: 1m
for 是从规则第一次算出 true 开始计时,而指标本身两分钟才更新一次。表达式里还用了 5 分钟 rate,窗口没填满前算出来是 0,等于又往后推一个窗口。两个延迟叠加,短故障直接被吞掉。这一点先确认清楚,后面就不用反复试。
「告警 for 延迟」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,把 rate 窗口降到抓取间隔的 4 倍以内 别用 5m 套 2m 的数据;for 按业务容忍度重设 连接数这类指标给 1m 就够;用 promtool test rules 造一段尖刺 看首次触发在第几个周期;上线后比对告警时间和指标异常起点。
改完照着核一遍,用测试数据回放,告警在异常出现后 3 分钟内触发。
