聚合 2 个 PromQL 量规指标,不包括来自右操作数的额外标签
Aggregate 2 PromQL gauge metrics without including extra labels from right operand
是否可以聚合 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
我想要获得的是一个包含所有标签的结果集,而不必通过任意 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 在对原始问题的评论中提供了有关如何实现此结果的宝贵提示。
是否可以聚合 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
我想要获得的是一个包含所有标签的结果集,而不必通过任意 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_replacemultiplication *
运算符和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 在对原始问题的评论中提供了有关如何实现此结果的宝贵提示。