所以我有一个 WCF 服务,我在我的开发机器上的控制台应用程序中托管。我在同一台机器上运行PerfView来收集 ETW(Windows 事件跟踪)事件。WCF 服务使用 TPL(任务并行库),我试图在 WCF 请求的整个生命周期内关联所有线程中的 ETW 事件。我说的是服务器,而不是客户端和服务器。但是,当我查看PerfView中的事件并将视图过滤到仅来自我的自定义的那些事件时,EventSource
只有某些线程上的事件具有ActivityId
. 对于任何给定的线程,所有事件都具有ActivityId
或没有事件。此外,所有事件都没有RelatedActivityId
.
此链接与语义日志记录应用程序块(SLAB)有关,但其中提到:
使用 TPL 任务时,每个线程都有自己的活动 ID,并且 TPL 调度代码会自动发布包含 ActivityId 和 RelatedActivityId 值的传输事件。这些可用于关联相关事件。
这对我来说似乎根本不是这样。我不仅没有看到任何与活动 ID 相关的传输事件,而且在许多情况下,正如我之前提到的,活动 ID 完全丢失了。
根据这个 SO 答案:https://stackoverflow.com/a/27620321/1937249:
如果您使用进程外侦听器,则存在错误,即按名称的 TPL 配置不起作用,应使用 GID:https ://slab.codeplex.com/workitem/62
所以我尝试将事件源的 GUID 添加到PerfView 的“附加提供程序”,而不是像这样的名称:
不过,这并没有什么不同。我的事件已发布,但其中许多仍然缺少它们ActivityId
,并且所有事件都缺少它们的RelatedActivityId
.
最后一件事可能是相关的,我使用的是NuGet 包Microsoft.Diagnostics.Tracing
中的命名空间,而不是框架中内置的命名空间。Microsoft.Diagnostics.Tracing.EventSource
System.Diagnostics.Tracing
编辑
这是一张显示从 TplEventSource 捕获的所有事件类型的图像。我假设这意味着 TplEventSource 已启用。我不清楚我是否应该在列表中看到“转移事件”,或者其中一个事件是否应该有一个关键字或其他表明它是转移的字段。如果应该有一个实际的“转移事件”,我在列表中看不到任何类似的东西。
PerfView输出
EventSource
这是我为单个 WCF 请求自定义的事件列表的图片。您可以看到请求从线程 id 10,724 开始。该线程上的每个事件都有一个ActivityId
. 'Asi-Geoservices/StartAuthenticateRequest/Start' 进行异步数据库调用,应用程序在线程 8,268 上恢复。线程 8,268 上的所有事件都没有ActivityId
. 'Asi-Geoservices/StartServiceProviderRequest/Start' 发出一个异步 HTTP 请求,应用程序在线程 11,764 上恢复,再次,该线程上的每个事件都有一个ActivityId
. 在“Asi-Geoservices/StartServiceProviderRequest/Stop”之后,进行了另一个异步数据库调用,应用程序再次在线程 8,268 上恢复,请求最终完成,ActivityId
.