Prometheus 如何把 instance 标签重标记(Relabel)为主机名?

用 relabel_configs 把 instance 标签的值改写为主机名:从 __address__ 提取 IP(不会反向 DNS),或把预先提供的主机名/服务发现元数据写入 instance。本文给出 static 与 K8s 两种场景的完整配置。

最佳实践
Prometheus 如何把 instance 标签重标记(Relabel)为主机名?封面

在 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变为该IP;不会执行反向DNS变成主机名。该正则不适用于带冒号的IPv6地址。

场景二:K8s/云环境中用真实主机名

relabel_configs:
  - source_labels: [__meta_kubernetes_node_name]
    target_label: instance

Kubernetes元数据可用性取决于discovery role;云厂商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属于身份层面,用前者;并不修改__address__抓取目标。需保留能区分多个端口/实例的标签组合,避免误合并。

常见问题(FAQ)

Q:改了 instance 历史数据怎么办? instance 是序列身份的一部分,改名等于新序列——历史数据留在旧标签下,建议一次性规划好命名。

Q:正则捕获组怎么引用? replacement: '$1' 中的 $1 对应 regex 的第一个括号。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台