如何在Prometheus告警规则中使用windows_exporter的hostname标签?
解决Windows Exporter告警中无法使用hostname标签的问题
问题根源
实例down的告警一般基于up指标,而windows_exporter的up指标默认仅包含job、instance标签,hostname标签只存在于windows_cs_hostname这类由cs采集器生成的指标中,因此直接在告警规则中引用$labels.hostname会无法获取到值。
解决方案
方案1:通过PromQL关联hostname标签(推荐)
修改告警规则的PromQL查询语句,使用group_left将windows_cs_hostname的hostname标签关联到up指标结果中,这样告警标签里就会包含hostname:
groups: - name: instance_down rules: - alert: InstanceDown expr: up{job=~"node_exporter|windows_exporter"} == 0 * on(instance) group_left(hostname) windows_cs_hostname{job="windows_exporter"} or up{job="node_exporter"} == 0 for: 1m annotations: summary: "{{ $labels.hostname }} instance is down"
解释:
- 对windows_exporter的up指标,通过
on(instance) group_left(hostname)关联同实例下的windows_cs_hostname指标,把hostname标签合并进来 - 保留node_exporter的原有逻辑,因为它本身的up指标已经带有hostname标签
方案2:在注释中做兼容处理(无需修改PromQL)
如果不想调整PromQL,可以在告警注释里使用条件判断,优先使用hostname标签,若不存在则自动去除instance中的端口号:
annotations: summary: "{{ if $labels.hostname }}{{ $labels.hostname }}{{ else }}{{ reReplaceAll ":.*" "" $labels.instance }}{{ end }} instance is down"
解释:
reReplaceAll ":.*" "" $labels.instance会把instance中:及后面的端口号去掉,只保留IP或主机名
注意事项
确保windows_exporter已经启用了cs采集器(默认是启用的,如果没启用需要在启动参数中添加--collectors.enabled=cs,...),否则windows_cs_hostname指标不会生成。
内容的提问来源于stack exchange,提问作者twkl
相关产品推荐
相关产品推荐

