首页 > 解决方案 > 在 prometheus/grafana 中从零开始绘制计数器

问题描述

在普罗米修斯中,我有一个单调递增的计数器(在这种情况下,来自 IF-MIB 的 ifHCInOctets)。

在 Grafana 中,我可以使用简单的查询创建一个图表,ifHCInOctets{job='snmp',instance='$Device',ifDescr=~'eth0'}并通过在右上角选择所需的范围来查看在不同时间范围内绘制的计数器。

几乎正​​是我想要的。但是,我希望图表始终从零开始并从那里增加。用例是我想可视化我在一个月内的数据使用情况,以了解我接近数据上限的速度。(我已经使用函数创建了一个仪表对象,该increase(ifHCInOctets{...}[$__range])函数向我显示了在给定时间范围内我总共使用了多少,但我希望能够随着时间的推移可视化该使用情况。)

基本上,我想要ifHCInOctets 在范围开始时的值在哪里ifHCInOctets{...} - XX我的第一个想法是:

ifHCInOctets{...} - ifHCInOctets{...} offset $__range

但这似乎向我展示了每个数据点减去$__range它之前的数据点时间(而不是仅仅从所有点中减去起始值)。

然后我尝试使用查询创建一个查询变量并将其query_result(ifHCInOctets{...} offset $__range)设置为在时间范围更改时更新。这几乎似乎有效,但结果图似乎总是开始有点负面,这取决于选择的时间范围,这让我觉得它没有做我认为的那样。

我也尝试过各种形式的sum,sum_over_timeincrease, 都无济于事。

标签: grafanaprometheus

解决方案


你可能正在寻找这样的东西

ifHCInOctets
  -
min_over_time(
  (ifHCInOctets
    and
  (month(timestamp(ifHCInOctets)) == scalar(month(vector($__to / 1000)))))[31d:]
)

但它没有考虑计数器重置。而且是丑陋和低效的地狱。它基本上是当前值减去与min_over_timeGrafana$__to时间戳同月的前 31 天计算的样本数。

您可能希望基于此表达式设置记录规则(将年、月和日标签添加到度量标准),然后计算increase()任何给定月份(包括当前月份)的时间。这考虑了计数器重置和月初不存在的计数器。


推荐阅读