JavaRush /Курсы /Модуль 5. Spring /Лекция 239: Мониторинг состояния Circuit Breaker в реальн...

Лекция 239: Мониторинг состояния Circuit Breaker в реальном времени

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

Мы уже успели познакомиться с основными проблемами отказов в микросервисных системах и углубились в паттерн Circuit Breaker. Мы узнали, как этот паттерн помогает разорвать цепочку отказов, предотвращая перегрузку сервисов с использованием состояний: Closed, Open и Half-Open. Мы также реализовали Circuit Breaker с использованием Resilience4j, настроили повторные запросы (Retry) и тайм-ауты, добавили fallback-функциональность, позволяя системе gracefully обрабатывать ошибки. Сегодня мы посмотрим, как отслеживать состояние Circuit Breaker в реальном времени, чтобы наша система была не только надежной, но и прозрачной.


Почему мониторинг Circuit Breaker важен для системы

Представьте, что вы настроили идеальный Circuit Breaker, конфигурировали Retry и Fallback. Система работает, но... что-то странное происходит. Некоторые пользователи жалуются на задержки, кто-то говорит о недоступности данных. Почему это происходит? Возможно, Circuit Breaker постоянно находится в Open состоянии, и вы об этом даже не знаете! Без мониторинга ваша система — это чёрный ящик, из которого вы можете получить только ошибочные запросы.

Мониторинг Circuit Breaker помогает:

  • Обнаруживать проблемы до того, как они перерастут в катастрофу.
  • Отслеживать состояния Circuit Breaker в реальном времени (сколько раз сработало Open, сколько запросов прошло в Closed).
  • Оптимизировать параметры настройки на основе реальных данных.

Инструменты для мониторинга Circuit Breaker

Для мониторинга Circuit Breaker мы будем использовать библиотеку Resilience4j, которая уже встроена в наше приложение. Resilience4j интегрируется с такими инструментами, как:

  • Micrometer: отличный инструмент для работы с метриками, который поддерживает экспорт данных в мониторинговые системы, такие как Prometheus.
  • Prometheus и Grafana: мониторинг и визуализация метрик.
  • Actuator: встроенный в Spring Boot инструмент, который позволяет собирать основные метрики приложения.

Настройка мониторинга для Resilience4j

Перед тем как приступить к мониторингу, убедитесь, что ваш pom.xml (или build.gradle) уже включает зависимости для Resilience4j и Spring Boot Actuator. Если нет, добавьте их.

Настройка зависимостей

Maven:


<dependencies>
    <!-- Resilience4j -->
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot2</artifactId>
        <version>1.7.1</version>
    </dependency>
    <!-- Micrometer для работы с метриками -->
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
    <!-- Spring Boot Actuator -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

Gradle:


dependencies {
    implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.1'
    implementation 'io.micrometer:micrometer-registry-prometheus'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

Конфигурация Resilience4j для мониторинга

Resilience4j автоматически интегрируется с micrometer, поэтому дополнительные настройки минимальны. Давайте убедимся, что в нашем application.yml включен Actuator и метрики.


management:
  endpoints:
    web:
      exposure:
        include: health, metrics, prometheus
  metrics:
    tags:
      application: my-spring-app

Здесь:

  • Мы добавляем metrics и prometheus к доступным HTTP endpoint-ам, чтобы система могла экспортировать метрики.

Пример метрик для Circuit Breaker

Теперь можно добавить примерный Circuit Breaker, если вы ещё этого не сделали, и посмотреть, какие метрики он генерирует.


import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;

@Service
public class ExternalService {

    @CircuitBreaker(name = "externalService", fallbackMethod = "fallbackMethod")
    public String getDataFromExternalService() {
        // Симулируем ошибку
        throw new RuntimeException("External service is not available");
    }

    public String fallbackMethod(Throwable throwable) {
        return "Fallback response";
    }
}

Метрики для externalService будут включать:

  • resilience4j_circuitbreaker_state: текущее состояние.
  • resilience4j_circuitbreaker_calls: количество вызовов.
  • resilience4j_circuitbreaker_successful: успешные вызовы.
  • resilience4j_circuitbreaker_failed: неудачные вызовы.

Тестирование метрик через Actuator

Для проверки данных отправьте запрос в Actuator:


curl http://localhost:8080/actuator/metrics

Вы увидите список метрик. Чтобы получить данные о вашем Circuit Breaker, выполните:


curl http://localhost:8080/actuator/metrics/resilience4j.circuitbreaker.state

Пример ответа:


{
  "name": "resilience4j.circuitbreaker.state",
  "measurements": [
    {
      "statistic": "value",
      "value": 1.0
    }
  ],
  "availableTags": [
    {
      "tag": "name",
      "values": ["externalService"]
    }
  ]
}

Значение 1.0 соответствует Closed состоянию. Если бы состояние было Open, значение стало бы 2.0.


Интеграция с Prometheus

Давайте сделаем следующий шаг: настроим Prometheus для сбора и хранения метрик.

Конфигурация Prometheus

Создайте файл prometheus.yml с настройками:


global:
  scrape_interval: 5s

scrape_configs:
  - job_name: 'spring-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

Запустите Prometheus с этой конфигурацией (не забудьте, что Prometheus должен быть установлен):


prometheus --config.file=prometheus.yml

После этого данные о состоянии вашего Circuit Breaker начнут собираться в Prometheus.


Визуализация метрик в Grafana

С Prometheus можно интегрировать Grafana для визуализации данных.

Настройка Grafana

  1. Установите Grafana (доступна через Docker, Homebrew, yum, apt и т.д.).
  2. Добавьте Prometheus как источник данных:
    • Войдите в Grafana, перейдите в "Configuration" -> "Data Sources".
    • Укажите URL Prometheus: http://localhost:9090.
  3. Создайте новый Dashboard:
    • В разделе "Visualization" выберите график.
    • Введите запрос к Prometheus, например:
      
      resilience4j_circuitbreaker_state{name="externalService"}
      
    • Настройте график в соответствии с вашими предпочтениями.

Практические рекомендации

  1. Настраивайте алерты: если Circuit Breaker переходит в состояние Open, отправляйте уведомления в Slack, почту или другой инструмент мониторинга.
  2. Изучайте паттерны использования: анализируйте данные, чтобы понять, как ваша система справляется с нагрузкой. Это поможет улучшить параметры настроек.
  3. Используйте исторические данные: Prometheus позволяет хранить данные за определённый период времени, что полезно для анализа.

Теперь, вероятно, стало очевидно, насколько важно наблюдать за состоянием Circuit Breaker в режиме реального времени. Ведь если кто-то скажет вам: "Моя система только что упала", вы сможете спокойно ответить: "Я уже знаю, и она сама собой восстановится через 10 секунд. Приятного дня!"

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