通过正则表达式重新标记节点导出器系列以具有 kube_state_metrics 的通用标签

Relabel node-exporter series to have common label with kube_state_metrics by regex

我想没有人有固定标签的方便方法,以至于您可以对来自 kube_state_metrics 的一个系列和来自 node-exporter 的一个系列进行 group_left/join。鉴于开箱即用,至少对我来说,他们不共享任何可以旋转的共同标签,这出乎意料地困难。

在我看来,我有两个选择:

  1. 以某种方式弄乱了抓取目标,这样我就可以为该系列贴上一个共同的标签,这可能会也可能不会。看着这个东西很复杂。但无论如何,这可能以我不想要的方式增加了我的基数。

  2. 做一个粗略的正则表达式重新标记以创建我自己的通用标签作为枢轴。

对于选项 2:我有以下接近的标签可以使用,我可以在其中进行转换以获得我的轴心点:

instance="10.26.10.113:9100" < node-exporter
internal_ip="10.26.10.113" < kube_state_metrics

我正在使用以下截断输出进行以下查询作为测试

label_replace(node_cpu_seconds_total{mode="idle"}, "instance", "", "instance", "[^:]*")

node_cpu_seconds_total{instance="10.26.10.113:9100", mode="idle"}   4975537.86

我原以为正则表达式会捕获 : 之前的所有内容,然后仅替换第一个捕获组的实例标签。然而事实并非如此。如果我更改查询的倒数第二个字段,实例标签将完全消失。

label_replace(node_cpu_seconds_total{mode="idle"}, "internal_ip", "", "instance", "[^:]*")
node_cpu_seconds_total{mode="idle"} 4975537.86

我做错了什么?根据 https://regoio.herokuapp.com/,我相信正则表达式是有效的 RE2 正则表达式语法。尽我所能阅读文档,我的语法似乎也是正确的。 https://prometheus.io/docs/prometheus/latest/querying/functions/#label_replace

我不知道为什么,但在这里窃取正则表达式似乎有效。我想我需要为整个源标签提供捕获组,即使我不关心整个事情。

https://newbedev.com/relabel-instance-to-hostname-in-prometheus

label_replace(node_cpu_seconds_total{mode="idle"}, "internal_ip", "", "instance", "([^:]+)(:[0-9]+)?")

node_cpu_seconds_total{internal_ip="10.26.10.113", instance="10.26.10.113:9100, mode="idle"}    4975537.86

===

默认情况下,kube_state_metrics 和节点导出器上的 instance 标签 不同 !一种是默认情况下 hostip:9100 的节点导出器绑定地址,而 kube-state-metrics 一种是 podip:8080。不要在没有先做 label_replace!

的情况下尝试加入系列

你会得到一个错误

found duplicate series for the match group {instance="10.2.2.45:8080"}

我为下一个可怜的灵魂所做的全部说明: 在节点标签

上加入节点导出器和 kube_state_metrics 系列
instance=10.10.10.10:9001 < label laid on node-exporter series
internal_ip=10.10.10.10 < label laid on kube_state_metrics series

First relabel by regex to the common internal_ip label
    label_replace(node_cpu_seconds_total{mode="idle"}, "internal_ip", "", "instance", "([^:]+)(:[0-9]+)?")

group_left to add the node label to the series
    label_replace(node_cpu_seconds_total{mode="idle"}, "internal_ip", "", "instance", "([^:]+)(:[0-9]+)?")
    * on (internal_ip) group_left (node) kube_node_info{}

The first argument of label_replace takes in a series. Sub in the rate query. note the [1m] positioning
    label_replace(rate(node_cpu_seconds_total{mode="idle"}[1m]), "internal_ip", "", "instance", "([^:]+)(:[0-9]+)?")
    * on (internal_ip) group_left (node) kube_node_info{"}

Do the rest of the query
1 - avg by (node) (
    label_replace(rate(node_cpu_seconds_total{mode="idle"}[5m]), "internal_ip", "", "instance", "([^:]+)(:[0-9]+)?")
    * on (internal_ip) group_left (node) kube_node_info{}
)