Emissão de rastreamentos de código de usuário

Além de habilitar o rastreamento na configuração para coletar dados de instrumentação gerados pelo Windows Communication Foundation (WCF), você também pode emitir rastreamentos programaticamente no código do usuário. Dessa forma, você pode criar proativamente dados de instrumentação que podem ser examinados posteriormente para fins de diagnóstico. Este tópico discute como você pode fazer isso.

Além disso, o exemplo de rastreamento de extensão inclui todo o código demonstrado nas seções a seguir.

Criando uma fonte de rastreamento

Você pode usar o código a seguir para criar uma fonte de rastreamento de usuário.

TraceSource ts = new TraceSource("myUserTraceSource");

Criação de Atividades

As atividades são unidade lógica de processamento. Você pode criar uma atividade para cada unidade de processamento principal na qual deseja que os rastreamentos sejam agrupados. Por exemplo, você pode criar uma atividade para cada solicitação ao serviço. Para fazê-lo, realize os seguintes passos.

  1. Salve o ID da atividade no escopo.

  2. Crie um novo ID de atividade.

  3. Transfira da atividade em escopo para a nova, defina a nova atividade no escopo e emita um rastreamento inicial para essa atividade.

O código a seguir demonstra como fazer isso.

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");

Emissão de rastreamentos dentro de uma atividade do usuário

O código a seguir emite rastreamentos dentro de uma atividade do usuário.

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 + "'");

Interrompendo as atividades

Para interromper as atividades, transfira de volta para a atividade antiga, interrompa a ID da atividade atual e redefina a ID da atividade antiga no escopo.

O código a seguir demonstra como fazer isso.

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

Propagando o ID de atividade para um serviço

Se você definir o propagateActivity atributo para true a fonte de System.ServiceModel rastreamento nos arquivos de configuração do cliente e do serviço, o processamento do serviço para a solicitação Add ocorrerá na mesma atividade definida no cliente. Se o serviço define suas próprias atividades e transferências, os rastreamentos de serviço não aparecem na atividade propagada pelo cliente. Em vez disso, eles aparecem em uma atividade correlacionada por rastreamentos de transferência para a atividade cujo ID é propagado pelo cliente.

Nota

Se o propagateActivity atributo for definido como true no cliente e no serviço, a atividade ambiental no escopo da operação do serviço será definida pelo WCF.

Você pode usar o código a seguir para verificar se uma atividade foi definida no escopo pelo 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;

Rastreando exceções lançadas no código

Quando você lança uma exceção no código, você também pode rastrear a exceção no nível de aviso ou acima usando o código a seguir.

ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");

Exibindo rastreamentos de usuário na ferramenta Visualizador de Rastreamento de Serviço

Esta seção contém capturas de tela de rastreamentos gerados pela execução do exemplo de Rastreamento de Extensão, quando visualizados usando a Ferramenta Visualizador de Rastreamento de Serviço (SvcTraceViewer.exe).

No diagrama a seguir, a atividade "Adicionar solicitação" criada anteriormente é selecionada no painel esquerdo. Ele é listado com três outras atividades de operação de matemática (dividir, subtrair, multiplicar) que constituem o programa cliente do aplicativo. O código do usuário definiu uma nova atividade para cada operação para isolar possíveis ocorrências de erro em diferentes solicitações.

Para demonstrar o uso de transferências no exemplo de Rastreamento de Extensão , uma atividade de Calculadora que encapsula as quatro solicitações de operação também é criada. Para cada solicitação, há uma transferência de ida e volta da atividade da Calculadora para a atividade de solicitação (o rastreamento é destacado no painel superior direito na figura).

Quando você seleciona uma atividade no painel esquerdo, os rastreamentos incluídos por essa atividade são mostrados no painel superior direito. Se propagateActivity estiver true em cada ponto de extremidade no caminho da solicitação, os rastreamentos na atividade da solicitação serão de todos os processos que participam da solicitação. Neste exemplo, você pode ver traços do cliente e do serviço na 4ª coluna do painel.

Esta atividade mostra a seguinte ordem de processamento:

  1. O cliente envia uma mensagem para Adicionar.

  2. O serviço recebe a mensagem Adicionar solicitação.

  3. O serviço envia Adicionar resposta.

  4. O cliente recebe Adicionar resposta.

Todos estes vestígios foram emitidos ao nível da Informação. Clicar em um rastreamento no painel superior direito mostra os detalhes desse rastreamento no painel inferior direito.

No diagrama a seguir, também vemos rastreamentos de transferência de e para a atividade da Calculadora, bem como dois pares de rastreamentos Start e Stop por atividade de solicitação, um para o cliente e outro para o serviço (um para cada fonte de rastreamento).

Trace Viewer: Emitting User-code traces Lista de atividades por tempo de criação (painel esquerdo) e suas atividades aninhadas (painel superior direito)

Se o código de serviço lançar uma exceção que faz com que o cliente lance também (por exemplo, quando o cliente não obteve a resposta à sua solicitação), as mensagens de aviso ou erro do serviço e do cliente ocorrem na mesma atividade para correlação direta. Na imagem a seguir, o serviço lança uma exceção que afirma "O serviço se recusa a processar essa solicitação no código do usuário". O cliente também lança uma exceção que afirma "O servidor não pôde processar a solicitação devido a um erro interno".

As imagens a seguir mostram que erros entre pontos de extremidade para uma determinada solicitação aparecem na mesma atividade se o id da atividade da solicitação foi propagado:

Screenshot that shows errors across endpoints for a given request.

Clicar duas vezes na atividade Multiplicar no painel esquerdo mostra o gráfico a seguir, com os traços da atividade Multiplicar para cada processo envolvido. Podemos ver um aviso ocorrido pela primeira vez no serviço (exceção lançada), que é seguido por avisos e erros no cliente porque a solicitação não pôde ser processada. Portanto, podemos implicar a relação de erro causal entre os pontos finais e derivar a causa raiz do erro.

A imagem a seguir mostra uma exibição gráfica da correlação de erros:

Screenshot that shows the graph view of error correlation.

Para obter os rastreamentos anteriores, definimos ActivityTracing para as fontes de rastreamento do usuário e propagateActivity=true para a fonte de System.ServiceModel rastreamento. Não definimos ActivityTracing a origem de rastreamento para permitir a propagação da atividade do código do usuário para o System.ServiceModel código do usuário. (Quando o rastreamento de atividade ServiceModel está ativado, o ID de atividade definido no cliente não é propagado até o código do usuário do serviço; As transferências, no entanto, correlacionam as atividades de código do cliente e do usuário do serviço com as atividades intermediárias do WCF.)

Definir atividades e propagar o ID de atividade nos permite executar a correlação direta de erros entre os pontos de extremidade. Desta forma, podemos localizar a causa raiz de um erro mais rapidamente.

Consulte também