在普罗米修斯重新标记

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

相关文件

mot*_*ger 5

错误理解

我认为我对普罗米修斯的标签是如何工作的理解有误。我的错误理解是:

  1. 在应用之前regex,首先将字符串拆分separator(否则它的目的是什么?),
  2. 每个子字符串都regex针对它进行了评估,
  3. 如果声明并找到了匹配组,它们将作为索引值可用,可在target_labelreplacement字段中使用。
  4. 如果regex不匹配,则该子字符串将被忽略。
  5. 因为regex期望在拆分后应用于每个子字符串,所以它将导致来自多个子字符串的多个标签。

正确理解

但是,从brian-brazil在他的答案和Prometheus的文档中链接的帖子来看,似乎发生了以下情况:

  1. 所有__meta标签组合成一条长的separator分隔线。
  2. regex 仅在该行上应用一次。
  3. 如果regex匹配并包含组,则它们将从1开始索引,并且可用于target_label和中replacement
  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}
Run Code Online (Sandbox Code Playgroud)

注意事项

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