다음을 통해 공유


User-Code 추적 내보내기

WCF(Windows Communication Foundation)에서 생성된 계측 데이터를 수집하기 위해 구성에서 추적을 사용하도록 설정하는 것 외에도 사용자 코드에서 프로그래밍 방식으로 추적을 내보낼 수도 있습니다. 이러한 방식으로 나중에 진단 목적으로 정독할 수 있는 계측 데이터를 사전에 만들 수 있습니다. 이 항목에서는 이 작업을 수행하는 방법에 대해 설명합니다.

또한 확장 추적 샘플에는 다음 섹션에 설명된 모든 코드가 포함되어 있습니다.

추적 원본 만들기

다음 코드를 사용하여 사용자 추적 원본을 만들 수 있습니다.

TraceSource ts = new TraceSource("myUserTraceSource");

활동 만들기

활동은 처리의 논리적 단위입니다. 추적을 함께 그룹화하려는 각 주요 처리 단위에 대해 하나의 작업을 만들 수 있습니다. 예를 들어 서비스에 대한 각 요청에 대해 하나의 활동을 만들 수 있습니다. 이렇게 하려면 다음 단계를 수행합니다.

  1. 스코프에서 액티비티 ID를 저장합니다.

  2. 새 활동 ID를 만듭니다.

  3. 범위 내 활동에서 새 활동으로 전송하고, 범위에서 새 활동을 설정하고, 해당 작업에 대한 시작 추적을 내보낸다.

다음 코드에서는 이 작업을 수행하는 방법을 보여 줍니다.

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번째 열에서 클라이언트와 서비스 모두에서 추적을 볼 수 있습니다.

이 작업은 다음 처리 순서를 보여줍니다.

  1. 클라이언트가 Add에게 메시지를 보냅니다.

  2. 서비스에서 요청 추가 메시지를 받습니다.

  3. 서비스에서 추가 응답을 보냅니다.

  4. 클라이언트는 추가 응답을 받습니다.

이러한 모든 추적은 정보 수준에서 내보내되었습니다. 오른쪽 위 패널에서 추적을 클릭하면 오른쪽 아래 패널에 해당 추적의 세부 정보가 표시됩니다.

다음 다이어그램에서는 계산기 작업 간에 추적 전송뿐만 아니라 요청 작업당 두 쌍의 시작 및 중지 추적을 볼 수 있습니다. 하나는 클라이언트용이고 다른 하나는 서비스용입니다(각 추적 원본마다 하나씩).

추적 뷰어: 사용자 코드 추적 내보내기 생성 시간별 활동 목록(왼쪽 패널) 및 중첩된 작업(오른쪽 위 패널)

서비스 코드가 예외를 발생시켜 클라이언트도 예외를 발생시키는 경우(예: 클라이언트가 요청에 대한 응답을 받지 못한 경우), 서비스와 클라이언트의 경고 또는 오류 메시지는 직접적인 상관관계를 위해 동일한 활동 내에서 발생합니다. 다음 이미지에서 서비스는 "서비스가 사용자 코드에서 이 요청을 처리하기를 거부합니다"라는 예외를 throw합니다. 또한 클라이언트는 "서버가 내부 오류로 인해 요청을 처리할 수 없습니다."라는 예외를 throw합니다.

다음 이미지는 요청 활동 ID가 전파된 경우 지정된 요청에 대한 엔드포인트 간 오류가 동일한 작업에 나타나는 것을 보여 줍니다.

지정된 요청에 대한 엔드포인트 간 오류를 보여 주는 스크린샷

왼쪽 패널에서 곱하기 작업을 두 번 클릭하면 관련된 각 프로세스의 곱하기 작업에 대한 추적과 함께 다음 그래프가 표시됩니다. 서비스에서 경고가 처음 발생한 것을 볼 수 있습니다(예외가 발생함). 그러면 요청을 처리할 수 없기 때문에 클라이언트에서 경고 및 오류가 발생합니다. 따라서 엔드포인트 간의 인과 관계와 오류의 근본 원인을 파생시킬 수 있습니다.

다음 이미지는 오류 상관 관계의 그래프 뷰를 보여줍니다.

오류 상관 관계의 그래프 보기를 보여 주는 스크린샷.

이전 추적을 가져오기 위해 사용자 추적 원본에는 ActivityTracing을 설정하고, propagateActivity=true 추적 원본에는 System.ServiceModel을 설정합니다. 사용자 코드 작업 전파를 활성화하기 위해 ActivityTracing 추적 원본에 System.ServiceModel를 설정하지 않았습니다. ServiceModel 활동 추적이 설정되면 클라이언트에 정의된 활동 ID가 서비스 사용자 코드로 전파되지는 않습니다. 그러나 전송은 클라이언트 및 서비스 사용자 코드 활동을 중간 WCF 활동과 상호 연결합니다.)

활동을 정의하고 활동 ID를 전파하면 엔드포인트 간에 직접 오류 상관 관계를 수행할 수 있습니다. 이러한 방식으로 오류의 근본 원인을 더 빠르게 찾을 수 있습니다.

참고하십시오