6. Сбор и визуализация метрик

[к списку решений]

Дата: 2025-01-24

Статус

Принято

Контекст

Для оценки качества работы кода требуется собирать метрики, такие как время выполнения запросов к БД,, потребление процессорного времени и памяти.

Решение

Для измерения скорости - Uptrace.

Для сбора внутренних метрик JVM - Prometheus и Grafana (cм. демо).

Что даст внедрение решения?

Возможность оценить работу всех подсистем проекта.

Варианты

Uptrace

[наверх]

Это популярное и мощное решение. На сайте производителя предлагается облачный вариант, но можно хостить самому, бесплатно. Uptrace накапливает метрики в ClickHouse, а метаданные метрик хранит в Postgres. Графики полезны тем, что отображаются не средние значения, а персентили1: p50, p90, p99. Это позволяет ответить, например, на вопрос, в какое время укладывается обработка 90% входящих запросов (p90), оставляя пики (10%) «за скобками». Соответственно бизнес-требования по скорости накладываются не на 100% запросов, что технически невозможно гарантировать, а на 90% или на 99%. Вот пример графика с сайта Uptrace: пример графика Uptrace

Преимущества и недостатки

Преимущества
  • Прозрачно подключается к любому Java-приложению как Java agent, т.е. приложения даже не знают, что их скорость измеряется.
  • Показывает статистически значимые значения - персентили, а не средние значения.
  • Настройка не требуется - все графики уже есть «из коробки».
Недостатки
  • Процесс сбора метрик уменьшает скорость работы приложений. В продакшне решается сбором лишь 10% метрик, т.к. необходимо понимать, как работает продакшн.
  • Для накопления метрик необходим ClickHouse, который имеет большие аппетиты в части RAM: не менее 4Gb, а лучше 8Gb и более. Но если ClickHouse уже используется в проекте (для аудита и/или бизнес-аналитики), это недостатком не является.
  • Это не профилировщик Java-кода - измеряются только вызовы внешних систем: баз данных (время выполнения каждого SQL-запроса), брокеров сообщений, REST (в обе стороны). Профилировка собственно кода - построчно - производится разработчиками с помощью соответствующих инструментов среды разработки.

  1. Персентиль (или процентиль) - мера, в которой процентная часть выборки не превышает её. Например, p90 для времени выполнения запросов - это столько секунд, что время выполнения 90% запросов не превышает его.