You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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更适合单条通知包含双主机的需求。

你之前的方法存在的问题

  1. 第一种表达式:probe_success{instance="host1"} == 0 and on() probe_success{instance="host2"} == 0
    无标签匹配(on())后,Prometheus默认只保留左侧表达式的标签,因此通知中只有host1的信息。
  2. 第二种表达式:sum(probe_success{instance=~"host1|host2"}) == 0
    sum聚合操作会丢弃所有非聚合标签(这里就是instance),导致告警完全丢失主机标识。

内容的提问来源于stack exchange,提问作者Ilya Afinogentov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:36:16