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

如何在Prometheus告警规则中添加操作系统标签区分节点类型

解决Prometheus节点宕机告警中添加操作系统标签的问题

核心问题:当节点状态为down(up == 0)时,Prometheus生成的up指标不会包含exporter正常运行时的自定义标签(如operatingsystem)——因为此时exporter已停止工作,Prometheus无法采集到该节点的任何业务指标,只能生成一个仅带有scrape层面标签(如job、instance)的up指标。

方案一:给Scrape Job添加静态标签(推荐)

这是最简单可靠的方式,直接在Prometheus的采集配置中,给不同系统的exporter job绑定固定的操作系统标签:

  1. 修改Prometheus的scrape_configs配置,分别为node_exporter和windows_exporter添加静态platform标签:
scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['linux-node-01:9100', 'linux-node-02:9100']
    # 给所有Linux节点的采集任务添加静态标签
    labels:
      platform: 'Linux'

  - job_name: 'windows_exporter'
    static_configs:
      - targets: ['win-node-01:9182', 'win-node-02:9182']
    # 给所有Windows节点的采集任务添加静态标签
    labels:
      platform: 'Windows'
  1. 更新告警规则,直接引用静态注入的platform标签:
- name: alert.rules
  rules:
  - alert: Instance Down
    expr: up == 0
    for: 1m
    labels:
      severity: "critical"
      subject: "Server {{ $labels.instance }} down"
      platform: "{{ $labels.platform }}" # 现在可以正常获取系统类型
    annotations:
      summary: "{{ $labels.instance }} instance is down"
      description: "Instance is down for more than 1 minute"

这种方式不受节点状态影响,只要配置了scrape任务,up指标就会带上platform标签。

方案二:用记录规则预存带系统标签的UP状态(动态场景)

如果需要动态获取操作系统信息(而非静态绑定),可以通过记录规则,在节点正常时将up指标与系统信息指标关联,预存带标签的状态:

  1. 添加记录规则,关联up指标和系统信息指标:
- name: record.rules
  rules:
  - record: up_with_platform
    # 关联node_exporter的系统信息指标
    expr: up * on(instance) group_left(operatingsystem) node_uname_info{job="node_exporter"}
          # 关联windows_exporter的系统信息指标
          or up * on(instance) group_left(operatingsystem) windows_os_info{job="windows_exporter"}
  • node_uname_info是node_exporter提供的系统信息指标,包含operatingsystem标签;windows_os_info是windows_exporter的对应指标。
  • group_left用于将系统信息指标的标签关联到up指标上。
  1. 修改告警规则的查询表达式,使用预存的up_with_platform指标:
- name: alert.rules
  rules:
  - alert: Instance Down
    expr: up_with_platform == 0 # 使用预存的带标签指标
    for: 1m
    labels:
      severity: "critical"
      subject: "Server {{ $labels.instance }} down"
      platform: "{{ $labels.operatingsystem }}" # 可以正常获取系统标签
    annotations:
      summary: "{{ $labels.instance }} instance is down"
      description: "Instance is down for more than 1 minute"

注意:这种方式依赖节点正常运行时已采集到系统信息指标,且instance标签能在up和系统信息指标间正确匹配。

方案三:在Alertmanager模板中补全系统类型

如果无法修改Prometheus配置,也可以在Alertmanager的邮件模板中,通过job或instance字段判断系统类型:
例如在邮件模板中添加以下逻辑:

{{/* 根据job名称判断系统类型 */}}
{{ if eq .Labels.job "node_exporter" }}
  platform: Linux
{{ else if eq .Labels.job "windows_exporter" }}
  platform: Windows
{{ else }}
  platform: Unknown
{{ end }}

或者根据instance的命名规则判断(如果你的节点命名包含系统标识):

{{/* 根据instance名称中的关键字判断 */}}
{{ if contains "linux" .Labels.instance }}
  platform: Linux
{{ else if contains "win" .Labels.instance }}
  platform: Windows
{{ else }}
  platform: Unknown
{{ end }}

这种方式不需要修改告警规则,直接在Alertmanager端处理,但灵活性依赖命名规则或job名称的规范性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:12:37