如何获取当前的TraceId和SpanId

问题描述 投票:0回答:1

本文,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

asp.net-core .net-core system.diagnostics
1个回答
0
投票

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

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

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

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

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

我希望这可以帮助您。

塞巴斯蒂安

© www.soinside.com 2019 - 2024. All rights reserved.