Логи, метрики, трейсы: что такое observability и почему трёх хватает
Observability — модное слово, за которым стоит простой принцип: вы должны уметь ответить на любой вопрос о поведении системы, не отправляя программиста дебажить прямо на проде. В отличие от monitoring (который показывает то, что вы заранее догадались измерять), observability позволяет разобраться в том, чего вы не предвидели. Три источника данных покрывают 95% задач, и главное — понимать, какой когда нужен.
Метрики (metrics) — «что и сколько»
Метрики — это числа во времени. Системные (CPU, память, диск, сеть), бизнес- (число заказов за минуту, конверсия), технические (RPS, latency, счётчик ошибок). Хранятся как временные ряды: timestamp → значение.
Сильные стороны. Дёшевы в хранении (одно число на точку), агрегируются (среднее, перцентили, сумма за интервал), идеальны для дашбордов и алертов. Можно держать месяцы данных без раздутия хранилища.
Стек. Prometheus (сбор и хранение, pull-модель) + Grafana (визуализация). Это де-факто стандарт в cloud-native мире. Для прикладных метрик часто добавляют statsd, для Java — Micrometer.
На что отвечают. «CPU у сервиса X на 95%», «число 500-х ошибок выросло втрое за последний час», «медианная latency поднялась со 100 мс до 500 мс». Метрики — основа алертов: если число пересекло порог — зовём дежурного.
Логи (logs) — «что именно произошло»
Логи — дискретные события с контекстом. Каждая запись: «в 12:03:14 пользователь user_42 попытался оформить заказ order_1337, метод processPayment упал с timeout connecting to payment-gateway:8080».
Сильные стороны. Полный контекст конкретного события — stack trace, значения переменных, идентификаторы пользователя и запроса. Незаменимы при разборе конкретного инцидента: «что пошло не так у этого пользователя в этот момент».
Слабые стороны. Дорогие в хранении и поиске. В отличие от метрик, лог — это текст (или структурированный JSON), и каждый байт стоит денег. Поиск по логам за месяц — тяжёлая операция. Поэтому логи обычно хранят короткое время (дни–недели), метрики — долго (месяцы–годы).
Стек. Loki (от авторов Grafana, интегрирован с Prometheus-метками), ELK (Elasticsearch + Logstash + Kibana), Datadog. Структурированный лог (JSON) предпочтительнее текстового — по нему можно фильтровать и агрегировать.
На что отвечают. «Почему у пользователя user_42 упал заказ?» — метрики скажут, что ошибок стало больше, но кто именно ошибся и с каким сообщением — только логи.
Трейсы (traces) — «где тормозит и почему»
Трейс — путь одного запроса через все сервисы и компоненты со временем на каждом шаге. В микросервисах один HTTP-запрос пользователя может пройти через gateway, auth-сервис, основной сервис, две базы данных, очередь сообщений и сторонний API. Трейс показывает всю эту цепочку: каждый span (шаг), сколько он занял, где задержка.
Сильные стороны. Незаменимы для распределённых систем. Без трейсов понять, почему запрос идёт 2 секунды, когда он проходит через 8 сервисов, — почти невозможно. Трейс сразу покажет: 1.5 секунды из 2 — это SQL-запрос в billing-service, конкретно в методе getInvoice.
Слабые стороны. Тяжелее настраивать (надо инструментировать код, пробрасывать trace context между сервисами). В отличие от метрик, трейсится не каждый запрос — обычно сэмплирование (1–10%), иначе объём данных взорвётся.
Стек. OpenTelemetry (стандартный API/SDK для генерации трейсов, метрик и логов), Jaeger, Grafana Tempo, Datadog APM.
На что отвечают. «Где именно в этом вызове тормозит?» — показываетspan с максимальной длительностью, вплоть до SQL-запроса.
Правило трёх — как они дополняют друг друга
Сигналы не конкурируют, а работают в связке. Классический цикл расследования инцидента:
- Метрика показывает, что есть проблема: «ошибки 500 выросли с 0.1% до 5% за последние 15 минут».
- Трейс ведёт, где в системе она возникла: «ошибки исходят из
payment-service, конкретно вcharge-вызове к стороннему API, который начал таймаутить». - Лог раскрывает детали конкретного события: «payment-gateway вернул 503 с телом
{"error": "rate limit exceeded"}».
Без метрик вы не узнаете о проблеме вовремя. Без трейсов — не поймёте, в каком из N сервисов она возникла. Без логов — не увидите, что именно произошло. Поэтому три сигнала вместе, а не один вместо всех.
OpenTelemetry — стандарт, снимающий vendor lock-in
Исторически каждый вендор (Datadog, New Relic, Dynatrace) имел свой SDK для инструментации кода. Сменить вендора — значит переписать инструментацию. OpenTelemetry (OTel) — открытый стандарт, единый API для сбора всех трёх сигналов. Вы пишете инструментацию один раз, а бэкенд (Jaeger, Tempo, Datadog, Honeycomb) меняете конфигурацией. Сейчас это индустриальный стандарт, его поддерживают все крупные вендоры.
Антипаттерны
Логировать всё подряд «на всякий случай». Превращает логи в шум: полезное сообщение тонет в тысячах отладочных. Логи должны быть структурированы, с уровнями (DEBUG/INFO/WARN/ERROR), и в production обычно включают INFO и выше. Дебаг-уровень — точечно при расследовании.
Делать алерты на логи. Если вы парсите строки логов для алертов — это сигнал, что должна быть метрика. Парсинг текста хрупок: поменяли формулировку сообщения — алерт сломался. Числа должны идти метриками.
Микросервис без trace context. Если каждый сервис логирует сам по себе, без общего correlation ID — связать события одного запроса невозможно. OpenTelemetry решает это автоматически, проставляя trace context в заголовках между вызовами.
Один дашборд на всё. Дашборд из 30 графиков, на который никто не смотрит, пока не сломается. Эффективнее несколько маленьких: один на сервис, с ключевыми SLO (latency p50/p95/p99, error rate, throughput). Остальное — по запросу.
Короткое summary
Observability держится на трёх источниках: метрики (числа во времени — для алертов и дашбордов, дёшевы, долго хранятся), логи (дискретные события с контекстом — для разбора конкретных инцидентов, дороги), трейсы (путь одного запроса через сервисы со временем на каждом шаге — для распределённой отладки производительности). Они работают в связке: метрика показывает проблему, трейс — где она возникла, лог — что именно произошло. OpenTelemetry — индустриальный стандарт, объединяющий сбор всех трёх сигналов через единый API и снимающий vendor lock-in. Главный антипаттерн — логировать всё подряд и парсить логи для алертов (числа должны быть метриками).
Что почитать
- OpenTelemetry: Introduction — официальный разбор сигналов и принципов observability.
- Prometheus Docs: Best Practices — про метрики, нейминг, алерты.
- «Observability Engineering» (Majors, Fong-Jones, Miranda) — книга от инженеров Honeycomb, концептуальный разбор.