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

PromQL中如何让<agg>_over_time()遵循指定分辨率并避免插值?

解决Prometheus中agg_over_time()插值问题,获取指定分辨率的单桶数据

要解决你的问题,核心是让last_over_time()处理离散的10分钟间隔序列,避免对短范围序列进行插值。

正确的当前10分钟桶查询

直接基于你原始的1小时6桶查询,用last_over_time()提取最后一个点即可:

last_over_time(
  sum(
    increase(istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m])
  )[1h:10m]
)

这个查询会返回单个无插值的10分钟桶数据,完全符合你的期望:

Time                      Value
2023-08-25 15:40:00           5

为什么之前的查询会插值?

你之前的子查询用了[10m:10m],仅生成了一个10分钟桶的点,但last_over_time()默认会使用Prometheus全局评估间隔(通常5秒)填充这个范围,导致大量重复的插值数据。而用[1h:10m]作为子查询的范围步长,会生成和原始查询一致的6个离散10分钟点,last_over_time()只取最后一个,自然不会产生插值。

结合基线计算的完整方案

要对比当前桶与过去5个桶的基线,可复用同一个范围向量查询:

  1. 当前10分钟流量:
    last_over_time(
      sum(increase(istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m]))[1h:10m]
    )
    
  2. 过去5个桶的平均值:
    avg_over_time(
      sum(increase(istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m]))[1h:10m] offset 10m
    )
    
  3. 过去5个桶的最小值:
    min_over_time(
      sum(increase(istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m]))[1h:10m] offset 10m
    )
    

告警规则示例(流量突降检测)

如果要实现“当前值低于过去最小值时自抑制,除非进一步恶化”的逻辑,可编写如下规则:

expr: 
  last_over_time(sum(increase(istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m]))[1h:10m]) 
  < 
  min_over_time(sum(increase(istio_requests_total{destination_workload="service-v1", reporter="source"}[10m:10m]))[1h:10m] offset 10m) * 0.5
for: 0m
labels:
  severity: warning
annotations:
  summary: 服务流量突降
  description: 当前10分钟流量({{ $value }})已低于过去5个10分钟桶最小值的50%

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:00:34