1

我有兴趣在 ASP.NET Core 中使用 Elastic APM 来检测通过混合协议(HTTP、SQS、SNS)进行通信的一组服务的跟踪。尽管查看了文档,但我不清楚如何使用Elastic APM 公共 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();

kibana 跟踪仪表板

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

4

1 回答 1

2

你没有结束trans1trans2

只需将这两行放在这些结束处,一切都会正常显示:

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

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

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

CaptureSpan和相同StartSpan

因此,您使用CaptureSpan了跨度,因此当 lambdaTask.Delay完成时自动结束的跨度,另一方面,您开始交易StartTransaction但仅调用.End()trans3不是其他 2 个交易。

这里有一个演示的一些解释- 该演示的示例代码在这里

于 2020-03-27T18:53:59.730 回答