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

问题描述

我正在 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 在一个跟踪中显示了来自两个不同服务的交易,正如我希望的那样。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...