为什么在普罗米修斯中,increase()会返回1.33的值?

Jam*_*mes 9 prometheus

我们用时间序列图表sum(increase(foo_requests_total[1m]))来显示每分钟的foo请求数.请求很偶然 - 每天只有几个请求.图表中显示的值始终为1.3333.为什么价值不是1?在这一分钟内有一个请求.

在此输入图像描述

bri*_*zil 7

计算这个数字的挑战是我们在一个时间范围内只有一些数据点,并且它们往往不在该时间范围的确切开始和结束(这里是1分钟).我们如何处理时间范围的开始和第一个数据点之间的时间,类似于最后一个数据点和范围的结束?

我们做了一点推断,以便将其平滑并产生正确的聚合结果.对于像这样非常慢的移动计数器,它可能会导致伪影.

  • 如何绘制这种缓慢移动计数器的所有单次出现的正确方法是什么? (7认同)

val*_*ala 6

Prometheus按以下方式计算increase(foo_requests_total[1m])时间戳:t

  1. 它选择每个时间序列的所有原始样本,并foo_requests_total在时间范围上命名(t-1m ... t]。请注意,时间戳处的样本t-1m不包含在选择中,而时间戳处的样本t包含在选择中。
  2. 它计算所选时间范围内最后一个和第一个原始样本之间的差异d(Prometheus 也可能删除可能的计数器重置,但为了清楚起见,让我们跳过此步骤)。
  3. d如果第一个和/或最后一个原始样本距离所选时间范围的界限太远,它会推断出计算出的差异。

最后一步可能会导致increase()整数计数器上的小数值,如原始问题所示。请参阅此问题了解更多详细信息。另请注意,increase()在 Prometheus 中,会忽略所选时间范围内的第一个原始样本与所选时间范围之前的前一个样本之间的差异。这可能会导致小于预期的increase()结果。

Prometheus 开发人员将解决这些问题 - 请参阅此设计文档。同时尝试VictoriaMetrics - 它的increase()函数正确返回预期的整数结果,而无需对整数计数器进行任何外推。