JavaRush /Курсы /Модуль 5. Spring /Лекция 119: Настройка кастомных метрик в Spring Boot

Лекция 119: Настройка кастомных метрик в Spring Boot

Модуль 5. Spring
12 уровень , 8 лекция
Открыта

Сегодня мы с вами отправимся в мир кастомных метрик. Метрики – это как маленькие шпионы в вашем приложении, которые рассказывают вам обо всём, что там происходит: сколько пользователей зашло на сайт, сколько заказов было сделано, и даже сколько раз кот нажал на кнопку "купить корм". Разберёмся, зачем нам это нужно, как это работает и как реализовать настоящие "персонализированные" метрики, которые подстроятся под ваш бизнес.


Почему может понадобиться настройка кастомных метрик?

Реальная жизнь редко укладывается в рамки стандартных метрик, которые предоставляет Actuator. Например, вы можете захотеть измерить:

  • Сколько раз пользователи добавляют товар в корзину.
  • Сколько времени занимает выполнение определённого бизнес-процесса.
  • Количество успешно обработанных заказов за последний час.
  • Процент успешных и неуспешных попыток входа в систему.

Кастомные метрики необходимы, чтобы ваш мониторинг соответствовал специфике вашего приложения. Например, если вы разработчик интернет-магазина, вам важно следить за конверсией покупок, тогда как для сервиса стриминга необходимо понимать, какие фильмы/сериалы пользуются максимальной популярностью.


Используем библиотеку Micrometer для кастомных метрик

Если Spring Boot Actuator – это "швейцарский нож" для мониторинга, то Micrometer – его "лезвие". Micrometer – библиотека, интегрированная в Actuator, которая позволяет накапливать и экспортировать метрики в различные мониторинговые системы, такие как Prometheus, New Relic, Graphite и другие.

Для создания кастомных метрик вам потребуется:

  1. Подключить Actuator (если вы ещё не сделали этого).
  2. Использовать API Micrometer для регистрации и мониторинга собственных метрик.

Подключение Actuator и Micrometer

Для начала убедимся, что в вашем проекте подключены все необходимые зависимости. Добавьте их в ваш pom.xml или build.gradle.

Maven:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId> <!-- Для интеграции с Prometheus -->
</dependency>

Gradle:


implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus' // Для Prometheus

Не забудьте настроить Actuator в файле application.properties. Например:

management.endpoints.web.exposure.include=*
management.endpoint.metrics.enabled=true

Реализация кастомных метрик

Теперь переходим к самому интересному: как зарегистрировать свои метрики!

Пример 1: считаем количество заказов

Представьте, что у нас есть приложение для интернет-магазина, и мы хотим отслеживать количество успешно обработанных заказов. Для этого создадим счётчик (Counter).


import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    private final Counter orderCounter;

    public OrderService(MeterRegistry meterRegistry) {
        // Регистрируем счётчик
        this.orderCounter = meterRegistry.counter("orders.processed");
    }

    public void processOrder(String orderId) {
        // Здесь логика обработки заказа
        System.out.println("Processing order: " + orderId);

        // Увеличиваем счётчик при успешной обработке заказа
        orderCounter.increment();
    }
}

Теперь, как только вызывается метод processOrder(), наш счётчик orders.processed увеличивается на единицу. Вы сможете увидеть эту метрику через /actuator/metrics/orders.processed.


Пример 2: измеряем время выполнения операций

Иногда важно понять, как долго выполняются те или иные операции. Для этого мы можем использовать таймеры (Timer).


import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class FileProcessingService {

    private final Timer fileProcessingTimer;

    public FileProcessingService(MeterRegistry meterRegistry) {
        // Регистрируем таймер
        this.fileProcessingTimer = meterRegistry.timer("file.processing.time");
    }

    public void processFile(String fileName) {
        // Измеряем время выполнения операции
        long startTime = System.nanoTime();
        try {
            System.out.println("Processing file: " + fileName);
            Thread.sleep(200); // Симуляция обработки файла
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            long endTime = System.nanoTime();
            fileProcessingTimer.record(endTime - startTime, TimeUnit.NANOSECONDS);
        }
    }
}

Когда мы обработаем файл через этот сервис, в метрике file.processing.time появится информация о времени выполнения задачи.


Пример 3: создаем пользовательский Gauge

Gauge позволяет отслеживать текущее состояние какого-либо значения. Например, мы можем отслеживать количество элементов в определённой коллекции.


import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ActiveUsersService {

    private final List<String> activeUsers = new ArrayList<>();

    public ActiveUsersService(MeterRegistry meterRegistry) {
        // Регистрируем Gauge для отслеживания количества активных пользователей
        meterRegistry.gauge("active.users.count", activeUsers, List::size);
    }

    public void userLoggedIn(String username) {
        activeUsers.add(username);
    }

    public void userLoggedOut(String username) {
        activeUsers.remove(username);
    }
}

Метрика active.users.count будет автоматически обновляться при изменении количества элементов в списке activeUsers.


Практическое задание: ваши кастомные метрики

  1. Добавьте метрику для подсчёта количества вызовов какого-либо API (например, API для добавления товаров в корзину).
  2. Настройте таймер для измерения времени выполнения сложной бизнес-операции.
  3. Создайте Gauge для отслеживания текущего состояния бизнес-показателя (например, количества активных заказов).

Частые ошибки и нюансы

Некоторые распространённые ошибки при настройке кастомных метрик:

  • Неверное использование Counter или Timer. Например, не используйте Counter для значений, которые могут уменьшаться. Для этого есть Gauge.
  • Чрезмерное количество метрик. Всегда задавайте себе вопрос: "Зачем мне эта метрика?" Если у вас миллион кастомных метрик, это может повлиять на производительность приложения.
  • Неинформативные имена метрик. Всегда старайтесь называть метрики так, чтобы из названия было понятно, что они измеряют. Например, orders.processed лучше, чем op.proc.

Куда двигаемся дальше?

Теперь, когда вы умеете создавать кастомные метрики, вы можете интегрировать их с внешними системами мониторинга, такими как Prometheus или Grafana, чтобы ваши бизнес-метрики стали не просто данными, а красивыми графиками и полезной аналитикой. Только представьте, как будет здорово видеть рост конверсии или оптимизацию времени выполнения задач в реальном времени!

Для тех, кто хочет углубиться в тему, загляните в документацию Micrometer – это отличное место для поиска вдохновения и дополнительных возможностей.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ