Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretó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 Extensão de Rastreamento inclui todo o código demonstrado nas seções seguintes.
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 registos sejam agrupados. Por exemplo, você pode criar uma atividade para cada solicitação ao serviço. Para fazer isso, execute as seguintes etapas.
Salve o ID da atividade no escopo.
Crie um novo ID de atividade.
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 traços dentro de uma atividade do utilizador
O código a seguir emite registos dentro de uma atividade do utilizador.
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;
Propagação do ID de atividade para um serviço
Se definir o atributo propagateActivity para true na fonte de rastreamento System.ServiceModel nos ficheiros de configuração do cliente e do serviço, o processamento do serviço para o pedido Add ocorrerá na mesma atividade definida no cliente. Se o serviço define suas próprias atividades e transferências, os traços do serviço não aparecem na atividade que é propagada pelo cliente. Em vez disso, aparecem numa atividade correlacionada por traços de transferência para a atividade cujo ID é propagado pelo cliente.
Observação
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");
Visualização de rastros de usuários na ferramenta Visualizador de Rastros 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 pedido, há uma transferência de ida e volta da atividade da Calculadora para a atividade de pedido (a linha de rastreamento é destacada no painel superior direito na figura).
Ao selecionar uma atividade no painel esquerdo, os traços que esta atividade inclui são apresentados 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:
O cliente envia uma mensagem para Adicionar.
O serviço recebe a mensagem de pedido de adição.
O serviço envia Adicionar resposta.
O cliente recebe a resposta de adição.
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 registos de transferência de e para a atividade da Calculadora, bem como dois pares de registos de Início e Paragem para cada atividade de pedido, um para o cliente e outro para o serviço (um para cada fonte de registo).
Lista de atividades pela data 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:
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:
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 para a fonte de rastreio System.ServiceModel a fim de permitir a propagação da atividade de código de utilizador para código de utilizador. (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 da atividade permite-nos realizar uma correlação direta de erros entre os endpoints. Desta forma, podemos localizar a causa raiz de um erro mais rapidamente.