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

如何通过Grafana与PromQL实现按小时统计事件的单柱状图

解决方案

方法1:直接聚合去重(最省心)

因为target_full_counter里同一个timeBase对应的数值是固定的——毕竟是小时统计的事件数,每分钟重复上报的都是同一个数。所以直接按timeBase标签聚合取最大值就行,这样每个小时只会留下一条数据:

max by (timeBase) (target_full_counter)

用avg或者sum也一样,反正同一timeBase下所有样本值都相同。

在Grafana里这么配置:

  • 选择柱状图面板,查询格式用Time series即可
  • 无需额外转Table,Grafana会自动按timeBase分组,每个小时显示一根柱子
  • 要是想把timeBase作为X轴分类,去面板的Axes设置里把X轴模式改成Category,选timeBase当分类字段就行

方法2:处理实时更新的当前小时数据

如果当前小时的统计数还在动态变化(比如每分钟上报最新累计值),要取每个timeBase的最新样本,就结合last_over_time和聚合:

max by (timeBase) (last_over_time(target_full_counter[1h]))

[1h]的范围能覆盖当前小时内的所有样本,last_over_time会抓取每个时间序列的最后一个值,再按timeBase聚合去重,不会出现同一小时多条柱子的情况。

避免丢失当前小时数据的小技巧

  • 别强制设置minStep=1h,让Grafana自动适配时间范围即可
  • 可以在PromQL里加个时间范围过滤,只获取最近36小时的数据,刚好匹配你的数据保留周期:
max by (timeBase) (target_full_counter[36h])

这样既能保证数据不超期,也不会漏掉当前小时的最新数据。

可选优化:让X轴按时间自动排序

要是想让柱子按时间顺序排列,不用手动调整timeBase的顺序,可以把timeBase转换为标准时间戳:

label_replace(
  max by (timeBase) (target_full_counter),
  "timestamp",
  "$1 $2:00:00",
  "timeBase",
  "(\\d{4}-\\d{2}-\\d{2}) (\\d{2})"
)

然后去Grafana的Transform里选择Convert field type,把timestamp字段转为时间类型,再把X轴设为时间模式,柱子就会自动按时间顺序排列了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:00:08