对具有相同值的不同标签的两个指标进行数学运算时,在普罗米修斯查询中使用 "label_replace" 是一个很好的解决方案吗

Is it a good solution to use "label_replace" in a prometheus query when doing math operations on two metrics with different labels for the same value

我们有一个很好的普罗米修斯查询,涉及节点的负载及其 cpu 个核心数:

(avg(node_load1{instance=~"$instance"}) by (instance) / sum(machine_cpu_cores{instance=~"$instance"}) by (instance)) * 100

但是“machine_cpu_cores”消失了,我找到了“kube_node_status_capacity{resource="cpu"}。我希望能够按节点分组,并且也可以按节点过滤。

问题是在指标“node_load1”上节点的标签是“实例”,在指标“kube_node_status_capacity”上它是“节点”。我无法对不匹配的标签执行所需的除法运算。我找到的解决方案是在一个指标上使用 'label_replace':

(avg(label_replace(node_load1{instance=~"$instance"}, "node", "", "instance", "(.*)")) by (node) / sum(kube_node_status_capacity{resource="cpu", node=~"$instance"}) by (node)) * 100

这是一个好的解决方案吗?有没有更好的解决方案?

当然,使用 label_replace 是绝对合适的。您的标签来自不同的来源,因此对大致相同的概念使用不同的标签名称。这是 label_replace 非常方便的场合之一!

有一种不同的方法可以获取 CPU 计数,这种方法很常见。您可以使用这样的查询:

count by (instance) (node_cpu_seconds_total{mode="idle"})

由于node-exporter为每个CPU/mode创建了一个node_cpu_seconds_total时间序列,它在特定模式下的每个实例计数(这里我们随意使用“idle”)是[=24的计数=]s.

我不确定 kube_node_status_capacity 是否代表节点的总 CPU 计数,或者只是分配给 运行 Kubernetes pods 的 CPU (一个节点可以预留一些CPU)。因此,根据您的需要,使用此查询可能更准确。