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
中以逗号分隔列表的形式提供,可用于重新标记。
普罗米修斯重新贴标配置:
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
的解决方案,我可以从我的代码列表中删除=
。上面写的relabel配置根本不会导致暴露任何标记,似乎被忽略了。运行Prometheus并将日志级别设置为debug也不会产生任何结果。
答案 0 :(得分:3)
我认为我对普罗米修斯的标签如何运作有一个错误。我的不正确的理解是:
regex
之前,字符串将首先在separator
上拆分(否则它的目的是什么?),regex
评估它,target_label
和replacement
字段中使用的索引值提供。regex
不匹配,则该子字符串将被忽略。regex
会在拆分后应用于每个子字符串,所以会从多个子字符串中生成多个标签。但是,在其brian-brazil和Prometheus的文档中链接的answer帖子中,似乎发生了以下情况:
__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中写的方法,以及我上面使用的方法)都有警告 - 我们要么事先知道我们想要的所有标签,要么有一定数量的标签。这意味着如果开发人员想要将不同或更多标签与他/她的服务相关联,他/她将需要使用操作,因为一般流程将无法处理它。我认为这是一个应该解决的小问题。
答案 1 :(得分:1)
https://www.robustperception.io/extracting-full-labels-from-consul-tags/显示了如何执行此操作,特别是最后一个示例。