【问题标题】:Distributed tracing with Elastic APM on .NET Core, non-HTTP在 .NET Core 上使用 Elastic APM 进行分布式跟踪,非 HTTP
【发布时间】:2021-09-19 03:08:45
【问题描述】:

我有兴趣在 ASP.NET Core 中使用 Elastic APM 来检测通过混合协议(HTTP、SQS、SNS)进行通信的一组服务的跟踪。尽管查看了文档,但我不清楚如何使用Elastic APM Public API 将发生在 HTTP 之外的事务相互连接(Elastic APM 会自动检测 HttpClient 以进行跟踪)。

根据文档,我应该能够序列化调用者上的CurrentTransaction.OutgoingDistributedTracingData,然后反序列化它以恢复被调用者上的事务,但是尽管在内存中实现了这种模式,但我在 Kibana 中的跟踪缺少所有跨度但最后的交易。

// transaction 1
var trans1 = Agent.Tracer.StartTransaction("Dist Trans 2", ApiConstants.TypeRequest);

await trans1.CaptureSpan("step 1 processing", ApiConstants.ActionExec, async () => await Task.Delay(30));

// transaction 2
var trans2 = Agent.Tracer.StartTransaction("Dist Trans 2", ApiConstants.TypeRequest,
    DistributedTracingData.TryDeserializeFromString(trans1.OutgoingDistributedTracingData.SerializeToString()));

await trans2.CaptureSpan("step 2 processing", ApiConstants.ActionExec, async () => await Task.Delay(30));

// transaction 3
var trans3 = Agent.Tracer.StartTransaction("Dist Trans 2", ApiConstants.TypeRequest,
    DistributedTracingData.TryDeserializeFromString(trans2.OutgoingDistributedTracingData.SerializeToString()));

await trans3.CaptureSpan("step 3 processing", ApiConstants.ActionExec, async () => await Task.Delay(30));

trans3.End();

可以在Github 上找到我的实施高峰。

【问题讨论】:

    标签: .net elasticsearch asp.net-core distributed-tracing elastic-apm


    【解决方案1】:

    你不会结束trans1trans2

    只需将这两行放在它们的结尾处,一切都应该很好:

    trans1.End();
    trans2.End();
    

    CaptureTransaction,这是一种方便的方法,可以包装您的任何代码并确保事务结束并捕获所有异常 - 因此您使用该方法,它会为您完成“一切”。

    然后是StartTransaction 方法——这是您在代码中使用的方法——它启动事务并且不执行任何其他操作。这里的优势是您可以获得一个ITransaction 实例,您可以随时随地使用它。但在这种情况下,您需要在执行事务(也就是您要捕获的代码)后手动调用.End()

    CaptureSpanStartSpan 相同。

    所以您使用CaptureSpan 作为您的跨度,因此当带有Task.Delay 的lambda 完成时自动结束的那些,另一方面您使用StartTransaction 开始您的事务但只在trans3 上调用.End() 和不在其他 2 笔交易中。

    有一个演示 here 的一些解释 - 该演示的示例代码是 here

    【讨论】:

    • 我最初对此进行了实验。 “结束”我试图扩展或继续的交易对我来说是违反直觉的。当我第一次这样做时,我一定把它搞砸了,因为没有连接痕迹。也就是说,现在再试一次,我的踪迹对链接仓库中的两个示例都有效。太棒了。
    • 这是一个很好的观点:因此最好以一种您不真正扩展或继续事务的方式来考虑这一点。 Elastic APM 使用的术语有:Trace、Transaction、Span。这里的 3 个事务是您正常结束的正常事务,但它们一起形成了一个跟踪 - 所以您不要“继续”这些事务,您只需确保它们是同一跟踪的一部分。一些希望对您有所帮助的文档:elastic.co/guide/en/apm/get-started/current/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2019-12-24
    • 2023-04-05
    • 2019-10-24
    • 2020-06-11
    • 2013-04-20
    相关资源
    最近更新 更多