monitoring - 在 Prometheus 中重新标记

标签 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 中以逗号分隔列表的形式提供,可用于重新标记。

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 也不会产生任何结果。

相关文档

最佳答案

理解错误

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

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

正确理解

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

  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,因为一般流程将无法处理它。我认为这是一个应该解决的小问题。

关于monitoring - 在 Prometheus 中重新标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44339461/

相关文章:

docker - 进程启动后如何执行docker命令

docker - 在Docker容器内创建领事客户端代理时如何传递参数?

security - K8S - 使用 Prometheus 检查证书验证

kubernetes - Prometheus Pods 在 grafana 中重启

java - hibernate 监控解决方案

logging - 如何在SAS中记录当前步骤?

linux - monitrc 中的 Monit 语法错误

linux - 神经节监测

shell - 使用ENTRYPOINT进行Docker CMD评估

grafana - 我可以使用 Grafana 表列出所有向 Prometheus 报告的节点吗?