聚合 2 个 PromQL 量规指标,不包括来自右操作数的额外标签

Aggregate 2 PromQL gauge metrics without including extra labels from right operand

是否可以聚合 2 个规格指标(即 kube_pod_labelskube_pod_container_resource_requests_cpu_cores),以便通过执行查询合并两个结果元素(即所有 pod 标签作为结果元素和 request_cpu_cores 作为值)?

查询 cpu 请求值如下所示 sum by (namespace, pod) (kube_pod_container_resource_requests_cpu_cores{cluster="my-cluster"})

实际结果:

{namespace="my-ns",pod="my-pod"} 0.05

pod 标签的查询是 kube_pod_labels{label_foo="bar"}

实际结果:

kube_pod_labels{cluster="my-cluster",label_foo="bar",label_app="my-app-label",namespace="my-ns",pod="my-pod",service="my-svc"} 1

我尝试过使用左关节,但似乎需要按给定标签(pod、名称空间等)进行分组,如 https://www.robustperception.io/left-joins-in-promql.

中所述

使用 multiplication 运算符 * 可以获得所需的结果集,但该集将仅包含 by 子句中指定的标签。示例查询:

group by (namespace,pod) (kube_pod_labels{label_foo="bar",cluster="my-cluster"}) * sum by (namespace, pod) (kube_pod_container_resource_requests_cpu_cores{cluster="my-cluster"})

示例结果:

{namespace="my-ns",pod="my-pod"}    0.05

我想要获得的是一个包含所有标签的结果集,而不必通过任意 label/value

进行过滤

加入 2 个查询后的 期望 结果应该是:

{cluster="my-cluster",label_foo="bar", label_app="my-app-label",namespace="my-ns",pod="my-pod",service="my-svc"} 0.05

这可以通过以下组合来实现:

  • label_replace 查询函数:对于 v 中的每个时间序列,label_replace(v 即时向量,dst_label 字符串,替换字符串,src_label string, regex string) 将正则表达式 regex 与标签 src_label 的值相匹配。如果匹配,则 returned 时间序列中标签 dst_label 的值将与输入中的原始标签一起进行扩展替换。正则表达式中的捕获组可以用 $1、$2 等引用。如果正则表达式不匹配,则时间序列 returned 不变。 https://prometheus.io/docs/prometheus/latest/querying/functions/#label_replace

  • multiplication *运算符和group_left()修饰符:多对一和一对多匹配是指每个向量元素都在“一”上的情况- side 可以与“many”-side 上的多个元素匹配。这必须使用 group_left 或 group_right 修饰符明确请求,其中 left/right 确定哪个向量具有更高的基数。 https://prometheus.io/docs/prometheus/latest/querying/operators/

示例查询:

label_replace(kube_pod_labels{},"label","","label_", "(.+)") 
* on (cluster,namespace, pod) group_left() 
(sum by (cluster,namespace, pod) (kube_pod_container_resource_requests_cpu_cores{}))

注意:If the regular expression doesn't match then the timeseries is returned unchanged。在这种情况下,正则表达式不匹配 - 因此完整的标签集 return 未更改。

示例结果:

{cluster="my-cluster",label_foo="bar", label_app="my-app-label",namespace="my-ns",pod="my-pod",service="my-svc"} 0.05

Felipe 在对原始问题的评论中提供了有关如何实现此结果的宝贵提示。