次の方法で共有


追跡プロファイル

追跡プロファイルには、実行時にワークフロー インスタンスの状態が変化したときに生成されるワークフロー イベントを追跡参加要素が定期受信することを可能にする追跡クエリが含まれています。

追跡プロファイル

追跡プロファイルは、どの追跡情報をワーク フロー インスタンスに出力するかを指定するために使用されます。 プロファイルが指定されていない場合、すべての追跡イベントが出力されます。 プロファイルを指定した場合、プロファイルで指定された追跡イベントが出力されます。 監視の要件に応じて、ワークフローの主な状態変化の少数のセットを定期受信する、非常に一般的なプロファイルを作成できます。 それとは反対に、結果として得られるイベントが、後で詳細な実行フローを十分に再構築できる極めて詳細なプロファイルを作成することもできます。

追跡プロファイルは、標準の .NET Framework 構成ファイル内の XML 要素として示されるか、コードで指定されます。 追跡参加要素が StartedCompleted のワークフロー イベントを定期受信できるようにする構成ファイルの .NET Framework 4.6.1 追跡プロファイルの例を次に示します。

<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 つの表示モードは、RootScopeAll です。 RootScope モードを使用すると、複合アクティビティがワークフローのルート アクティビティでない場合にアクティビティの実装を形成するアクティビティの追跡レコードが抑制されます。 したがって、他のアクティビティを使用して実装されているアクティビティがワークフローに追加された場合、implementationVisibility が RootScope に設定されていると、その複合アクティビティ内の最上位アクティビティのみが追跡されます。 アクティビティがワークフローのルート アクティビティである場合、アクティビティの実装はワークフローそのものであり、追跡レコードはその実装を形成するアクティビティを対象として生成されます。 All モードを使用すると、ルート アクティビティとそのすべての複合アクティビティを対象として、すべての追跡レコードを生成できます。

たとえば、MyActivity が、その実装に Activity1Activity2 の 2 つのアクティビティを含む複合アクティビティであるとします。 このアクティビティがワークフローに追加され、implementationVisibilityRootScope に設定され、追跡プロファイルでの追跡が有効になると、MyActivity のみを対象に追跡レコードが生成されます。 このとき、Activity1Activity2 の各アクティビティのレコードは生成されません。

ただし、追跡プロファイルの implementationVisibility 属性が All に設定されている場合、MyActivity のみでなく、Activity1Activity2 の各アクティビティについても、追跡レコードは生成されます。

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 - 前に説明した StartedCompleted など、ワークフロー インスタンスのライフサイクルの変化を追跡するために使用します。 WorkflowInstanceQuery は、次の TrackingRecord オブジェクトの定期受信に使用されます。

    定期受信可能な状態は、WorkflowInstanceStates クラスで指定します。

    Started を使用して WorkflowInstanceQuery インスタンス状態のワークフロー インスタンス レベルの追跡レコードを定期受信するために使用される構成またはコードを、次の例に示します。

    <workflowInstanceQueries>
        <workflowInstanceQuery>
          <states>
            <state name="Started"/>
          </states>
        </workflowInstanceQuery>
    </workflowInstanceQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new WorkflowInstanceQuery()
            {
                States = { WorkflowInstanceStates.Started}
            }
        }
    };
    
  • ActivityStateQuery - ワークフロー インスタンスを構成するアクティビティのライフ サイクルの変化を追跡するために使用します。 たとえば、ワークフロー インスタンスの "電子メールの送信" アクティビティの完了を毎回追跡したいとします。 このクエリは、TrackingParticipantActivityStateRecord オブジェクトを定期受信するのに必要です。 定期受信可能な状態は ActivityStates で指定します。

    ActivityStateQuery アクティビティに SendEmailActivity を使用するアクティビティ状態の追跡レコードを定期受信するために使用される構成またはコードを、次の例に示します。

    <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 - このクエリを使用すると、親アクティビティによって実行がスケジュールされているアクティビティを追跡できます。 このクエリは、TrackingParticipantActivityScheduledRecord オブジェクトを定期受信するのに必要です。

    SendEmailActivity を使用して、スケジュールされている ActivityScheduledQuery 子アクティビティに関連するレコードを定期受信するために使用される構成またはコードを、次の例に示します。

    <activityScheduledQueries>
      <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </activityScheduledQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new ActivityScheduledQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • FaultPropagationQuery - アクティビティ内で発生したエラーの処理を追跡するために使用します。 このクエリは、TrackingParticipantFaultPropagationRecord オブジェクトを定期受信するのに必要です。

    FaultPropagationQuery を使用して、エラー伝達に関連するレコードを定期受信するために使用される構成またはコードを、次の例に示します。

    <faultPropagationQueries>
      <faultPropagationQuery faultSourceActivityName="SendEmailActivity" faultHandlerActivityName="NotificationsFaultHandler" />
    </faultPropagationQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new FaultPropagationQuery()
            {
                FaultSourceActivityName = "SendEmailActivity",
                FaultHandlerActivityName = "NotificationsFaultHandler"
            }
        }
    };
    
  • CancelRequestedQuery - 親アクティビティによって子アクティビティをキャンセルする要求を追跡するために使用されます。 このクエリは、TrackingParticipantCancelRequestedRecord オブジェクトを定期受信するのに必要です。

    CancelRequestedQuery を使用し、アクティビティのキャンセルに関連するレコードを定期受信するために使用する構成またはコードを、次の例に示します。

    <cancelRequestedQueries>
      <cancelRequestedQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </cancelRequestedQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CancelRequestedQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • CustomTrackingQuery - コード アクティビティで定義するイベントを追跡するために使用します。 このクエリは、TrackingParticipantCustomTrackingRecord オブジェクトを定期受信するのに必要です。

    CustomTrackingQuery を使用して、カスタム追跡レコードに関連するレコードを定期受信するために使用される構成またはコードを、次の例に示します。

    <customTrackingQueries>
      <customTrackingQuery name="EmailAddress" activityName="SendEmailActivity" />
    </customTrackingQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CustomTrackingQuery()
            {
                Name = "EmailAddress",
                ActivityName = "SendEmailActivity"
            }
        }
    };
    
  • BookmarkResumptionQuery - ワークフロー インスタンス内のブックマークの再開を追跡するために使用します。 このクエリは、TrackingParticipantBookmarkResumptionRecord オブジェクトを定期受信するのに必要です。

    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>

警告

ワークフロー サービス ホストを使用する 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>
    

関連項目