Prometheus 如何把 instance 标签重标记(Relabel)为主机名?
用 relabel_configs 把 instance 标签的值改写为主机名:从 __address__ 提取 IP 段,或通过反向 DNS/元数据标签取主机名写入 instance。本文给出 static 与 K8s 两种场景的完整配置。
在 relabel_configs 里加一条规则:以地址或元数据为源,用正则提取主机名部分,写入 target_label: instance——之后所有指标的 instance 标签就显示主机名而不是 IP:端口。
场景一:去掉端口,只留 IP/主机
relabel_configs:
- source_labels: [__address__]
regex: '([^:]+):\d+'
target_label: instance
replacement: '$1'
192.168.1.10:9100 → instance 变为 192.168.1.10。
场景二:K8s/云环境中用真实主机名
relabel_configs:
- source_labels: [__meta_kubernetes_node_name]
target_label: instance
云厂商 VM 用对应的元数据标签(如 __meta_ec2_tag_Name)。
场景三:static_configs 直接命名
static_configs:
- targets: ['10.0.0.1:9100']
labels: {instance: 'web-server-01'}
最省事——直接在配置里把 instance 写成主机名。
原理说明
relabel 在抓取前执行,改的是目标的身份标签;想在抓取后改指标标签用 metric_relabel_configs。改 instance 属于身份层面,用前者。
观测云对照
观测云 DataKit 采集的主机指标自动以主机名为对象标识,并支持通过全局标签与 hostname 映射配置自定义命名,无需手写 relabel 规则。
常见问题(FAQ)
Q:改了 instance 历史数据怎么办? instance 是序列身份的一部分,改名等于新序列——历史数据留在旧标签下,建议一次性规划好命名。
Q:正则捕获组怎么引用? replacement: '$1' 中的 $1 对应 regex 的第一个括号。