Как организовать мониторинг Java-сервиса?

«Как организовать мониторинг Java-сервиса?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мониторинг сервиса включает сбор метрик, логов и трассировок для обеспечения наблюдаемости (observability).

Типичный стек и практики:

  1. Метрики (Metrics):
    • Инструменты: Prometheus (сбор) + Grafana (визуализация).
    • Подход: Использование библиотек (Micrometer в Spring Boot) для экспорта метрик приложения (количество запросов, время отклика, ошибки, использование JVM).
      @RestController
      public class ApiController {
      private final Counter requestCounter;
      public ApiController(MeterRegistry registry) {
          requestCounter = registry.counter("http.requests", "endpoint", "/api/data");
      }
      @GetMapping("/api/data")
      public String getData() {
          requestCounter.increment(); // Увеличиваем счетчик
          return "data";
      }
      }
  2. Логи (Logging):
    • Инструменты: ELK-стек (Elasticsearch, Logstash/Filebeat, Kibana) или Loki + Grafana.
    • Практика: Структурированное логирование (JSON) с контекстом (correlation ID, userId).
  3. Трассировка (Tracing):
    • Инструменты: Jaeger, Zipkin или коммерческие APM-решения (New Relic, Datadog).
    • Цель: Отслеживание пути запроса через распределенные сервисы.
  4. Алертинг: Настройка правил в Prometheus Alertmanager или Grafana для уведомлений о критических ошибках, высокой загрузке ресурсов (CPU, память, диски) и аномалиях.