У мікросервісній архітектурі логування й моніторинг потрібні для:
- Виявлення помилок і збоїв.
- Відстеження "життя" події — від її появи до обробки.
- Налагодження й аналіз продуктивності.
- Розуміння загального стану системи та її компонентів.
Логування подій: основи
Логування подій у мікросервісах має свої особливості. Головна ідея — фіксувати кожну подію, щоб ти завжди знав, що відбувається і в якій послідовності. Але логування має бути не просто "записом у файл". Воно має бути структурованим і продуманим. Розберемо основні складові.
Під час логування подій важливо фіксувати:
- ID події: унікальний ідентифікатор для кожної події.
- Тип події: наприклад, "Створення замовлення", "Оплата", "Оновлення статусу доставки".
- Джерело події: який продюсер (сервіс) згенерував подію.
- Мітка часу: коли подія була створена або оброблена.
- Стан події: чи виник збій під час обробки (наприклад, "успішне виконання" або "помилка").
- Кореляційний ID: використовується для зв'язку кількох подій, що належать до одного процесу (наприклад, усі етапи виконання замовлення).
Приклад JSON-події, описаної вище:
{
"eventId": "12345",
"eventType": "OrderCreated",
"source": "OrderService",
"timestamp": "2023-10-12T10:15:30.000Z",
"status": "SUCCESS",
"correlationId": "abc-123-correlation-id"
}
Інструменти для логування
У світі Java найпопулярнішим інтерфейсом для логування є SLF4J разом із реалізаціями, такими як Logback або Log4j2. Ці бібліотеки дають змогу керувати логами через конфігурацію й спрощують інтеграцію з іншими сервісами.
Приклад конфігурації Logback (logback.xml):
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/microservice.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
Приклад використання SLF4J у Java:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EventLogger {
private static final Logger logger = LoggerFactory.getLogger(EventLogger.class);
public void logEvent(String eventId, String eventType, String status) {
logger.info("Event logged: id={}, type={}, status={}", eventId, eventType, status);
}
}
Моніторинг подій: основи
Якщо логування — це спогади про минуле, то моніторинг — можливість заглянути в теперішнє. Моніторинг подій дає змогу в реальному часі бачити, що відбувається в системі, і попереджати про проблеми.
Коли говоримо про моніторинг подій, важлива аналітика:
- Кількість подій: скільки подій оброблено за певний період.
- Помилки: наприклад, відсоток подій, що завершилися з помилкою.
- Затримка: час від появи події до її обробки.
- Розмір черг: скільки подій ще очікує обробки.
Як це виглядає?
Уяви дашборд, де видно, скільки замовлень створено за останню годину, скільки з них завершилися успішно, а скільки — з помилкою. Наприклад:
| Метрика | Значення |
|---|---|
| Подій оброблено | 10,000 |
| Помилки під час обробки | 450 |
| Середній час обробки | 120ms |
Інструменти для моніторингу
Для моніторингу подій і побудови дашбордів можна використовувати:
- Prometheus для збору метрик.
- Grafana для візуалізації.
- ELK-стек (Elasticsearch, Logstash, Kibana) для аналізу логів.
Приклад конфігурації Prometheus у Spring Boot:
Додай залежність у pom.xml:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Створи кастомну метрику для кількості оброблених подій:
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;
@Component
public class EventMetrics {
private final MeterRegistry meterRegistry;
public EventMetrics(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
public void incrementProcessedEvents() {
meterRegistry.counter("event.processed.count").increment();
}
}
Після цього метрика event_processed_count буде доступна для моніторингу!
Налаштування ELK для аналізу логів
Якщо хочеш аналізувати логи подій і будувати дашборди, ELK-стек — відмінний вибір.
- Logstash збирає логи з твого додатка.
- Elasticsearch індексує дані логів.
- Kibana візуалізує дані і дозволяє фільтрувати інформацію.
Приклад налаштування Logstash для отримання логів з файлу:
input {
file {
path => "/path/to/log/file.log"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "microservice-logs"
}
}
В результаті всі логи твого додатка будуть доступні в інтерфейсі Kibana, де можна будувати дашборди, шукати помилки або аналізувати продуктивність.
Точки моніторингу та їхній аналіз
У реальних системах важливо не лише фіксувати факти, а й аналізувати їх. Наприклад, якщо бачиш зріст кількості подій з помилкою, система моніторингу (наприклад, Prometheus + Grafana або ELK) може надіслати тобі сповіщення.
Налаштування алертів у Prometheus:
groups:
- name: event-monitoring
rules:
- alert: HighErrorRate
expr: rate(event_errors_total[5m]) > 0.05
for: 1m
labels:
severity: warning
annotations:
description: "High error rate detected in the last 5 minutes!"
Тепер, якщо допустимий рівень помилок буде перевищено, ти отримаєш сповіщення.
Що може піти не так?
Логування й моніторинг подій ідеальні лише в теорії. На практиці можна зіткнутися з:
- Надмірною кількістю логів, що ускладнює їхній аналіз. Важливо логувати лише те, що справді потрібно.
- Вузькими місцями в моніторингу, наприклад, коли система не справляється з навантаженням при зборі метрик.
- Складнощами з кореляцією даних, особливо якщо використовується декілька брокерів повідомлень або мікросервісів.
Щоб цього уникнути, дотримуйся принципу «менше, але краще»: збирай лише необхідні дані й ретельно проектуй структуру подій і метрик.
Тепер ми знаємо, як робити мікросервіси "прозорими" і як з простих логів та графіків вичавлювати максимум корисної інформації. Вперед до наступної теми!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ