【问题标题】:Elastic APM - Creating Transaction / Span using traceparent / trace_id in C# Agent LibrariesElastic APM - 在 C# 代理库中使用 traceparent/trace_id 创建事务/跨度
【发布时间】:2021-02-07 12:43:54
【问题描述】:

我正在 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 以获取信息,但找不到任何相关信息。有办法吗?谢谢。

【问题讨论】:

    标签: elasticsearch elastic-stack elastic-apm


    【解决方案1】:

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

    是的,这是可能的,并且有一个 API。 This part of the documentation 解释它。

    因此,您需要在开始事务时执行此操作 - 我想在您的场景中,这将是您从 RabbitMQ 读取消息时。

    当您start the transaction 时,有一个名为distributedTracingData 的可选参数 - 如果您传递它,那么事务将重用您通过 RabbitMQ 传递的 traceid,这样新事务将成为整个跟踪的一部分。如果不传这个参数,会生成一个新的traceid并启动一个新的trace。

    另一条可能有帮助的评论:您将跟踪 id 传递给启动事务的方法,并且每个跨度将在事务中继承此跟踪 id - 因此您可以在事务级别控制它,因此您不会传递它变成一个跨度。

    这里有一个小代码 sn-p 说明它的外观:

    serializedDistributedTracingData = //read this from the message which you get RabbitMq
    
    var transaction2 = Agent.Tracer.StartTransaction("RadFromQueue", "RabbitMQRead",
         DistributedTracingData.TryDeserializeFromString(serializedDistributedTracingData));
    

    【讨论】:

    • 嗨@gregkalapos 我也看到了这个,但不太理解 serializedDistributedTracingData 对象的格式。我希望会有一个重载方法来获取跟踪 ID 并创建事务。我会在这个方向多看一点,并在这里发表评论。感谢感谢您的帮助。
    【解决方案2】:

    @gregkalapos,再次感谢您提供的信息。我检查了如何获取node.js agent documentation 中的必要跟踪信息,当我调试时注意到它是跟踪ID。接下来在 C# 消费者端,我放置了 .Net agent 中提到的代码 sn-p 并运行它。 Kibana 按照我希望的那样在一个跟踪中显示了来自两个不同服务的事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2022-12-13
      • 2020-07-21
      • 1970-01-01
      相关资源
      最近更新 更多