我正在与prometheus进行一些监控,并试图了解如何正确使用费率函数。
前提是这个;我有一个计数器,其配置设置为每15秒摄取一个新值。
现在我试图绘制每秒的速率图,所以使用率函数我这样做:
rate(pgbouncer_sent_bytes_total{job="pgbouncer", database="worker"}[1m])
当我解释费率函数时,查询将在每个查询的时间点给出一个滚动率平均值(在1米回看窗口中)。点数的间隔由所使用的分辨率指定。
下面是prometheus控制台的截图,包括原始数据图和上面使用1m分辨率的费率查询的图。现在,此处生成的费率图表与我在下图中查看原始数据的预期不符。
有趣的是,根据加载的时间点,生成的图形看起来会有很大不同。只需重新加载相同的图形,随后几次就会完全将外观转移到一个甚至看起来不一致的程度,因为它代表相同的数据。下面的图像是几分钟之后的相同数据集,但是在相同的数据集之后几秒钟。
有人可以了解这里真正发生的事情吗?
答案 0 :(得分:12)
AFAICT导致奇怪结果的原因是(1)你的计数器实际上每分钟只增加一次,即使你每15秒收集一次,加上(2)普罗米修斯' rate()
实施会在每次第4次增加时放弃(在您的特定设置中)。
更确切地说,你似乎计算1分钟的速度,每1分钟计算一次,以15秒的分辨率刮擦,每1分钟(平均)增加。
这意味着普罗米修斯基本上将你的1小时间隔切成不相交 1分钟的范围并估算每个范围内的比率。第一个值是点0和3之间的外推增长率,第二个值是点4和点7之间的外推速率,依此类推。因为您的计数器实际上每分钟只增加一次,所以您可以遇到两种不同的情况:
rate()
返回接近90 QPS的东西)。这就是图表后半部分的情况。这也是您的图表在刷新时看起来截然不同的原因。当前实施rate()
的论点是,平均而言是正确的#34;。如果你仔细查看整个图表,那么这是真的。 < /讽刺>
基本上在分辨率为R的时间范围R内绘制普罗米修斯rate()
或increase()
会导致混叠,或者过高估计(在您的情况下为1.33x)或低估(在您的情况下为零)但是一个平稳增加的反击。
您可以使用以下代码替换表达式来解决此问题:
rate(foo[75s]) / 75 * 60
通过这种方式,您实际上可以获得相隔1分钟的数据点之间的增长率(75秒范围几乎总是返回5个点,因此4个计数器增加)并将推断反转为Prometheus所做的75秒。在边缘情况下会有一些噪音(例如,如果您的评估与刮擦时间一致,则可能在一个范围内获得6个点而在下一个范围内可能获得4个由于刮擦间隔抖动)但是您正在获得该值无论如何rate()
。
顺便说一句,您可以通过将图表的分辨率提高到1秒(任何15秒或更短的时间应该清楚地显示)来看到锯齿。
答案 1 :(得分:2)
你所说的并不是与数据对齐,原始数据每分钟只上升一次。你确定你每15秒就刮一次吗?