Распространение контекста трассировки W3C на издателя / потребителя MassTransit

Я пытаюсь поддерживать распространение свойств traceId и spanId контекста трассировки W3C из вызовов http -> publisher -> consumer -> http в MassTransit (только чтобы они отображались в журналах / seq на данный момент, но мы используем Dynatrace) , но я не смог найти здесь ничего нестандартного: https://masstransit-project.com/advanced/monitoring/diagnostic-source.html

Если нет ничего доступного, я, наверное, попробую создать что-нибудь сам на основе этих статей:

Я могу найти это в качестве примера для OpenTracing: https://github.com/yesmarket/MassTransit.OpenTracing

И это как ссылка на NServiceBus: https://jimmybogard.com/building-end-to-end-diagnostics-and-tracing-a-primer-trace-context/

Разве кто-то может предложить то, что уже существует?


person Wiebe Tijsma    schedule 18.05.2020    source источник


Ответы (3)


Я являюсь автором библиотеки MassTransit.OpenTracing, на которую вы ссылались, но я написал ее до рекомендации W3C, которая, похоже, появилась совсем недавно (6 февраля 2020 г.).

Моя цель заключалась в том, чтобы я хотел распределенную трассировку через микросервисную архитектуру, которая имела как синхронную / HTTP, так и асинхронную связь брокера сообщений. Для HTTP-материалов я использовал OpenTracing.Contrib.NetCore, который «использует .NET. DiagnosticSource для инструментирования своего кода '. Для связи с асинхронным брокером сообщений я использовал RabbitMQ с MassTransit, но я не совсем понимал подход MassTransit DiagnosticSource , предложенный на веб-сайте (и я не смог найти никаких примеров), поэтому я решил немного разобраться в деталях и покататься самостоятельно.

Короче говоря, все сработало, как и ожидалось, с использованием Джагера в качестве трассирующего. Интересно, что мы (как и в компании, в которой я работаю) решили также использовать DynaTrace, который работает на гораздо более низком уровне и как бы устраняет необходимость обработки большого количества этого материала в коде. Тем не менее, подход не является недействительным (IMO), поскольку не каждый может позволить себе DynaTrace (или аналогичные инструменты APM).

Я постараюсь обновить эту библиотеку с помощью рекомендации W3C в ближайшую неделю или 2. Дайте мне знать, если вы хотите помочь с вкладом / обзором (или если вы хотите пойти в другом направлении и откатить свой собственный, тоже хорошо. ) ...

person Ryan.Bartsch    schedule 18.05.2020
comment
Спасибо! Да, я работаю над предложением, я попытался добавить OpenTracing в свое приложение .NET core 3.1, но по какой-то причине GlobalTracer.Instance.ActiveSpan кажется нулевым при публикации сообщения от контроллера, и я ожидал действия контроллера чтобы уже сгенерировать промежуток. - person Wiebe Tijsma; 18.05.2020
comment
Я создал здесь простой PoC на основе вашего репо и статьи Джимми Богардса, надеюсь, что все в порядке, и любые отзывы приветствуются: github.com/zidad/MassTransit.ActivityTracing - person Wiebe Tijsma; 18.05.2020

РЕДАКТИРОВАТЬ: это еще не работает, только в том же процессе, все еще нужно исправить: /

На основе библиотеки Райана Барча и статьи Джимми Богарда я создал этот пакет, который делает то, что мне нужно: https://github.com/zidad/MassTransit.ActivityTracing

person Wiebe Tijsma    schedule 19.05.2020

Dynatracing утверждает, что легко интегрируется с OpenTracing https://www.dynatrace.com/integrations/opentracing/ и если вы используете указанную вами библиотеку и если ваша HTTP-часть оснащена OpenTracing, она будет работать из коробки.

Единственный потенциальный недостаток в том, что в службе, которая размещает, получает HTTP-вызов и в контексте обработки, которая отправляет или публикует сообщение через MassTransit, все должно быть оснащено OpenTracing, потому что он запустит дочерний диапазон с помощью OpenTracing API.

Мы делаем это с помощью Datadog, поэтому используем библиотеку интеграции Datadog OpenTracing и отслеживаем WebApi и HttpClient с помощью библиотек OpenTracing Contrib. Итак, автоматика у нас не сработала. Но нетрудно использовать эти библиотеки для инструментария вашего приложения вместо использования автоматического инструментария.

Обычный поток выглядит так:

  • Снаружи -> WebApi: начать промежуток
  • WebApi -> MassTransit: запуск дочернего диапазона, добавление контекста в заголовки
  • MassTransit -> потребитель: извлеките контекст, запустите дочерний диапазон и т. Д.

Оба бита с инъекцией и извлечением обрабатываются в библиотеке MassTransit.OpenTracing, так что делать больше нечего.

С библиотекой, которую ваш провайдер должен поддерживать OpenTracing, обычно происходит так:

  • Настроить трассировщик провайдера
  • Установите глобальный трассировщик OpenTracing в оболочку, используя библиотеку интеграции от вашего провайдера.
  • Когда вы создаете диапазон с помощью OpenTracing, он создает диапазон, зависящий от поставщика, и переносит его в диапазон OpenTracing.
person Alexey Zimarev    schedule 18.05.2020