You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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", "^([^-]+-[^-]+)-.*"
  )
)

关键细节解释

  1. label_replace函数的作用:
    这个函数会为每个时间序列新增一个pod_prefix标签,值是从原pod_name标签中提取出的目标前缀。
  2. 正则表达式解析:
    • ^([^-]+-[^-]+)-.*:
      • ^:匹配字符串的起始位置
      • ([^-]+-[^-]+):核心捕获组,专门匹配第二个横杠之前的所有内容:
        • [^-]+:匹配任意非横杠的字符序列,两个[^-]+用-连接,正好对应你需要的前缀(比如namespace1-eventstore、avsandbox-X)
      • -.*:匹配第二个横杠及之后的所有内容,这部分会被忽略,只保留捕获组的内容作为pod_prefix的值
  3. 聚合逻辑:
    最后通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:37:20