通过 MassTransit 传播 W3C 跟踪上下文 publisher/consumer

Propagating W3C trace context over MassTransit publisher/consumer

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

除非有人可以建议已经存在的东西?

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

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

我们使用 Datadog 执行此操作,因此我们使用 Datadog OpenTracing 集成库并使用 OpenTracing Contrib 库跟踪 WebApi 和 HttpClient。因此,自动检测对我们不起作用。但是使用这些库来检测您的应用程序而不是使用自动检测并不难。

通常的流程是这样的:

  • 外部 -> WebApi:开始跨度
  • WebApi -> MassTransit:启动一个 child 跨度,将上下文注入 headers
  • MassTransit -> 消费者:提取上下文,开始 child 跨度 等等

注入和提取的位都在 MassTransit.OpenTracing 库中处理,因此,没有额外的事情要做。

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

  • 配置提供商的追踪器
  • 使用提供商的集成库将 OpenTracing 全局跟踪器设置为包装器
  • 当您使用 OpenTracing 创建跨度时,它会创建一个 vendor-specific 跨度并将其包装在 OpenTracing 跨度中

我是您引用的 MassTransit.OpenTracing 库的作者,但我是在 W3C 推荐之前写的,它看起来是最近的(2020 年 2 月 6 日)。

我的目标是希望通过具有 synchronous/HTTP 和异步消息代理通信的微服务架构进行分布式跟踪。对于我使用的 HTTP 内容 OpenTracing.Contrib.NetCore, which 'uses .NET's DiagnosticSource to instrument its code'. For the asynchronous message broker communications, I was using RabbitMQ with MassTransit, but I didn't really understand the MassTransit DiagnosticSource approach suggested on the website(我也找不到任何示例),所以我决定深入了解具体细节并自己动手做。

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

我会在接下来的一两周内尝试根据 W3C 的建议升级这个库。如果你想帮助 contribution/review(或者如果你想朝不同的方向前进),请告诉我自己动手也可以)...

编辑:它还没有工作,只是在同一个过程中,仍然需要修复它:/

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