Prometheus AlertManager 错误发送告警已解决通知问题咨询
问题根因分析
- 聚合查询空值匹配逻辑问题:你当前使用的
sum by(pcName) (cm_summary{regState="p_online"}) == 0逻辑存在漏洞:当某一个pcName在Prometheus规则评估瞬间没有对应regState的样本时,sum函数会返回NaN而非0,NaN == 0的判断结果为空,整条告警查询不会返回该pcName的时序,Prometheus会判定告警恢复;下一个评估周期样本正常返回后,条件重新满足,告警再次触发。这是概率性出现该问题的最常见原因,和你描述的随机间隔触发恢复的特征完全匹配。 - 指标抓取时间差跨评估窗口:如果
cm_summary指标的scrape_interval(抓取间隔)接近甚至大于告警规则的evaluation_interval(评估间隔),不同regState的样本抓取时间戳存在毫秒级偏差时,可能出现在某个评估时间点,部分regState的最新样本还未入库,导致对应sum结果为空,触发告警恢复。 - 指标数值瞬时抖动:如果
cm_summary指标对应regState的计数值存在毫秒级的跳变(比如瞬间从0变为1又立刻回落),刚好被Prometheus的规则评估捕获到,也会导致临时不满足==0的条件,触发恢复通知。 - 规则组评估资源不足:如果该告警规则所在的规则组包含大量高复杂度查询,Prometheus规则评估线程资源不足时会出现评估延迟,部分评估周期被跳过,导致告警状态出现异常翻转。
修复方案
你可以先使用如下优化后的查询替换原有告警规则,观测问题是否复现:
( sum by(pcName) (cm_summary{regState="p_online"} or on(pcName) sum(cm_summary) by(pcName) * 0) == 0 and sum by(pcName) (cm_summary{regState="nb_online"} or on(pcName) sum(cm_summary) by(pcName) * 0) == 0 and sum by(pcName) (cm_summary{regState="f40_online"} or on(pcName) sum(cm_summary) by(pcName) * 0) == 0 ) and on(pcName) (sum(cm_summary) by (pcName) >= 5)
上述查询通过or算子给没有对应regState样本的pcName补0,避免空值导致的判断失效。
如果修改后问题仍然存在,可以依次排查:
- 检查该告警规则所在规则组的
evaluation_interval配置,建议设置为指标抓取间隔的2倍以上 - 检查Prometheus日志中是否存在规则评估超时、评估跳过的相关报错
- 对触发异常的
pcName拉取对应3类regState指标的历史曲线,确认是否存在数值跳变情况
内容的提问来源于stack exchange,提问作者Arnav Bose
相关产品推荐
相关产品推荐

