AFAICT 导致奇怪结果的原因是(1)您的计数器实际上每分钟只增加一次,即使您每 15 秒收集一次并结合(2)Prometheus 的rate()
实现丢弃每 4 个计数器增加(在您的特定设置中) .
更准确地说,您似乎正在计算 1 分钟的速率,每 1 分钟在以 15 秒分辨率抓取的计数器上计算,每 1 分钟增加一次(平均)。
这基本上意味着 Prometheus 基本上会将您的 1 小时间隔分成不相交的 1 分钟范围,并估计每个范围内的速率。第一个值是点 0 和 3 之间的外推增长率,第二个值是点 4 和 7 之间的外推率,依此类推。因为您的计数器实际上每分钟只增加一次,您可能会遇到两种不同的情况:
- 您的计数器增加发生在点对 3-4、7-8 等之间。在这种情况下,Prometheus 看到的增加率为零(因为点 0 和 3、点 4 和 7 等之间没有增加。这似乎发生在第一张图的前半部分。
- 您的计数器增加发生在点 0-3、4-7 等之间。在这种情况下,Prometheus 取每个间隔中最后一个点和第一个点之间的差异(您的实际计数器增加),将其除以两个点之间的时间差(平均 45 秒),然后将其推断为 1 分钟(基本上高估了 1 倍。(3)——我目测在 50 分钟内增加了约 200k,因此平均速率约为 67 QPS,而
rate()
返回接近 90 QPS 的东西)。这就是图表后半部分发生的情况。
这也是为什么您的图表在刷新时看起来大不相同的原因。当前实施的论点rate()
是它“平均而言是正确的”。如果您查看整个图表,跨越刷新,这是正确的。</讽刺>
本质上,用分辨率 R 绘制 Prometheusrate()
或increase()
时间范围 R 将导致混叠,高估(在您的情况下为 1.33 倍)或低估(在您的情况下为 0)除了平滑增加的计数器。
您可以通过将表达式替换为:
rate(foo[75s]) / 75 * 60
这样,您实际上将获得相隔 1 分钟的数据点之间的增长率(75 秒的范围几乎总是会准确返回 5 个点,因此计数器增加了 4 个)并将外推反转为 Prometheus 所做的 75 秒。在边缘情况下会有一些噪音(例如,如果您的评估与刮擦时间一致,则可能在一个范围内获得 6 分,在下一个范围内获得 4 分,因为刮擦间隔抖动)但无论如何您都会得到rate()
.
顺便说一句,您可以通过将图形的分辨率提高到 1 秒来查看混叠(任何 15 秒或以下都应该清楚地显示出来)。