通过 MassTransit 发布者/使用者传播 W3C 跟踪上下文



正在尝试支持从 MassTransit 中的 http 调用 -> publisher -> consumer -> http 调用传播 W3C 跟踪上下文 traceId 和 spanId 属性(只是为了让它们现在显示在 logs/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/

除非有人能提出已经存在的东西?

EDIT2: 默认情况下,最新版本的 MassTransit 会传播跟踪上下文。

在启动中启用 W3C 跟踪:

Activity.DefaultIdFormat = ActivityIdFormat.W3C;

配置总线呼叫时:

bus.UseInstrumentation();

编辑: 基于Ryan Bartsch的库和Jimmy Bogard的文章,我创建了这个包,它可以做我需要它做的事情: https://github.com/zidad/MassTransit.ActivityTracing

我是你引用的 MassTransit.OpenTracing 库的作者,但我是在 W3C 建议之前写的,这看起来是最近的(2020 年 2 月 6 日(。

我的目标是希望通过同时具有同步/HTTP 和异步消息代理通信的微服务体系结构进行分布式跟踪。对于HTTP的东西,我使用的是OpenTracing.Contrib.NetCore,它使用.NET的诊断源来检测其代码'。对于异步消息代理通信,我将 RabbitMQ 与 MassTransit 一起使用,但我并不真正理解网站上建议的 MassTransit DiagnosticSource 方法(我也找不到任何示例(,所以我决定稍微了解一下具体细节并滚动我自己的方法。

长话短说,这一切都如预期的那样使用Jaeger作为示踪剂。有趣的是,我们(就像在我工作的公司一样(决定也使用 DynaTrace,它在低得多的级别上运行,并且消除了在代码中处理大量此类内容的需要。也就是说,这种方法并不是无效的(IMO(,因为不是每个人都能买得起DynaTrace(或类似的APM工具(。

我将在未来一周或两周内尝试使用 W3C 建议升级此库。如果您想帮助贡献/审查,请告诉我(或者如果您想朝着不同的方向前进并推出自己的也可以(......

Dynatracing 声称可以与 OpenTracing https://www.dynatrace.com/integrations/opentracing/无缝集成,如果您使用您提到的库并且如果您使用 OpenTracing 检测您的 HTTP 部分,它将开箱即用。

唯一的潜在缺点是在托管服务中获取HTTP调用,并且在处理它通过MassTransit发送或发布消息的上下文中,所有内容都必须使用OpenTracing进行检测,因为它将使用OpenTracing API启动子跨度。

我们使用 Datadog 来做到这一点,因此我们使用 Datadog OpenTracing 集成库,并使用 OpenTracing Contrib 库跟踪 WebApi 和 HttpClient。因此,自动仪器对我们不起作用。但是,使用这些库来检测应用并不难,而不是使用自动检测。

通常的流程如下:

  • 外部 -> WebApi:开始跨度
  • WebApi -> MassTransit:启动子跨度,将上下文注入标头
  • MassTransit -> 消费者:提取上下文,启动子跨度 等等

注入和提取的位都在MassTransit.OpenTracing库中处理,因此无需执行任何额外的操作。

对于您的提供商必须支持 OpenTracing 的库,它通常是这样的:

  • 配置提供程序的跟踪程序
  • 使用提供程序中的集成库将 OpenTracing 全局跟踪器设置为包装器
  • 当您使用 OpenTracing 创建跨度
  • 时,它将创建一个特定于供应商的跨度并将其包装在 OpenTracing 跨度中

最新更新