在 prometheus/grafana 中从零开始绘制一个计数器
Posted
技术标签:
【中文标题】在 prometheus/grafana 中从零开始绘制一个计数器【英文标题】:Graph a counter from zero in prometheus/grafana 【发布时间】:2020-02-12 16:34:27 【问题描述】:在普罗米修斯中,我有一个单调递增的计数器(在本例中是来自 IF-MIB 的 ifHCInOctets)。
在 Grafana 中,我可以使用简单的查询 ifHCInOctetsjob='snmp',instance='$Device',ifDescr=~'eth0'
创建一个图表,并通过在右上角选择所需的范围来查看在不同时间范围内绘制的计数器。
这几乎正是我想要的。但是,我希望图表始终从零开始并从那里增加。用例是我想可视化我在一个月内的数据使用情况,以了解我接近数据上限的速度。 (我已经使用increase(ifHCInOctets...[$__range])
函数创建了一个仪表对象,它显示了在给定时间范围内我总共使用了多少,但我希望能够随着时间的推移可视化该使用情况。)
基本上,我想要ifHCInOctets... - X
,其中X
是范围开头的ifHCInOctets 的值。我的第一个想法是:
ifHCInOctets... - ifHCInOctets... offset $__range
但这似乎显示每个数据点减去数据点 $__range
之前的时间(而不是仅仅从所有点中减去起始值)。
然后我尝试使用查询 query_result(ifHCInOctets... offset $__range)
创建一个查询变量,并将其设置为在时间范围更改时更新。这几乎似乎奏效了,但结果图似乎总是开始有点负面,这取决于选择的时间范围,这让我觉得它没有做我认为的那样。
我也试过各种形式的sum
、sum_over_time
、increase
,都无济于事。
【问题讨论】:
【参考方案1】:您可能正在寻找类似的东西
ifHCInOctets
-
min_over_time(
(ifHCInOctets
and
(month(timestamp(ifHCInOctets)) == scalar(month(vector($__to / 1000)))))[31d:]
)
但它没有考虑计数器重置。而且是丑陋和低效的地狱。它基本上是当前值减去在与 Grafana 的 $__to
时间戳相同月份的前 31 天的样本中计算得出的 min_over_time
。
您可能希望基于this expression(将年、月和日标签添加到指标)设置记录规则,然后计算任何给定月份(包括当前月份)的increase()
。这将计数器重置和月初不存在的计数器都考虑在内。
【讨论】:
哇,谢谢你的回答。不幸的是,它似乎并不完全奏效。该图肯定“下降”,但并非一直为零。我没想到这会这么复杂。也许我会忍受仪表。以上是关于在 prometheus/grafana 中从零开始绘制一个计数器的主要内容,如果未能解决你的问题,请参考以下文章
监控利器Prometheus——Prometheus+Grafana监控服务器资源
监控利器Prometheus——Prometheus+Grafana监控服务器资源