Observability: метрики, трейсинг, логирование и профилирование

Observability (наблюдаемость) — способность понимать состояние системы через данные: метрики, логи, трейсы и профили. Это основа для поиска причин сбоев, оценки производительности и быстрой реакции на инциденты.

Метрики и мониторинг

Метрики — числовые показатели состояния системы. Приложение инкрементирует счётчики (например, requests_total), значения собираются с заданной периодичностью и отображаются на дашбордах.

  • RPS (requests per second) — запросы в секунду.
  • TPS (transactions per second) — транзакции в секунду (одна транзакция может включать несколько запросов).
  • Latency / Response Time — время ответа (часто смотрят перцентили, например p95).
  • Error Rate — доля ошибочных ответов (например, 5xx).
  • Системные метрики: CPU, RAM, диск, сеть, размеры очередей, uptime.

Метрики не смотрят вручную 24/7 — настраивают алерты при превышении порогов (например, memory_usage > 80% или error_rate > 5%). Уведомления уходят в Slack/Telegram, команда начинает разбор.

Инструменты: Prometheus (сбор и хранение временных рядов), Grafana (дашборды).

Трейсинг

Трейсинг — отслеживание пути запроса через распределённую систему (много микросервисов). Каждому запросу присваивается trace_id; каждый сервис создаёт «спаны» (операции с временем и trace_id). Спаны собираются в централизованной системе и собираются в один трейс — цепочку операций по всем сервисам. Видно, где возникла задержка или ошибка.

Без трейсинга при проблеме пришлось бы смотреть логи на каждом сервере; с трейсингом — один граф запроса. Контекст (trace_id) пробрасывается через HTTP-заголовки; библиотеки (например, OpenTelemetry) создают спаны автоматически.

Инструменты: Jaeger, Zipkin, OpenTelemetry.

Логирование

Логи — запись событий приложения в файлы или централизованное хранилище. При сбое по логам восстанавливают последовательность событий (например, «Failed to assign driver for ride_001»).

Проблемы классического подхода: логи только на каждой машине — нужен SSH и grep по серверам; в продакшене доступ часто ограничен. Современный подход — демон (Fluentd, Filebeat) собирает логи и отправляет в централизованную систему; поиск и агрегация через веб-интерфейс (например, по ride_id или «все ошибки за 24 часа»).

Инструменты: ELK Stack (Elasticsearch, Logstash, Kibana), Graylog.

Профилирование

Профилирование — сбор данных о производительности (CPU, память, время выполнения функций). Сервис периодически снимает профили и отправляет их в систему. При инциденте (например, рост памяти в 2:00) смотрят профиль за 1:55 и находят причину (утечка в определённой функции). Сравнение профилей до и после релиза выявляет регрессии.

Инструменты: Pyroscope, Parca.

Обработка ошибок (Sentry-подобные системы)

При ошибке или панике приложение отправляет стек и контекст в централизованную систему (Sentry, Kabrio). Ошибки агрегируются по типу и сервису; не нужно искать их по логам или core dump на каждом хосте. В коде используется SDK (например, sentry.CaptureException(err)).

Зачем это при проектировании

Без observability запуск сервиса — как вождение без приборной панели. На этапе проектирования закладывают: какие метрики собирать (RPS, latency, ошибки), как настроить трейсинг между сервисами, куда отправлять логи и как их искать, как профилировать и куда слать ошибки. Это основа для прозрачности и управляемости системы в проде.