Вопрос с собеседования · Spring

Что необходимо, чтобы распределённая трассировка связала запрос, прошедший через несколько сервисов?

MiddleSpring CloudSpring BootSpring Boot >=3
Ещё спрашивают так:
  • Как настроить трассировку в Spring Boot 3?
Коротко

Контекст трассировки (trace id, span id) должен передаваться заголовком (W3C traceparent) через каждую границу — HTTP, брокер, асинхронные потоки — и попадать в логи.

  • Spring Boot 3: Micrometer Tracing (вместо Spring Cloud Sleuth) + мост OpenTelemetry или Brave
  • Клиенты из Spring (RestClient.Builder, WebClient.Builder, KafkaTemplate с observation) передают заголовки сами
  • Свой new RestTemplate() без билдера — контекст теряется

А ещё В асинхронных потоках — Context Propagation или TaskDecorator

Подробно

Micrometer Tracing (пришедший на смену Spring Cloud Sleuth) инструментирует стандартные точки автоматически: входящие HTTP-запросы, RestTemplate и WebClient, слушатели брокеров. Проблемы начинаются на нестандартных границах — собственный пул потоков, ручная отправка сообщения, интеграция со сторонним клиентом: там контекст теряется, и трейс распадается на несвязанные куски. Полезная практика — класть идентификатор трейса в MDC, чтобы он попадал в каждую строку лога, и связывать логи с трейсами по нему. Метрики и логи сами по себе корреляции не дают: метрика агрегирована и не знает о конкретном запросе, а логи без общего идентификатора невозможно сшить.

Что хотят услышать

  • Передача контекста через все границы.
  • Micrometer Tracing в Boot 3.
  • Типичные места потери контекста.

Частые ошибки

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

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Передавать контекст трассировки (W3C traceparent) через все клиенты и асинхронные границы
  • ✗Достаточно включить сбор метрик на каждом сервисе и сопоставить их по времени в Grafana
  • ✗Достаточно писать логи в единое хранилище
  • ✗Достаточно одинаковой версии Spring Boot во всех сервисах

Что спросят дальше

  • Как пробросить контекст трассировки через @Async?
  • Зачем идентификатор трейса кладут в MDC?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования