如何在Grafana中添加下采样变量,按指定时间聚合Prometheus计数器数据?
固定时间粒度聚合请求量的解决方案
问题根源
直接替换$__interval为自定义的1h/6h参数后结果不符合预期,是因为$__interval是Grafana根据面板时间范围和图表宽度自动计算的显示适配间隔,而你需要的是业务逻辑上的固定时间窗口聚合,两者逻辑完全不同:前者是为了让图表显示合适的点数,后者是要严格按指定粒度统计每个窗口的总请求量。
可行方案
方案1:通用PromQL实现(兼容Prometheus/VictoriaMetrics)
用sum_over_time统计固定窗口内的总请求,再通过round对齐时间戳,确保每个窗口只显示一个数据点:
sum by (model_id, rounded_time) ( sum_over_time(requests[$downsample]) ) |> round($downsample)
sum_over_time(requests[$downsample]):对每个时间序列,计算指定窗口内的请求增量总和(和increase等价,但更适合固定窗口场景)round($downsample):把数据点的时间戳对齐到你选择的粒度边界(比如1h的话,所有数据点都会落在整点)- 外层
sum by (model_id, rounded_time):按模型ID和对齐后的时间汇总,保证每个粒度窗口只有一个数据点
方案2:VictoriaMetrics专属高效实现
VictoriaMetrics提供了原生的rollup函数,比通用PromQL更高效,适合大规模数据:
sum by (model_id) ( rollup_sum(requests[$downsample]) )
rollup_sum(requests[$downsample]):直接按指定时间粒度对计数器做降采样求和,自动对齐时间窗口,性能优于通用函数- 外层
sum by (model_id):按模型ID汇总每个窗口的总请求量
变量配置步骤
- 在Grafana中创建名为
downsample的变量,类型选自定义 - 选项列表添加需要的时间粒度:
1h6h1d(按需扩展)
- 确保变量值是PromQL支持的时间格式(比如
1h、6h,可读性更好)
关键配置检查
- 进入面板编辑页的「查询选项」,把**最小间隔(Min interval)**设置为
$downsample,防止Grafana在你指定的粒度之外再进行二次采样,导致结果混乱 - 确认
requests是计数器类型(通常指标名带_total后缀),如果是 gauge 类型,需要调整函数为avg_over_time等对应逻辑
内容的提问来源于stack exchange,提问作者Nikola Borisov
相关产品推荐
相关产品推荐

