Backend
October 12, 2023

Введение в работу с метриками приложения в Java (с micrometer.io)

Давай разберемся, зачем вообще нужно измерять производительность программ. Когда ты пишешь код, важно понимать, насколько хорошо он работает. Ведь никому не нужно медленное и тормозящее приложение!

Чтобы отслеживать, как быстро выполняются разные части программы, используют специальные показатели, которые называют метриками. Они могут измерять, например, скорость загрузки страницы, время отклика сервера, количество ошибок и так далее. Анализируя эти метрики, можно понять, где именно возникают «узкие места», и оптимизировать работу приложения.

Теперь давай поговорим о библиотеке Micrometer.io, которая упрощает сбор метрик в Java-приложениях. Эта полезная штука была создана компанией Pivotal (ныне VMware).

Основные возможности Micrometer.io:

  • Простая установка - добавь зависимость в пару строк кода и настрой метрики.
  • Удобные интерфейсы для регистрации разных типов метрик (счетчики, таймеры, гистограммы и так далее).
  • Автоматическая отправка метрик в популярные системы мониторинга вроде Prometheus, Datadog, Graphite.
  • Единый API для работы с разными системами - не нужно писать отдельный код под каждую.
  • Встроенные метрики JVM, которые измеряют производительность Java и память.
  • Поддержка множества приложений и фреймворков от Spring Boot до Micronaut.

Короче, Micrometer.io - это отличный выбор, чтобы без больших усилий добавить мониторинг в Java-приложение. Давай разберем, как его использовать.

Сначала нужно подключить библиотеку к проекту. Если ты используешь Maven, то добавь в файл pom.xml следующую зависимость:

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-core</artifactId>
  <version>1.9.0</version>
</dependency>

Готово! Теперь можно регистрировать метрики. Для начала создадим самый простой счетчик, который будет отслеживать, сколько раз выполнился код:

Counter counter = Counter.builder("processed.orders").description("Total orders processed").register(Metrics.globalRegistry);

counter.increment(); // увеличиваем значение счетчика

Как видишь, синтаксис довольно прямолинейный. Мы создали счетчик с именем "processed.orders" и описанием "Total orders processed". А затем увеличили его значение на 1.

Micrometer.io поддерживает множество полезных типов метрик:

  • Счетчики (Counters) - подсчитывают количество событий, запросов и т.п.
  • Таймеры (Timers) - измеряют время выполнения операций.
  • Гистограммы (Histograms) - строят распределение значений (например, времени отклика).
  • Индикаторы (Gauges) - отображают текущее значение, например размер памяти.

Выбирай тот тип, который наилучшим образом подходит для твоей задачи.

Допустим, ты пишешь веб-приложение и хочешь отследить скорость обработки HTTP-запросов.

Можно воспользоваться таймером:

Timer timer = Timer.builder("requests").register(registry);

@GetMapping("/api/users")  
public ResponseEntity<List<User>> getUsers() {

  Timer.Sample sample = timer.start();
  
  // код обработки запроса
  
  sample.stop();
  
  return ResponseEntity.ok(users);
}

Здесь мы запускаем таймер перед обработкой запроса и останавливаем после. Micrometer автоматически посчитает время и отправит метрики в систему мониторинга.

Таким образом можно добавить полезные метрики в разные части приложения и сервисов. А затем посмотреть результаты в удобном интерфейсе Prometheus или Grafana.

Давай рассмотрим пример интеграции Micrometer и Prometheus.

Для этого нужно всего лишь добавить такую зависимость:

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
  <version>1.9.0</version>
</dependency>

Встроенный реестр Prometheus будет автоматически собирать все метрики из приложения и отдавать их по HTTP эндпоинту /actuator/prometheus.

Чтобы это увидеть, запусти Spring Boot приложение и перейди по адресу http://localhost:8080/actuator/prometheus.

Увидишь что-то вроде:

# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads
# TYPE jvm_threads_live_threads gauge
jvm_threads_live_threads{} 19.0
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool 
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{id="direct",} 12.0
jvm_buffer_count_buffers{id="mapped",} 0.0

Это и есть метрики, которые Prometheus будет собирать через HTTP для мониторинга. Их можно визуализировать в Grafana и создавать графики, дашборды, алерты и прочее.

Конечно, это только краткое введение, на практике возможностей гораздо больше.

В заключение давай подытожим основные моменты:

  • Метрики критически важны для понимания производительности приложения.
  • Micrometer.io - удобная библиотека для сбора метрик в Java.
  • Она поддерживает разные типы метрик: счетчики, таймеры, гистограммы и т. п.
  • Метрики можно отправлять в Prometheus, Grafana, Datadog и другие системы.

На этом все, надеюсь, тебе было интересно.