Prometheus Label Join
Label Join
是通过 PromQL 将两个时间序列按某些标签进行匹配,并把一方的标签附加到另一方指标上的过程。
常用于:
- 把某个标签从一个 metric 扩展到另一个 metric
- 通过 namespace、pod、node 等共有字段连接两个指标
Label Join 核心语法
1 | <left_metric> |
1 | <left_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_labels
和 Label 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 | kubectl label namespaces cattle-logging-system product_name=suse |
然后就可以进行 Label Join
查询,例如获取属于 SUSE 产品命名空间的所有 Pod 信息:
1 | kube_pod_info |
Prometheus Label Join
https://warnerchen.github.io/2025/06/11/Prometheus-Label-Join/
install_url
to use ShareThis. Please set it in _config.yml
.