簡體   English   中英

PromQL:rate() function 是什么意思?

[英]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 minutesrate(http_requests_total[5m])

  1. 要計算t0t0 + 5 minutes之間這些指標的增量
increase(http_requests_total{url="/foo"}[5m]) = 345 - 123 = 222
increase(http_requests_total{url="/bar"}[5m]) = 789 - 456 = 333
  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

所以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM