在普罗米修斯重新标记

时间:2017-06-03 01:43:30

标签: monitoring consul prometheus

设置

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_meowb=2_woofc=3_moo并忽略monkey,因为它只是一个字符串。如果有一个需要monkey的解决方案,我可以从我的代码列表中删除=。上面写的relabel配置根本不会导致暴露任何标记,似乎被忽略了。运行Prometheus并将日志级别设置为debug也不会产生任何结果。

相关文档

2 个答案:

答案 0 :(得分:3)

理解不正确

我认为我对普罗米修斯的标签如何运作有一个错误。我的不正确的理解是:

  1. 在应用regex之前,字符串将首先在separator上拆分(否则它的目的是什么?),
  2. 每个子字符串都有regex评估它,
  3. 如果声明并找到匹配组,则它们将作为可在target_labelreplacement字段中使用的索引值提供。
  4. 如果regex不匹配,则该子字符串将被忽略。
  5. 因为预期regex会在拆分后应用于每个子字符串,所以会从多个子字符串中生成多个标签。
  6. 正确理解

    但是,在其brian-brazil和Prometheus的文档中链接的answer帖子中,似乎发生了以下情况:

    1. 所有__meta代码组合成一条长separator分隔线。
    2. regex仅在该行上应用一次。
    3. 如果regex匹配并包含群组,则会从1开始编制索引,并可在target_labelreplacement中使用。
    4. separator似乎在本节中被忽略,即使你提到它。
    5. 通过更正的理解配置

      从这个想法和问题中的例子开始,我能够制作以下配置

      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/显示了如何执行此操作,特别是最后一个示例。