基于Prometheus数据源,在Grafana中实现0起始的增量计数器展示
实现Grafana+Prometheus的0基准计数器增量展示(适配系统重启)
嘿,刚好我前段时间解决过完全一样的需求!要在Grafana里用Prometheus做0基准的计数器增量展示,不用rate(),还得适配系统重启的情况。下面给你直接能用的方案,分精准版和简化版,看你需求来选:
精准版:保证总增量准确(适配多次重启)
如果需要严格统计所选时间范围内的总写入字节数,哪怕中间系统重启多次,最终值都是准确的,用这个PromQL:
written_bytes - (last_over_time(written_bytes[$__range_start:$__range_start]) or vector(0)) + sum(resets(written_bytes[$__range_start:$__time])) * (last_over_time(written_bytes[$__range_start:$__range_start]) or vector(0))
逐段拆解逻辑:
$__range_start:Grafana自带的内置变量,自动对应你当前选中的时间范围起始时刻,不用手动算时间。last_over_time(written_bytes[$__range_start:$__range_start]):精准获取起始时刻的计数器值——用[start:start]的时间范围,确保哪怕起始时刻没有刚好的采样点,也能拿到最近的一条数据。or vector(0):兜底用的,如果起始时刻进程还没启动(比如系统是在你选的时段内重启的),就用0作为基准值,避免出现NaN。sum(resets(written_bytes[$__range_start:$__time])):统计从起始时刻到当前时刻的计数器重置次数(每次进程重启,计数器从0开始,就会触发一次重置)。- 最后那段加法:每次重置相当于之前的增量已经“独立”了,所以要把起始基准值加回来,保证重启后的增量计算不会出现负数,最终总增量是所有重启前后的增量之和。
举个实际例子你就懂了:
- 起始时刻t0:计数器值=10000
- t1时刻:计数器涨到15000,此时增量是15000-10000=5000
- t2时刻:进程重启,计数器重置为0,
resets返回1,计算结果是0-10000 +1*10000=0,和0基准要求一致 - t3时刻:计数器涨到500,计算结果是
500-10000 +1*10000=500,总增量就是5000+500=5500,完全准确
简化版:仅避免负数(适合无需精准总增量的场景)
如果你的场景只需要展示增量趋势,不用严格统计总写入量,重启后从0开始计数就行,用这个更简洁的写法:
max(written_bytes - (last_over_time(written_bytes[$__range_start:$__range_start]) or vector(0)), 0)
这个逻辑很简单:用max(...,0)把重启后可能出现的负数直接转为0,保证图表不会出现向下跳的异常线条,重启后从0开始继续展示增量。
Grafana配置小提示
- 确保你的Prometheus是2.0+版本(
resets函数是2.0之后才支持的,大部分场景都满足) - 图表选折线图或者面积图,开启填充效果的话,增量变化的过程会更直观
- 不用手动改任何变量,Grafana会自动把
$__range_start和$__time替换成你当前选的时间范围参数
内容的提问来源于stack exchange,提问作者Cristian T
相关产品推荐
相关产品推荐

