Emitindo traços de código de usuário

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

Além disso, o exemplo Estendendo o rastreamento 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");

Criando atividades

Atividades são uma 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 para o serviço. Para isso, execute as etapas a seguir.

  1. Salve a ID da atividade no escopo.

  2. Crie uma ID de atividade.

  3. Transfira da atividade no 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");

Emitindo 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, volte 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 a ID da atividade para um serviço

Se você definir o atributo propagateActivity como true para a fonte de rastreamento System.ServiceModel 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 que a definida no cliente. Se o serviço definir as próprias atividades e transferências, os rastreamentos de serviço não aparecerão na atividade propagada pelo cliente. Em vez disso, aparecerão em uma atividade correlacionada por rastreamentos de transferência à atividade cuja ID é propagada pelo cliente.

Observação

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

Você pode usar o seguinte código 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 geradas no código

Ao gerar 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 da amostra Estendendo o rastreamento, quando exibida 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. Ela é listada com três outras atividades de operação 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 solicitações diferentes.

Para demonstrar o uso de transferências no exemplo Estendendo o rastreamento, uma atividade de Calculadora que encapsula as quatro solicitações de operação também é criada. Para cada solicitação, há uma transferência da atividade de Calculadora para a atividade de solicitação (o rastreamento está realçado 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 for true em todos os pontos de extremidade no caminho da solicitação, os rastreamentos na atividade de solicitação serão de todos os processos que participam da solicitação. Neste exemplo, você pode ver rastreamentos do cliente e do serviço na 4ª coluna no painel.

Essa atividade mostra a seguinte ordem de processamento:

  1. O cliente envia uma mensagem para Adicionar.

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

  3. O serviço envia a resposta de Adicionar.

  4. O cliente recebe a resposta de Adicionar.

Todos esses rastreamentos foram emitidos no nível da informação. Clicar em um rastreamento no painel superior direito mostra os detalhes dele no painel inferior direito.

No diagrama a seguir, também vemos rastreamentos de transferência de e para a atividade de Calculadora, bem como dois pares de rastreamentos Iniciar e Parar 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 hora de criação (painel esquerdo) e suas atividades aninhadas (painel superior direito)

Se o código do serviço gerar uma exceção que faça com que o cliente também gere uma (por exemplo, quando o cliente não obtém a resposta à solicitação), as mensagens de aviso ou erro do serviço e do cliente ocorrerão na mesma atividade para correlação direta. Na imagem a seguir, o serviço gera uma exceção que afirma "O serviço se recusa a processar esta solicitação no código do usuário". O cliente também gera 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 os erros entre pontos de extremidade de uma determinada solicitação aparecerão na mesma atividade se a ID da atividade de solicitação tiver sido propagada:

Screenshot that shows errors across endpoints for a given request.

Clicar duas vezes na atividade Multiplicar no painel esquerdo mostra o grafo a seguir, com os rastreamentos da atividade Multiplicar para cada processo envolvido. Podemos ver um aviso que ocorreu primeiro no serviço (exceção gerada), que é seguido por avisos e erros no cliente porque a solicitação não pôde ser processada. Portanto, podemos deduzir a relação de erro causal entre os pontos de extremidade e derivar a causa raiz do erro.

A seguinte imagem mostra uma exibição de grafo 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 do rastreamento System.ServiceModel. Não definimos ActivityTracing para a fonte do rastreamento System.ServiceModel para habilitar a propagação do código do usuário para a atividade do código do usuário. (Quando o rastreamento da atividade ServiceModel está ativado, a ID da atividade definida no cliente não é propagada até o código do usuário do serviço. No entanto, as transferências correlacionam as atividades de código do cliente e do usuário do serviço às atividades intermediárias do WCF.)

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

Confira também