设置
Prometheus 节点导出器已注册为具有各种标签的 consul 代理的服务。提供给领事代理的示例服务定义:
{
"service":{
"id": "server-stats",
"name": "server-stats",
"tags": [
"a=1_meow",
"b=2_woof",
"c=3_moo",
"monkey"
],
"port": 9100,
"checks": [
{
"name": "Process #1",
"script": "/path/to/healthcheck/script.sh",
"interval": "5s"
}
]
}
}
Prometheus 设置为查找此 server-stats
服务并使用 Consul 提供的配置(主机地址和端口)从服务器中抓取统计信息。上述标签在 __meta_consul_tags
中以逗号分隔列表的形式提供,可用于重新标记。
Prometheus 重标配置:
relabel_configs:
- source_labels: [__meta_consul_tags]
separator: ','
#regex: '(.+)=(.+)'
regex: '([a-z_]+)=([a-z_]+|\d+)'
target_label: ${1}
replacement: ${2}
问题
我正在尝试向 Prometheus 公开标签,以便我们可以根据标签获取统计信息和图表。牢记上述服务配置,除了 Prometheus 内部所做的任何事情之外,我希望每个指标都有以下标签:
a=1_meow
、b=2_woof
、c=3_moo
并忽略 monkey
,因为它只是一个字符串。如果存在需要 =
的解决方案,我可以从标签列表中删除 monkey
。上面编写的重新标记配置根本不会暴露任何标签,并且似乎被忽略了。在日志级别设置为调试的情况下运行 Prometheus 也不会产生任何结果。
相关文档
最佳答案
理解错误
我认为我对 prometheus 中标签的工作原理的理解有误。我的不正确理解是:
- 在应用
regex
之前,字符串首先会在separator
上进行拆分(否则它的用途是什么?), - 每个子字符串都有
regex
对其进行评估, - 如果声明并找到匹配组,它们将作为可用于
target_label
和replacement
字段的索引值。 - 如果
regex
不匹配,则该子字符串将被忽略。 - 因为
regex
预计会在拆分后应用到每个子字符串上,所以会导致多个子字符串产生多个标签。
正确理解
但是,从 brian-brazil的帖子链接在他的answer和 Prometheus 的文档,似乎发生了以下情况:
- 所有
__meta
标记组合成一个长的separator
分隔行。 regex
仅在该行上应用一次。- 如果
regex
匹配并包含组,则它们从 1 开始编入索引,并可用于target_label
和replacement
。 separator
似乎在本节中被忽略了,即使你提到它。
根据正确理解配置
根据这个想法和问题中的示例,我能够制作以下有效的配置
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: '.*,a=([a-z0-9_]+),.+'
target_label: 'a'
replacement: ${1}
- source_labels: [__meta_consul_tags]
regex: '.*,b=([a-z0-9_]+),.+'
target_label: 'b'
replacement: ${1}
- source_labels: [__meta_consul_tags]
regex: '.*,c=([a-z0-9_]+),.+'
target_label: 'c'
replacement: ${1}
- source_labels: [__meta_consul_tags]
regex: '.*,d=([a-z0-9_]+),.+'
target_label: 'd'
replacement: ${1}
注意事项
我相信这两种方法(brian-brazil 在 his blogpost 中写的方法,以及我在上面使用的方法)都有一些警告——我们要么需要事先知道我们想要的所有标签,要么有一定数量的标签。这意味着如果开发人员想要将不同的或更多的标签与他/她的服务相关联,他/她将需要使用 ops,因为一般流程将无法处理它。我认为这是一个应该解决的小问题。
关于monitoring - 在 Prometheus 中重新标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44339461/