普罗米修斯速率函数和区间选择

时间:2016-08-12 09:52:20

标签: prometheus

我正在与prometheus进行一些监控,并试图了解如何正确使用费率函数。

前提是这个;我有一个计数器,其配置设置为每15秒摄取一个新值。

现在我试图绘制每秒的速率图,所以使用率函数我这样做:

rate(pgbouncer_sent_bytes_total{job="pgbouncer", database="worker"}[1m])

当我解释费率函数时,查询将在每个查询的时间点给出一个滚动率平均值(在1米回看窗口中)。点数的间隔由所使用的分辨率指定。

下面是prometheus控制台的截图,包括原始数据图和上面使用1m分辨率的费率查询的图。现在,此处生成的费率图表与我在下图中查看原始数据的预期不符。

data graphs

有趣的是,根据加载的时间点,生成的图形看起来会有很大不同。只需重新加载相同的图形,随后几次就会完全将外观转移到一个甚至看起来不一致的程度,因为它代表相同的数据。下面的图像是几分钟之后的相同数据集,但是在相同的数据集之后几秒钟。

rate reloaded graph

有人可以了解这里真正发生的事情吗?

2 个答案:

答案 0 :(得分:12)

AFAICT导致奇怪结果的原因是(1)你的计数器实际上每分钟只增加一次,即使你每15秒收集一次,加上(2)普罗米修斯' rate()实施会在每次第4次增加时放弃(在您的特定设置中)。

更确切地说,你似乎计算1分钟的速度,每1分钟计算一次,以15秒的分辨率刮擦,每1分钟(平均)增加。

这意味着普罗米修斯基本上将你的1小时间隔切成不相交 1分钟的范围并估算每个范围内的比率。第一个值是点0和3之间的外推增长率,第二个值是点4和点7之间的外推速率,依此类推。因为您的计数器实际上每分钟只增加一次,所以您可以遇到两种不同的情况:

  1. 你的计数器增加发生在点对3-4,7-8等之间。在这种情况下,普罗米修斯看到增加率为零(因为0点和3点之间没有增加,点4和7等等。这似乎是将在第一张图的前半部分发生。
  2. 你的计数器增加发生在0-3,4-7之间的某个位置等等。在这种情况下,普罗米修斯得到每个区间中最后一个点和第一个点之间的差值(你的实际计数器增加),除以它之间的时间差。 2分(平均45秒),然后将其推断为1分钟(基本上高估了1倍。(3) - 我在50分钟内观察到增加〜200k,所以平均速度大约67 QPS,而rate()返回接近90 QPS的东西)。这就是图表后半部分的情况。
  3. 这也是您的图表在刷新时看起来截然不同的原因。当前实施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秒就刮一次吗?