JavaRush /Курси /Модуль 5. Spring /Лекція 208: Логування і моніторинг подій у мікросервісах

Лекція 208: Логування і моніторинг подій у мікросервісах

Модуль 5. Spring
Рівень 13 , Лекція 7
Відкрита

У мікросервісній архітектурі логування й моніторинг потрібні для:

  • Виявлення помилок і збоїв.
  • Відстеження "життя" події — від її появи до обробки.
  • Налагодження й аналіз продуктивності.
  • Розуміння загального стану системи та її компонентів.

Логування подій: основи

Логування подій у мікросервісах має свої особливості. Головна ідея — фіксувати кожну подію, щоб ти завжди знав, що відбувається і в якій послідовності. Але логування має бути не просто "записом у файл". Воно має бути структурованим і продуманим. Розберемо основні складові.

Під час логування подій важливо фіксувати:

  1. ID події: унікальний ідентифікатор для кожної події.
  2. Тип події: наприклад, "Створення замовлення", "Оплата", "Оновлення статусу доставки".
  3. Джерело події: який продюсер (сервіс) згенерував подію.
  4. Мітка часу: коли подія була створена або оброблена.
  5. Стан події: чи виник збій під час обробки (наприклад, "успішне виконання" або "помилка").
  6. Кореляційний 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);
    }
}

Моніторинг подій: основи

Якщо логування — це спогади про минуле, то моніторинг — можливість заглянути в теперішнє. Моніторинг подій дає змогу в реальному часі бачити, що відбувається в системі, і попереджати про проблеми.

Коли говоримо про моніторинг подій, важлива аналітика:

  1. Кількість подій: скільки подій оброблено за певний період.
  2. Помилки: наприклад, відсоток подій, що завершилися з помилкою.
  3. Затримка: час від появи події до її обробки.
  4. Розмір черг: скільки подій ще очікує обробки.

Як це виглядає?

Уяви дашборд, де видно, скільки замовлень створено за останню годину, скільки з них завершилися успішно, а скільки — з помилкою. Наприклад:

Метрика Значення
Подій оброблено 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-стек — відмінний вибір.

  1. Logstash збирає логи з твого додатка.
  2. Elasticsearch індексує дані логів.
  3. 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!"

Тепер, якщо допустимий рівень помилок буде перевищено, ти отримаєш сповіщення.


Що може піти не так?

Логування й моніторинг подій ідеальні лише в теорії. На практиці можна зіткнутися з:

  • Надмірною кількістю логів, що ускладнює їхній аналіз. Важливо логувати лише те, що справді потрібно.
  • Вузькими місцями в моніторингу, наприклад, коли система не справляється з навантаженням при зборі метрик.
  • Складнощами з кореляцією даних, особливо якщо використовується декілька брокерів повідомлень або мікросервісів.

Щоб цього уникнути, дотримуйся принципу «менше, але краще»: збирай лише необхідні дані й ретельно проектуй структуру подій і метрик.


Тепер ми знаємо, як робити мікросервіси "прозорими" і як з простих логів та графіків вичавлювати максимум корисної інформації. Вперед до наступної теми!

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