[英]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 個百分位數?
是否有任何代碼或算法可以讓我更好地理解它?
您必須使用reset
因為計數器可以重置, rate
自動考慮重置並為您提供正確的每秒計數。 請記住,在使用計數器之前始終使用速率。
你可以在這里參考我的回復
實際上 rate() 函數只是用來指定時間窗口的,分母對百分位數的計算沒有影響。
一個可靠的例子將很好地解釋histogram_quantile
。
假設:
http_request_duration_seconds
10 個桶。10ms、50ms、100ms、200ms、300ms、500ms、1s、2s、3s、5s
http_request_duration_seconds
是COUNTER
的度量類型時間 | 價值 | 三角洲 | rate(物品數量) |
---|---|---|---|
t-10m | 50 | 不適用 | 不適用 |
t-5m | 100 | 50 | 50 / (5*60) |
噸 | 200 | 100 | 100 / (5*60) |
... | ... | ... | ... |
rate()
來計算每個桶的quantity
rate_xxx(t) = (value_xxx[t]-value_xxx[t-5m]) / (5m*60)
是[t-5m, t]
quantity of items
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=10ms
到bucket=+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=500ms
( range=300~500ms
)內得到了400
項目
Prometheus 假設桶中的物品以線性模式均勻分布。
bucket=500ms
200th
項的度量值為400ms = 300+(500-300)*(200/400)
也就是說, 95%
是400ms
。
有幾個要記住
COUNTER
le
定義普羅米修斯至少做出了這個假設
histogram_quantile
結果是一個近似值 PS:
由於假設Items (Data) in a specific bucket spread evenly a linear pattern
的Items (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.