label_replace 是 Prometheus 中用于运行时动态重写标签值的函数,通过正则匹配 src_label 并用 replacement 模板填充 dst_label,实现异构监控数据的标签对齐,不增删标签、不丢弃样本,但需确保 regex 全匹配。

label_replace 是 Prometheus 中用于在查询时动态重写标签值的函数,特别适合在不改动 Exporter 源码的前提下,对齐两套标签体系不一致的监控数据(比如一套用 instance 表示主机,另一套用 host;或一套用 job="nginx",另一套用 job="web-server")。它不能新增或删除标签,但能基于正则匹配提取并重组标签值,是实现“运行时标签对齐”的核心工具。
理解 label_replace 的参数逻辑
语法:label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
关键点:
-
v:输入的瞬时向量(如
http_requests_total) - dst_label:要写入的目标标签名(若已存在则覆盖,不存在则新增)
-
replacement:替换模板,支持
$1、$2等捕获组引用 - src_label:从中提取原始值的源标签名(必须存在)
-
regex:用于匹配
src_label值的正则表达式(**必须全匹配**,即隐含^...$)
⚠️ 注意:regex 不匹配的样本会被**保留原样**(不会丢弃),但 dst_label 不会写入 —— 这意味着你需要确保正则足够通用,或配合 and/or 做兜底。
对齐 host/instance 标签(常见异构场景)
假设系统 A 的指标带 host="10.1.2.3:9100",系统 B 带 instance="10.1.2.3:9100",你想统一用 instance 标签做 join:
对系统 A 数据补全 instance:
label_replace(
node_cpu_seconds_total{job="system_a"},
"instance", "$1",
"host",
"(.*)"
)
如果系统 A 的 host 值含多余前缀(如 host="srv-01.prod:10.1.2.3:9100"),可精准提取 IP+端口:
label_replace(
node_cpu_seconds_total{job="system_a"},
"instance", "$1:$2",
"host",
".*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)"
)
这样输出向量就和系统 B 共享了 instance 标签,可直接 sum by(instance)(...) 或 ... and ... 关联。
标准化 job 名称与环境标签
系统 A 用 job="app_v2" + env="prod-us",系统 B 用 job="backend-api" + environment="production"。想统一为 job="backend" 和 env="prod":
分步处理(PromQL 支持链式调用):
label_replace(
label_replace(
metrics{job=~"app_v2|backend-api"},
"job", "backend",
"job",
".*"
),
"env", "prod",
"env",
"prod.*"
)
更健壮的做法是按来源分别映射:
label_replace(
label_replace(
metrics{job="app_v2"},
"job", "backend",
"job",
"app_v2"
) or label_replace(
metrics{job="backend-api"},
"job", "backend",
"job",
"backend-api"
),
"env", "prod",
"environment",
"production"
)
这里用 or 合并两个子查询结果,避免单条 label_replace 因 regex 不匹配导致部分样本丢失 env 标签。
注意事项与避坑指南
- regex 必须全匹配:写
"(\d+\.\d+\.\d+\.\d+)"匹配不了"10.1.2.3:9100",应写"(\d+\.\d+\.\d+\.\d+):\d+"或加.*宽松匹配 - 空标签值会导致 regex 匹配失败 → 对可能为空的标签(如
env=""),先用unless或默认值兜底 - label_replace 不改变指标名称或时间序列唯一性:若重写后多个序列拥有完全相同的标签集,它们会**被自动聚合**(取决于后续操作符)
- 性能影响小,但避免在高频告警规则中嵌套多层 label_replace;优先在 recording rule 中预计算对齐后的指标

















