[英]PromQL: What is rate() function meant for?
我對 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分鍾。
雖然我對 Micrometer Timer 不熟悉,但您描述的指標是 Summary 類型。 它在_count
中計算“事件”,並在_sum
中對事件大小(如持續時間、經過的時間等)求和。 如果您現在執行rate(metric_count[5m])
,您將獲得每秒 5m 的平均事件速率。 如果你想知道這些事件在 5m window 內的平均持續時間,你可以做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])
。
rate(m[d])
function 計算計數器度量m
在方括號中給定后視 window d
的增量,然后將增量除以d
。 每個匹配時間序列m
獨立執行計算。 例如,假設有帶有url
label 的http_requests_total
指標:
http_requests_total{url="/foo"}
http_requests_total{url="/bar"}
如果它們在時間t0
具有以下值:
http_requests_total{url="/foo"} 123
http_requests_total{url="/bar"} 456
...以及時間t0 + 5 minutes
的以下值:
http_requests_total{url="/foo"} 345
http_requests_total{url="/bar"} 789
然后按以下方式計算時間t0 + 5 minutes
的rate(http_requests_total[5m])
:
t0
和t0 + 5 minutes
之間這些指標的增量:increase(http_requests_total{url="/foo"}[5m]) = 345 - 123 = 222
increase(http_requests_total{url="/bar"}[5m]) = 789 - 456 = 333
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
所以rate(http_requests_total[5m])
的最終結果是過去 5 分鍾的每秒平均 rps,它是按每個時間序列以http_requests_total
名稱單獨計算的。
幾點注意事項:
當計數器重置為零時, rate()和increase()都可以正確處理例如counter resets
。
有時,由於所選數據 model,Prometheus 可能會從rate()
和increase()
返回意外結果。 看到這個問題。 這個問題在 VictoriaMetrics - 我工作的類似 Prometheus 的監控系統中得到了解決 - 請參閱此評論和本文。
一些與 PromQL 兼容的查詢引擎(例如MetricsQL)允許在使用rate()
function 時跳過方括號中的后向 window,因此rate(http_requests_total)
是一個有效的 MetricsQL 查詢。 在這種情況下,它會在查詢執行之前自動在 window 后面添加[$__interval]
。 有關更多詳細信息,請參閱這些文檔。
首先 - 使用與您的用例相匹配的工具。
其次 - 無論您選擇什么,驗證數據。 最好現在就這樣做,而不是在停機期間或與憤怒的客戶/用戶在一起。
第三個_count
和_bucket
是直方圖和摘要的特征。 采樣頻率在這里並不重要,只要它小於rate()
function 的[5m]
分組。
該速率只是為您提供“在這五分鍾內發生了多少次事件 ( [5m]
) 的數據點。
一般說明 - Prometheus 中的rate()
概念引起了很多混亂。 太多人之間爭論不休。 他們可能應該把它叫做別的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.