mot*_*ger 3 monitoring consul prometheus
Prometheus节点导出器已向具有各种标签的领事代理注册为服务。提供给领事代理的示例服务定义:
{
"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"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
我正在尝试向Prometheus公开标签,以便我们可以基于标签获取统计信息和图表。保持上述服务配置这一点,我想每个指标有下列标签除了任何普罗米修斯做内部:
a=1_meow,b=2_woof,c=3_moo和忽略monkey,因为它只是一个字符串。monkey如果有解决方案,我可以从标签列表中删除=。上面编写的relabel配置根本不会导致暴露任何标签,并且似乎被忽略了。在日志级别设置为调试的情况下运行Prometheus也不会产生任何结果。
我认为我对普罗米修斯的标签是如何工作的理解有误。我的错误理解是:
regex,首先将字符串拆分separator(否则它的目的是什么?),regex针对它进行了评估,target_label和replacement字段中使用。regex不匹配,则该子字符串将被忽略。regex期望在拆分后应用于每个子字符串,所以它将导致来自多个子字符串的多个标签。但是,从brian-brazil在他的答案和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}
Run Code Online (Sandbox Code Playgroud)
我相信这两种方法(brian-brazil在他的博客文章中所写的方法,以及我在上面使用的方法)都需要警告-我们要么需要事先知道我们想要的所有标签,要么要有一定数量的标签。这意味着,如果开发人员想要将其他标签或更多标签与他/她的服务相关联,则他/她将需要与操作人员合作,因为一般流程将无法处理它。我认为这是一个小警告,应该解决。