Сьогодні ми з вами вирушимо у світ кастомних метрик. Метрики – це як маленькі шпигуни у вашому застосунку, які розповідають вам про все, що там відбувається: скільки користувачів зайшло на сайт, скільки замовлень було зроблено, і навіть скільки разів кіт натиснув на кнопку "купити корм". Розберемося, навіщо нам це потрібно, як це працює і як реалізувати справжні "персоналізовані" метрики, які підлаштуються під ваш бізнес.
Чому може знадобитися налаштування кастомних метрик?
Реальне життя рідко вкладається в рамки стандартних метрик, які надає Actuator. Наприклад, ви можете захотіти виміряти:
- Скільки разів користувачі додають товар у кошик.
- Скільки часу займає виконання певного бізнес-процесу.
- Кількість успішно оброблених замовлень за останню годину.
- Відсоток успішних і неуспішних спроб входу в систему.
Кастомні метрики потрібні, щоб ваш моніторинг відповідав специфіці вашого застосунку. Наприклад, якщо ви розробник інтернет-магазину, вам важливо слідкувати за конверсією покупок, тоді як для сервісу стримінгу потрібно розуміти, які фільми/серіали користуються найбільшим попитом.
Використовуємо бібліотеку Micrometer для кастомних метрик
Якщо Spring Boot Actuator – це "швейцарський ніж" для моніторингу, то Micrometer – його "лезо". Micrometer – бібліотека, інтегрована в Actuator, яка дозволяє накопичувати і експортувати метрики в різні системи моніторингу, такі як Prometheus, New Relic, Graphite та інші.
Щоб створювати кастомні метрики вам знадобиться:
- Підключити Actuator (якщо ви ще цього не зробили).
- Використовувати 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.
Практичне завдання: ваші кастомні метрики
- Додайте метрику для підрахунку кількості викликів якогось API (наприклад, API для додавання товарів у кошик).
- Налаштуйте таймер для вимірювання часу виконання складної бізнес-операції.
- Створіть
Gaugeдля відстеження поточного стану бізнес-показника (наприклад, кількості активних замовлень).
Поширені помилки та нюанси
Деякі розповсюджені помилки при налаштуванні кастомних метрик:
- Неправильне використання
CounterабоTimer. Наприклад, не використовуйтеCounterдля значень, які можуть зменшуватися. Для цього єGauge. - Занадто велика кількість метрик. Завжди ставте собі питання: "Навіщо мені ця метрика?" Якщо у вас мільйон кастомних метрик, це може вплинути на продуктивність застосунку.
- Неінформативні імена метрик. Завжди намагайтесь називати метрики так, щоб з назви було зрозуміло, що вони вимірюють. Наприклад,
orders.processedкраще, ніжop.proc.
Куди рухаємось далі?
Тепер, коли ви вмієте створювати кастомні метрики, ви можете інтегрувати їх з зовнішніми системами моніторингу, такими як Prometheus або Grafana, щоб ваші бізнес-метрики стали не просто даними, а красивими графіками й корисною аналітикою. Уявіть собі, як круто буде бачити зростання конверсії або оптимізацію часу виконання задач у реальному часі!
Для тих, хто хоче поглибитися в тему, зазирніть в документацію Micrometer – це відмінне місце для пошуку натхнення і додаткових можливостей.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ