I need to get the highest and average 95th percentile recorded over time in PromQL.
This query only gets the current 95th percentile.
histogram_quantile(
0.95,
sum(
rate(
istio_request_duration_milliseconds_bucket{destination_workload=~"service", reporter="source"}[1m]
)
) by (le, destination_workload)
)
Result: (current value)
Time destination_workload Value
... service 488
Because histogram_quantile outputs an instant vector, i cannot do a max_over_time() on it.
I tried this, but i get values less than 1 for some reason, and one value for each le bucket.
quantile_over_time(
0.95,
sum(
rate(
istio_request_duration_milliseconds_bucket{destination_workload=~"service", reporter="source"}[1m]
)
) by (le, destination_workload)[1m:]
)
Result: I don't know why the values are so tiny, or why it doesn't handle the buckets.
Time destination_workload le Value
... service 0.5 0
... service 1 0
... service 5 0
... service 10 0
...
... service 600000 0.167
We do not use Victoria Metrics.
How can i get the maximum and average 95th percentile recorded over a period of time.
Usually averaging the percentiles doesn't make sense. Here is a great article on this.
To get the max you could use:
To get the average you could use (_sum and _count metrics are provided by Histogram as well as _bucket):
Prometheus Subquery
If you really know what you're doing and you really need taking the max and the average on the calculated percentile, you could use the Subquery to get a range vector of calculated percentiles. The range vector in that case is a result of subsequent invocations of the instant-vector function (f.e.
histogram_quantile) for some duration (f.e. last5 min) with some resolution (f.e.each 1 min).Average 95p over last 5 min with the 1 min step:
Max 95p over last 5 min with the 1 min step: