如何获取当前的TraceId和SpanId

时间:2020-02-10 07:41:47

标签: asp.net-core .net-core system.diagnostics

本文https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/告诉我,字段TraceId可以用作相关ID,太好了!

info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
     => ConnectionId:0HLR1BR0PL1CH 
     => RequestPath:/weatherforecastproxy 
        RequestId:0HLR1BR0PL1CH:00000001, 
        SpanId:|363a800a-4cf070ad93fe3bd8., 
        TraceId:363a800a-4cf070ad93fe3bd8, 
        ParentId: Executed endpoint 'FrontEndApp.Controllers.WeatherForecastProxyController.Get
(FrontEndApp)'

实际上,我可以看到在日志接收器中它的工作如广告所示:当Web应用程序A为请求提供服务并调用Web应用程序B时,它们两个都将相同的TraceId值写入日志。

据我了解,任何接收到传入Request-Id头的ASP.NET Core应用程序都会将相同的头附加到传出的请求上,但是如果该头不存在于传入的请求上,则会有一个新值为传出请求生成。

已经要求我们将该值添加到来自Web应用程序A的响应中,但是(在传入请求中)它不(不足为奇)。

我一直在看System.Diagnostics.Activity类,但是访问Activity.Current并没有给我提供任何有用的实例-TraceID只是{}-即为空。

我的问题是:如何在Web应用程序的上下文中访问TraceId值?

-S

1 个答案:

答案 0 :(得分:3)

当我尝试添加带有TraceId值的标头时,我遇到了同样的问题。

通过ModelValidation进行了一些测试,然后看到在这种错误响应中,“ traceId”值是正确的,但是我无法以任何方式从http上下文变量中获取此值。

然后,我进入了网络核心源代码,以查看 DefaultProblemDetailsFactory 的实现并感到惊讶!通过执行以下操作可获取“ traceId”值:

var traceId = Activity.Current?.Id ?? httpContext?.TraceIdentifier;

是的,您可以使用Activity静态变量获取traceId。

相关问题