Prometheus社区
作者Prometheus社区·2021-03-04 15:00
资深市场专员·Grandage

PromQL中Counter相关函数rate(), irate()与 increase() 的使用与区别

字数 2312阅读 1559评论 0赞 0

Counters(计数型)是Prometheus 的一种指标类型,其值只增不减,且代表累计的总计数,比如“总共已处理了多少请求?”或者“用了多少秒来处理请求?”由于counter的值取决于追踪和公开过程的初始(重新)启动时间,因此它的绝对值几乎是没有用的。所以在根据counter绘图或做任何事之前,通常要借助rate(), irate()或 increase() 函数来查看它的rate。

这三个函数的确切运行方式经常引起混淆,因此本文会详细介绍每一个函数,以及它们如何处理counter重置,对数据做出推断并得出最终值。需要注意的是,本文只涉及到以上提及的三个有关counter的函数,如果你想追踪Gauge指标的增长或下降,则需要使用delta() 或deriv() 函数,我们会在后续的文章中介绍它们。

综述

以下内容高度概况了三个函数计算counter增长率的差异:

rate()

此函数计算整个采样周期内每秒的增长率。

例如:rate(http_requests_total[5m]) 得出的是HTTP在5分钟窗口内,平均每秒的请求率。作为最常见的函数,它以可预测的每秒输出单位产生平滑的rate。

irate()

即 "瞬时rate",此函数和rate()一样,计算每秒的增长率,但只对规定采样周期内的最后两个样本进行计算,而忽略前面所有样本。

例如:irate(http_requests_total[5m]) 选取规定5分钟窗口内的最后两个样本,并计算两者之间每秒的增长率。如果想让一个放大的图形显示出对rate变化的快速响应,那这个函数就很有用,它呈现的结果会比rate()的有更多的峰值。

increase()

此函数和 rate() 完全一样,只是它没有将最终单位转换为 “每秒”(1/s)。每个规定的采样周期就是它的最终单位。

例如:increase(http_requests_total[5m]) 得出的是5分钟的采样周期内处理完成的HTTP请求的总增长量(单位1/5m)。因此increase(foo[5m])/ (5 * 60) 等同于rate(foo[5m])。

这三个函数都有一个共同的要求,就是它们在规定的采样周期中都需要有至少两个样本才能运行。少于两个样本的序列将从结果中删除。

如何精准计算在固定时间窗口和该窗口中一些数据点的增长是一个要权衡和不完美的近似值问题。Prometheus选择的方法是在所提供的采样周期中通过有限的数据,来提供平均下来最正确的答案。让我们来看看它是如何做到这点的。

数据外推

rate()和 increase()两个函数的外推经常让人混淆。例如,对于只有整数增量的counter,increase() 也可能返回非整数结果,如2.5883。这是因为increase() 是在规定时间窗口的总范围内得到counter增长量的近似值(比如increase(foo[5m])中的5分钟)。但实际上,时间窗口中的第一个和最后一个样本,永远不会与规定时间窗口的开始和结束100%重合。因此increase() (以及rate())会在窗口与窗口的界限中外推第一个和最后一个数据点之间的斜率,以得出一个平均而言更接近整个窗口内预期增长的数值(如果在窗口边界确实有样本)。

下图显示了一个使用 rate()的例子,窗口时间为1分钟,采样间隔为15秒,在窗口中发生了一次counter实际增加 1 的情况。

如图所示,报告结果是基于窗口中第一个和最后一个样本之间的斜率产生的(基本正确,可以参考下一节有关counter重置的内容),并外推到窗口边界处。

注意:这种外推是有一些例外的:当一个序列好像在规定的采样周期开始或结束时,我们不希望向该序列终止的方向外推太远。rate() 和 increase()函数推测,当第一个或最后一个样本距离各自的窗口边界大于窗口中样本之间平均间隔的1.1倍时,序列会在窗口中开始或结束。在这种情况下,外推只向窗口边界延伸半个平均样本区间,而不是全部。同样,函数会避免外推至负值,因为counter总是从0开始,永远不会是负值。相反,只有达到预期值0时,外推才会发生。

由于irate()只看两个样本间每秒的增长,所以它不做这种外推。

处理Counter重置

尽管counter一般只会叠加,但是当追踪它们的过程重置时,它们也会重置为0 。为了不把这些重置解释成实际的负rate,和counter相关的函数具有检测和处理这些重置的逻辑:如当在提供的时间窗口下迭代样本时,函数会检查是否有任何样本的值比前一个低,并将这种情况解释为counter重置。Counter在重置后总是从0开始,那么根据这个假设,这些函数只是将新的采样值加到之前看到的采样值上,以补偿重置。

下面这个图表显示了rate()的计算如何处理在规定的窗口中发生的counter重置。你可以把它想象成rate()从底层“真实 ”样本中创建了一组 “虚拟”样本。然后从虚拟样本中计算出最终的rate,就像重置从未发生过一样。

注意:当counter重置时,数据有可能在Prometheus最后一次拉取之后,重置之前增加。这些增量会被Prometheus永远丢失,且无法找回。为了尽量减少这种影响,重置应该只在一段时间内发生一次,而且要比Prometheus拉取目标数据的频率低。

小结

PromQL中各种counter相关函数的内部工作方式和输出方式可能会让你感到困惑。本文旨在阐明rate()、irate()和increase() 函数是如何处理单位、counter重置和外推的。希望能助你更好地理解它们细微的差别。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

相关文章

相关问题

相关资料

X社区推广