Получить доступ

Как в Spring Boot собрать перцентили времени ответа HTTP-запросов?

MiddleSpring Boot и ActuatorSpring Boot
Ещё спрашивают так:
  • Как настроить метрики задержки через Micrometer?
  • Что такое p99?
Коротко

Actuator + Micrometer уже пишут таймер **http.server.requests с метками uri (шаблон), method, status, outcome. Для перцентилей включают гистограмму** и считают квантили в Prometheus — так они корректно складываются по экземплярам.

  • management.metrics.distribution.percentiles-histogram.http.server.requests=true
  • histogram_quantile(0.99, sum by (le, uri) (rate(http_server_requests_seconds_bucket[5m])))
  • Готовые перцентили в приложении (percentiles) нельзя усреднять между подами

А ещё p99 — время, быстрее которого укладываются 99% запросов

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Что есть из коробки. С 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 с полным путём вместо шаблона.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Метрика http.server.requests уже есть в Actuator; включить гистограмму (management.metrics.distribution.percentiles-histogram) и считать перцентили в Prometheus через histogram_quantile
  • ✗Считать среднее время ответа в контроллере и писать в лог
  • ✗Вычислять p99 в каждом экземпляре и усреднять значения в Grafana
  • ✗Добавить в метрику метку с id пользователя

Что спросят дальше

  • Чем histogram отличается от timer?
  • Какие RED metrics вы знаете?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем