ASP.Net Core SignalR 是否支持 W3C 跟踪上下文或任何类型的分布式跟踪?

Does ASP.Net Core SignalR support W3C Trace Contexts or any kind of distributed tracing?

我正在为我的应用程序设置分布式跟踪。应用程序中的连接之一是使用 SignalR 的 WebSocket 连接。 SignalR 连接的两端都是 asp.net 核心应用程序。一个是 Windows 服务(客户端),另一个在 Web 服务器(服务器)下运行。

通信将来自两个方向,因此我将让 TraceIds 源自连接两端的请求。 SignalR 是否具有来回传递此跟踪信息的工具?我到处搜索,几乎没有关于支持 W3C 跟踪上下文的 SignalR 的信息,甚至没有像 .net core pre 2.0 这样的自定义实现的跟踪系统的信息。

我尝试在服务器端发出请求时创建一个新的 Activity,但我认为没有任何跟踪信息发送到客户端。我可能没有在正确的地方寻找,但是当我在客户端检查 System.Diagnostics.Activity.CurrentActivity 时,我只得到 null 即使在服务器上我有以下 Activity打电话。

System.Diagnostics.Activity.Current
{System.Diagnostics.Activity}
    ActivityTraceFlags: None
    Baggage: {System.Collections.Generic.KeyValuePair<string, string>[0]}
    Context: {System.Diagnostics.ActivityContext}
    DisplayName: "Microsoft.AspNetCore.Hosting.HttpRequestIn"
    Duration: {00:00:00}
    Events: {System.Diagnostics.ActivityEvent[0]}
    Id: "00-eb7a4125a171a6438a44ddda5a637cd0-f7c16b0bb8512443-00"
    IdFormat: W3C
    IsAllDataRequested: true
    Kind: Internal
    Links: {System.Diagnostics.ActivityLink[0]}
    OperationName: "Microsoft.AspNetCore.Hosting.HttpRequestIn"
    Parent: null
    ParentId: null
    ParentSpanId: {0000000000000000}
    Recorded: false
    RootId: "eb7a4125a171a6438a44ddda5a637cd0"
    Source: {System.Diagnostics.ActivitySource}
    SpanId: {f7c16b0bb8512443}
    StartTimeUtc: {7/13/2021 11:26:13 PM}
    TagObjects: {System.Collections.Generic.KeyValuePair<string, object>[0]}
    Tags: {System.Collections.Generic.KeyValuePair<string, string>[0]}
    TraceId: {eb7a4125a171a6438a44ddda5a637cd0}
    TraceStateString: null

我希望有人能对此有所启发。

谢谢!

-=-=-=-=编辑-=-=-=-=

当托管在 Blazor 应用程序中时,SignalR 似乎至少支持某种级别的 W3C 上下文跟踪。虽然不知道该怎么做。 https://github.com/dotnet/aspnetcore/issues/29846

Loggingtracing 实际上是 相同技术.[=14 的两个名称=]

  1. 您可以使用日志系统收集诊断信息以帮助解决问题。
  2. Logging and diagnostics in ASP.NET Core SignalR
  3. .NET Core logging and tracing

如果要实施分布式跟踪,可以为ASP.NET 核心应用程序启用Application Insights

  1. Application Insights for ASP.NET Core applications
  2. .NET distributed tracing

经过大量研究,SignalR 不仅几乎没有消息调用生命周期的可扩展性选项(唯一可用的似乎是 HubFilters),而且它根本不支持 W3C 跟踪上下文。我已经开始自己实施这个,但这是一项艰巨的任务,所以我暂缓查看 MS 是否会在接下来的 8 到 12 个月内开始支持它。希望如此。

更多关于我对如何必须手动实施的思考...

集线器过滤器

当消息来自连接的客户端之一时,这些仅提供可扩展性接触点。在客户端请求的方法调用发生之前,您有机会检查来自客户端的消息,并可以在中央位置对所有消息采取措施。对于发送到客户端、被客户端接收或从客户端发送的消息,似乎没有这样的可扩展性选项。为了在这些点注入代码,您必须通过将所有函数调用包装在另一个函数中来手动完成。

Header 和查询字符串支持

SignalR 确实允许您将 headers 和数据添加到查询字符串中,但是由于 Websocket 通信不是通过 HTTP 协议进行的,因此无法使用这些 headers.

结论

如果你想支持从 SignalR 中的 W3C Trace Contexts 实现中获得的与 websockets 相同的功能,你需要在每个请求中传递一个通用的 object(我称之为我的 SignalRContext)和从客户端或服务器。此 object 可用于传递至少一个 TraceId,以帮助将所有应用程序跟踪联系在一起。