追跡プロファイルには、追跡参加要素が実行時にワークフロー インスタンスの状態が変化したときに出力されるワークフロー イベントをサブスクライブできるようにする追跡クエリが含まれます。
追跡プロファイル
追跡プロファイルは、ワークフロー インスタンスに対して出力される追跡情報を指定するために使用されます。 プロファイルが指定されていない場合は、すべての追跡イベントが生成されます。 プロファイルが指定されている場合、プロファイルで指定された追跡イベントが出力されます。 監視の要件に応じて、非常に一般的なプロファイルを作成できます。このプロファイルは、ワークフロー上の少数の高レベルの状態変更をサブスクライブします。 逆に、後で詳細な実行フローを再構築するのに十分な豊富なイベントを持つ非常に詳細なプロファイルを作成できます。
追跡プロファイルは、標準の .NET Framework 構成ファイル内またはコードで指定された XML 要素としてマニフェストされます。 次の例は、構成ファイル内の .NET Framework 4.6.1 追跡プロファイルで、追跡参加要素が Started
および Completed
ワークフロー イベントをサブスクライブできるようにします。
<system.serviceModel>
...
<tracking>
<profiles>
<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>
次の例は、コードを使用して作成された同等の追跡プロファイルを示しています。
TrackingProfile profile = new TrackingProfile()
{
Name = "CustomTrackingProfile",
Queries =
{
new WorkflowInstanceQuery()
{
// Limit workflow instance tracking records for started and
// completed workflow states.
States = { WorkflowInstanceStates.Started, WorkflowInstanceStates.Completed },
}
}
};
追跡レコードは、 ImplementationVisibility 属性を使用して追跡プロファイル内の表示モードでフィルター処理されます。 複合アクティビティは、その実装を形成する他のアクティビティを含む最上位レベルのアクティビティです。 可視性モードでは、ワークフロー アクティビティ内の複合アクティビティから出力される追跡レコードを指定して、実装を形成するアクティビティが追跡されているかどうかを指定します。 可視性モードは、追跡プロファイル レベルで適用されます。 ワークフロー内の個々のアクティビティの追跡レコードのフィルター処理は、追跡プロファイル内のクエリによって制御されます。 詳細については、このドキュメントの「 追跡プロファイル クエリの種類 」セクションを参照してください。
追跡プロファイルの implementationVisibility
属性で指定された 2 つの表示モードは、 RootScope
と All
です。
RootScope
モードを使用すると、複合アクティビティがワークフローのルートではない場合に、アクティビティの実装を形成するアクティビティの追跡レコードが抑制されます。 これは、他のアクティビティを使用して実装されたアクティビティがワークフローに追加され、 implementationVisibility
が RootScope に設定されている場合、その複合アクティビティ内の最上位レベルのアクティビティのみが追跡されることを意味します。 アクティビティがワークフローのルートである場合、アクティビティの実装はワークフロー自体であり、実装を形成するアクティビティの追跡レコードが出力されます。 All モードを使用すると、ルート アクティビティとそのすべての複合アクティビティに対して、すべての追跡レコードを出力できます。
たとえば、 MyActivity が複合アクティビティであり、実装に Activity1 と Activity2 の 2 つのアクティビティが含まれているとします。 このアクティビティがワークフローに追加され、 implementationVisibility
が RootScope
に設定された追跡プロファイルで追跡が有効になっている場合、追跡レコードは MyActivity に対してのみ出力されます。 ただし、 アクティビティ Activity1 と Activity2 にはレコードは出力されません。
ただし、追跡プロファイルの implementationVisibility
属性が All
に設定されている場合、追跡レコードは MyActivity だけでなく、 アクティビティ Activity1 と Activity2 にも出力されます。
implementationVisibility
フラグは、次の追跡レコードの種類に適用されます。
ActivityStateRecord
FaultPropagationRecord
CancelRequestedRecord
ActivityScheduledRecord
注
アクティビティの実装から出力された CustomTrackingRecords は、implementationVisibility 設定によって除外されません。
implementationVisibility
機能は、次のようにコードの追跡プロファイルにRootScopeとして指定されます。
TrackingProfile sampleTrackingProfile = new TrackingProfile()
{
Name = "Sample Tracking Profile",
ImplementationVisibility = ImplementationVisibility.RootScope
};
implementationVisibility
機能は、次のように、構成ファイルの追跡プロファイルにAllとして指定されます。
<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", 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", Queries = { new ActivityStateQuery() { ActivityName = "SendEmailActivity", States = { ActivityStates.Closed } } } };
注
複数の activityStateQuery 要素の名前が同じである場合、追跡プロファイルでは最後の要素の状態のみが使用されます。
ActivityScheduledQuery - このクエリを使用すると、親アクティビティによって実行されるようにスケジュールされたアクティビティを追跡できます。 TrackingParticipantがActivityScheduledRecord オブジェクトをサブスクライブするには、クエリが必要です。
ActivityScheduledQueryを使用してスケジュールされている
SendEmailActivity
子アクティビティに関連するレコードをサブスクライブするために使用する構成とコードを次の例に示します。<activityScheduledQueries> <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" /> </activityScheduledQueries>
TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile", 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", 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", 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", Queries = { new CustomTrackingQuery() { Name = "EmailAddress", ActivityName = "SendEmailActivity" } } };
BookmarkResumptionQuery - ワークフロー インスタンス内のブックマークの再開を追跡するには、これを使用します。 このクエリは、 TrackingParticipant が BookmarkResumptionRecord オブジェクトをサブスクライブするために必要です。
BookmarkResumptionQueryを使用してブックマークの再開に関連するレコードをサブスクライブするために使用する構成とコードを次の例に示します。
<bookmarkResumptionQueries> <bookmarkResumptionQuery name="SentEmailBookmark" /> </bookmarkResumptionQueries>
TrackingProfile sampleTrackingProfile = new TrackingProfile() { Name = "Sample Tracking Profile", Queries = { new BookmarkResumptionQuery() { Name = "sentEmailBookmark" } } };
注釈
注釈を使用すると、ビルド後に構成できる値を使用して追跡レコードに任意のタグを付けることができます。 たとえば、複数のワークフローにわたって複数の追跡レコードに "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.6.1 コードを使用して追跡プロファイルを作成するために使用されます。 構成ファイルを使用して作成された追跡プロファイルの例を次に示します。
<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.serviceModel>
Warnung
ワークフロー サービス ホストを使用する 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>
こちらも参照ください
.NET