Gymterview
middle

Как обеспечить наблюдаемость приложения?

Наблюдаемость (observability) — это способность понять внутреннее состояние системы по её внешним сигналам, которая строится на трёх столпах: метрики, логи и трейсы, связанных через trace ID.

Аналогия из жизни: наблюдаемость — это как приборная панель автомобиля. Спидометр (метрики) показывает текущую скорость, бортовой журнал (логи) фиксирует события, а навигатор (трейсы) показывает маршрут запроса от начала до конца.

Стек наблюдаемости

Компонент Инструмент Назначение
Метрики Prometheus + Micrometer Числовые показатели (latency, throughput, errors)
Логи Loki + Logback Структурированные события
Трейсы Tempo + OpenTelemetry Путь запроса через сервисы
Визуализация Grafana Дашборды, алертинг
SDK OpenTelemetry (OTel) Вендор-нейтральный сбор телеметрии

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

Пример
management:
  endpoints:
    web:
      exposure:
        include: health, info, prometheus, metrics
  endpoint:
    health:
      probes:
        enabled: true  # Kubernetes: /actuator/health/liveness, /readiness
  metrics:
    tags:
      application: order-service
    distribution:
      percentiles-histogram:
        http.server.requests: true
  tracing:
    sampling:
      probability: 1.0  # 100% в dev, 10-50% в prod

Кастомные метрики

Пример
@Component
@RequiredArgsConstructor
public class OrderMetrics {

    private final MeterRegistry registry;

    public void recordOrderCreated(String status) {
        registry.counter("orders.created", "status", status).increment();
    }

    public void recordOrderProcessingTime(Duration duration) {
        registry.timer("orders.processing.time").record(duration);
    }
}

Structured Logging (JSON)

В production логи должны быть в JSON-формате для парсинга Loki/Elasticsearch:

Пример
{
  "timestamp": "2026-04-19T10:30:45.123Z",
  "level": "INFO",
  "logger": "c.e.order.adapter.in.web.OrderController",
  "message": "Order created successfully",
  "traceId": "abc123def456",
  "spanId": "789ghi",
  "orderId": "550e8400-e29b-41d4-a716-446655440000"
}

Spring Boot Actuator — ключевые эндпоинты

Endpoint Назначение
/actuator/health Health check (liveness + readiness)
/actuator/health/liveness Kubernetes liveness probe
/actuator/health/readiness Kubernetes readiness probe
/actuator/prometheus Метрики в формате Prometheus
/actuator/info Информация о приложении

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

  • 100% sampling в production: огромный объём данных трейсинга. Используйте 10-50%
  • Логирование чувствительных данных: пароли, токены, персональные данные
  • Мониторинг только инфраструктурных метрик (CPU, RAM) без бизнес-метрик
  • Алертинг на каждую ошибку в логе вместо агрегированного error rate

На собеседовании: назовите три столпа (метрики, логи, трейсы) и объясните, что они связаны через trace ID. Частый вопрос: “Чем отличается liveness от readiness probe?” Liveness — приложение живо (если нет — перезапуск), readiness — готово принимать трафик (если нет — убрать из балансировки). Упоминание OpenTelemetry как вендор-нейтрального стандарта добавляет очков.