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

Posted

技术标签:

【中文标题】PromQL:rate() 函数的用途是啥?【英文标题】:PromQL: What is rate() function meant for?PromQL:rate() 函数的用途是什么? 【发布时间】:2021-03-31 15:52:08 【问题描述】:

我对 PromQL 及其查询函数 rate() 以及如何正确使用它有疑问。在我的应用程序中,我有一个线程正在运行,我使用 Micrometer 的 Timer 来监视线程的运行时间。使用 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 分钟内的平均请求持续时间,请使用以下表达式:

rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])

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

但据我了解文档,看起来这个表达式会计算请求持续时间的每秒平均增长率,即不是请求平均需要多长时间,而是请求持续时间改变了多少过去 5 分钟的平均值。

【问题讨论】:

【参考方案1】:

虽然我不熟悉千分尺计时器,但您描述的指标是摘要类型。它计算_count 中的“事件”,并将_sum 中的事件大小(如持续时间、经过时间等)相加。 如果您现在执行rate(metric_count[5m]),您将获得平均每秒 5m 的事件速率。如果你想知道这些事件在 5m 窗口内的平均持续时间,你可以 rate(metric_sum[5m]) / rate(metric_count[5m])。如果您尝试除以metric_sum/metric_count,您将获得所有时间(自计数器重置以来)平均值,而不是某个时间点的 5m 平均值。 在某种程度上,为此使用rate() 看起来有点有趣。使用increase() 对我来说似乎更直观,但从数学上讲,它与rate() 完全相同,只是increase()/range,因此这些范围在rate(metric_sum[5m]) / rate(metric_count[5m]) 中相互抵消。

【讨论】:

【参考方案2】:

首先 - 使用与您的用例相匹配的工具。

第二 - 无论您选择什么,验证数据。最好现在就这样做,而不是在停机或愤怒的客户/用户面前这样做。

第三 - _count_bucket直方图摘要的特征。采样频率在这里并不重要,只要它小于rate() 函数的[5m] 分组即可。

速率只是为您提供“在这五分钟内发生了多少次事件 ([5m]) 的数据点。

一般说明 - Prometheus 中的rate() 概念引起了很多混乱。太多人之间争论不休。他们可能应该叫它别的名字。

【讨论】:

以上是关于PromQL:rate() 函数的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PromQL 中 histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m])) 背后的数学是啥

JavaScript 中嵌套函数的需求和用途是啥

swift中嵌套函数的实际用途是啥? [复制]

PromQL 中的 MetricQL 函数

PromQL 内置函数

Kotlin 中这些东西的用途是啥?