2017-06-03 144 views
0

设置

Prometheus节点导出器被注册为带有各种标签的consul代理的服务。提供给领事剂实施例的服务定义:在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" 
     } 
     ] 
    } 
} 

普罗米修斯被设定为寻找这个server-stats服务,并使用由领事提供的配置(主机地址和端口)来从服务器刮统计信息。以上标签在__meta_consul_tags中以逗号分隔列表形式提供,可用于重新标记。

普罗米修斯重新贴标签的配置:

relabel_configs: 
- source_labels: [__meta_consul_tags] 
    separator:  ',' 
    #regex:   '(.+)=(.+)' 
    regex:   '([a-z_]+)=([a-z_]+|\d+)' 
    target_label: ${1} 
    replacement: ${2} 

问题

我试图揭露标签普罗米修斯这样我们就可以得到统计数据和基于标签的图表。考虑到上述服务配置,我希望每个度量标准除了Prometheus的内部标准外还有以下标签: a=1_meowb=2_woof,c=3_moo并忽略monkey,因为它只是一个字符串。如果有需要=的解决方案,我可以从我的标签列表中删除monkey。上面所写的relabel配置并没有导致暴露任何标签,似乎被忽略。运行日志级别设置为调试的Prometheus也不会产生任何结果。

相关的文档

回答

0

不正确的认识

我觉得在我的普罗米修斯标签是如何工作的理解是错误的。我不正确的理解是:

  1. 应用regex之前,字符串将是第一个分裂的separator(否则?作用是什么?),
  2. 每个子已经regex评估反对,
  3. 如果匹配组被声明并找到,它们将作为索引值在target_labelreplacement字段中使用。
  4. 如果regex不匹配,那么该子串将被忽略。
  5. 由于regex预计会在分割后应用于每个子字符串,因此会导致来自多个子字符串的多个标签。

正确认识

然而,从brian-brazil的帖子他answer和普罗米修斯的文档链接,似乎以下情况发生:

  1. 所有__meta标签被合并成一个长separator分离线。
  2. regex只在该行上应用一次。
  3. 如果regex匹配且包含组,则它们从1开始索引,并可用于target_labelreplacement
  4. 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} 

注意事项

相信无论是方法(布里奇 - 巴西在his blogpost中写道的方法,以及我上面使用的方法)有警告 - 我们或者需要事先知道我们想要的所有标签,或者有​​一组数字他们中的一员。这意味着,如果开发人员想要将不同的或更多的标签与他/她的服务相关联,则他/她需要与ops一起工作,因为一般流程将无法处理它。我认为这是一个小问题,应该加以解决。

0

https://www.robustperception.io/extracting-full-labels-from-consul-tags/展示了如何做到这一点,尤其是在过去的例子。

+0

该链接已包含在我原始问题的相关文档中。它没有得到我所希望的。 – motomonger

+0

链接完全覆盖你想要做的事情,你需要以书面形式使用它 - 而不是你发布的修改版本。 –

+0

是的...我现在看到为什么需要做。我已经包括了我的理解以及我在回答中所做的工作。如果我在我的答案的某处出错,请纠正我。 – motomonger