Elastic APM - 在 C# 代理库中使用 traceparent / trace_id 创建事务/跨度

Elastic APM - Creating Transaction / Span using traceparent / trace_id in C# Agent Libraries

我正在 Elastic APM 中试用 .Net 代理,我正在使用一个 C# 应用程序,该应用程序是使用名为 ASP.net Boilerplate 的框架创建的。我已经添加了文档中提到的核心库,并在 appsettings.json 中添加了设置。这将启用默认检测,并且我在通过 Kibana 可视化的 APM 中获得了跟踪。

目前我有一个 node.js 应用程序 运行 并且我将一条消息发布到 RabbitMQ 队列,消息负载中包含 traceparent。 C# 应用读取发布的消息。我需要使用此 traceparent / trace id 创建事务或跨度,以便 Kibana 显示分布式系统之间的跟踪。

我想知道是否有一种方法可以使用从另一个不使用 HTTP 协议的系统发送的跟踪父项来创建事务(或跨度)。我已经检查了 Elastic APM 代理文档 -> Public API 以获取信息,但找不到任何相关信息。有办法吗?谢谢

I want to know if there is a way to create a transaction (or span) using a traceparent that is being sent from another system not using a HTTP protocol.

是的,这是可能的,并且有一个 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 and when I debugged noticed that it was the trace id. Next in the C# consumer end I placed a code snippet as mentioned in the .Net agent 并给它一个 运行。正如我所希望的那样,Kibana 在单个跟踪中显示了来自两个不同服务的事务。