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])) 背后的数学是啥