如何在普罗米修斯中获得速率的分位数

Posted

技术标签:

【中文标题】如何在普罗米修斯中获得速率的分位数【英文标题】:How to get the quantile of rate in prometheus 【发布时间】:2020-07-12 17:01:00 【问题描述】:

我在看这个article

# TYPE prometheus_http_request_duration_seconds histogram
prometheus_http_request_duration_seconds_buckethandler="/",le="0.1" 25547
prometheus_http_request_duration_seconds_buckethandler="/",le="0.2" 26688
prometheus_http_request_duration_seconds_buckethandler="/",le="0.4" 27760
prometheus_http_request_duration_seconds_buckethandler="/",le="1" 28641
prometheus_http_request_duration_seconds_buckethandler="/",le="3" 28782

我不知道为什么

histogram_quantile(0.9, 
    rate(prometheus_http_request_duration_seconds_bucket[5m])
)

不会以observe event / second 为单位提供速率分位数,而是以second / observe event 为单位提供请求持续时间的分位数

rate(prometheus_http_request_duration_seconds_bucket[5m]

应该给你number of observe event in certain bucket / second 平均超过 5 分钟

我想histogram_quantile 会给你速率分位数

我一定是理解错了

【问题讨论】:

有一个可靠的例子解释histogram_quantilehere 【参考方案1】:

This 和 here 是 prometheus 中 historgram_quantile 的代码。

举个例子,

assumed the original bucket is :
[50][100][150][200][200] with corresponding upperbound 5s,10s,15s,20s,+Inf.

then the rate(xx[5m]) returned a bucket like this:
[20/5*60][40/5*60][60/5*60][80/5*60][80/5*60]

histogram_quantile will delegate the returned bucket to another function bucketQuantile.
It used the rough following logic to compute the percentile: 

1) get the total rank of the percentile 
such as 90ile is 0.9 * total counts = 0.9 * (80/5*60)
2) compute the value of 90ile
last upperbound before the total rank position is 15 secs;
current upperbound of the total rank is 20 secs;
the count in the bucket that 90ile position belongs is (80/5*60)-(60/5*60);
the internal rank in that single bucket of 90ile position is (0.9 * 80/5*60)-(60/5*60);
finally, the value of 90ile is: 15 sec + (internal rank / that bucket count) * (20sec-15sec) = 15 + 3 * ( (0.9 * 80/5*60)-(60/5*60) / (80/5*60)-(60/5*60) ) = 
15 + 3 * ( (0.9*80 - 60)/(80-60) ) = 15 + 3 * ( 12/20) = 15+3*0.6= 16.8 sec

就是这样,你可以看到分母5*60实际上对计算没有影响。所以 rate() 函数只是用来指定时间窗口 5 分钟。

【讨论】:

【参考方案2】:

rate() 函数用于指定分位数计算的时间窗口,如histogram_quantile() function 中所示。它翻译为“在过去 5 分钟内,我 90% 的用户体验到的最大 http 响应时间是多少?”

histogram_quantile() 函数通过假设桶内的线性分布来插入分位数值,le 给出最大观察时间。桶是一个计数器,用于测量自过程开始以来观察发生的次数。 rate() 通过计算每秒(平均)观察发生的次数来建立链接,从中可以插值时间窗口内的响应时间(平均)。

您是对的,因为平均值,它不是 100% 准确的度量,但是该函数做出了很多假设,并且桶的选择已经引入了偏差。

我猜你可以使用irate() 来计算瞬时分位数,但它可能会更嘈杂。

【讨论】:

以上是关于如何在普罗米修斯中获得速率的分位数的主要内容,如果未能解决你的问题,请参考以下文章

普罗米修斯获得整数计数

PromQL 查询以绘制传入请求的速率

我们如何在 prometheus 数据存储中获得高可用性?

在普罗米修斯中按年/月/日分组数据

window普罗米修斯监控如何重启

如何在普罗米修斯中公开 nginx 指标? [关闭]