Rastreando participantes
O acompanhamento de participantes são pontos de extensibilidade que permitem que um desenvolvedor de fluxo de trabalho acesse TrackingRecord objetos e os processe. O .NET Framework 4.6.1 inclui um participante de controle padrão que grava registros de controle como eventos ETW (Event Tracing for Windows). Se isso não atender aos seus requisitos, você também pode escrever um participante de rastreamento personalizado.
Rastreando participantes
A infraestrutura de rastreamento permite a aplicação de um filtro nos registros de rastreamento de saída, de modo que um participante possa se inscrever em um subconjunto dos registros. O mecanismo para aplicar um filtro é através de um perfil de rastreamento.
O Windows Workflow Foundation (WF) no .NET Framework 4.6.1 fornece um participante de controle que grava os registros de controle em uma sessão ETW. O participante é configurado em um serviço de fluxo de trabalho adicionando um comportamento específico de rastreamento em um arquivo de configuração. Habilitar um participante de rastreamento ETW permite que os registros de rastreamento sejam visualizados no visualizador de eventos. O exemplo SDK para rastreamento baseado em ETW é uma boa maneira de se familiarizar com o rastreamento WF usando o participante de rastreamento baseado em ETW.
Participante de rastreamento ETW
O .NET Framework 4.6.1 inclui um Participante de Controle ETW que grava os registros de controle em uma sessão ETW. Isso é feito de maneira muito eficiente com impacto mínimo no desempenho do aplicativo ou na taxa de transferência do servidor. Uma vantagem de usar o participante de rastreamento ETW padrão é que os registros de rastreamento que ele recebe podem ser exibidos com os outros logs do aplicativo e do sistema no Visualizador de Eventos do Windows.
O participante de rastreamento ETW padrão é configurado no arquivo Web.config, conforme mostrado no exemplo a seguir.
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<etwTracking profileName="Sample Tracking Profile"/>
</behavior>
</serviceBehaviors>
</behaviors>
<tracking>
<profiles>
<trackingProfile name="Sample Tracking Profile">
….
</trackingProfile>
</profiles>
</tracking>
</system.serviceModel>
</configuration>
Nota
Se um trackingProfile
nome não for especificado, como apenas <etwTracking/>
ou <etwTracking profileName=""/>
, o perfil de controle padrão instalado com o .NET Framework 4.6.1 no arquivo Machine.config será usado.
No arquivo Machine.config, o perfil de controle padrão assina registros e falhas de instância do fluxo de trabalho.
No ETW, os eventos são gravados na sessão do ETW por meio de um ID de provedor. A ID do provedor que o participante de rastreamento do ETW usa para gravar os registros de rastreamento no ETW é definida na seção de diagnóstico do arquivo Web.config (em <system.serviceModel><diagnostics>
). Por padrão, o participante de rastreamento do ETW usa um ID de provedor padrão quando um não foi especificado, conforme mostrado no exemplo a seguir.
<system.serviceModel>
<diagnostics etwProviderId="52A3165D-4AD9-405C-B1E8-7D9A257EAC9F" />
A ilustração a seguir mostra o fluxo de dados de rastreamento através do participante de rastreamento ETW. Uma vez que os dados de rastreamento chegam à sessão ETW, eles podem ser acessados de várias maneiras. Uma das maneiras mais úteis de acessar esses eventos é por meio do Visualizador de Eventos, uma ferramenta comum do Windows usada para exibir logs e rastreamentos de aplicativos e serviços.
Rastreando dados de eventos de participantes
Um participante de rastreamento serializa dados de eventos rastreados para uma sessão ETW no formato de um evento por registro de rastreamento. Um evento é identificado usando um ID dentro do intervalo de 100 a 199. Para obter definições dos registros de eventos de rastreamento emitidos por um participante de rastreamento, consulte o tópico Referência de eventos de rastreamento.
O tamanho de um evento ETW é limitado pelo tamanho do buffer ETW ou pela carga útil máxima para um evento ETW, o valor que for menor. Se o tamanho do evento exceder qualquer um desses limites do ETW, o evento será truncado e seu conteúdo removido de forma arbitrária. Variáveis, argumentos, anotações e dados personalizados não são removidos seletivamente. No caso de truncamento, todos eles são truncados independentemente do valor que fez com que o tamanho do evento excedesse o limite do ETW. Os dados removidos são substituídos por <item>..<item>
.
Tipos complexos em variáveis, argumentos e itens de dados personalizados são serializados para o registro de evento ETW usando a NetDataContractSerializer classe. Essa classe inclui informações do tipo CLR no vapor XML serializado.
O truncamento de dados de carga útil devido aos limites do ETW pode resultar no envio de registros de rastreamento duplicados para uma sessão do ETW. Isso pode ocorrer se mais de uma sessão estiver escutando os eventos e as sessões tiverem limites de carga diferentes para os eventos.
Para a sessão com o limite inferior o evento pode ser truncado. O participante de rastreamento do ETW não tem conhecimento do número de sessões ouvindo os eventos; se um evento for truncado para uma sessão, o participante do ETW tentará enviar o evento novamente uma vez. Nesse caso, a sessão configurada para aceitar um tamanho de carga maior receberá o evento duas vezes (o evento não truncado e truncado). A duplicação pode ser evitada configurando todas as sessões ETW com os mesmos limites de tamanho de buffer.
Acessando dados de rastreamento de um participante do ETW no Visualizador de eventos
Os eventos que são gravados em uma sessão ETW pelo participante de rastreamento ETW podem ser acessados por meio do Visualizador de Eventos (ao usar a ID do provedor padrão). Isso permite a visualização rápida dos registros de rastreamento que foram emitidos pelo fluxo de trabalho.
Nota
O rastreamento de eventos de registro emitidos para uma sessão ETW usa IDs de evento no intervalo de 100 a 199.
Para habilitar a exibição dos Registros de Rastreamento no Visualizador de Eventos
Iniciar o Visualizador de Eventos (EVENTVWR.EXE)
Selecione Visualizador de Eventos, Logs de Aplicativos e Serviços, Microsoft, Windows, Aplicativos do Servidor de Aplicativos.
Clique com o botão direito do mouse e verifique se Exibir logs analíticos e de depuração está selecionado. Caso contrário, selecione-a para que a marca de seleção apareça ao lado dela. Isso exibe os logs Analítico, Desempenho e Depuração .
Clique com o botão direito do rato no registo analítico e, em seguida, selecione Ativar registo. O log existirá no arquivo %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Application Server-Applications%4Analytic.etl.
Participante de Acompanhamento Personalizado
A API do participante de rastreamento permite a extensão do tempo de execução do rastreamento com um participante de rastreamento fornecido pelo usuário que pode incluir lógica personalizada para lidar com registros de rastreamento emitidos pelo tempo de execução do fluxo de trabalho. Para escrever um participante de acompanhamento personalizado, o desenvolvedor deve implementar o Track
método na TrackingParticipant classe. Esse método é chamado quando um registro de controle é emitido pelo tempo de execução do fluxo de trabalho.
O acompanhamento dos participantes deriva da TrackingParticipant aula. O sistema fornecido EtwTrackingParticipant emite um evento ETW (Event Tracking for Windows) para cada registro de rastreamento recebido. Para criar um participante de acompanhamento personalizado, é criada uma classe que deriva de TrackingParticipant. Para fornecer a funcionalidade básica de rastreamento, a substituição Track. Track é chamada quando um registro de rastreamento é enviado pelo tempo de execução e pode ser processado da maneira desejada. No exemplo a seguir, é definida uma classe de participante de rastreamento personalizada que emite todos os registros de rastreamento para a janela do console. Você também pode implementar um TrackingParticipant objeto que processa os registros de controle de forma assíncrona usando seus BeginTrack
métodos e EndTrack
class ConsoleTrackingParticipant : TrackingParticipant
{
protected override void Track(TrackingRecord record, TimeSpan timeout)
{
if (record != null)
{
Console.WriteLine("=================================");
Console.WriteLine(record);
}
}
}
Para usar um participante de acompanhamento específico, registre-o com a instância do fluxo de trabalho que você deseja acompanhar, conforme mostrado no exemplo a seguir.
myInstance.Extensions.Add(new ConsoleTrackingParticipant());
No exemplo a seguir, um fluxo de trabalho que consiste em uma Sequence atividade que contém uma WriteLine atividade é criado. O ConsoleTrackingParticipant
é adicionado às extensões e o fluxo de trabalho é invocado.
Activity activity= new Sequence()
{
Activities =
{
new WriteLine()
{
Text = "Hello World."
}
}
};
WorkflowApplication instance = new WorkflowApplication(activity);
instance.Extensions.Add(new ConsoleTrackingParticipant());
instance.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
{
Console.WriteLine("workflow instance completed, Id = " + instance.Id);
resetEvent.Set();
};
instance.Run();
Console.ReadLine();