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

Лекція 119: Налаштування кастомних метрик у Spring Boot

Модуль 5. Spring
Рівень 19 , Лекція 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 – це відмінне місце для пошуку натхнення і додаткових можливостей.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ