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

如何用PromQL获取30天内各命名空间与容器的聚合最大内存值

解决方法:获取30天内Namespace+Container的全局最大内存值

正确的PromQL语句

要直接拿到过去30天内每个namespace+container组合的全局最大值(而非时间序列),使用以下查询:

max by(namespace, container) (
  max_over_time(
    container_memory_working_set_bytes{
      container!~".*generic.*", 
      namespace=~"namespace-01|namespace-02"
    }[30d]
  )
)

如果需要转换为GB单位,可修改为:

max by(namespace, container) (
  max_over_time(
    container_memory_working_set_bytes{
      container!~".*generic.*", 
      namespace=~"namespace-01|namespace-02"
    }[30d]
  ) / 1024 / 1024 / 1024
)

为什么之前的方法出错

  1. 原始查询的问题
    你最初的max by(namespace, container) (container_memory_working_set_bytes...)是范围查询模式下的写法:Prometheus会按照min step间隔取每个时间点的瞬时内存值,再聚合该时刻的最大值,返回的是一段时间序列,而非全局最大值。不同min step会导致采样点不同,自然得到的"最大值"只是每个采样点的瞬时聚合,不是30天内的真正峰值。

  2. 带max_over_time([1d])的问题
    这个写法依然是范围查询模式:Prometheus会按min step间隔,每个时间点计算往前1天的内存最大值,返回的是按步长排列的每日最大值序列,不是30天的全局最大值。而且min step的设置会打乱窗口划分,导致结果行数异常。

正确的执行方式

  • 必须切换到瞬时查询(Instant)模式(比如Grafana Metrics Browser里选择「Instant」而非「Range」),不要设置时间范围。因为[30d]已经明确指定了要查询的时间窗口,瞬时查询会直接返回每个namespace+container组合在过去30天内的最大内存值,不会生成时间序列,也不受min step影响。
  • 确保你的Prometheus实例保留了至少30天的监控数据,否则max_over_time无法计算完整窗口的最大值。

额外说明

  • 这个查询会自动包含30天内所有同名namespace+container的实例(包括已销毁重建的Pod),因为max_over_time会遍历该标签组合下的所有历史时间序列,外层的max by会聚合所有实例的峰值,得到全局最大。

内容的提问来源于stack exchange,提问作者KohlmanJohnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:05:25