Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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. Dessa forma, você pode criar proativamente dados de instrumentação que podem ser perutilizados posteriormente para fins de diagnóstico. Este tópico discute como você pode 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
As atividades são uma unidade lógica de processamento. Você pode criar uma atividade para cada unidade de processamento principal em que deseja que os rastros sejam agrupados. Por exemplo, você pode criar uma atividade para cada solicitação para o serviço. Para fazer isso, execute as etapas a seguir.
Salve a ID da atividade no escopo.
Crie uma nova ID de atividade.
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 System.ServiceModel de rastreamento nos arquivos de configuração do cliente e do serviço, o processamento do serviço para a solicitação de adição 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 tanto no cliente quanto no serviço, a atividade ambiente no escopo de operação do serviço será configurada 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 geradas no código
Ao lançar uma exceção no código, você também pode rastrear a exceção a partir do nível de aviso para cima usando o seguinte código.
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 dos rastreamentos gerados ao executar o exemplo Extensão de Rastreamento, quando exibido usando a Ferramenta Visualizadora 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 outras três 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 registros incluídos por essa atividade aparecem 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 traços do cliente e do serviço na quarta coluna do painel.
Essa atividade mostra a seguinte ordem de processamento:
O cliente envia uma mensagem para Adicionar.
O serviço recebe uma mensagem de solicitação de adição.
O serviço envia a resposta de Adicionar.
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).
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 indica "O serviço se recusa a processar essa solicitação no código do usuário". O cliente também gera uma exceção que indica "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:

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 implicar a relação de erro causal entre pontos de extremidade e derivar a causa raiz do erro.
A imagem a seguir mostra uma exibição de grafo de correlação de erro:

Para obter os rastreamentos anteriores, definimos ActivityTracing para as fontes de rastreamento do usuário e propagateActivity=true para a fonte de 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 de atividade ServiceModel está ativado, a ID de atividade definida no cliente não é propagada completamente até ao código de usuário do serviço; No entanto, as transferências correlacionam as atividades de código de usuário do cliente e do serviço com as atividades intermediárias do WCF.)
Definir atividades e propagar a ID da atividade permite-nos executar a correlação direta de erros entre pontos terminais. Dessa forma, podemos localizar a causa raiz de um erro mais rapidamente.