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



是否有可能聚合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

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

进行过滤连接两个查询的结果应该是:

{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的instant-vector, dst_label字符串,replacement字符串,src_label字符串,regex字符串)将正则表达式regex与标签src_label的值进行匹配。如果匹配,则返回的时间序列中的标签dst_label的值将是replacement的扩展,以及输入中的原始标签。正则表达式中的捕获组可以用$1、$2等来引用。如果正则表达式不匹配,则返回时间序列不变。https://prometheus.io/docs/prometheus/latest/querying/functions/label_replace

  • multiplication *运算符和group_left()修饰符:多对一和一对多匹配是指"单"侧的每个向量元素可以与"多"侧的多个元素匹配。这必须使用group_left或group_right修饰符显式请求,其中左/右决定哪个向量具有更高的基数。https://prometheus.io/docs/prometheus/latest/querying/operators/

示例查询:

label_replace(kube_pod_labels{},"label","$1","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。在这种情况下,正则表达式不匹配-因此完整的标签集将原样返回。

结果示例:

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

Felipe在原始问题的评论中提供了如何实现此结果的有价值的提示。

最新更新