如何在Prometheus告警规则中添加操作系统标签区分节点类型
解决Prometheus节点宕机告警中添加操作系统标签的问题
核心问题:当节点状态为
down(up == 0)时,Prometheus生成的up指标不会包含exporter正常运行时的自定义标签(如operatingsystem)——因为此时exporter已停止工作,Prometheus无法采集到该节点的任何业务指标,只能生成一个仅带有scrape层面标签(如job、instance)的up指标。
方案一:给Scrape Job添加静态标签(推荐)
这是最简单可靠的方式,直接在Prometheus的采集配置中,给不同系统的exporter job绑定固定的操作系统标签:
- 修改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'
- 更新告警规则,直接引用静态注入的
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指标与系统信息指标关联,预存带标签的状态:
- 添加记录规则,关联
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指标上。
- 修改告警规则的查询表达式,使用预存的
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
相关产品推荐
相关产品推荐

