Prometheus组合告警规则不触发问题排查求助
问题:Prometheus组合告警规则无法触发排查
配置的告警规则
- alert: HostHighCpuLoadTSDB expr: (100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle",common_name="stg-tsdb-eks"}[2m])) * 100) > 5) and (hour() < 8 or hour() > 9) for: 5m labels: severity: warning annotations: summary: Host high CPU load (instance {{ $labels.instance }}) description: "CPU load is > 5%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
告警表达式
(100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle",common_name="stg-tsdb-eks"}[2m])) * 100) > 5) and (hour() < 8 or hour() > 9)
问题现象
- 单独使用CPU负载条件表达式,告警可正常触发;
- 单独使用时间条件表达式,告警可正常触发;
- 测试时间为12点(满足
hour() >9),且CPU负载已超过5%,但两个条件组合后告警无法触发。
环境信息
- Prometheus版本:v2.41.0
- Alertmanager版本:v0.25.0
- 部署方式:通过Helm部署kube-prometheus-stack运行在Kubernetes集群
需求
CPU负载超过5%时触发告警,但排除8:00-9:00时间段。
问题原因及解决方案
原因
Prometheus的and运算符默认要求两边序列的标签完全匹配。hour()返回的时间序列没有任何标签,而CPU负载表达式的结果带有instance标签,两者标签集不匹配,导致and运算后没有符合条件的序列,因此告警无法触发。
解决方案
使用on()运算符忽略标签匹配,让两个条件仅做值的逻辑与判断,修改后的告警表达式如下:
(100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle",common_name="stg-tsdb-eks"}[2m])) * 100) > 5) and on() (hour() < 8 or hour() > 9)
验证
将修改后的表达式输入Prometheus的Expression浏览器,若能返回符合条件的instance序列,则说明配置正确,等待for:5m后告警即可正常触发。
内容的提问来源于stack exchange,提问作者Oleksii K
相关产品推荐
相关产品推荐

