PromQL:rate() 函数的用途是什么?

zer*_*gen 7 prometheus promql micrometer

我有一个关于 PromQL 及其查询函数rate() 以及如何正确使用它的问题。在我的应用程序中,我有一个线程正在运行,我使用 Micrometer 的计时器来监视线程的运行时间。使用 Timer 可以为您提供一个带有后缀 _count 的计数器和另一个带有后缀 _sum 所花费的秒数总和的计数器。例如 my_metric_sum 和 my_metric_count。

我的原始数据如下所示(抓取间隔 30 s,范围向量 5m):

在此输入图像描述

现在根据文档,https://prometheus.io/docs/prometheus/latest/querying/functions/#rate 计算范围向量中时间序列的每秒平均增长率(此处为 5m)。

现在我的问题是:我为什么想要那个?我的执行运行时间的相对变化对我来说似乎毫无用处。事实上,仅使用 sum/count 看起来更有用,因为它为我提供了每个时刻的平均绝对持续时间。同时,这就是让我困惑的地方,在我找到的文档中

要根据名为 http_request_duration_seconds 的直方图或摘要计算过去 5 分钟内的平均请求持续时间,请使用以下表达式:

速率(http_request_duration_seconds_sum[5m]) / 速率(http_request_duration_seconds_count[5m])

来源: https: //prometheus.io/docs/practices/histograms/

但据我了解文档,这个表达式似乎会计算请求持续时间的每秒平均增长率,即不是请求平均花费多长时间,而是请求持续时间平均改变了多少最后5分钟。

val*_*ala 14

该函数计算方括号中给定后视窗口上计数器度量rate(m[d])的增量,然后将增量除以。每个匹配时间序列独立执行计算。例如,假设有带有标签的指标: mddmhttp_requests_totalurl

http_requests_total{url="/foo"}
http_requests_total{url="/bar"}
Run Code Online (Sandbox Code Playgroud)

如果它们在某个时间具有以下值t0

http_requests_total{url="/foo"} 123
http_requests_total{url="/bar"} 456
Run Code Online (Sandbox Code Playgroud)

...以及以下时间值t0 + 5 minutes

http_requests_total{url="/foo"} 345
http_requests_total{url="/bar"} 789
Run Code Online (Sandbox Code Playgroud)

那么rate(http_requests_total[5m])时间的t0 + 5 minutes计算方式如下:

  1. 要计算和之间这些指标的增量t0t0 + 5 minutes
increase(http_requests_total{url="/foo"}[5m]) = 345 - 123 = 222
increase(http_requests_total{url="/bar"}[5m]) = 789 - 456 = 333
Run Code Online (Sandbox Code Playgroud)
  1. 将计算出的增量除以以5 minutes秒为单位的 ( 5*60s = 300s):
rate(http_requests_total{url="/foo"}[5m]) = 222 / 300 = 0.74
rate(http_requests_total{url="/bar"}[5m]) = 333 / 300 = 1.11
Run Code Online (Sandbox Code Playgroud)

因此,最终结果rate(http_requests_total[5m])是最后 5 分钟的每秒平均 rps,它是根据每个带有http_requests_total名称的时间序列单独计算的。

一些注意事项:

  • 计数器重置为零时, rate()increase()都可以正确处理例如。counter resets

  • 有时,Prometheus 可能会由于所选的数据模型rate()而返回意外的结果。increase()看到这个问题。这个问题在 VictoriaMetrics 中得到解决 - 我从事的类似 Prometheus 的监控系统 - 请参阅此评论这篇文章

  • 一些与 PromQL 兼容的查询引擎(例如MetricsQL)允许在使用函数时跳过方括号中的后视窗口rate()rate(http_requests_total)有效的 MetricsQL 查询也是如此。在这种情况下,它会在查询执行之前自动添加[$__interval]后视窗口。请参阅这些文档以了解更多详细信息。