簡體   English   中英

根據 Prometheus 中的速率了解 histogram_quantile

[英]Understanding histogram_quantile based on rate in Prometheus

根據 Prometheus 文檔,為了使用直方圖指標獲得第 95 個百分點,我可以使用以下查詢:

histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

資料來源: https : //prometheus.io/docs/practices/histograms/#quantiles

由於直方圖的每個桶都是一個計數器,我們可以計算每個桶的比率為:

范圍向量中時間序列的每秒平均增長率。

請參閱: https : //prometheus.io/docs/prometheus/latest/querying/functions/#rate

因此,例如,如果桶值[t-5m] = 100 和桶值[t] = 200,則桶率[t] = (200-100)/(10*60) = 0.167

最后,最令人困惑的部分是 histogram_quantile 函數如何在知道所有桶率的情況下找到給定指標的第 95 個百分位數?

是否有任何代碼或算法可以讓我更好地理解它?

我相信是普羅米修斯中的代碼
一般的想法是,您使用存儲桶中的數據來推斷/近似分位數 Elasticsearch 在其匯總功能中也做了類似(但不同/簡單得多)的事情

您必須使用reset因為計數器可以重置, rate自動考慮重置並為您提供正確的每秒計數。 請記住,在使用計數器之前始終使用速率。

你可以在這里參考我的回復

實際上 rate() 函數只是用來指定時間窗口的,分母對百分位數的計算沒有影響。

一個可靠的例子將很好地解釋histogram_quantile

假設:

  • 為簡單起見,只有一個系列
  • 指標http_request_duration_seconds 10 個桶。

10ms、50ms、100ms、200ms、300ms、500ms、1s、2s、3s、5s

  • http_request_duration_secondsCOUNTER的度量類型
時間 價值 三角洲 rate(物品數量)
t-10m 50 不適用 不適用
t-5m 100 50 50 / (5*60)
200 100 100 / (5*60)
... ... ... ...
  • 我們至少有兩個系列的刮擦,覆蓋了 5 分鍾的rate()來計算每個桶的quantity

rate_xxx(t) = (value_xxx[t]-value_xxx[t-5m]) / (5m*60)[t-5m, t] quantity of items

  • 我們在這里查看 2 個樣本( value(t)value(t-5m) )。
  • 10000 http 請求持續時間( items ),即
    10000 = rate_10ms(t) + rate_50ms(t) + rate_100ms(t) + ... + rate_5s(t)
桶(樂) 10ms 50ms 100ms 200ms 300ms 500ms 1s 2s 3s 5s +信息
范圍 ~10ms 10~50ms 50~100ms 100~200ms 200~300ms 300~500ms 500ms~1s 1~2s 2s~3s 3~5s 5s~
rate_xxx(t) 3000 3000 1500 1000 800 400 200 40 30 5 5

桶是直方圖的本質。 我們只需要rate_xxx(t) 10 個數字來進行分位數計算

讓我們仔細看看這個表達式(為簡單起見,省略了sum()類的聚合)

histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

我們實際上正在尋找rate_xxx(t)bucket=10msbucket=+Inf 95%th項。 95%th表示這里的95%th 9500th ,因為我們總共有10000項目( 10000 * 0.95 )。
從上表中可以看出,在bucket=500ms之前總共有9300 = 3000+3000+1500+1000+800項。

所以第9500th項目是第200th項目( 9500-9300 )在bucket=500msrange=300~500ms )內得到了400項目

Prometheus 假設桶中的物品以線性模式均勻分布。
bucket=500ms 200th項的度量值為400ms = 300+(500-300)*(200/400)

也就是說, 95%400ms

有幾個要記住

  • 對於直方圖度量類型,度量本質上應該是COUNTER
  • 對於位數計算系列應該總是讓標簽le定義
  • 特定桶中的項目(數據)以線性模式均勻分布(例如:300~500ms)

普羅米修斯至少做出了這個假設

  • 分位數計算需要按升序/降序對桶進行排序(定義)(例如:1ms < 5ms < 10ms < ...)
  • histogram_quantile結果是一個近似值

PS:
由於假設Items (Data) in a specific bucket spread evenly a linear patternItems (Data) in a specific bucket spread evenly a linear pattern因此度量值並不總是accurate

假設, bucket=500ms ( range=300~500ms ) 中的實際最大持續時間(例如:來自 nginx 訪問日志)是310ms ,但是,我們將通過上述設置從histogram_quantile獲得400ms ,這有時會令人困惑。

桶距越小, approximation越准確。
因此,請設置適合您需要的鏟斗距離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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