WCF(Windows Communication Foundation)에서 생성된 계측 데이터를 수집하기 위해 구성에서 추적을 사용하도록 설정하는 것 외에도 사용자 코드에서 프로그래밍 방식으로 추적을 내보낼 수도 있습니다. 이러한 방식으로 나중에 진단 목적으로 정독할 수 있는 계측 데이터를 사전에 만들 수 있습니다. 이 항목에서는 이 작업을 수행하는 방법에 대해 설명합니다.
또한 확장 추적 샘플에는 다음 섹션에 설명된 모든 코드가 포함되어 있습니다.
추적 원본 만들기
다음 코드를 사용하여 사용자 추적 원본을 만들 수 있습니다.
TraceSource ts = new TraceSource("myUserTraceSource");
활동 만들기
활동은 처리의 논리적 단위입니다. 추적을 함께 그룹화하려는 각 주요 처리 단위에 대해 하나의 작업을 만들 수 있습니다. 예를 들어 서비스에 대한 각 요청에 대해 하나의 활동을 만들 수 있습니다. 이렇게 하려면 다음 단계를 수행합니다.
스코프에서 액티비티 ID를 저장합니다.
새 활동 ID를 만듭니다.
범위 내 활동에서 새 활동으로 전송하고, 범위에서 새 활동을 설정하고, 해당 작업에 대한 시작 추적을 내보낸다.
다음 코드에서는 이 작업을 수행하는 방법을 보여 줍니다.
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");
사용자 작업 내에서 추적 내보내기
다음 코드는 사용자 작업 내에서 추적을 내보낸다.
double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");
활동 중지
활동을 중지하려면 이전 활동으로 다시 전송하고, 현재 활동 ID를 중지하고, 범위에서 이전 활동 ID를 다시 설정합니다.
다음 코드에서는 이 작업을 수행하는 방법을 보여 줍니다.
ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;
서비스에 활동 ID 전파하기
클라이언트 및 서비스 구성 파일 모두에서 propagateActivity
추적 원본의 true
특성을 System.ServiceModel
로 설정하면 추가 요청에 대한 서비스 처리는 클라이언트에 정의된 작업과 동일한 작업에서 발생합니다. 서비스에서 자체 활동 및 전송을 정의하는 경우 서비스 추적은 클라이언트에서 전파된 활동에 나타나지 않습니다. 대신 클라이언트에서 ID를 전파하는 활동으로 추적을 전송하여 상호 관련된 활동에 표시됩니다.
비고
propagateActivity
속성이 클라이언트와 서비스 모두에서 true
로 설정되면, 서비스 작업 범위 내의 앰비언트 활동은 WCF에 의해 결정됩니다.
다음 코드를 사용하여 WCF에서 활동이 범위에서 설정되었는지 여부를 확인할 수 있습니다.
// Check if an activity was set in scope by WCF, if it was
// propagated from the client. If not, ( ambient activity is
// equal to Guid.Empty), create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
Guid newGuid = Guid.NewGuid();
Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");
// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add "
+ n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);
// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;
코드에서 발생된 예외 추적
코드에서 예외를 throw할 때, 경고 수준 이상에서 예외를 추적할 수도 있습니다. 이를 위해 아래 코드를 사용하십시오.
ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");
서비스 추적 뷰어 도구에서 사용자 추적 보기
이 섹션에는 서비스 추적 뷰어 도구(SvcTraceViewer.exe)를 사용하여 볼 때 추적 확장 샘플을 실행하여 생성된 추적의 스크린샷이 포함되어 있습니다.
다음 다이어그램에서 이전에 만든 "요청 추가" 작업이 왼쪽 패널에서 선택됩니다. 애플리케이션 클라이언트 프로그램을 구성하는 세 가지 다른 수학 작업 작업(나누기, 빼기, 곱하기)이 나열됩니다. 사용자 코드는 다른 요청에서 잠재적인 오류 발생을 격리하기 위해 각 작업에 대해 하나의 새 활동을 정의했습니다.
확장 추적 샘플에서 전송의 사용을 보여 주려면 4개의 작업 요청을 캡슐화하는 계산기 작업도 만들어집니다. 각 요청에 대해 계산기 활동에서 요청 활동으로 앞뒤로 전송됩니다(추적은 그림의 오른쪽 위 패널에 강조 표시됨).
왼쪽 패널에서 활동을 선택하면 이 활동에 포함된 추적이 오른쪽 위 패널에 표시됩니다.
propagateActivity
이(가) 요청 경로의 모든 엔드포인트에 있는 경우, 요청 활동의 추적은 요청에 참여하는 모든 프로세스로부터 포함됩니다. 이 예제에서는 패널의 4번째 열에서 클라이언트와 서비스 모두에서 추적을 볼 수 있습니다.
이 작업은 다음 처리 순서를 보여줍니다.
클라이언트가 Add에게 메시지를 보냅니다.
서비스에서 요청 추가 메시지를 받습니다.
서비스에서 추가 응답을 보냅니다.
클라이언트는 추가 응답을 받습니다.
이러한 모든 추적은 정보 수준에서 내보내되었습니다. 오른쪽 위 패널에서 추적을 클릭하면 오른쪽 아래 패널에 해당 추적의 세부 정보가 표시됩니다.
다음 다이어그램에서는 계산기 작업 간에 추적 전송뿐만 아니라 요청 작업당 두 쌍의 시작 및 중지 추적을 볼 수 있습니다. 하나는 클라이언트용이고 다른 하나는 서비스용입니다(각 추적 원본마다 하나씩).
생성 시간별 활동 목록(왼쪽 패널) 및 중첩된 작업(오른쪽 위 패널)
서비스 코드가 예외를 발생시켜 클라이언트도 예외를 발생시키는 경우(예: 클라이언트가 요청에 대한 응답을 받지 못한 경우), 서비스와 클라이언트의 경고 또는 오류 메시지는 직접적인 상관관계를 위해 동일한 활동 내에서 발생합니다. 다음 이미지에서 서비스는 "서비스가 사용자 코드에서 이 요청을 처리하기를 거부합니다"라는 예외를 throw합니다. 또한 클라이언트는 "서버가 내부 오류로 인해 요청을 처리할 수 없습니다."라는 예외를 throw합니다.
다음 이미지는 요청 활동 ID가 전파된 경우 지정된 요청에 대한 엔드포인트 간 오류가 동일한 작업에 나타나는 것을 보여 줍니다.
왼쪽 패널에서 곱하기 작업을 두 번 클릭하면 관련된 각 프로세스의 곱하기 작업에 대한 추적과 함께 다음 그래프가 표시됩니다. 서비스에서 경고가 처음 발생한 것을 볼 수 있습니다(예외가 발생함). 그러면 요청을 처리할 수 없기 때문에 클라이언트에서 경고 및 오류가 발생합니다. 따라서 엔드포인트 간의 인과 관계와 오류의 근본 원인을 파생시킬 수 있습니다.
다음 이미지는 오류 상관 관계의 그래프 뷰를 보여줍니다.
이전 추적을 가져오기 위해 사용자 추적 원본에는 ActivityTracing
을 설정하고, propagateActivity=true
추적 원본에는 System.ServiceModel
을 설정합니다. 사용자 코드 작업 전파를 활성화하기 위해 ActivityTracing
추적 원본에 System.ServiceModel
를 설정하지 않았습니다. ServiceModel 활동 추적이 설정되면 클라이언트에 정의된 활동 ID가 서비스 사용자 코드로 전파되지는 않습니다. 그러나 전송은 클라이언트 및 서비스 사용자 코드 활동을 중간 WCF 활동과 상호 연결합니다.)
활동을 정의하고 활동 ID를 전파하면 엔드포인트 간에 직접 오류 상관 관계를 수행할 수 있습니다. 이러한 방식으로 오류의 근본 원인을 더 빠르게 찾을 수 있습니다.