Есть ли централизованный трейсинг и как он реализован?
Что проверяют
Умеете ли вы найти, где тормозит запрос, который проходит через несколько сервисов и очередей. Спрашивают про ваш текущий проект: как устроен трейсинг, куда уходят данные, как контекст передаётся между сервисами. Следом обычно звучит вопрос про сэмплирование и связь трейсов с логами.
Как отвечать
Опишите цепочку целиком, от кода до интерфейса с трейсами:
- инструментирование: стандарт это OpenTelemetry. В Python это
opentelemetry-sdkи пакеты автоинструментации для FastAPI, Django, Flask,requests,httpx, SQLAlchemy, Celery. Сервис можно запустить черезopentelemetry-instrumentбез правки кода, а свои спаны добавить черезtracer.start_as_current_span(); - передача контекста: между HTTP-сервисами идёт заголовок
traceparentпо W3C Trace Context. В очередях (Kafka, RabbitMQ, Celery) контекст кладут в заголовки сообщения черезinjectи достают черезextract, иначе трейс рвётся; - асинхронность: в
asyncioтекущий спан хранится вcontextvarsи сам переходит между корутинами, а вThreadPoolExecutorконтекст надо передавать явно; - доставка: сервис шлёт спаны по OTLP в OpenTelemetry Collector, тот фильтрует, сэмплирует и пересылает в Jaeger, Grafana Tempo или коммерческий APM;
- сэмплирование: head-based через
ParentBased(TraceIdRatioBased(0.1))в SDK или tail-based в коллекторе, который сохраняет все трейсы с ошибками и медленные; - связь с логами:
trace_idпишется в каждую строку лога, и из трейса можно перейти к логам конкретного запроса.
Если трейсинга нет, так и скажите и объясните, как бы вы его вводили: коллектор, автоинструментация самых нагруженных сервисов, затем ручные спаны там, где не хватает деталей.
Где спотыкаются
Показывают код с opentelemetry.exporter.jaeger. Этот экспортёр устарел и не поддерживается, Jaeger давно принимает OTLP напрямую.
Запускают под gunicorn с форком воркеров и создают провайдер в мастер-процессе. Фоновый поток BatchSpanProcessor в воркерах не работает, инициализировать надо в хуке post_fork.
Путают трейсы с логами и метриками. Трейс показывает путь одного запроса по сервисам и время каждого шага, логи и метрики эту картину не заменяют.