首页 > 解决方案 > Elastic APM - 在 C# 代理库中使用 traceparent/trace_id 创建事务/跨度

问题描述

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

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

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

标签: elasticsearchelastic-stackelastic-apm

解决方案


我想知道是否有一种方法可以使用从另一个不使用 HTTP 协议的系统发送的 traceparent 来创建事务(或跨度)。

是的,这是可能的,并且有一个 API。这部分文档解释了它。

所以当你开始你的事务时你需要这样做——我想在你的场景中这将是你从 RabbitMQ 读取消息时。

当您启动事务时,有一个称为可选参数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));

推荐阅读