如何在Prometheus中按Pod名称前缀(第二个横杠前)聚合内存数据?
解决方案:按Pod名称前缀(第二个横杠前)聚合内存使用
要实现按第二个横杠前的Pod名称前缀聚合求和,你可以利用Prometheus的label_replace函数结合正则表达式提取目标前缀,再基于新标签完成聚合计算。
最终可用的PromQL查询
sum by (pod_prefix) ( label_replace( container_memory_working_set_bytes{namespace="namespace1", image!="", name=~"^k8s_.*", kubernetes_io_hostname=~"^$Node$"}, "pod_prefix", "$1", "pod_name", "^([^-]+-[^-]+)-.*" ) )
关键细节解释
label_replace函数的作用:
这个函数会为每个时间序列新增一个pod_prefix标签,值是从原pod_name标签中提取出的目标前缀。- 正则表达式解析:
^([^-]+-[^-]+)-.*:^:匹配字符串的起始位置([^-]+-[^-]+):核心捕获组,专门匹配第二个横杠之前的所有内容:[^-]+:匹配任意非横杠的字符序列,两个[^-]+用-连接,正好对应你需要的前缀(比如namespace1-eventstore、avsandbox-X)
-.*:匹配第二个横杠及之后的所有内容,这部分会被忽略,只保留捕获组的内容作为pod_prefix的值
- 聚合逻辑:
最后通过sum by (pod_prefix)将相同前缀的Pod内存使用数据求和,得到你需要的聚合结果。
特殊情况兼容(可选)
如果集群中存在Pod名称不足两个横杠的情况(比如test-pod或singlepod),可以调整正则表达式,确保这类Pod的名称会被完整保留为前缀:
sum by (pod_prefix) ( label_replace( container_memory_working_set_bytes{namespace="namespace1", image!="", name=~"^k8s_.*", kubernetes_io_hostname=~"^$Node$"}, "pod_prefix", "$1", "pod_name", "^([^-]+(?:-[^-]+)?)(?:-.*)?" ) )
这个正则会智能匹配:
- 有两个及以上横杠的Pod:提取第二个横杠前的前缀
- 只有一个或没有横杠的Pod:直接使用完整的Pod名称作为前缀
内容的提问来源于stack exchange,提问作者Uliysess
相关产品推荐
相关产品推荐

