Histogram、Summary 笔记
背景
在大多數情況下人們都傾向于使用某些量化指標的平均值,例如CPU的平均使用率、頁面的平均響應時間。這種方式的問題很明顯,以系統API調用的平均響應時間為例:如果大多數API請求都維持在100ms的響應時間范圍內,而個別請求的響應時間需要5s,那么就會導致某些WEB頁面的響應時間落到中位數的情況,而這種現象被稱為長尾問題。
為了區分是平均的慢還是長尾的慢,最簡單的方式就是按照請求延遲的范圍進行分組。例如,統計延遲在0~10ms之間的請求數有多少而10~20ms之間的請求數又有多少。通過這種方式可以快速分析系統慢的原因。Histogram和Summary都是為了能夠解決這樣問題的存在,通過Histogram和Summary類型的監控指標,我們可以快速了解監控樣本的分布情況。
百分位數(quantile)
Prometheus中稱為quantile,其實叫percentile更準確。百分位數是指小于某個特定數值的采樣點達到一定的百分比。例如,假設0.9-quantile的值為120,意思就是所有的采樣值中,小于120的采樣值的數量占總體采樣值的90%。相應的,假設0.5-quantile的值為x,那么意思就是指小于x的采樣值占總體的50%,所以0.5-quantile也指中值(median)。
相對于簡單的平均值來說,百分位數更豐富,更能反應出真實的用戶體驗。常用的百分位數為0.5-quantile,0.9-quantile以及0.99-quantile。這也是Prometheus默認的設置。
注:這只是Prometheus中Summary目前版本的默認設置,在版本v0.10中,這些默認值會廢棄,意味著默認的Summary將沒有quantile設置。
Histogram也是Prometheus在client端支持的四種metrics類型之一。與Summary類似,每定義一個Histogram類型的metrics,實際也會生成幾個metrics。例如,
Histogram會產生下面6類metrics。后面4個可以用于計算quantile值。
http_request_duration_millisecond_count http_request_duration_millisecond_sum http_request_duration_millisecond_bucket http_request_duration_millisecond_bucket
Histogram主要是設置不同的bucket,采用值分別落入不同的bucket。例如上面第一個bucket就是響應時間小于10ms的采樣點的數量,第二個bucket就是響應時間小于50ms的采樣點的數量,依此類推。
注意后面的采樣點是包含前面的采用點的,例如xxx_bucket的值為30,而xxx_bucket的值為120,那么意味著這120個采用點中,有30個是小于10ms的,其余90個采樣點的響應時間是介于10ms和50ms之間的。
注意+Inf是最高bucket的上限值,所以xxx_bucket是所有采樣點的數量,是Prometheus自動增加的一個bucket。
計算quantile值直接用函數histogram_quantile即可,例如下面是計算0.9-quantile的值,
histogram_quantile(0.9, rate(http_request_duration_milliseconds_bucket[10m]))
上面會針對每種label組合計算出一個出一個0.9-quantile值,也就是對每個"path"會計算出一個值。如果要針對所有path計算出一個匯總的值,則用如下語句,
histogram_quantile(0.9, sum(rate(http_request_duration_milliseconds_bucket[10m])) by (le))
使用Histogram計算quantile值,最大的問題就是:因為Histogram采用了線性插值法,所以如果bucket設置不合理,那么最后計算出的值可能偏差比較大。例如在前面的例子中,假設0.9-quantile的結果在10ms~50ms之間,但是表達式必須返回一個具體的值,這時就采用線性插值法得出36ms。顯然這種方法計算出的值可能會有誤差,而且范圍越大,例如10ms ~ 500ms,那么誤差也會越大。
Summary和Histogram對比
Summary不能對quantile值進行aggregation操作,而Histogram則可以;所以如果針對多實例的場景計算quantile,只能使用Histogram;
如果histogram的bucket設置不合理,則最后誤差可能會很大;所以如果需要相對精確的結果,而且是單實例場景,那么就使用Summary;
Summary對quantile的計算是在client端通過第三方庫perks做的;而Histogram對quantile的計算則是server端完成的;
Summary計算出的quantile值是基于進程開始運行至今的所有采樣值計算出來的;而Histogram則是基于最近的一段時間的采樣值計算出來的,更符合monitoring系統的本質。
引用:https://cloud.tencent.com/developer/news/319419
總結
以上是生活随笔為你收集整理的Histogram、Summary 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论嵌入式与单片机,相爱相杀。
- 下一篇: 【C语言笔记】关于数组的一个陷阱!