我正在尝试找出延迟 SLO 的 PromQL,我们希望 90% 的请求在 1000 毫秒或更短时间内得到服务。
我可以通过以下方式获得请求的第 90 个百分位:
histogram_quantile( 0.90, sum by (le) ( rate(MyMetric_Request_Duration_bucket{instance="foo"}[1h]) ) )
我可以找到在 1000 毫秒或更短的时间内服务的 ALL 请求的百分比。
((sum(rate(MyMetric_Request_Duration_bucket{le="1000",instance="foo"}[1h]))) / (sum (rate(MyMetric_Request_Duration_count{instance="foo"}[1h])))) *100
是否可以将这些合并到一个查询中,告诉我在 1000 毫秒或更短的时间内服务的第 90 个百分位中的请求百分比是多少?
我尝试了最明显的(无论如何对我来说)解决方案,但没有得到任何数据。
histogram_quantile( 0.90, sum by (le) ( rate(MyMetric_Request_Duration_bucket{le="1000",instance="foo"}[1h]) ) )
目标是获得一个衡量标准,显示对于第 90 个百分位的请求,其中有多少请求低于 1000 毫秒?看起来这应该很简单,但我找不到允许我这样做的 PromQL 查询。
Prometheus 不提供可用于计算 histogram 存储桶在一秒内服务的请求的份额(也称为百分比)的函数。但是这样的功能存在于VictoriaMetrics中——这是我正在开发的类似Prometheus的监控系统。该函数是histogram_share()。例如,以下查询返回过去一小时内服务持续时间小于一秒的请求的份额:
histogram_share(1s, sum(rate(http_request_duration_seconds_bucket[1h])) by (le))
然后,当在一秒内服务的共享或请求下降到 90% 以下时,可以使用以下查询来发出警报:
histogram_share(1s, sum(rate(http_request_duration_seconds_bucket[1h])) by (le)) < 0.9
请注意,所有在直方图桶上工作的函数都会返回估计结果。它们的准确性很大程度上取决于所使用的直方图桶的边界。详情请参阅本文。
欢迎来到SO。
在所有请求中,有多少请求在 1000 毫秒内得到服务,发现我会将 1000 毫秒以下的请求总数除以请求总数。在我的 gcp 世界中,它会转换为如下查询:
你基本上是在测量你的
(sum(rate(istio_request_duration_milliseconds_bucket{reporter="destination",namespace="abcxyz",le="1000"}[1m]))/sum(rate(istio_request_duration_milliseconds_count{reporter="destination",namespace="abcxyz"}[1m])))*100
在 grafana 中使用上述查询设置图表后,您可以对低于 93 的任何内容设置警报,这样即使在达到 90% 的 SLO 之前您也会收到警报。
我知道我正在回复旧线程,但也许它仍然对某人有帮助。
我理解您想要构建一个 SLO,可以表述为:
一周内 99.9% 的时间里,第 90% 的请求延迟低于 1000 毫秒。
我添加了week部分,因为我还没有找到您的SLO被考虑的时间段。
我相信可以通过以下PromQL查询来解决:
avg_over_time(
(histogram_quantile(
0.9,
sum by (le) (rate(MyMetric_Request_Duration_bucket{instance="foo"}[1h]))
) <bool 1)[7d:]
) * 100
技巧在于它计算
90th
百分位数,然后对结果执行二进制量化。换句话说,它创建一个由 1
和 0
组成的向量,对应于何时满足目标值以及何时未满足目标值。然后,avg_over_time
函数生成良好样本与所有样本的比率。
我遇到了一个非常相似的问题。根据我的解决方案,我写了这篇文章。我已经发表了一些评论,说明为什么一般来说最好避免 SLO 中的百分位数。您可能会发现它很有趣:https://mkaz.me/blog/2024/slo-formulas-implementation-in-promql-step-by-step#formula-for-latency-slo-with-percentiles