Prometheus 速率函数和区间选择

Posted

技术标签:

【中文标题】Prometheus 速率函数和区间选择【英文标题】:Prometheus rate functions and interval selections 【发布时间】:2016-12-19 07:03:20 【问题描述】:

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

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

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

rate(pgbouncer_sent_bytes_totaljob="pgbouncer", database="worker"[1m])

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

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

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

有人能解释一下这里到底发生了什么吗?

【问题讨论】:

我还注意到速率计算是跳跃的,并且随着重新加载而变化。速率计算比仅查看间隔中第一次和最后一次测量的斜率更复杂 - 也许还应该提供另一种方法。 github.com/prometheus/prometheus/blob/master/promql/… 【参考方案1】:

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 取每个间隔中最后一个点和第一个点之间的差异(您的实际计数器增加),将其除以两个点之间的时间差2 分(平均 45 秒),然后将其推断为 1 分钟(基本上高估了 1 倍。(3)——我目测在 50 分钟内增加了约 20 万,所以平均速率约为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 秒或以下都应该清楚地显示出来)。

【讨论】:

这是对 rate() 函数底层动态的一个很好的解释?? 这是一个很好的解释。我还发现 Rate 结果非常不直观。关于为什么速率的行为方式以及(可悲)为什么 Prometheus 不考虑修复它/在此处提供更直观的替代方案,有一些冗长的讨论:github.com/prometheus/prometheus/issues/3746【参考方案2】:

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

【讨论】:

是的,但是在放大时会变得更加明显。这也将产生简单地扩大范围选择/分辨率将解决它。它不是。我包含了一个示例系列,我拥有的所有系列都存在同样的问题。 问题是你的抓取。 1 分钟的刮擦间隔加上 1 分钟的行程将非常容易受到比赛的影响。

以上是关于Prometheus 速率函数和区间选择的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus 速率函数输出为整数

GKE 和 prometheus 监控

prometheus部署

prometheus部署

Prometheus学习之安装

Prometheus学习之安装