问题描述
我正在 Elastic APM 中试用 .Net 代理,并且我正在使用一个 C# 应用程序,该应用程序是使用名为 ASP.net Boilerplate 的框架创建的。我已经添加了文档中提到的核心库,并在 appsettings.json 中添加了设置。这将启用默认检测,并且我在通过 Kibana 可视化的 APM 中获得了跟踪。
目前我有一个 node.js 应用程序正在运行,我将一条消息发布到 RabbitMQ 队列,消息负载中包含 traceparent。 C# 应用程序读取发布的消息。我需要使用此 traceparent/trace id 创建事务或跨度,以便 Kibana 显示分布式系统之间的跟踪。
我想知道是否有办法使用从不使用 HTTP 协议的另一个系统发送的 traceparent 创建事务(或跨度)。我已经检查了 Elastic APM 代理文档 -> 公共 API 以获取信息,但找不到任何关于此的信息。有办法吗?谢谢。
解决方法
我想知道是否有办法使用从不使用 HTTP 协议的另一个系统发送的 traceparent 创建事务(或跨度)。
是的,这是可能的,并且有一个 API。 This part of the documentation 对此进行了解释。
因此,您需要在开始交易时执行此操作 - 我想在您的场景中,这将是您从 RabbitMQ 读取消息时。
当你 start the transaction 有一个可选参数叫做 distributedTracingData
- 如果你传递它,那么事务将重用你通过 RabbitMQ 传递的 traceid,这样新事务将成为一部分整个痕迹。如果不传递这个参数,会生成一个新的traceid,并开始一个新的trace。
另一条可能有帮助的评论:您将跟踪 ID 传递到启动事务的方法中,每个跨度都将在事务中继承此跟踪 ID - 因此您可以在事务级别控制它,因此您不会传递它成一个跨度。
这是一个关于它的外观的小代码片段:
serializedDistributedTracingData = //read this from the message which you get RabbitMq
var transaction2 = Agent.Tracer.StartTransaction("RadFromQueue","RabbitMQRead",DistributedTracingData.TryDeserializeFromString(serializedDistributedTracingData));
,
@gregkalapos,再次感谢您提供的信息。我检查了如何获取必要的跟踪信息,如 node.js agent documentation 中所示,当我调试时注意到它是跟踪 ID。接下来在 C# 消费者端,我放置了 .Net agent 中提到的代码片段并运行了它。 Kibana 在一个跟踪中显示了来自两个不同服务的交易,正如我希望的那样。