为什么 increase() return 在 prometheus 中的值为 1.33?
Why does increase() return a value of 1.33 in prometheus?
我们用 sum(increase(foo_requests_total[1m]))
绘制时间序列图,以显示每分钟的 foo 请求数。请求很少出现——每天只有几个请求。图表中显示的值始终为 1.3333。为什么值不是1?这一分钟内有一个请求。
计算这个数字的挑战在于我们在一个时间范围内只有几个数据点,而且它们往往不在该时间范围的确切开始和结束处(此处为 1 分钟)。我们如何处理时间范围开始和第一个数据点之间的时间,同样最后一个数据点和范围结束之间的时间?
我们进行了一些外推来消除这一点并产生正确的聚合结果。对于像这样移动非常缓慢的计数器,它可能会导致伪影。
Prometheus 通过以下方式在时间戳 t
处计算 increase(foo_requests_total[1m])
:
- 它选择时间范围
(t-1m ... t]
上名称为 foo_requests_total
的每个时间序列的所有原始样本。请注意,时间戳 t-1m
处的样本未包含在选择中,而时间戳 t
处的样本包含在选择中。
- 它计算所选时间范围内最后一个和第一个原始样本之间的差异
d
(Prometheus 也可能会删除可能的计数器重置,但为了清楚起见,我们跳过这一步)。
- 如果第一个 and/or 最后一个原始样本距离所选时间范围的边界太远,它会推断计算出的差异
d
。
最后一步可能会导致整数计数器的小数 increase()
值,如原始问题中所示。有关详细信息,请参阅 this issue。另请注意,Prometheus 中的 increase()
忽略了所选时间范围内的第一个原始样本与所选时间范围之前的前一个样本之间的差异。这可能会导致 increase()
结果小于预期。
Prometheus 开发人员将解决这些问题 - 请参阅 this design doc. In the mean time try VictoriaMetrics - its increase() 正常运行 returns 预期的整数结果,无需对整数计数器进行任何外推。
我们用 sum(increase(foo_requests_total[1m]))
绘制时间序列图,以显示每分钟的 foo 请求数。请求很少出现——每天只有几个请求。图表中显示的值始终为 1.3333。为什么值不是1?这一分钟内有一个请求。
计算这个数字的挑战在于我们在一个时间范围内只有几个数据点,而且它们往往不在该时间范围的确切开始和结束处(此处为 1 分钟)。我们如何处理时间范围开始和第一个数据点之间的时间,同样最后一个数据点和范围结束之间的时间?
我们进行了一些外推来消除这一点并产生正确的聚合结果。对于像这样移动非常缓慢的计数器,它可能会导致伪影。
Prometheus 通过以下方式在时间戳 t
处计算 increase(foo_requests_total[1m])
:
- 它选择时间范围
(t-1m ... t]
上名称为foo_requests_total
的每个时间序列的所有原始样本。请注意,时间戳t-1m
处的样本未包含在选择中,而时间戳t
处的样本包含在选择中。 - 它计算所选时间范围内最后一个和第一个原始样本之间的差异
d
(Prometheus 也可能会删除可能的计数器重置,但为了清楚起见,我们跳过这一步)。 - 如果第一个 and/or 最后一个原始样本距离所选时间范围的边界太远,它会推断计算出的差异
d
。
最后一步可能会导致整数计数器的小数 increase()
值,如原始问题中所示。有关详细信息,请参阅 this issue。另请注意,Prometheus 中的 increase()
忽略了所选时间范围内的第一个原始样本与所选时间范围之前的前一个样本之间的差异。这可能会导致 increase()
结果小于预期。
Prometheus 开发人员将解决这些问题 - 请参阅 this design doc. In the mean time try VictoriaMetrics - its increase() 正常运行 returns 预期的整数结果,无需对整数计数器进行任何外推。