我正在使用普罗米修斯进行一些监视,并试图了解如何正确使用费率函数。前提是这个;我有一个计数器,为此配置将其设置为每15秒接收一次新值。现在,我试图以图形显示每秒的速率,因此使用速率函数将其执行为:rate(pgbouncer_sent_bytes_total{job="pgbouncer", database="worker"}[1m])在解释速率函数时,查询将为我提供所查询的每个时间点的滚动速率平均值(在1m后向窗口中)。点的间隔由使用的分辨率指定。下面是Prometheus控制台的屏幕截图,包括原始数据图和上面使用1m分辨率的速率查询得出的图。现在,在底部的原始数据中,此处得出的费率图与我的预期不符。 有趣的是,生成的图形根据加载的时间点看起来会非常不同。只需在随后的几次中重新加载相同的图形,就可以将外观完全转移到一个甚至看起来都不像的位置,因为它代表了相同的数据。下图是几分钟后的同一数据集,但即使几秒钟后也会发生相同的情况。有人可以阐明这里的实际情况吗? 最佳答案 AFAICT产生怪异结果的原因是(1)即使您每15秒收集一次计数器,实际上您的计数器实际上每分钟只会增加一次,而且(2)Prometheus的rate()实现会丢弃每第4次计数器增加(在您的计数器中特定设置)。更精确地说,您似乎正在以1秒的速率计算,在以15秒分辨率抓取的计数器上每1分钟计算一次,平均每1分钟增加一次。这实际上意味着Prometheus将把您的1小时间隔基本上切成不相交的1分钟范围,并估算每个范围的速率。第一个值是点0和点3之间的外推增长率,第二个值是点4和点7之间的外推速率,依此类推。因为您的计数器实际上实际上每分钟才增加一次,所以您会遇到两种不同的情况:您的计数器增加发生在点对3-4、7-8等之间。在这种情况下,普罗米修斯看到的增加率为零(因为在点0和3,点4和7等之间没有增加。这似乎发生在第一张图表的前半部分。您的计数器增加发生在0-3、4-7等点之间。在这种情况下,Prometheus取每个间隔中最后一个点与第一个点之间的差(您的实际计数器增加),将其除以2个点之间的时间差(平均45秒),然后将其推断为1分钟(实际上高估了1分之一。(3)-我的目光是在大约50分钟的时间内增加200,000千,因此平均速率约为67 QPS,而rate()返回的值接近90 QPS)。这就是图表的后半部分。这也是为什么您的图表在刷新之间看起来截然不同的原因。当前rate()实现的参数是“平均正确”。如果跨刷新查看整个图形,那是正确的。 从本质上讲,在分辨率为R的时间范围R内绘制Prometheus rate()或increase()会导致混叠,要么高估(在您的情况下为1.33倍),要么低估(在您的情况下为零),而不是平滑增加计数器。您可以通过以下方式解决您的问题:rate(foo[75s]) / 75 * 60这样,您实际上将获得相隔1分钟的数据点之间的增长率(75秒的范围几乎总是返回准确的5点,因此计数器增加4),并将外推值反转为Prometheus的75秒。在边缘情况下会有一些噪音(例如,如果您的评估与抓取时间一致,则由于抓取间隔抖动而可能在一个范围内获得6分,在下一个范围内获得4分),但是无论如何您都可以通过rate()获得该点。顺便说一句,您可以通过将图形的分辨率提高到大约1秒(任何15秒或以下的时间应清楚显示)来查看混叠。关于prometheus - 普罗米修斯速率函数和区间选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38915018/
10-15 22:07