Gymterview
junior

Что такое Spring Boot Actuator?

Spring Boot Actuator — модуль Spring Boot, предоставляющий production-ready функции для мониторинга и управления приложением через HTTP-эндпоинты или JMX.

Подключение

Пример
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Основные endpoints

Endpoint Описание По умолчанию
/actuator/health Состояние приложения и зависимостей Включён
/actuator/info Информация о приложении Включён
/actuator/metrics Список всех метрик Выключен
/actuator/prometheus Метрики в формате Prometheus Выключен
/actuator/env Переменные окружения Выключен
/actuator/beans Все Spring-бины Выключен
/actuator/loggers Управление уровнями логирования Выключен
/actuator/threaddump Дамп потоков Выключен
/actuator/heapdump Дамп кучи (скачиваемый файл) Выключен
/actuator/mappings Все @RequestMapping Выключен

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

Пример
management:
  endpoints:
    web:
      exposure:
        include: health, info, metrics, prometheus, loggers, env
      base-path: /actuator
  endpoint:
    health:
      show-details: when-authorized  # never | when-authorized | always
      show-components: always
    env:
      show-values: when-authorized

  # Отдельный порт для actuator (рекомендуется для production)
  server:
    port: 9090

  info:
    env:
      enabled: true
    git:
      mode: full

Health Indicators

Spring Boot автоматически регистрирует health indicators для подключённых зависимостей:

Indicator Проверяет
DataSourceHealthIndicator Подключение к БД
RedisHealthIndicator Подключение к Redis
KafkaHealthIndicator Подключение к Kafka broker
ElasticsearchHealthIndicator Кластер Elasticsearch
RabbitHealthIndicator Подключение к RabbitMQ
DiskSpaceHealthIndicator Свободное место на диске
Пример ответа /actuator/health
{
  "status": "UP",
  "components": {
    "db": {
      "status": "UP",
      "details": {
        "database": "PostgreSQL",
        "validationQuery": "isValid()"
      }
    },
    "redis": {
      "status": "UP",
      "details": {
        "version": "7.2.4"
      }
    },
    "kafka": {
      "status": "UP",
      "details": {
        "brokerId": "1"
      }
    },
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 107374182400,
        "free": 53687091200,
        "threshold": 10485760
      }
    }
  }
}
Кастомный Health Indicator
@Component
public class PaymentGatewayHealthIndicator implements HealthIndicator {

    private final PaymentGatewayClient client;

    public PaymentGatewayHealthIndicator(PaymentGatewayClient client) {
        this.client = client;
    }

    @Override
    public Health health() {
        try {
            boolean isAvailable = client.ping();
            if (isAvailable) {
                return Health.up()
                    .withDetail("provider", "stripe")
                    .withDetail("responseTime", "45ms")
                    .build();
            } else {
                return Health.down()
                    .withDetail("provider", "stripe")
                    .withDetail("reason", "Ping failed")
                    .build();
            }
        } catch (Exception e) {
            return Health.down(e)
                .withDetail("provider", "stripe")
                .build();
        }
    }
}

Kubernetes Probes

Spring Boot Actuator автоматически поддерживает Kubernetes health probes:

Probe Назначение Что происходит при fail
Startup Приложение запустилось? Контейнер перезапускается
Liveness Приложение работает? Контейнер перезапускается
Readiness Приложение готово принимать трафик? Убирается из Service (перестаёт получать трафик)
Настройка probes в application.yml и Kubernetes deployment
# application.yml
management:
  endpoint:
    health:
      probes:
        enabled: true
      group:
        liveness:
          include: livenessState
        readiness:
          include: readinessState, db, redis
        startup:
          include: livenessState
# Kubernetes deployment.yml
spec:
  containers:
    - name: order-service
      livenessProbe:
        httpGet:
          path: /actuator/health/liveness
          port: 9090
        initialDelaySeconds: 30
        periodSeconds: 10
        failureThreshold: 3
      readinessProbe:
        httpGet:
          path: /actuator/health/readiness
          port: 9090
        initialDelaySeconds: 10
        periodSeconds: 5
        failureThreshold: 3
      startupProbe:
        httpGet:
          path: /actuator/health/startup
          port: 9090
        initialDelaySeconds: 5
        periodSeconds: 5
        failureThreshold: 30

Управление уровнями логирования в runtime

Пример
# Получить текущий уровень логгера
curl http://localhost:9090/actuator/loggers/com.example.service

# Изменить уровень без перезапуска
curl -X POST http://localhost:9090/actuator/loggers/com.example.service \
  -H 'Content-Type: application/json' \
  -d '{"configuredLevel": "DEBUG"}'
Безопасность Actuator
@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig {

    @Bean
    public SecurityFilterChain actuatorFilterChain(HttpSecurity http) throws Exception {
        http
            .securityMatcher("/actuator/**")
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/actuator/health/**").permitAll()
                .requestMatchers("/actuator/info").permitAll()
                .requestMatchers("/actuator/prometheus").permitAll()
                .requestMatchers("/actuator/**").hasRole("ADMIN")
            )
            .httpBasic(Customizer.withDefaults());
        return http.build();
    }
}

Важное

  • Отдельный порт для Actuator (management.server.port) — рекомендуемая практика. Позволяет ограничить доступ на уровне сети.
  • health/liveness не должен зависеть от внешних систем (БД, Redis). Если БД недоступна, приложение не нужно перезапускать — нужно убрать из балансировки (readiness).
  • health/readiness должен включать проверки критических зависимостей (БД, кэш), без которых сервис не может обрабатывать запросы.
  • Endpoint /actuator/prometheus должен быть доступен для Prometheus, но не для внешних пользователей.

Частые ошибки

  • Включение всех endpoints в production (include: "*"): опасно — heapdump и env могут содержать чувствительные данные.
  • Liveness probe зависит от БД: при недоступности БД Kubernetes перезапустит все поды, хотя проблема не в приложении.
  • Нет отдельного порта для Actuator: actuator endpoints доступны на том же порту, что и бизнес-API.
  • Забыть настроить show-details: по умолчанию /health возвращает только {"status":"UP"} без деталей.
  • Тяжёлые health checks: healthcheck, делающий полный SELECT из БД каждые 5 секунд, создаёт нагрузку. Используйте лёгкие проверки (ping, isValid()).

Как используется в 2026

  • Spring Boot 3.4+ — Actuator endpoints с поддержкой structured logging (JSON) из коробки.
  • Actuator + Observation API — все endpoints автоматически инструментируются (метрики + трейсы).
  • Graceful shutdown — Actuator интегрируется с lifecycle: при shutdown сервис сначала снимается с readiness, затем дожидает текущие запросы.
  • Container-aware health — Actuator понимает, что работает в контейнере, и автоматически адаптирует health groups для Kubernetes.
  • Info endpoint — автоматически подтягивает Git commit info, Java version, OS info, Spring Boot version.

На собеседовании: обязательно упомяните разницу между liveness и readiness probes — это очень частый вопрос. Liveness проверяет “живо ли приложение” (не включать внешние зависимости), readiness — “готово ли принимать трафик” (включать БД, Redis). Также покажите знание про отдельный порт для Actuator в production и безопасность endpoints.