是否有可能聚合2个衡量指标(即kube_pod_labels
和kube_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在原始问题的评论中提供了如何实现此结果的有价值的提示。