追跡プロファイル
このトピックの内容は、Windows Workflow Foundation 4 に該当します。
追跡プロファイルには、実行時にワークフロー インスタンスの状態が変化したときに生成されるワークフロー イベントを追跡参加要素がサブスクライブすることを可能にする追跡クエリが含まれています。
追跡プロファイル
監視の要件に応じて、ワークフローの主な状態変化の少数のセットをサブスクライブする、非常に一般的なプロファイルを作成できます。それとは反対に、結果として得られるイベントが、後で詳細な実行フローを十分に再構築できる極めて詳細なプロファイルを作成することもできます。
追跡プロファイルは、標準の .NET Framework 構成ファイル内の XML 要素や、コードで指定される XML 要素として出現します。追跡参加要素が Started
と Completed
のワークフロー イベントをサブスクライブできるようにする構成ファイルの .NET Framework Version 4 追跡プロファイルの例を次に示します。
<system.serviceModel>
…
<tracking>
<trackingProfile name="Sample Tracking Profile">
<workflow activityDefinitionId="*">
<workflowInstanceQueries>
<workflowInstanceQuery>
<states>
<state name="Started"/>
<state name="Completed"/>
</states>
</workflowInstanceQuery>
</workflowInstanceQueries>
</workflow>
</trackingProfile>
</profiles>
</tracking>
…
</system.serviceModel>
追跡レコードは、ImplementationVisibility 属性を使用して、追跡プロファイル内部の表示モードを通じてフィルター処理されます。複合アクティビティは、その実装を形成する他のアクティビティを含む最上位アクティビティです。表示モードは、実装を形成するアクティビティが追跡されているかどうかを指定するために、ワークフロー アクティビティ内の複合アクティビティから生成された追跡レコードを指定します。表示モードは、追跡プロファイル レベルで適用されます。ワークフロー内にある個々のアクティビティの追跡レコードのフィルター処理は、追跡プロファイル内のクエリによって制御されます。詳細については、このドキュメントで後述される「プロファイルのクエリの型の追跡」を参照してください。
追跡プロファイルの implementationVisibility
属性で指定される 2 つの表示モードは、RootScope
と All
です。RootScope
モードを使用すると、複合アクティビティがワークフローのルート アクティビティでない場合にアクティビティの実装を形成するアクティビティの追跡レコードが抑制されます。したがって、他のアクティビティを使用して実装されているアクティビティがワークフローに追加された場合、implementationVisibility
が RootScope に設定されていると、その複合アクティビティ内の最上位アクティビティのみが追跡されます。アクティビティがワークフローのルート アクティビティである場合、アクティビティの実装はワークフローそのものであり、追跡レコードはその実装を形成するアクティビティを対象として生成されます。All モードを使用すると、ルート アクティビティとそのすべての複合アクティビティを対象として、すべての追跡レコードを生成できます。
たとえば、MyActivity は Activity1 と Activity2 の 2 つのアクティビティが実装に含まれている複合アクティビティである、とします。この複合アクティビティがワークフローに追加され、implementationVisibility
が RootScope
に設定された追跡プロファイルで追跡が有効化されると、追跡レコードは MyActivity のみを対象として生成されます。しかし、Activity1 と Activity2 の各アクティビティについてはレコードは生成されません。
これに対して、追跡プロファイルの implementationVisisbility
属性が All
に設定されている場合は、MyActivity だけでなく、Activity1 と Activity2 の各アクティビティについても、追跡レコードが生成されます。
implementationVisibility
フラグは、次の追跡レコード タイプに適用されます。
ActivityStateRecord
FaultPropagationRecord
CancelRequestedRecord
ActivityScheduledRecord
注 : |
---|
アクティビティの実装から生成される CustomTrackingRecords は、implementationVisibility 設定によるフィルター処理で除外されません。 |
implementationVisibility
機能は、コードの追跡プロファイルで次のように指定されます。
TrackingProfile sampleTrackingProfile = new TrackingProfile()
{
Name = "Sample Tracking Profile"
ActivityDefinitionId="EmailWorkflow"
ImplementationVisibility = ImplementationVisibility.RootScope
}
implementationVisibility
機能の指定は、次のように構成ファイルの追跡プロファイルで行うこともできます。
<tracking>
<profiles>
<trackingProfile name="Shipping Monitoring" implementationVisibility="All">
<workflow activityDefinitionId="*">
….
</workflow>
</trackingProfile>
</profiles>
</tracking>
追跡プロファイルの ImplementationVisibility
設定は必要に応じて行います。既定では、この値は RootScope
に設定されます。この属性の値も、大文字と小文字が区別されます。
プロファイルのクエリの型の追跡
追跡プロファイルは、特定の追跡レコードを対象としてワークフロー ランタイムをクエリすることができる追跡レコードの宣言型のサブスクリプションとして構築されます。クエリには、TrackingRecord オブジェクトのさまざまなクラスをサブスクライブできる型がいくつかあります。追跡プロファイルは、構成で指定したり、コードで指定したりすることができます。最も一般的なクエリの型は次のとおりです。
WorkflowInstanceQuery - 前に説明した
Started
やCompleted
など、ワークフロー インスタンスのライフサイクルの変化を追跡するために使用します。WorkflowInstanceQuery は、次の TrackingRecord オブジェクトのサブスクライブに使用されます。サブスクライブ可能な状態は、WorkflowInstanceStates クラスで指定します。
WorkflowInstanceQuery を使用して
Started
インスタンス状態のワークフロー インスタンス レベルの追跡レコードをサブスクライブするために使用される構成またはコードを、次の例に示します。<workflowInstanceQueries> <workflowInstanceQuery> <states> <state name="Started"/> </states> </workflowInstanceQuery> </workflowInstanceQueries> TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile" ActivityDefinitionId="EmailWorkflow" Queries = { new WorkflowInstanceQuery() { States = { WorkflowInstanceStates.Started} } } }
ActivityStateQuery - ワークフロー インスタンスを構成するアクティビティのライフ サイクルの変化を追跡するために使用します。たとえば、ワークフロー インスタンスの "電子メール送信" アクティビティの完了を毎回追跡する必要がある場合があります。このクエリは、TrackingParticipant が ActivityStateRecord オブジェクトをサブスクライブするのに必要です。サブスクライブ可能な状態は ActivityStates で指定します。
SendEmailActivity
アクティビティに ActivityStateQuery を使用するアクティビティ状態の追跡レコードをサブスクライブするために使用される構成またはコードを、次の例に示します。<activityStateQueries> <activityStateQuery activityName="SendEmailActivity"> <states> <state name="Closed"/> </states> </activityStateQuery> </activityStateQueries> TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile" ActivityDefinitionId="EmailWorkflow" Queries = { new ActivityStateQuery() { ActivityName = "SendEmailActivity", States = { ActivityStates.Closed } } } }
ActivityScheduledQuery - このクエリを使用すると、親アクティビティによって実行がスケジュールされているアクティビティを追跡できます。このクエリは、TrackingParticipant が ActivityScheduledRecord オブジェクトをサブスクライブするのに必要です。
ActivityScheduledQuery を使用して、スケジュールされている
SendEmailActivity
子アクティビティに関連するレコードをサブスクライブするために使用される構成またはコードを、次の例に示します。<activityScheduledQueries> <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName=" SendEmailActivity" /> </activityScheduledQueries> TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile" ActivityDefinitionId="EmailWorkflow" Queries = { new ActivityScheduledQuery() { ActivityName = "ProcessNotificationsActivity", ChildActivityName = "SendEmailActivity" } } }
FaultPropagationQuery - アクティビティ内で発生したエラーの処理を追跡するために使用します。このクエリは、TrackingParticipant が FaultPropagationRecord オブジェクトをサブスクライブするのに必要です。
FaultPropagationQuery を使用して、エラー伝達に関連するレコードをサブスクライブするために使用される構成またはコードを、次の例に示します。
<faultPropagationQueries> <faultPropagationQuery faultSourceActivityName="SendEmailActivity" faultHandlerActivityName="NotificationsFaultHandler" /> </faultPropagationQueries> TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile" ActivityDefinitionId="EmailWorkflow" Queries = { new FaultPropagationQuery() { FaultSourceActivityName = "SendEmailActivity", FaultHandlerActivityName = "NotificationsFaultHandler" } } }
CancelRequestedQuery - 親アクティビティによって子アクティビティをキャンセルする要求を追跡するために使用されます。このクエリは、TrackingParticipant が CancelRequestedRecord オブジェクトをサブスクライブするのに必要です。
CancelRequestedQuery を使用して、アクティビティのキャンセルに関連するレコードをサブスクライブするために使用される構成またはコードを、次の例に示します。
<cancelRequestedQueries> <cancelRequestedQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" /> </cancelRequestedQueries> TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile" ActivityDefinitionId="EmailWorkflow" Queries = { new CancelRequestedQuery() { ActivityName = "ProcessNotificationsActivity", ChildActivityName = "SendEmailActivity" } } }
CustomTrackingQuery - コード アクティビティで定義するイベントを追跡するために使用します。このクエリは、TrackingParticipant が CustomTrackingRecord オブジェクトをサブスクライブするのに必要です。
CustomTrackingQuery を使用して、カスタム追跡レコードに関連するレコードをサブスクライブするために使用される構成またはコードを、次の例に示します。
<customTrackingQueries> <customTrackingQuery name="EmailAddress" activityName="SendEmailActivity" /> </customTrackingQueries> TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile" ActivityDefinitionId="EmailWorkflow" Queries = { new CustomTrackingQuery() { Name = "EmailAddress", ActivityName = "SendEmailActivity" } } }
BookmarkResumptionQuery - ワークフロー インスタンス内のブックマークの再開を追跡するために使用します。このクエリは、TrackingParticipant が BookmarkResumptionRecord オブジェクトをサブスクライブするのに必要です。
BookmarkResumptionQuery を使用して、ブックマークの再開に関連するレコードをサブスクライブするために使用される構成またはコードを、次の例に示します。
<bookmarkResumptionQueries> <bookmarkResumptionQuery name="SentEmailBookmark" /> </bookmarkResumptionQueries> TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile" ActivityDefinitionId="EmailWorkflow" Queries = { new BookmarkResumptionQuery() { Name = "sentEmailBookmark" } } }
変数と引数
ワークフローの実行を追跡するときは、データを抽出すると便利です。これにより、実行後に追跡レコードにアクセスするときにコンテキストが追加されます。.NET Framework 4 では、追跡を使用して、ワークフローのアクティビティのスコープ内の参照可能な変数や引数を抽出できます。プロファイルを追跡すると、データを簡単に抽出できるようになります。
変数および引数が抽出されるのは、Activity が ActivityStateRecord を生成したときです。変数は、アクティビティのスコープ内にある場合にのみ抽出の対象となります。アクティビティを使用して抽出する変数は、次のように指定します。
変数名によって変数が指定されている場合、追跡されている現在のアクティビティと親アクティビティ内の変数が追跡で検索されます。変数は、現在のアクティビティのスコープと親スコープ内で検索されます。
抽出される変数が name=”*” を使用して指定されている場合、追跡されている現在のアクティビティ内のすべての変数が抽出されます。この場合、スコープ内の変数でも、親アクティビティで定義されているものは抽出されません。
引数の抽出時、抽出される引数は Activity の状態によって異なります。アクティビティの状態が Executing である場合、InArguments
のみが抽出に使用できます。他のアクティビティ状態 (Closed、Faulted、Canceled) については、すべての引数、InArguments、OutArguments が抽出に使用できます。
次の例は、アクティビティの Closed
追跡レコードが生成されたときに変数と引数を抽出するアクティビティ状態クエリを示しています。変数と引数は、ActivityStateRecord でのみ抽出できるため、ActivityStateQuery を使用して追跡プロファイル内でサブスクライブされます。
<activityStateQuery activityName="SendEmailActivity">
<states>
<state name="Closed"/>
</states>
<variables>
<variable name="FromAddress"/>
</variables>
<arguments>
<argument name="Result"/>
</arguments>
</activityStateQuery>
変数/引数に格納される情報の保護
追跡される変数や引数は、既定では WF ランタイムによって参照可能になります。ワークフローの開発者は、次のような適切な手順を行うことで、追跡対象の変数や引数へのアクセスを防止できます。
変数の値を暗号化します。
追跡プロファイルの作成を管理して、変数や引数の抽出を防止します。
カスタムの追跡参加要素については、変数や引数に格納されている機密情報が WF コードによって公開されないようにします。
注釈
注釈を使用すると、ビルド後に構成可能な値を使用して、追跡レコードへのタグ付けを任意に行うことができます。たとえば、複数のワークフローに存在する複数の追跡レコードに、"Mail Server" == "Mail Server1" というタグを付けることができます。こうすると、後で追跡レコードのクエリを実行するときに、このタグがあるすべてのレコードを簡単に見つけることができます。
これを可能にするために、次の例に示すように注釈が追跡クエリに追加されます。
<activityStateQuery activityName="SendEmailActivity">
<states>
<state name="Closed"/>
</states>
<annotations>
<annotation name="MailServer" value="Mail Server1"/>
</annotations>
</activityStateQuery>
追跡プロファイルを作成する方法
追跡クエリ要素を使用することで、XML 構成ファイルまたは .NET Framework 4 のコードを使用した追跡プロファイルを作成できます。次の例は、構成ファイルを使用して作成した追跡プロファイルです。
<system.serviceModel>
<tracking>
<profiles>
<trackingProfile name="Sample Tracking Profile ">
<workflow activityDefinitionId="*">
<!—Specify the tracking profile query elements to subscribe for tracking records
-->
</workflow>
</trackingProfile>
</profiles>
</tracking>
</system.seriviceModel>
注意 : |
---|
ワークフロー サービス ホストを使用する WF の場合、追跡プロファイルは構成ファイルを使用して作成されることがほとんどです。また、追跡プロファイルや追跡クエリ API を使用するコードで追跡プロファイルを作成することも可能です。 |
XML 構成ファイルとして構成されるプロファイルは、動作拡張を使用して追跡参加要素に適用されます。後のセクション「ワークフローの追跡の構成」で説明されているように、これは WorkflowServiceHost に追加されます。
ホストが生成する追跡レコードの詳細度は、追跡プロファイルの構成の設定によって決まります。追跡参加要素は、クエリを追跡プロファイルに追加して追跡レコードをサブスクライブします。すべての追跡レコードをサブスクライブするためには、追跡プロファイルにおいて各クエリの名前フィールドで “*” を使用し、すべての追跡クエリを指定する必要があります。
一般的な追跡プロファイルの例を次に示します。
- ワークフロー インスタンスのレコードとエラーを取得する追跡プロファイル
<trackingProfile name="Instance and Fault Records">
<workflow activityDefinitionId="*">
<workflowInstanceQueries>
<workflowInstanceQuery>
<states>
<state name="*" />
</states>
</workflowInstanceQuery>
</workflowInstanceQueries>
<activityStateQueries>
<activityStateQuery activityName="*">
<states>
<state name="Faulted"/>
</states>
</activityStateQuery>
</activityStateQueries>
</workflow>
</trackingProfile>
- すべてのカスタム追跡レコードを取得する追跡プロファイル
<trackingProfile name="Instance_And_Custom_Records">
<workflow activityDefinitionId="*">
<customTrackingQueries>
<customTrackingQuery name="*" activityName="*" />
</customTrackingQueries>
</workflow>
</trackingProfile>