Prometheus Label Join

Label Join 是通过 PromQL 将两个时间序列按某些标签进行匹配,并把一方的标签附加到另一方指标上的过程。

常用于:

  • 把某个标签从一个 metric 扩展到另一个 metric
  • 通过 namespace、pod、node 等共有字段连接两个指标

Label Join 核心语法

1
2
3
4
<left_metric>
* on(<join_labels>)
group_left(<extra_labels>)
<right_metric>
1
2
3
4
<left_metric>
* on(<join_labels>)
group_right(<extra_labels>)
<right_metric>

核心在于 on(<join_labels>)group_left(<extra_labels>)

  • on(<join_labels>):可以理解为连接字段,也就是利用两个指标都存在且相同的标签进行连接
  • group_left(<extra_labels>):连接后,就可以将 <left_metric> 的额外标签附加到 <right_metric>

场景一

希望以产品维度来汇总监控信息。由于同一个产品可能会部署在集群的不同命名空间中,因此需要在相关监控指标中额外添加一个 product_name 的 label,这样在 Grafana 中就可以通过 product_name 统一筛选出该产品对应的所有 namespace、Pod 等资源的监控数据。

针对这个需求,可以通过 kube_namespace_labelsLabel Join 解决。

kube_namespace_labels 来自于 kube-state-metrics,而 kube-state-metrics 在高版本默认不收集此类指标,相关 Issue:https://github.com/kubernetes/kube-state-metrics/issues/2297

所以需要给 kube-state-metrics 添加下面的参数进行收集:

1
- '--metric-labels-allowlist=namespaces=[*]'

此时已经有了 kube_namespace_labels,然后给 namespace 添加额外的 label:

1
2
kubectl label namespaces cattle-logging-system product_name=suse
kubectl label namespaces cattle-monitoring-system product_name=suse

然后就可以进行 Label Join 查询,例如获取属于 SUSE 产品命名空间的所有 Pod 信息:

1
2
3
4
kube_pod_info
* on(namespace)
group_left(label_product_name)
kube_namespace_labels{label_product_name="suse"}

Author

Warner Chen

Posted on

2025-06-11

Updated on

2025-06-11

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.