我需要通过直方图时间序列计算和绘制 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]))
非常感谢这里的任何帮助!
所有
{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]))
应该可以。
如果您需要根据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 直方图 - 它仅适用于实验性本机直方图。