了解 prometheus 和 Grafana 在 http_server_requests_seconds_count 上使用的increase()和rate()

Chu*_*k94 11 spring grafana prometheus micrometer

我尝试从普罗米修斯获取这些测量值:

  1. increase(http_server_requests_seconds_count{uri="myURI"}[10s])
  2. increase(http_server_requests_seconds_count{uri="myURI"}[30s])
  3. rate(http_server_requests_seconds_count{uri="myURI"}[10s])
  4. rate(http_server_requests_seconds_count{uri="myURI"}[30s])

然后我运行一个 python 脚本,其中创建了 5 个线程,每个线程都访问此 myURI 端点:

我在 Grafana 上看到的是:

在此输入图像描述 在此输入图像描述

我收到了这些值:

  1. 0
  2. 6
  3. 0
  4. 0.2

我预计会收到这些(但没有):

  1. 5(如在过去 10 秒内该端点收到5呼叫)
  2. 5(如在过去 30 秒内该端点收到5 个呼叫)
  3. 0.5(10秒内终端接到5个呼叫5/10
  4. 0.167(终端在30秒内接到5个呼叫5/30

有人可以用我的例子解释这个函数背后的公式以及实现我期望的指标/值的方法吗?

val*_*ala 11

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

  1. 它获取存储在数据库中的原始样本,以在时间范围内进行时间序列匹配。请注意,时间戳处的样本不包含在时间范围内,而包含在时间范围内的样本。预计每个选定的时间序列都是一个计数器,因为仅适用于计数器。m(t-d .. t]t-dtincrease()
  2. 它针对每个时间序列匹配分别计算所选时间范围内最后一个和第一个原始样本值之间的差异m。请注意,Prometheus 不会考虑该(t-d ... t]时间范围之前的最后一个原始样本与该时间范围内的第一个原始样本之间的差异。在某些情况下,这可能会导致低于预期的结果
  3. 如果第一个和/或最后一个原始样本距离时间范围边界太远,它会推断在步骤 2 中获得的结果(t-d .. t]这可能会导致意想不到的结果。例如,整数计数器的小数结果。详情请参阅本期。

Prometheus 计算rate(m[d])increase(m[d]) / d,因此rate()有时结果也可能出乎意料。Prometheus 开发人员已经意识到这些问题并将最终修复它们 - 请参阅这些设计文档

同时,您可以使用 VictoriaMetrics - 这是我正在开发的类似 Prometheus 的监控解决方案。它提供了increase()rate()函数,这些函数没有上述问题。