在之前的文章中,我们简单的介绍了WF 4.0 beta1中的跟踪机制,并且深入介绍了WF 4.0 beta1的跟踪配置。
你还可以通过试验下面的示例来获得更多WF 4.0 beta1跟踪机制的动手经验。本文所使用的示例包含在下面的资源中:
WCF and WF samples for .NET 4 Beta 1
ETW tracking participant sample
跟踪参与者概览
正如《WF 4.0 beta1中的跟踪机制》所述,WF 4.0的跟踪基础结构由3个主要的组件构成:
跟踪记录:由工作流运行时放出。
跟踪账户:允许你以声明性、灵活的方式来订阅跟踪记录。
跟踪参与者:直接监听运行时放出的跟踪记录,并以根据选择的方式来处理它们。这种处理包括写入到特定的输出(比如文件、控制台、ETW)、处理/汇总这些记录、或者其他方式的组合。
在WF 4.0 中,多个跟踪参与者可以同时消费跟踪事件。每个跟踪参与者都可以关联到一个不同的跟踪配置。
跟踪参与者用于获取工作流放出的跟踪数据,并将它们存储到不同的媒介中。所以,跟踪记录的任何后期处理也可以通过跟踪参与者来完成。在将来的文章中,我们会介绍WF 4.0跟踪基础结构完整的可扩展性,包括便携自定义跟踪参与者。
现成的ETW跟踪参与者
在.NET 4中,我们内置了一个现成的Event Tracing for Windows(ETW) 跟踪参与者,它可以将跟踪记录输出到ETW。ETW跟踪参与者会将这些记录写入到一个ETW会话中,写入的方式非常高效,对应用性能的影响也非常小。
使用跟踪参与者的优势之一便是可以在Windows事件查看器中查看跟踪记录,就在“应用程序”分类和“系统”分类的旁边。
下面是在Web.config文件中配置ETW跟踪参与者的示例:
- <configuration>
- <system.web>
- <compilation targetFrameworkMoniker=".NETFramework,Version=v4.0"/>
- </system.web>
- <system.serviceModel>
- <diagnostics etwProviderId="52A3165D-4AD9-405C-B1E8-7D9A257EAC9F" />
- <tracking>
- <participants>
- <add name="EtwTrackingParticipant"
- type="System.Activities.Tracking.EtwTrackingParticipant, System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
- profileName="HealthMonitoring_Tracking_Profile"/>
- </participants>
- </tracking>
- <behaviors>
- <serviceBehaviors>
- <behavior name="SampleTrackingSample.SampleWFBehavior">
- <trackingComponents>
- <add name="EtwTrackingParticipant"/>
- </trackingComponents>
- </behavior>
- </serviceBehaviors>
- </behaviors>
- </system.serviceModel>
- </configuration>
在ETW中,事件是通过Provider Id来写入到ETW会话中的。ETW跟踪参与者所使用的Provider Id定义于Web.config的diagnostics节(在<system.serviceModel><diagnostics>中):
- <system.serviceModel>
- <diagnostics etwProviderId="52A3165D-4AD9-405C-B1E8-7D9A257EAC9F" />
- …
在没有指定Provider Id时,ETW跟踪参与者会使用一个默认的Provider Id。
跟踪参与者定义于<system.serviceModel><tracking><participants>节。每个跟踪参与者都有一个与之关联的配置,藉此来制定它所订阅的跟踪记录:
- <system.serviceModel>
- …
- <tracking>
- <participants>
- <add name="EtwTrackingParticipant"
- type="System.Activities.Tracking.EtwTrackingParticipant, System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
- profileName="HealthMonitoring_Tracking_Profile"/>
- </participants>
- </tracking>
- …
定义好它们之后,就可以把跟踪参与者添加到服务行为中。这会把选中的跟踪参与者添加到工作流实例的扩展中,它们就这样开始接收跟踪记录了。
为此,我们只需要像这样来使用之前步骤中定义的跟踪参与者名称:
- <behaviors>
- <serviceBehaviors>
- <behavior name="SampleTrackingSample.SampleWFBehavior">
- <trackingComponents>
- <add name="EtwTrackingParticipant"/>
- </trackingComponents>
- </behavior>
- </serviceBehaviors>
- </behaviors>
下图阐述了跟踪数据经过ETW跟踪参与者的流转过程:
一旦跟踪数据到达了ETW会话中,就能够以多种方式来消费它。最常使用的方法之一是通过事件查看器来消费这些事件,事件查看器是一个用来查看来自应用程序和服务的日志与跟踪记录的Windows工具。
在事件查看器中消费来自ETW跟踪参与者的跟踪数据
由ETW跟踪参与者写入到ETW会话中的事件可以被事件查看器消费(当使用默认Provider Id时)。这就允许快速地查看工作流放出的跟踪记录。
在事件查看器中启用跟踪记录的方法如下:
打开事件查看器(eventvwr.exe)
定位到“应用程序和服务日志”>“Microsoft”>“WCF”>“WF-Development”
右键单击并选择“Show Analytic and Debug logs”来启用查看
启用日志
在ETW Tracking Participant Sample中,工作流模拟了出错的情况,ETW跟踪参与者则用来跟踪这个问题。下图显示了事件查看器中的跟踪事件:
所有跟踪记录都拥有从100-112的ETW事件ID。其他事件ID(200-225)则用于其他类型的追踪(Tracing)(比如WCF追踪)。在将来的文章中,我们会全面地介绍与监视数据视图相关的追踪和跟踪事件。
通过EW跟踪参与者放出的跟踪记录还会在事件查看器中显示适当的安全级别。这样就能够很轻松地识别工作流执行过程中出现的任何警告或者错误。
.NET 4.0 beta1通过使用ETW跟踪参与者以及它与事件查看器的集成,使得消费跟踪记录变得又快捷又轻松。
预告
在将来的文章中,我们还会介绍自定义跟踪参与者和如何放出自定义跟踪记录。与此同时,我们也期待您对以下示例和动手实验的反馈:
WCF and WF samples for .NET 4 Beta 1
ETW tracking participant sample
【编辑推荐】