如何在Prometheus中配置双主机不可用的联合告警规则?
解决Prometheus中两台主机同时不可用时告警并保留双主机标签的问题
方案1:使用count判断触发条件,结合告警模板获取所有不可用主机
这种方法既满足"两台主机均不可用才触发"的逻辑,又能在通知中动态列出所有故障主机,是最适配需求的方案:
告警规则示例
groups: - name: host_monitoring rules: - alert: BothHost1AndHost2Down # 当匹配host1/host2的probe_success为0的样本数等于2时触发 expr: count(probe_success{instance=~"host1|host2"} == 0) == 2 for: 1m labels: severity: critical annotations: summary: "两台主机同时不可达" description: "以下主机已离线:{{ range query 'probe_success{instance=~\"host1|host2\"} == 0' }}{{ .Labels.instance }} {{ end }}"
原理说明
count(probe_success{instance=~"host1|host2"} == 0) == 2:精确判断两台主机的probe_success都为0(不可用),只有满足这个条件才会触发告警。- 告警注释中的
{{ range query ... }}模板语法:会实时查询当前符合"不可用"条件的主机,把它们的instance标签全部列出来,确保通知包含两台主机的信息。
方案2:使用向量匹配保留双主机标签(适合需要在指标中保留标签的场景)
如果希望告警指标本身就携带两台主机的标签,可以用group_right进行无标签向量匹配,保留两边的标签:
probe_success{instance="host1"} == 0 and on() group_right(instance) probe_success{instance="host2"} == 0
原理说明
on():指定不使用任何标签进行向量匹配,让两个独立的时间序列可以匹配。group_right(instance):保留右侧表达式的instance标签,最终结果会同时包含host1和host2的标签(生成两个时间序列,分别对应两台主机)。不过这种方式会触发两条告警,需要在通知模板中合并,因此方案1更适合单条通知包含双主机的需求。
你之前的方法存在的问题
- 第一种表达式:
probe_success{instance="host1"} == 0 and on() probe_success{instance="host2"} == 0
无标签匹配(on())后,Prometheus默认只保留左侧表达式的标签,因此通知中只有host1的信息。 - 第二种表达式:
sum(probe_success{instance=~"host1|host2"}) == 0sum聚合操作会丢弃所有非聚合标签(这里就是instance),导致告警完全丢失主机标识。
内容的提问来源于stack exchange,提问作者Ilya Afinogentov
相关产品推荐
相关产品推荐

