다음을 통해 공유


추적 프로필

추적 프로필에는 추적 참가자가 런타임에 워크플로 인스턴스의 상태가 변경될 때 내보내는 워크플로 이벤트를 구독할 수 있도록 허용하는 추적 쿼리가 포함되어 있습니다.

추적 프로필

추적 프로필은 워크플로 인스턴스에 대해 내보낸 추적 정보를 지정하는 데 사용됩니다. 프로필을 지정하지 않으면 모든 추적 이벤트가 내보내집니다. 프로필을 지정하면 프로필에 지정된 추적 이벤트가 내보내집니다. 모니터링 요구 사항에 따라 매우 일반적인 프로필을 작성할 수 있습니다. 이 프로필은 워크플로에서 개략적인 상태 변경의 작은 집합을 구독합니다. 반대로, 나중에 자세한 실행 흐름을 재구성할 수 있을 만큼 풍부한 결과 이벤트가 있는 매우 자세한 프로필을 만들 수 있습니다.

추적 프로필은 표준 .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 특성에 지정된 두 가지 표시 모드는 RootScopeAll입니다. 모드를 RootScope 사용하면, 복합 활동이 워크플로의 루트가 아닌 경우, 활동의 구현을 구성하는 활동에 대한 추적 레코드가 억제됩니다. 즉, 다른 활동을 사용하여 구현된 활동이 워크플로에 추가되고 implementationVisibility RootScope로 설정된 경우 해당 복합 작업 내의 최상위 활동만 추적됩니다. 활동이 워크플로의 루트인 경우 활동의 구현은 워크플로 자체이며 추적 레코드는 구현을 구성하는 활동에 대해 내보내집니다. All 모드를 사용하면 루트 활동 및 모든 복합 활동에 대해 모든 추적 레코드를 내보냅니다.

예를 들어 MyActivity가 구현에 Activity1과 Activity2라는 두 개의 활동이 포함된 복합 작업이라고 가정합니다. 이 활동이 워크플로에 추가되고 implementationVisibilityRootScope로 설정된 추적 프로필을 사용하여 추적이 활성화되면, 추적 레코드는 MyActivity에 대해서만 내보내집니다. 그러나 활동 Activity1Activity2에 대한 레코드는 내보내지지 않습니다.

그러나 추적 프로필의 implementationVisibility 특성이 설정된 All경우 추적 레코드는 MyActivity뿐만 아니라 활동 활동1 및 Activity2에도 내보내집니다.

플래그는 implementationVisibility 다음 추적 레코드 형식에 적용됩니다.

  • ActivityStateRecord

  • 결함 전파 기록

  • 취소요청레코드

  • 활동 예정 기록

비고

작업 구현에서 내보낸 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 - 워크플로 인스턴스를 구성하는 활동의 수명 주기 변경 내용을 추적하는 데 사용합니다. 예를 들어 워크플로 인스턴스 내에서 "전자 메일 보내기" 작업이 완료 될 때마다 추적할 수 있습니다. 이 쿼리는 TrackingParticipant이(가) ActivityStateRecord 개체를 구독하는 데 필요합니다. 구독할 수 있는 상태는 .에 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 - 이 쿼리를 사용하면 부모 활동에 의해 실행되도록 예약된 활동을 추적할 수 있습니다. TrackingParticipant이/가 ActivityScheduledRecord 개체를 구독하는 데 쿼리가 필요합니다.

    다음 예제에서는 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 - 작업 내에서 발생하는 오류의 처리를 추적하려면 이 작업을 사용합니다. 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>

경고

워크플로 서비스 호스트를 사용하는 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>
    

참고하십시오