1

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

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

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

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

1 回答 1

3

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

  • label_replace查询函数:对于 v 中的每个时间序列,label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string) 将正则表达式 regex 与标签 src_label 的值匹配。如果匹配,则返回的时间序列中标签 dst_label 的值将是替换的扩展,以及输入中的原始标签。正则表达式中的捕获组可以使用 $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 在对原始问题的评论中提供了有关如何实现此结果的宝贵提示。

于 2021-08-12T10:32:03.600 回答