如何为Prometheus告警配置恢复阶段的5分钟稳定性过滤器?
解决方案
核心问题是Prometheus默认的for子句仅控制告警触发的延迟逻辑,恢复时会在下一次评估周期(1分钟)内直接转为inactive。要实现恢复阶段的5分钟稳定性过滤,最直接的方案是使用Prometheus 2.24+版本支持的keep_firing_for参数,无需修改全局evaluation_interval影响其他服务。
修改后的告警规则
- alert: forecaster expr: rate(forecasts_published_counter{job="metrics_job", module_name="forecaster"}[5m]) <= 0 for: 5m keep_firing_for: 5m
配置效果说明
- 触发阶段:和原有逻辑一致,当
rate(...) <= 0的状态持续满5分钟后,告警才会从pending转为firing,避免Push Gateway短时间宕机(如1分钟)触发误告警。 - 恢复阶段:当指标恢复(
rate(...) > 0)后,告警不会立刻转为inactive,而是继续保持firing状态5分钟。只有当这5分钟内指标持续正常推送(rate(...) > 0始终满足),5分钟后才会正式恢复告警,确保恢复的稳定性。
兼容旧版本的替代方案(若无法升级Prometheus)
如果你的Prometheus版本低于2.24,可通过记录规则结合PromQL模拟恢复延迟:
- 先创建记录规则,标记过去5分钟是否有指标推送:
- record: forecaster:has_metrics expr: count_over_time(forecasts_published_counter{job="metrics_job", module_name="forecaster"}[5m]) > 0
- 修改告警规则,仅当“无指标状态持续5分钟”触发告警,且恢复时需要“有指标状态持续5分钟”:
- alert: forecaster expr: | forecaster:has_metrics == 0 and changes(forecaster:has_metrics[5m]) == 0 for: 5m
这种方式通过changes()函数确保无指标状态的稳定性,恢复时则需要forecaster:has_metrics == 1的状态持续5分钟才会让告警表达式变为false,间接实现恢复延迟。
内容的提问来源于stack exchange,提问作者Shivakumar Sajjan
相关产品推荐
相关产品推荐

