Почему ваши логи бесполезны без трейсов

Логи без трейсов плохо помогают при инцидентах: они фиксируют событие, но не показывают, какой запрос и какая цепочка сервисов привели к ошибке. Трейсы связывают вызовы в один маршрут и позволяют быстро увидеть конкретный bottleneck.

В микросервисах один запрос может пройти через 5–7 сервисов, и каждый из них пишет отдельные логи. Без общего контекста непонятно, относятся ли строки из api-gateway, order-service и inventory-service к одному запросу, где именно произошёл сбой и между какими сервисами искать проблему.

Трейс — это сквозная запись запроса через систему: каждый span фиксирует действие сервиса, длительность и атрибуты. В примере с checkout сразу видно, что ошибка возникает на AcquireLock в inventory-service после 300 мс, а в примере с GET /api/users/:id задержку в 1240 мс даёт Redis, который отвечал 1,2 секунды из-за cold miss.

Для Node.js предлагается связка OpenTelemetry и Uptrace: SDK подключается до основного кода, auto-instrumentations автоматически покрывают HTTP, Express, PostgreSQL и Redis, а трейсы отправляются через OTLP. Чтобы логи работали вместе с трейсами, в каждую строку добавляют trace_id и span_id; тогда из лога можно открыть полный путь запроса в APM, включая waterfall, Service Map, связанные логи и алерты по error rate и p99 latency.

Коротко

  • Обычные логи отвечают на вопрос «что произошло», но без trace_id не показывают, какой запрос связал несколько сервисов.
  • Трейс собирает путь одного запроса через сервисы и span'ы, показывая длительность, атрибуты и конкретное место сбоя.
  • В примере с Express задержку GET /api/users/:id объясняет Redis: 1228 мс из 1240 мс пришлись на получение настроек пользователя.
  • OpenTelemetry для Node.js можно подключить без изменений бизнес-кода: auto-instrumentations покрывают HTTP, Express, PostgreSQL и Redis.
  • Uptrace принимает трейсы, метрики и логи по OTLP, показывает waterfall, Service Map, связанные логи и алерты по error rate и p99 latency.

FAQ

Зачем добавлять трейсы, если в системе уже есть подробные логи по каждому сервису и endpoint'у?

Логи фиксируют события внутри отдельных сервисов, но не собирают их в один путь запроса. Трейсы показывают, где именно в цепочке появилась задержка или ошибка.

Как связать строки логов с конкретным трейсом, чтобы не искать проблему вручную по разным сервисам?

В логи добавляют trace_id и span_id текущего span'а. По trace_id можно открыть полный трейс в APM и увидеть все связанные события одного запроса.

Что даёт OpenTelemetry в примере с Node.js, Express, PostgreSQL и Redis без переписывания бизнес-логики?

OpenTelemetry SDK с auto-instrumentations автоматически собирает трейсы по HTTP, Express, PostgreSQL и Redis. Приложение запускается с подключённым tracing.js, а данные отправляются в Uptrace через OTLP.

Читайте также

  1. Динамический ресайзинг изображений (Image Previewer)
  2. Как тимлид заменил десятки вкладок на файловую систему и Claude Code
  3. От хаоса к системе: как выстроить процесс Discovery (часть 1)
  4. Как сегментировать базу: основные критерии сортировки контактов
  5. Альтман в панике: зачем ChatGPT превратили в рекламную помойку и почему это не спасёт OpenAI
Ключевые инсайты из новости (по версии ChatGPT)
  • Логи должны связываться с трейсами через trace_id: В распределённой системе лог без общего идентификатора запроса быстро превращается в изолированное событие: видно ошибку, но не видно её место в цепочке. Для production-сервисов нужно добавлять в каждую строку лога trace_id и span_id, чтобы из записи лога можно было открыть полный путь запроса в APM.
    [Observability и инциденты]
Для получения полного доступа оформите подписку PubMag PRO.
Зарегистрированные пользователи видят только два тезиса.
Зарегистрироваться
Инсайты автоматически генерируются с помощью искусственного интеллекта на основе текста статьи.
← Назад в лентуЧитать оригинал →
✈️ Подписывайтесь на мой Telegram-канал — там еще больше интересного про AdTech, MarTech, AI и многое другое!