Сквозная трассировка запроса между сервисами
Вопрос
Запрос проходит через API, два микросервиса и очередь. Как сделать так, чтобы по одной ошибке у пользователя найти всю цепочку логов и время на каждом шаге?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Единый 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 ошибок.