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

使用Prometheus/Alertmanager时,Host Down触发如何屏蔽其他服务告警?

解决方案:避免主机宕机时触发关联服务告警

完全可以通过Prometheus或Alertmanager的配置实现这个需求,下面是两种最常用的方案:


方案1:使用Alertmanager的抑制规则(Inhibition Rules)

这是最推荐的方式,核心逻辑是当「主机宕机」告警触发时,自动抑制同一主机上的所有服务类告警。

配置步骤

在Alertmanager的配置文件(通常是alertmanager.yml)中添加inhibit_rules段落:

global:
  # 其他全局配置...

route:
  # 路由配置...

inhibit_rules:
  # 抑制同一主机下的服务告警,当HostDown触发时
  - source_match:
      alertname: "HostDown"  # 源告警:主机宕机的告警名称
    target_match_re:
      # 用正则匹配需要被抑制的服务告警名称
      alertname: "(NginxDown|DockerDown|RedisDown|MysqlDown)"
    equal: ["instance"]  # 匹配标签:确保是同一台主机的告警

关键说明

  • source_match:指定触发抑制的源告警(这里是HostDown)
  • target_match_re:用正则匹配所有需要被抑制的服务告警名称,按需添加即可
  • equal:通过instance标签关联同一主机,确保不会误抑制其他正常主机的服务告警

配置完成后重启Alertmanager,当某台主机触发HostDown告警时,该主机上的Nginx、Docker等服务告警会被自动抑制,不会发送到PagerDuty或邮箱。


方案2:在Prometheus告警规则中添加前置条件

如果你不想依赖Alertmanager的抑制,也可以直接在Prometheus的告警规则里加判断:只有当主机存活时,才触发服务类告警。

配置示例

以Nginx告警为例,修改Prometheus的告警规则文件(比如alerts.yml):

groups:
- name: service_alerts
  rules:
  - alert: NginxDown
    # 新增up == 1的条件:代表主机的node_exporter存活(主机正常)
    expr: nginx_up == 0 AND up == 1
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Nginx服务异常 ({{ $labels.instance }})"

  - alert: DockerDown
    expr: docker_up == 0 AND up == 1
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Docker服务异常 ({{ $labels.instance }})"

关键说明

  • up指标来自node_exporter,up == 1表示主机的exporter正常采集(主机存活)
  • 当主机宕机时,up会变为0,服务告警的表达式结果为false,不会触发告警

这种方式的优势是从源头减少告警产生,但需要给所有服务告警规则都添加该条件。


注意事项

  1. 确保所有告警的instance标签格式一致(比如IP:端口或主机名),否则抑制规则或条件判断会失效
  2. 可以通过Alertmanager的Web UI(默认端口9093)查看抑制状态,验证规则是否生效
  3. 如果使用方案2,要确保所有主机都部署了node_exporter,否则up指标会缺失

内容的提问来源于stack exchange,提问作者Filip Cheliński

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:05:17