【问题标题】:How to get the current TraceId and SpanId如何获取当前的 TraceId 和 SpanId
【发布时间】:2023-03-17 02:35:02
【问题描述】:

这篇文章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

【问题讨论】:

  • 你试过HttpContext.TraceIdentifier吗?
  • 是的,这会产生一个似乎跨越当前请求的不同 Id,但它似乎不会传播到下一个应用程序中。例如:Web 应用程序 A:0HLTE0F4RQOTU:00000001 WebApplication B:0HLTE0F5N8LF8:00000002 在我的日志接收器中,该值被记录为“RequestId”,考虑到记录的“TraceId”似乎来自 Request-Id,这有点令人困惑标题。我猜,给事物命名很难。

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


【解决方案1】:

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

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

然后去net core源码看DefaultProblemDetailsFactory的实现,惊喜! “traceId”值是这样获得的:

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

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

【讨论】:

  • 有趣 - 我会看看它,看看它是否给了我预期的结果。
猜你喜欢
  • 2021-04-25
  • 2019-12-17
  • 2021-08-31
  • 2020-08-21
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多