如何在Prometheus中创建特定条件的UPS状态告警规则?
解决UPS电池供电告警误报的Prometheus规则配置
最终告警规则
groups: - name: ups_alerts rules: - alert: UPSOnBatteryPower expr: upsBasicOutputStatus != 2 and count_over_time(upsBasicOutputStatus == 4[1m]) == 0 labels: severity: critical annotations: summary: "UPS {{ $labels.instance }} 已切换至电池供电" description: "UPS {{ $labels.instance }} 当前输出状态为 {{ $value }},且过去1分钟内未执行自检,确认是真实电池供电状态。"
规则逻辑拆解
upsBasicOutputStatus != 2:直接匹配UPS当前非市电供电的状态(对应电池供电场景,这是告警的核心触发条件,保证真实告警无延迟)count_over_time(upsBasicOutputStatus == 4[1m]) == 0:统计过去1分钟内UPS处于自检状态(值为4)的数据点数量,等于0说明这段时间内没有自检行为,彻底排除自检导致的误报;同时,当自检结束后如果UPS确实停留在电池供电状态,只要自检结束超过1分钟,该条件就会满足,不会漏报真实告警。
为什么不用unless_over_time
unless_over_time(upsBasicOutputStatus == 4[1m])的逻辑是“当前表达式成立,且时间范围内没有匹配到指定条件”,但Prometheus的时间序列数据可能存在采集偏移,导致偶尔的时间窗口不匹配,反而触发误告警。而count_over_time是精确统计时间窗口内的匹配次数,稳定性更高,能避免数据偏移带来的问题。
内容的提问来源于stack exchange,提问作者jamien
相关产品推荐
相关产品推荐

