如何在Prometheus端实现HighCpuLoad告警每7天仅触发一次?
实现HighCpuLoad告警每7天仅触发一次(Prometheus端方案)
针对你的需求,我们可以直接在Prometheus的告警规则中添加时间窗口判断逻辑,无需修改Alertmanager的路由配置,完全保留原有按project_name标签转发到对应Slack频道的逻辑,同时确保HighCpuLoad告警每7天仅触发一次。
具体告警规则配置
修改你现有的HighCpuLoad告警规则,加入时间范围判断:
groups: - name: vm_alerts rules: - alert: HighCpuLoad expr: | # 原有CPU负载告警条件:CPU使用率超过80%(持续5分钟由`for`字段控制) 100 - (avg by (instance, project_name) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 80 # 新增条件:过去7天内该实例+项目的HighCpuLoad告警从未触发过 AND absent_over_time(ALERTS{alertname="HighCpuLoad", alertstate="firing", instance=~"$labels.instance", project_name=~"$labels.project_name"}[7d]) for: 5m # 可根据实际需求调整告警持续触发的阈值时间 labels: severity: warning annotations: summary: "High CPU Load on {{ $labels.instance }}" description: "CPU load exceeds 80% for 5 minutes. This alert will only trigger once every 7 days per instance."
方案原理
- 原有告警逻辑:通过
irate计算CPU空闲率,转换为使用率后判断是否超过阈值,for字段确保告警持续触发一段时间才会被发送。 - 时间控制逻辑:
ALERTS是Prometheus内置指标,记录当前所有告警的状态(firing/resolved)。absent_over_time(...)函数会检查过去7天内,对应instance和project_name的HighCpuLoad告警是否有过触发记录:- 如果过去7天内从未触发过该告警,函数返回
1,满足条件,告警触发。 - 如果过去7天内已经触发过该告警,函数返回
0,不满足条件,告警不会重复触发。
- 如果过去7天内从未触发过该告警,函数返回
- 当7天周期结束后,过去7天的时间窗口不再包含上次触发记录,函数会再次返回
1,允许告警重新触发。
优势与注意事项
- 兼容性:完全保留Alertmanager原有路由配置,不会影响其他34种告警的正常转发逻辑。
- 独立性:按
instance和project_name分别控制告警频率,不同VM或项目的告警触发互不干扰。 - 内置指标依赖:确保Prometheus的
ALERTS指标处于启用状态(默认开启,无需额外配置)。 - 灵活调整:如果需要修改周期,只需把
[7d]改为其他时间单位(比如[3d]表示3天一次)即可。
内容的提问来源于stack exchange,提问作者bobs
相关产品推荐
相关产品推荐

