Prometheus抑制规则疑问:已触发的High告警为何未被Critical抑制?
Alertmanager抑制规则失效问题分析
配置信息
抑制规则
inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'high' equal: ['alertname']
CPU使用率告警规则
High级别告警(Alert 1)
- alert: ContainerCpuUsage expr: ContainerCpuUsage > 90 for: 30m labels: severity: high topic: container annotations: summary: "Container CPU usage for pod '{{ $labels.pod }}' is above 90% for the last 30 minutes." description: "Container CPU usage (name {{ $labels.pod }}) MeasuredValue={{ printf "%.2f" $value }}%"
Critical级别告警(Alert 2)
- alert: ContainerCpuUsage expr: ContainerCpuUsage > 98 for: 30m labels: severity: critical topic: container annotations: summary: "Container CPU usage for pod '{{ $labels.pod }}' is above 98% for the last 30 minutes." description: "Container CPU usage (name {{ $labels.pod }}) MeasuredValue={{ printf "%.2f" $value }}%"
问题场景
- 场景1:CPU使用率从20%突升至99%,仅触发Critical告警,符合预期;
- 场景2:CPU使用率先升至91%触发High告警,之后升至99%触发Critical告警,但High告警仍处于激活状态,未被抑制关闭。
问题解答
为何High告警未被抑制?
Alertmanager的抑制规则仅负责阻止目标告警发送通知,不会改变告警本身的激活状态。当CPU使用率达到99%时,High告警的表达式ContainerCpuUsage > 90依然成立,Prometheus会持续生成这条告警,Alertmanager只是不对外发送它的通知,但告警本身仍会保持激活状态。
另外当前抑制规则仅匹配alertname,如果要确保只抑制同一Pod的对应告警,需要把pod标签加入equal列表,但即使调整后,也只能控制通知,无法关闭告警。
抑制规则能否关闭已触发的告警?
不能。抑制规则的核心作用是管控通知流程,不干预告警的生命周期。告警的激活/关闭完全由Prometheus的告警规则表达式决定:只要表达式为真,告警就保持激活;只有当表达式为假且持续for配置的时长后,告警才会被标记为resolved(关闭)。
实现预期效果的方案
要让CPU>98%时仅保留Critical告警,需修改High级别告警的表达式,排除已触发Critical的场景:
- alert: ContainerCpuUsage expr: ContainerCpuUsage > 90 AND ContainerCpuUsage <= 98 for: 30m labels: severity: high topic: container annotations: summary: "Container CPU usage for pod '{{ $labels.pod }}' is above 90% for the last 30 minutes." description: "Container CPU usage (name {{ $labels.pod }}) MeasuredValue={{ printf "%.2f" $value }}%"
当CPU超过98%时,High告警的表达式变为假,持续30分钟后就会自动关闭,此时仅Critical告警处于激活状态。
内容的提问来源于stack exchange,提问作者olti
相关产品推荐
相关产品推荐

