如何通过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
相关产品推荐
相关产品推荐

