Как обеспечить наблюдаемость приложения?
Наблюдаемость (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 как вендор-нейтрального стандарта добавляет очков.