Ответ вслух Senior Ошибки и логирование обновлено

Сквозная трассировка запроса между сервисами

Вопрос

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

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Нужен общий идентификатор трассы, который живёт через все сервисы. Стандарт для этого W3C Trace Context: заголовок traceparent с trace id и id родительского спана.

Что должно прозвучать в ответе

  • Единый trace id: стандарт W3C Trace Context (`traceparent`), передаётся в HTTP-заголовках и в метаданных сообщений очереди

  • OpenTelemetry SDK с автоинструментацией http, express/nest, pg, redis, kafka: спаны создаются сами

  • Trace id и span id в каждой строке структурного лога (через AsyncLocalStorage), чтобы переходить от трейса к логам

  • Экспорт трейсов в коллектор и бэкенд (Jaeger, Tempo), семплирование: голова плюс сохранение всех ошибок и медленных

  • Возвращать trace id клиенту в ответе об ошибке, чтобы поддержка нашла цепочку

  • Для очередей: связь продюсера и консьюмера через контекст в сообщении

Что могут спросить следом

  • Почему одного request id в логах недостаточно?
  • Как семплировать, чтобы не терять ошибки?
  • Как передать контекст через Kafka?

Разбор

Нужен общий идентификатор трассы, который живёт через все сервисы. Стандарт для этого W3C Trace Context: заголовок traceparent с trace id и id родительского спана. Его надо передавать и по HTTP, и в заголовках сообщений очереди, иначе цепочка рвётся на асинхронном шаге. На практике ставлю OpenTelemetry SDK для Node: автоинструментация сама создаёт спаны для входящих запросов, исходящих HTTP, pg, redis, kafka, а я добавляю свои спаны для важных бизнес-шагов. Trace id попадает в каждую строку лога через AsyncLocalStorage, поэтому из трейса можно перейти в логи и обратно. Трейсы уходят в коллектор и дальше в Jaeger или Tempo, с семплированием: обычные запросы частично, ошибки и медленные целиком (tail sampling в коллекторе). В ответе об ошибке отдаю trace id, чтобы поддержка по обращению сразу нашла цепочку.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.