ワークフローの追跡の構成
このトピックの内容は、Windows Workflow Foundation 4 に該当します。
ワークフローは、次の 3 つの方法で実行できます。
WorkflowServiceHost でホストする
WorkflowApplication として実行する
WorkflowInvoker を使用して直接実行する
ワークフローのホスト オプションに応じて、コードまたは構成ファイルによって追跡参加要素を追加できます。ここでは、追跡参加要素を WorkflowApplication および WorkflowServiceHost に追加して追跡を構成する方法、および WorkflowInvoker の使用時に追跡を有効にする方法について説明します。
ワークフロー アプリケーション追跡の構成
ワークフローは、WorkflowApplication クラスを使用して実行できます。ここで、追跡参加要素を WorkflowApplication ワークフロー ホストに追加することで、.NET Framework Version 4 ワークフロー アプリケーション用に追跡を構成する方法について説明します。この場合、ワークフローはワークフロー アプリケーションとして実行されます。WorkflowApplication クラスを使用する自己ホスト型の .exe ファイルであるコードを介して (構成ファイルを使用せずに)、ワークフロー アプリケーションを構成します。追跡参加要素は WorkflowApplication インスタンスの拡張として追加します。これを行うには、TrackingParticipant を WorkflowApplication インスタンスの拡張コレクションに追加します。
ワークフロー アプリケーションの場合、次のコードのように EtwTrackingParticipant 動作拡張を追加できます。
LogActivity activity = new LogActivity();
WorkflowApplication instance = new WorkflowApplication(activity);
EtwTrackingParticipant trackingParticipant =
new EtwTrackingParticipant
{
TrackingProfile = new TrackingProfile
{
Name = "SampleTrackingProfile",
ActivityDefinitionId = "ProcessOrder",
Queries = new WorkflowInstanceQuery
{
States = { "*" }
}
}
};
instance.Extensions.Add(trackingParticipant);
ワークフロー サービス追跡の構成
WorkflowServiceHost サービス ホストでホストする場合、ワークフローは WCF サービスとして公開できます。WorkflowServiceHost はワークフロー ベースのサービス向けに特化した .NET ServiceHost 実装です。ここでは、WorkflowServiceHost で実行されている .NET Framework 4 ワークフロー サービスの追跡を構成する方法について説明します。Web.config ファイル (Web ホスト サービスの場合) または App.config ファイル (コンソール アプリケーションなどのスタンドアロン アプリケーションでホストされるサービスの場合) を介し、サービス動作を指定して構成するか、またはコードを介し、サービス ホスト用に Behaviors コレクションに追跡固有の動作を追加して構成できます。
WorkflowServiceHost でホストされるワークフロー サービスの場合、次の例のように、構成ファイル内の <behavior> 要素を使用して EtwTrackingParticipant を追加できます。
<behaviors>
<serviceBehaviors>
<behavior>
<etwTracking profileName="Sample Tracking Profile" />
</behavior>
</serviceBehaviors>
<behaviors>
また、WorkflowServiceHost でホストされるワークフロー サービスの場合、コードを介して EtwTrackingParticipant 動作拡張を追加できます。カスタムの追跡参加要素を追加するには、次のコード例のように、新しい動作拡張を作成し、それを ServiceHost に追加します。
![]() |
---|
カスタムの追跡参加要素を追加するカスタムの動作要素を作成する方法を示すサンプル コードを確認するには、「追跡」のサンプルを参照してください。 |
ServiceHost svcHost = new ServiceHost(typeof(WorkflowService), new
Uri("https://localhost:8001/Sample"));
EtwTrackingBehavior trackingBehavior =
new EtwTrackingBehavior
{
ProfileName = "Sample Tracking Profile"
};
svcHost.Description.Behaviors.Add(trackingBehavior);
svcHost.Open();
追跡参加要素は、動作の拡張としてワークフロー サービス ホストに追加されます。
以下のサンプル コードは、構成ファイルから追跡プロファイルを読み取る方法の例です。
TrackingProfile GetProfile(string profileName, string displayName)
{
TrackingProfile trackingProfile = null;
TrackingSection trackingSection = (TrackingSection)WebConfigurationManager.GetSection("system.serviceModel/tracking");
if (trackingSection == null)
{
return null;
}
if (profileName == null)
{
profileName = "";
}
//Find the profile with the specified profile name in the list of profile found in config
var match = from p in new List<TrackingProfile>(trackingSection.TrackingProfiles)
where (p.Name == profileName) && ((p.ActivityDefinitionId == displayName) || (p.ActivityDefinitionId == "*"))
select p;
if (match.Count() == 0)
{
//return an empty profile
trackingProfile = new TrackingProfile()
{
ActivityDefinitionId = displayName
};
}
else
{
trackingProfile = match.First();
}
return trackingProfile;
このサンプル コードは、ワークフロー ホストに追跡プロファイルを追加する方法の例です。
WorkflowServiceHost workflowServiceHost = serviceHostBase as WorkflowServiceHost;
if (null != workflowServiceHost)
{
string workflowDisplayName = workflowServiceHost.Activity.DisplayName;
TrackingProfile trackingProfile = GetProfile(this.profileName, workflowDisplayName);
workflowServiceHost.WorkflowExtensions.Add(() => new EtwTrackingParticipant {
TrackingProfile = trackingProfile
});
}
WorkflowInvoker を使用した追跡の構成
WorkflowInvoker を使用して実行するワークフローの追跡を構成するには、追跡プロバイダーを拡張として WorkflowInvoker インスタンスに追加します。次のコード例は、「カスタム追跡」のサンプルから抜粋したものです。
WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);
invoker.Invoke();
イベント ビューアーでの追跡レコードの表示
EtwTrackingParticipant 拡張機能を使用する場合、追跡レコードは、[Microsoft]、[Windows]、[アプリケーション サーバー - アプリケーション] の順にノードを展開すると表示される分析ログに示されます。追跡レコードを表示するには、次の手順を実行します。
イベント ビューアーを開くために、[スタート] ボタン、[ファイル名を指定して実行] の順にクリックします。[ファイル名を指定して実行] ダイアログ ボックスで、「eventvwr」と入力します。
[イベント ビューアー] ダイアログ ボックスで、[アプリケーションとサービス ログ] ノードを展開します。
[Microsoft]、[Windows]、[アプリケーション サーバー - アプリケーション] の順にノードを展開します。
[アプリケーション サーバー - アプリケーション] ノードの下の [分析] ノードを右クリックし、[ログを有効にする] をクリックします。
追跡が有効になっているアプリケーションを実行して追跡レコードを生成します。
[分析] ノードを右クリックし、[最新の情報に更新] をクリックします。追跡レコードが中央ペインに表示されます。
イベント ビューアーの追跡イベントを次の図に示します。
アプリケーション固有のプロバイダー ID の登録
イベントを特定のアプリケーション ログに書き込む必要がある場合は、次の手順に従って新しいプロバイダー マニフェストを登録します。
アプリケーション構成ファイルでプロバイダー ID を宣言します。
<system.serviceModel> <diagnostics etwProviderId="2720e974-9fe9-477a-bb60-81fe3bf91eec"/> </system.serviceModel>
マニフェスト ファイルを %windir%\Microsoft.NET\Framework\<.NET Framework 4 の最新バージョン>\Microsoft.Windows.ApplicationServer.Applications.man から一時的な場所にコピーし、その名前を Microsoft.Windows.ApplicationServer.Applications_Provider1.man に変更します。
マニフェスト ファイルの GUID を新しい GUID に変更します。
<provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}"
既定のプロバイダーをアンインストールしない場合は、プロバイダー名を変更します。
<provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}"
前の手順でプロバイダー名を変更した場合は、マニフェスト ファイルのチャネル名を新しいプロバイダー名に変更します。
<channel name="Microsoft-Windows-Application Server-Applications_Provider1/Admin" chid="ADMIN_CHANNEL" symbol="ADMIN_CHANNEL" type="Admin" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ADMIN_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Operational" chid="OPERATIONAL_CHANNEL" symbol="OPERATIONAL_CHANNEL" type="Operational" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.OPERATIONAL_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Analytic" chid="ANALYTIC_CHANNEL" symbol="ANALYTIC_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ANALYTIC_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Debug" chid="DEBUG_CHANNEL" symbol="DEBUG_CHANNEL" type="Debug" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.DEBUG_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Perf" chid="PERF_CHANNEL" symbol="PERF_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.PERF_CHANNEL.message)" />
次の手順に従ってリソース DLL を生成します。
Windows SDK をインストールします。Windows SDK には、メッセージ コンパイラ (mc.exe) およびリソース コンパイラ (rc.exe) が含まれています。
Windows SDK コマンド プロンプトで、新しいマニフェスト ファイルに対して mc.exe を実行します。
mc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.man
前の手順で生成されたリソース ファイルに対して rc.exe を実行します。
rc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.rc
NewProviderReg.cs という名前の空の cs ファイルを作成します。
C# コンパイラを使用してリソース DLL を作成します。
csc /target:library /win32res:Microsoft.Windows.ApplicationServer.Applications_Provider1.res NewProviderReg.cs /out:Microsoft.Windows.ApplicationServer.Applications_Provider1.dll
マニフェスト ファイルのリソース dll とメッセージ dll の名前を
Microsoft.Windows.ApplicationServer.Applications.Provider1.man
から新しい dll 名に変更します。<provider name="Microsoft-Windows-Application Server-Applications_Provider1" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" symbol="Microsoft_Windows_ApplicationServer_ApplicationEvents" resourceFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll" messageFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll">
wevtutil を使用してマニフェストを登録します。
wevtutil im Microsoft.Windows.ApplicationServer.Applications_Provider1.man