Перейти к содержанию

Kubernetes — наблюдаемость

В Kubernetes наблюдаемость строится на стандартных инструментах: метрики — через Prometheus Operator (ServiceMonitor), логи — через сборщик кластера, здоровье — через пробы.

Метрики (Prometheus Operator)

Каждый сервис отдаёт метрики в формате Prometheus на эндпоинте /metricsapi-gateway — на отдельном порту 9090). Вместо ручного scrape-конфига (как в пилоте на Compose) для обнаружения целей Prometheus Operator'ом включается ServiceMonitor — флагом metrics.serviceMonitor.enabled: true в values соответствующего сервиса. Объект ServiceMonitor создаётся в namespace сервиса и размечен лейблами, по которым его подхватывает Prometheus Operator.

Полный перечень метрик и их смысл — Справочник: Метрики; настройка дашбордов Grafana, алерты и PromQL-рецепты — Мониторинг и метрики.

Пробы здоровья

  • livenessProbeGET /healthz (всегда 200, без зависимостей).
  • readinessProbeGET /readyz (проверяет критичные зависимости — БД, Redis, брокер; 503 при недоступности).
  • Для ML-сервисов — startupProbeGET /startupz (загрузка модели).

readinessProbe (/readyz) проверяет критичные зависимости и возвращает 503 при недоступности БД, Redis или MinIO — под при этом выводится из балансировки, но не перезапускается. У ML-сервисов (threat-detector, content-safety, translation-service) загрузка модели занимает время, поэтому startupProbe (/startupz) задаётся с высоким failureThreshold (порядка 10 минут) — пока он не пройдёт, liveness/readiness не активируются и под не убивается за «медленный» старт.

Логи

Все сервисы пишут структурированные JSON-логи в stdout — их собирает стандартный агрегатор кластера (Loki, ELK или аналог), без дополнительной настройки на стороне приложения. Поля контракта:

  • event — текст события;
  • level — уровень (info/warning/error/…);
  • service — имя сервиса-источника;
  • timestamp — отметка времени в UTC;
  • trace_id / span_id — корреляция с трассировкой.

Поля trace_id/span_id позволяют связать запись лога с распределённой трассой (см. ниже).

Трассировка (OpenTelemetry)

Распределённая трассировка включается двумя переменными окружения на каждом сервисе:

  • OTEL_ENABLED=true — активирует экспорт трейсов;
  • OTEL_EXPORTER_OTLP_ENDPOINT — адрес OTLP-коллектора (например, OpenTelemetry Collector или Tempo), куда сервисы отправляют спаны.

Коллектор и бэкенд трейсов разворачиваются на стороне кластера; идентификаторы trace_id/span_id совпадают с полями JSON-логов, что даёт сквозную корреляцию логов и трасс.

Дашборды и алерты

Готовые дашборды Grafana и правила алертов поставляются в комплекте — см. Мониторинг и метрики. Импортируйте их в свою Grafana и подключите правила к Prometheus.