如何用PromQL计算90分位请求中延迟≤1000ms的占比?
实现延迟SLO的正确PromQL方案
你要的是验证90%的请求响应时间不超过1000ms的SLO,之前的错误在于误解了查询逻辑,且用不完整的直方图桶计算分位数导致无数据返回。下面给你两种直接可用的方案:
方案一:直接判断90分位延迟是否达标
计算整体请求的90分位延迟,判断其是否≤1000ms,返回1表示满足SLO,0表示不满足:
histogram_quantile(0.90, sum by (le) (rate(MyMetric_Request_Duration_bucket{instance="foo"}[1h]))) <= 1000
方案二:计算达标请求占比并验证是否≥90%
用你之前写的达标请求占比查询,直接和90%(0.90)做比较,同样返回1/0表示是否达标:
(sum(rate(MyMetric_Request_Duration_bucket{le="1000",instance="foo"}[1h])) / sum(rate(MyMetric_Request_Duration_count{instance="foo"}[1h]))) >= 0.90
如果需要查看具体的达标占比数值,去掉后面的>= 0.90即可。
为什么你之前的合并查询无数据?
histogram_quantile要求第二个参数必须是完整的直方图bucket序列(包含所有le值,直到+Inf的桶),你只过滤了le="1000"的桶,数据不完整无法构建完整分布曲线,自然计算不出分位数。而且你想要的“90分位请求中延迟≤1000ms的占比”逻辑和SLO需求不符——SLO核心是“90%的请求延迟不超过1000ms”,上面两个方案已直接命中这个需求。
内容的提问来源于stack exchange,提问作者Scott Napolitan
相关产品推荐
相关产品推荐

