Как в Spring Boot собрать перцентили времени ответа HTTP-запросов?
- Как настроить метрики задержки через Micrometer?
- Что такое p99?
Actuator + Micrometer уже пишут таймер **http.server.requests с метками uri (шаблон), method, status, outcome. Для перцентилей включают гистограмму** и считают квантили в Prometheus — так они корректно складываются по экземплярам.
management.metrics.distribution.percentiles-histogram.http.server.requests=truehistogram_quantile(0.99, sum by (le, uri) (rate(http_server_requests_seconds_bucket[5m])))- Готовые перцентили в приложении (
percentiles) нельзя усреднять между подами
А ещё p99 — время, быстрее которого укладываются 99% запросов
Подробно
Что есть из коробки. С spring-boot-starter-actuator и micrometer-registry-prometheus каждый запрос MVC/WebFlux записывается в таймер http.server.requests с метками uri (шаблон маршрута /orders/{id}, а не полный путь), method, status, outcome, exception. Экспорт — /actuator/prometheus.
Перцентили — два способа:
- гистограмма —
percentiles-histogram: trueпубликует счётчики по бакетам (_bucket{le=...}). Prometheus вычисляет любой квантиль и корректно агрегирует по всем экземплярам и маршрутам. Рекомендуемый путь; - клиентские перцентили —
percentiles: 0.5,0.95,0.99считаются в приложении и публикуются готовыми числами. Их нельзя складывать и усреднять между подами — математически бессмысленно.
Настройки: minimum-expected-value и maximum-expected-value или slo (свои границы бакетов, например 100ms, 300ms, 1s) — точнее и меньше рядов.
Свои таймеры: @Timed на методе или Timer.builder("payments.charge") — для внешних вызовов и бизнес-операций.
Осторожно с метками: только ограниченные значения. Полный URL или id пользователя в метке — миллионы временных рядов.
Смысл p99: 99% запросов быстрее этого значения. Смотрят p50, p95, p99 отдельно для успешных запросов и долю ошибок отдельно.
Пример
management:
endpoints.web.exposure.include: health,prometheus
metrics.distribution:
percentiles-histogram.http.server.requests: true
slo.http.server.requests: 100ms,300ms,1sЧто хотят услышать
- Метрика http.server.requests из коробки.
- Гистограммы и вычисление квантилей на стороне Prometheus.
- Почему нельзя усреднять готовые перцентили.
- Ограниченные метки, смысл p99.
Частые ошибки
- Усреднять p99 разных подов.
- Метка uri с полным путём вместо шаблона.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Вычислять p99 в каждом экземпляре через Micrometer и усреднять полученные значения в Grafana
- ✗Считать среднее время ответа в контроллере и писать в лог
- ✓Включить гистограмму http.server.requests и считать histogram_quantile в Prometheus
- ✗Добавить в метрику метку с id пользователя
Что спросят дальше
- Чем histogram отличается от timer?
- Какие RED metrics вы знаете?
Разбор темы
- Actuator и наблюдаемость
Production-эндпоинты, health-проверки и probes, метрики через Micrometer, трассировка и безопасность эндпоинтов.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.