如何使用 Prometheus 查询语言在一段时间内获得最高和平均 95% 的百分位数

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

我需要获得 PromQL 中随时间记录的最高和平均第 95 个百分位数。

此查询仅获取当前第 95 个百分位。

histogram_quantile(
  0.95, 
  sum(
    rate(
      istio_request_duration_milliseconds_bucket{destination_workload=~"service", reporter="source"}[1m]
    )
  ) by (le, destination_workload)
)

结果:(当前值)

Time    destination_workload    Value
...     service                 488

因为 histogram_quantile 输出即时向量,所以我无法对其执行 max_over_time() 。

我尝试过这个,但由于某种原因我得到的值小于 1,并且每个桶都有一个值。

quantile_over_time(
  0.95, 
  sum(
    rate(
      istio_request_duration_milliseconds_bucket{destination_workload=~"service", reporter="source"}[1m]
    )
  ) by (le, destination_workload)[1m:]
)

结果: 我不知道为什么这些值如此之小,或者为什么它不能处理桶。

Time    destination_workload    le         Value
...     service                 0.5        0
...     service                 1          0
...     service                 5          0
...     service                 10         0
...
...     service                 600000     0.167

我们不使用维多利亚指标。

我怎样才能获得一段时间内记录的最大和平均 95% 的百分位数。

prometheus promql percentile
1个回答
0
投票

通常对百分位数进行平均是没有意义的。这是关于此的一篇很棒的文章

要获得最大值你可以使用:

histogram_quantile(
  1, 
  sum(
    rate(
      istio_request_duration_milliseconds_bucket{destination_workload=~"service", reporter="source"}[1m]
    )
  ) by (le, destination_workload)
)

要获得平均值您可以使用(由直方图提供):

rate(istio_request_duration_milliseconds_sum{destination_workload=~"service", reporter="source"}[1m])
/
rate(istio_request_duration_milliseconds_count{destination_workload=~"service", reporter="source"}[1m])


如果您确实知道自己在做什么,并且确实需要计算计算百分位数的最大值和平均值,则可以使用子查询来获取计算百分位数的范围向量。

最后 5 分钟平均 95p,步长为 1 分钟:

avg_over_time(histogram_quantile(0.95, sum(rate(demo_api_request_duration_seconds_bucket[5m]))by(le))[5m:1m])

最后 5 分钟最多 95p,步长为 1 分钟:

max_over_time(histogram_quantile(0.95, sum(rate(demo_api_request_duration_seconds_bucket[5m]))by(le))[5m:1m])
© www.soinside.com 2019 - 2024. All rights reserved.