Короткий ответ
histogram_quantile(phi, rate(..._bucket[5m])) оценивает процентиль latency (например, p95) на основе накопленных бакетов histogram за окно; важно учитывать, что результат — это приближение, зависящее от границ бакетов (le), и точность будет низкой, если реальное значение попадает между далеко расположенными границами бакетов.
Как это работает подробнее
histogram хранит несколько counter'ов-бакетов с кумулятивным количеством наблюдений, не превышающих заданную границу (le). histogram_quantile() линейно интерполирует внутри бакета, в который попадает искомый процентиль, поэтому точность оценки прямо зависит от того, насколько плотно расставлены границы бакетов вокруг реальных значений latency.
Пример кода
query.promql
# Корректная агрегация по бакетам перед расчётом квантиля
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{service="checkout"}[5m])) by (le)
)
# Разбивка по маршруту, чтобы найти "виновный" эндпоинт
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{service="checkout"}[5m])) by (le, route)
)Что использовать на практике
- Практика. при диагностике роста latency сначала смотрят общий p95/p99 по сервису, затем разбивают запрос по дополнительным labels (
by (route),by (instance)), чтобы понять, растёт latency везде равномерно (возможно, инфраструктурная причина — сеть, диск) или только на конкретном эндпоинте/инстансе (возможно, конкретный код или горячие данные). Если бакеты настроены плохо (например, границы0.1, 1, 10секунд при реальной latency 200–400 мс), оценка квантиля будет грубой — стоит пересмотретьbucketsв инструментации. - Практика. Если первый запрос показывает рост p99 с 300 мс до 3 секунд, а второй выявляет, что рост сосредоточен только в
route="/checkout/pay", это сразу сужает область расследования до конкретного эндпоинта, а не всего сервиса.
Подводные камни
- Частые ошибки. суммировать histogram_quantile с разных инстансов напрямую вместо агрегации на уровне бакетов через
sum(rate(...)) by (le)перед вызовомhistogram_quantile— усреднение уже посчитанных квантилей математически некорректно; не проверять_countи_sum, из-за чего можно пропустить, что резкий рост p99 вызван малым количеством запросов (единицы медленных запросов на фоне малого трафика, а не массовая деградация).