WCF(Windows Communication Foundation) 작업 추적을 사용하도록 설정하면 엔드투엔드 작업 ID가 WCF 스택 전체의 논리적 작업에 할당됩니다. .NET Framework 4.6.1에는 메시지 흐름 추적이라는 ETW(Windows용 이벤트 추적)와 함께 작동하는 이 기능의 고성능 버전이 있습니다. 이 기능을 사용하도록 설정하면 엔드투엔드 작업 ID가 들어오는 메시지에서 가져와 지고(비어 있는 경우 들어오는 메시지에 할당됨) 메시지가 채널을 통해 디코딩된 후 내보내지는 모든 추적 이벤트에 전파됩니다. 이 기능을 사용하면 다른 서비스의 추적 로그를 사용하여 메시지 흐름을 다시 생성할 수 있습니다.
추적은 애플리케이션에서 문제가 발견되면 사용하도록 설정했다가 문제가 해결되면 사용하지 않도록 설정할 수 있습니다.
추적 사용
다음 예제와 같이 .NET Framework 4 messageFlowTracing
구성 요소를 true
로 설정하여 메시지 흐름 추적을 사용하도록 설정할 수 있습니다.
<system.servicemodel>
<diagnostics>
<endToEndTracing propagateActivity="true" messageFlowTracing="true" />
</diagnostics>
</system.servicemodel>
참고
endToEndTracing
구성 요소는 Web.config 파일에 있기 때문에 ETW와 동일한 방식으로 동적으로 구성할 수 없습니다.
endToEndTracing
구성 요소를 적용하려면 애플리케이션을 재활용해야 합니다.
작업은 작업 ID라는 식별자의 교환을 통해 상호 연결됩니다. 이 식별자는 GUID이며 System.Diagnostics.CorrelationManager 클래스에서 생성됩니다. System.Diagnostics.Trace.CorrelationManager.ActivityID를 조작하는 경우 실행 제어가 WCF 코드로 다시 전달될 때 값이 원래대로 설정되는지 확인합니다. 또한 비동기 WCF 프로그래밍 모델을 사용하는 경우 System.Diagnostics.Trace.CorrelationManager.ActivityID가 스레드 간에 전달되는지 확인합니다.
메시지 흐름 추적 및 REST 서비스
메시지 흐름 추적을 사용해서 종단 간 요청을 추적할 수 있습니다. SOAP 기반 서비스에서는 작업 ID가 SOAP 메시지 헤더로 전송됩니다. REST 요청에는 이 헤더가 포함되지 않으므로 특별한 HTTP 이벤트 헤더가 대신 사용됩니다. 다음 코드 조각에서는 작업 ID 값을 자동으로 검색하는 방법을 보여 줍니다.
Object output = null;
if (OperationContext.Current.IncomingMessageProperties.TryGetValue(HttpRequestMessageProperty.Name, out output))
{
HttpRequestMessageProperty httpHeaders = output as HttpRequestMessageProperty;
// Retrieve the Activity Id from the HTTP header string e2eId = httpHeaders.Headers["E2EActivity"];
// ...
}
다음 코드를 사용해서 헤더를 프로그래밍 방식으로 추가할 수 있습니다.
HttpContent content = new StreamContent(contentStream);
Guid correlation = Guid.NewGuid();
content.Headers.Add("E2EActivity", Convert.ToBase64String(correlation.ToByteArray()));