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
Logging 和 tracing 实际上是 相同技术.[=14 的两个名称=]
- 您可以使用日志系统收集诊断信息以帮助解决问题。
- Logging and diagnostics in ASP.NET Core SignalR
- .NET Core logging and tracing
如果要实施分布式跟踪,可以为ASP.NET 核心应用程序启用Application Insights。
经过大量研究,SignalR 不仅几乎没有消息调用生命周期的可扩展性选项(唯一可用的似乎是 HubFilters),而且它根本不支持 W3C 跟踪上下文。我已经开始自己实施这个,但这是一项艰巨的任务,所以我暂缓查看 MS 是否会在接下来的 8 到 12 个月内开始支持它。希望如此。
更多关于我对如何必须手动实施的思考...
集线器过滤器
当消息来自连接的客户端之一时,这些仅提供可扩展性接触点。在客户端请求的方法调用发生之前,您有机会检查来自客户端的消息,并可以在中央位置对所有消息采取措施。对于发送到客户端、被客户端接收或从客户端发送的消息,似乎没有这样的可扩展性选项。为了在这些点注入代码,您必须通过将所有函数调用包装在另一个函数中来手动完成。
Header 和查询字符串支持
SignalR 确实允许您将 headers 和数据添加到查询字符串中,但是由于 Websocket 通信不是通过 HTTP 协议进行的,因此无法使用这些 headers.
结论
如果你想支持从 SignalR 中的 W3C Trace Contexts 实现中获得的与 websockets 相同的功能,你需要在每个请求中传递一个通用的 object(我称之为我的 SignalRContext)和从客户端或服务器。此 object 可用于传递至少一个 TraceId,以帮助将所有应用程序跟踪联系在一起。
我正在为我的应用程序设置分布式跟踪。应用程序中的连接之一是使用 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
Logging 和 tracing 实际上是 相同技术.[=14 的两个名称=]
- 您可以使用日志系统收集诊断信息以帮助解决问题。
- Logging and diagnostics in ASP.NET Core SignalR
- .NET Core logging and tracing
如果要实施分布式跟踪,可以为ASP.NET 核心应用程序启用Application Insights。
经过大量研究,SignalR 不仅几乎没有消息调用生命周期的可扩展性选项(唯一可用的似乎是 HubFilters),而且它根本不支持 W3C 跟踪上下文。我已经开始自己实施这个,但这是一项艰巨的任务,所以我暂缓查看 MS 是否会在接下来的 8 到 12 个月内开始支持它。希望如此。
更多关于我对如何必须手动实施的思考...
集线器过滤器
当消息来自连接的客户端之一时,这些仅提供可扩展性接触点。在客户端请求的方法调用发生之前,您有机会检查来自客户端的消息,并可以在中央位置对所有消息采取措施。对于发送到客户端、被客户端接收或从客户端发送的消息,似乎没有这样的可扩展性选项。为了在这些点注入代码,您必须通过将所有函数调用包装在另一个函数中来手动完成。
Header 和查询字符串支持
SignalR 确实允许您将 headers 和数据添加到查询字符串中,但是由于 Websocket 通信不是通过 HTTP 协议进行的,因此无法使用这些 headers.
结论
如果你想支持从 SignalR 中的 W3C Trace Contexts 实现中获得的与 websockets 相同的功能,你需要在每个请求中传递一个通用的 object(我称之为我的 SignalRContext)和从客户端或服务器。此 object 可用于传递至少一个 TraceId,以帮助将所有应用程序跟踪联系在一起。