詳解WF 4.0 beta1中的跟蹤參與者
在之前的文章中,我們簡單的介紹了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
【編輯推薦】