18

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

前提是这样;我有一个计数器,它的配置设置为每 15 秒获取一次新值。

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

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

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

下面是来自 prometheus 控制台的屏幕截图,包括原始数据图和上面使用 1m 分辨率的速率查询的图。现在,此处生成的速率图与我对底部图中原始数据的期望并不完全相符。

数据图

有趣的是,根据加载的时间点,生成的图表看起来会非常不同。简单地在随后的几次重新加载相同的图表将完全改变外观到它甚至看起来不像代表相同数据的点。下图是几分钟后的相同数据集,但即使在几秒钟后也会发生同样的情况。

速率重新加载图

有人可以阐明这里到底发生了什么吗?

4

2 回答 2

27

AFAICT 导致奇怪结果的原因是(1)您的计数器实际上每分钟只增加一次,即使您每 15 秒收集一次并结合(2)Prometheus 的rate()实现丢弃每 4 个计数器增加(在您的特定设置中) .

更准确地说,您似乎正在计算 1 分钟的速率,每 1 分钟在以 15 秒分辨率抓取的计数器上计算,每 1 分钟增加一次(平均)。

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

  1. 您的计数器增加发生在点对 3-4、7-8 等之间。在这种情况下,Prometheus 看到的增加率为零(因为点 0 和 3、点 4 和 7 等之间没有增加。这似乎发生在第一张图的前半部分。
  2. 您的计数器增加发生在点 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 秒或以下都应该清楚地显示出来)。

于 2018-04-04T15:10:32.067 回答
2

你所说的与数据不符,原始数据每分钟只会增加一次。你确定你每15秒刮一次?

于 2016-08-12T10:09:30.223 回答