JavaRush /Курсы /Модуль 5. Spring /Лекция 157: Добавление логирования и мониторинга через Sp...

Лекция 157: Добавление логирования и мониторинга через Spring Boot Actuator

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

Сегодня мы узнаем, как с помощью Spring Boot Actuator сделать ваше приложение более наблюдаемым. В частности, мы рассмотрим:

  1. Подключение и настройку Spring Boot Actuator.
  2. Использование встроенных метрик и эндпоинтов для мониторинга.
  3. Логирование и интеграцию с внешними системами, такими как Grafana, Prometheus и ELK (Elasticsearch, Logstash, Kibana).
  4. Настройку кастомных метрик для вашего приложения.

Итак, приготовьтесь, пора взглянуть под капот вашего приложения!


Подключение Spring Boot Actuator

Напомним, Spring Boot Actuator — это модуль, который добавляет наблюдаемость и предоставляет метрики, доступные через API или консоль. Это настоящий инструмент джедая для разработчика, желающего следить за своим приложением.

Официальная документация: Spring Boot Actuator

Мы начнём с добавления зависимости Actuator в проект. Убедитесь, что у вас установлен Spring Boot (если вы вдруг забыли сделать это ранее).

Подключаем зависимость

Добавьте следующую зависимость в ваш pom.xml:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Если вы используете Gradle, выполните импорт:


implementation 'org.springframework.boot:spring-boot-starter-actuator'

После этого, выполните mvn install или gradle build, чтобы подтянуть зависимости в проект.


Основные возможности Actuator

Actuator предоставляет набор уже готовых эндпоинтов для мониторинга и управления приложением. Вот несколько из них:

Эндпоинт Назначение
/actuator/health Показывает статус приложения (UP/DOWN)
/actuator/info Общая информация о приложении (настраивается)
/actuator/metrics| Метрики производительности приложения
/actuator/env Переменные окружения и их значения
/actuator/loggers| Управление уровнями логирования
/actuator/beans Информация обо всех Spring Beans, зарегистрированных в приложении

Настройка и активация эндпоинтов

Шаг 1: Разрешение эндпоинтов

По умолчанию, не все эндпоинты Actuator доступны. Давайте откроем их в конфигурации:


# application.yml
management:
  endpoints:
    web:
      exposure:
        include: "*" # Открываем все эндпоинты

Или, если вы используете application.properties:


management.endpoints.web.exposure.include=*

Откройте браузер и перейдите по адресу http://localhost:8080/actuator. Вы увидите список доступных эндпоинтов.


Шаг 2: Включение метрик

Spring Boot Actuator интегрирован с Micrometer, инструментарием для сбора метрик производительности. Для начала, давайте посмотрим на некоторые предустановленные метрики:

  1. Запустите приложение.
  2. Перейдите на /actuator/metrics.
  3. Вы увидите список всех доступных метрик. Например:

{
  "names": [
    "jvm.memory.used",
    "jvm.memory.max",
    "process.uptime",
    "system.cpu.usage",
    "http.server.requests"
  ]
}

Попробуйте перейти на конкретную метрику, например /actuator/metrics/system.cpu.usage. Вы получите данные о загрузке процессора.


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

Prometheus — это система мониторинга, которая отлично работает в связке с Actuator. Давайте настроим её.

Шаг 1: Добавляем зависимость Prometheus


<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

Шаг 2: Включаем эндпоинт /actuator/prometheus


management:
  endpoints:
    web:
      exposure:
        include: prometheus

Теперь Prometheus сможет собирать данные с вашего приложения, отправляя запросы на /actuator/prometheus.


Логирование через ELK-стек

С логами всё просто: они должны быть читаемыми и централизованными. Для этого отлично подходит комбинация Elasticsearch, Logstash и Kibana.

Шаг 1: Настройте файл logback-spring.xml

Создайте файл logback-spring.xml в директории src/main/resources.


<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logs/spring-boot-app.log</file>
        <encoder>
            <pattern>%d [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

Шаг 2: Интеграция с Logstash

Logstash будет собирать логи из файла spring-boot-app.log. Настройте его для отправки данных в Elasticsearch для последующего анализа с помощью Kibana.


Настройка кастомных метрик

Допустим, вы хотите отслеживать, сколько раз вызывается определённый метод в вашем приложении. Для создания собственных метрик можно использовать Micrometer.

Пример: Кастомная метрика

Добавьте следующую конфигурацию:


import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;

@Service
public class CustomMetricsService {

    private final Counter customCounter;

    public CustomMetricsService(MeterRegistry registry) {
        this.customCounter = registry.counter("custom.metric.counter", "type", "custom_metric");
    }

    public void performAction() {
        // Логика метода
        customCounter.increment(); // Увеличиваем счётчик
    }
}

Теперь, при каждом вызове performAction(), ваш кастомный счётчик будет увеличиваться. Эту метрику можно увидеть на эндпоинте /actuator/metrics/custom.metric.counter.


Обеспечение безопасности метрик

Не все эндпоинты Actuator стоит открывать миру. Например, /actuator/metrics и /actuator/beans содержат важную информацию, которая может быть использована злоумышленниками. Используйте Spring Security, чтобы ограничить доступ:


@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/actuator/health").permitAll() // Доступен всем
        .antMatchers("/actuator/**").authenticated() // Требует аутентификации
        .and()
        .httpBasic();
}

Теперь ваше приложение не только функционально, но и наблюдаемо! Вы можете анализировать метрики, логировать события и быть уверенными в том, что приложение работает стабильно.

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