【问题标题】:Relabeling in Prometheus在 Prometheus 中重新标记
【发布时间】:2017-06-03 01:43:29
【问题描述】:

设置

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"
        }
      ]
    }
}

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

相关文档

【问题讨论】:

    标签: monitoring consul prometheus


    【解决方案1】:

    理解错误

    我认为我对 prometheus 中标签的工作原理的理解有误。我的不正确理解是:

    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}
    

    注意事项

    我相信这两种方法(brian-brazil 在his blogpost 中写的方法,以及我在上面使用的方法)都有一些警告——我们要么需要事先知道我们想要的所有标签,要么有一定数量的标签。这意味着如果开发人员想要将不同的或更多的标签与他/她的服务相关联,他/她将需要使用 ops,因为一般流程将无法处理它。我认为这是一个应该解决的小问题。

    【讨论】:

      【解决方案2】:

      https://www.robustperception.io/extracting-full-labels-from-consul-tags/ 展示了如何执行此操作,尤其是最后一个示例。

      【讨论】:

      • 该链接已包含在我原始问题的相关文档中。它没有得到我所希望的。
      • 该链接完全涵盖了您想要做的事情,您需要按照书面形式使用它 - 而不是您发布的更改版本。
      • 是的...我现在明白为什么需要这样做了。我已经在我的回答中包含了我的理解和我的工作内容。如果我的回答有错误,请纠正我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2021-01-21
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多