Prometheus relabel_configs是否支持单条正则设置多个目标标签
结论
你在单条relabel_configs规则里配置多个target_label的写法不是Prometheus官方支持的合法用法,达不到同时填充多个标签的效果。
原因说明
Prometheus的relabel配置块中,target_label是单值字段,按照YAML的解析规则,同一个配置块里重复写同名字段时,最后出现的值会覆盖前面所有的同名字段值。你给出的示例配置里,最终只有最后声明的env标签会被赋值,前面写的type标签会被直接忽略,完全不会生效。
另外你示例里给type标签指定replacement: $2也是错误的:正则里第一个括号([^_]+)匹配的是服务类型(http/db这类值),对应捕获组$1;第二个括号(dev|tst|uat|prod)匹配的是环境值,对应捕获组$2。
正确实现方式
要从同一段源标签内容里提取多个值赋值给不同标签,必须编写多条独立的relabel规则,每条规则单独指定目标标签和对应的捕获组即可,不需要额外改造服务发现逻辑。正确配置示例如下:
file_sd_configs: - files: - /etc/prometheus/targets/hostname_http_prod.yml - /etc/prometheus/targets/hostname_http_dev.yml - /etc/prometheus/targets/hostname_db_prod.yml relabel_configs: # 提取服务类型标签 - source_labels: [__meta_filepath] regex: "/etc/prometheus/targets/hostname_([^_]+)_(dev|tst|uat|prod)\\.yml" target_label: type replacement: $1 # 提取环境标签 - source_labels: [__meta_filepath] regex: "/etc/prometheus/targets/hostname_([^_]+)_(dev|tst|uat|prod)\\.yml" target_label: env replacement: $2
这种写法没有额外的性能问题,Prometheus的relabel匹配逻辑开销极低,对于绝大多数场景都不会产生可观测的性能损耗,也是官方文档中推荐的多标签提取写法。如果觉得重复书写正则太冗余,也可以先通过一条规则把文件名中需要拆分的部分提取到临时的内部标签(标签名以__开头,不会对外暴露),再基于临时标签做拆分,但对于这类简单的路径匹配场景,直接写多条独立规则的可读性最高,后续维护也更方便。
内容的提问来源于stack exchange,提问作者Steve Crook
相关产品推荐
相关产品推荐

