请求延迟SLO计算

问题描述 投票:0回答:2

我需要通过直方图时间序列计算和绘制 Prometheus 上的延迟 SLO 图,但我未能成功在 Grafana 中显示直方图。 一个示例指标是 nginx 的请求时间。

假设如果我有一个像这样的直方图桶,

nginx_request_time_bucket(le=1) 1,
nginx_request_time_bucket(le=10) 2,
nginx_request_time_bucket(le=60) 2,
nginx_request_time_bucket(le=+inf) 5

我使用下面的表达式来验证延迟 SLO 。该表达式返回 10 秒内请求的百分比:

sum(rate(nginx_request_time_bucket{le="10"}[$__range])) / sum(rate(nginx_request_time_count[$__range]))

现在我怎样才能找到10秒到60秒内的请求百分比?我该如何计算?

下面的表述正确吗?

(
  sum(rate(nginx_request_time_bucket{le="10"}[$__range]))
+
  sum(rate(nginx_request_time_bucket{le="60"}[$__range]))
) / 2 / sum(rate(nginx_request_time_count[$__range])) 

非常感谢这里的任何帮助!

histogram prometheus grafana promql
2个回答
1
投票

所有

{le="10"}
请求也包含在
{le="60"}
中(以及所有更大的存储桶中),因此为了了解它们之间的请求量,您只需减去费率,例如:

(
  sum(rate(nginx_request_time_bucket{le="60"}[$__range]))
   - 
  sum(rate(nginx_request_time_bucket{le="10"}[$__range]))
)
/ sum(rate(nginx_request_time_count[$__range]))

应该可以。


0
投票

如果您需要根据Prometheus直方图绘制持续时间不超过某个阈值的请求份额的SLI / SLO图,那么Prometheus尚未提供所需的功能。

可以计算不超过预定义阈值的请求份额,该阈值等于通过

le
标签定义的直方图边界,如另一个答案所示:

sum(increase(nginx_request_time_bucket{le="10"}[1h]))
  /
sum(increase(nginx_request_time_bucket_count[1h]))

查询计算过去一小时内不超过 10 秒的请求的份额(在

[0 .. 1]
范围内)。

使用我工作的类似 Prometheus 的替代系统时,可以使用以下 MetricsQL 查询来计算任意阈值的请求的估计份额:

histogram_share(10, sum(increase(nginx_request_time_bucket[1h])) by (le))

此查询计算过去一小时内不超过 10 秒的请求的估计份额。请参阅 histogram_share() 文档

附注Prometheus 提供了 histogram_fraction 函数,可以用于类似上述计算的 SLI/SLO 计算。不幸的是,此函数不适用于传统的 Prometheus 直方图 - 它仅适用于实验性本机直方图

© www.soinside.com 2019 - 2024. All rights reserved.