추적 프로필
이 항목은 Windows Workflow Foundation 4에 적용됩니다.
추적 프로필에는 추적 참가자가 런타임에 워크플로 인스턴스 상태가 변경될 때 발생하는 워크플로 이벤트를 구독할 수 있도록 허용하는 추적 쿼리가 포함됩니다.
추적 프로필
모니터링 요구 사항에 따라 워크플로에서 상위 수준의 상태 변경 내용 중 작은 부분만 구독하는 매우 개괄적인 프로필을 작성할 수 있습니다. 이와 반대로 이후에 세부 실행 흐름을 다시 작성할 수 있을 정도로 상세한 결과 이벤트를 포함하는 아주 자세한 프로필을 만들 수도 있습니다.
추적 프로필은 표준 .NET Framework 구성 파일 내에 XML 요소로 표시되거나 코드로 지정됩니다. 다음 예제에서는 추적 참가자가 Started
및 Completed
워크플로 이벤트를 구독할 수 있도록 하는 구성 파일의 .NET Framework 버전 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
특성은 두 가지 표시 모드(RootScope
및 All
)를 지정합니다. 복합 활동이 워크플로의 루트가 아닌 경우 RootScope
모드를 사용하면 활동의 구현을 구성하는 활동에 대한 추적 레코드가 표시되지 않습니다. 즉, 다른 활동을 사용하여 구현되는 활동이 워크플로에 추가되고 implementationVisibility
가 RootScope로 설정된 경우에는 해당 복합 활동의 최상위 활동만 추적됩니다. 활동이 워크플로의 루트인 경우 활동 구현이 워크플로 자체이고 구현 단계를 구성하는 활동에 대한 추적 레코드가 내보내집니다. 모두 모드에서는 루트 활동과 모든 복합 활동에 대해 모든 추적 레코드가 내보내집니다.
예를 들어 MyActivity가 복합 활동이고 해당 구현에 Activity1 및 Activity2의 두 활동이 포함된다고 가정합니다. 이 활동을 워크플로에 추가하고 추적 프로필에서 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에서는 추적을 통해 워크플로의 활동 범위 내에서 표시 변수 또는 인수를 추출할 수 있습니다. 추적 프로필을 사용하여 데이터를 쉽게 추출할 수 있습니다.
변수 및 인수는 활동에서 ActivityStateRecord를 내보낼 때 추출됩니다. 변수는 활동 범위 내에 있는 경우에만 추출할 수 있습니다. 활동을 통해 추출할 변수는 다음과 같은 방법으로 지정합니다.
변수 이름으로 변수를 지정할 경우 추적을 실행하면 추적 중인 현재 활동과 부모 활동에서 변수를 찾습니다. 즉, 현재 활동 범위와 부모 범위에서 변수를 검색합니다.
name="*"를 사용하여 추출할 변수를 지정하면 추적 중인 현재 활동 내의 모든 변수가 추출됩니다. 이 경우 범위 내에 있지만 부모 활동에 정의된 변수는 추출되지 않습니다.
인수를 추출할 경우 추출되는 인수는 활동의 상태에 따라 다릅니다. 활동 상태가 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>