如何在Prometheus中将instance标签重标记为节点主机名?
解决Prometheus抓取node_exporter后Grafana显示IP而非主机名的问题
我之前也遇到过一模一样的情况——用IP配置target后,Grafana里的instance全是冷冰冰的IP,根本分不清哪台是哪台。下面给你几种靠谱的解决方法,从简单到灵活都有:
方法1:静态配置直接指定主机名(最简单)
如果你的机器数量不多,主机名也不会经常变,直接在Prometheus的static_configs里给每个target加上instance标签就行,一步到位:
scrape_configs: - job_name: node_exporter static_configs: - targets: ["1.2.3.4:9100"] labels: instance: "web-server-01" # 这里写实际主机名 - targets: ["2.3.4.5:9100"] labels: instance: "db-server-01" - targets: ["3.4.5.6:9100"] labels: instance: "cache-server-01"
修改后重启Prometheus,Grafana里的instance就会直接显示你设置的主机名了。
方法2:用metric_relabel自动提取主机名(适合机器多的场景)
你提到用了重标记规则没效果,大概率是用错了配置项——要注意relabel_configs和metric_relabel_configs的区别:
relabel_configs是在"抓取目标"阶段处理(还没拿到指标数据),这时候根本拿不到node_exporter暴露的主机名标签;metric_relabel_configs才是在"抓取到指标后"处理,能读取到node_uname_info里的nodename(也就是主机名)。
正确的配置应该是这样:
scrape_configs: - job_name: node_exporter static_configs: - targets: - 1.2.3.4:9100 - 2.3.4.5:9100 - 3.4.5.6:9100 # 重点:用metric_relabel_configs修改指标的instance标签 metric_relabel_configs: # 匹配node_uname_info指标,把nodename的值替换到instance标签 - source_labels: [__name__, nodename] regex: node_uname_info;(.*) target_label: instance replacement: $1 # 可选:把原来的IP:port标签保留为original_instance,方便排查问题 - source_labels: [instance] target_label: original_instance
重启Prometheus后,所有node_exporter的指标都会自动把instance替换成主机名,原来的IP会存在original_instance里(如果配置了的话)。
方法3:Grafana层面处理(不用改Prometheus)
如果不想动Prometheus的配置,也可以直接在Grafana里做文章:
- 编写查询时,用
group_left关联node_uname_info指标(它包含主机名nodename):
# 以CPU使用率为例,关联nodename标签 100 - (avg by (instance, nodename) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
- 在面板的"图例选项"里,把图例格式改成
{{nodename}},而不是默认的{{instance}}。
这样Grafana的图表就会显示主机名,完全不用修改Prometheus配置。
为什么你的重标记规则没效果?
大概率是这两个原因:
- 用了
relabel_configs而不是metric_relabel_configs,时机不对,拿不到nodename标签; - 正则表达式写得有问题,比如没正确匹配
node_uname_info的指标名和nodename值。
内容的提问来源于stack exchange,提问作者Norrius
相关产品推荐
相关产品推荐

