Agregação e coleção de eventos com o EventFlow

O EventFlow de Diagnósticos da Microsoft pode encaminhar eventos de um nó para um ou mais destinos de monitorização. Uma vez que está incluído como um pacote NuGet no seu projeto de serviço, o código do EventFlow e a configuração viajam com o serviço, eliminando o problema de configuração por nó mencionado anteriormente sobre Diagnóstico do Azure. O EventFlow é executado no seu processo de serviço e liga-se diretamente às saídas configuradas. Devido à ligação direta, o EventFlow funciona para implementações do Azure, do contentor e do serviço no local. Tenha cuidado se executar o EventFlow em cenários de alta densidade, como num contentor, porque cada pipeline do EventFlow faz uma ligação externa. Por isso, se alojar vários processos, obterá várias ligações de saída! Isto não é tanto uma preocupação para as aplicações do Service Fabric, porque todas as réplicas de uma ServiceType execução no mesmo processo, o que limita o número de ligações de saída. O EventFlow também oferece filtragem de eventos, para que apenas os eventos que correspondam ao filtro especificado sejam enviados.

Configurar o EventFlow

Os binários do EventFlow estão disponíveis como um conjunto de pacotes NuGet. Para adicionar o EventFlow a um projeto de serviço do Service Fabric, clique com o botão direito do rato no projeto no Explorador de Soluções e selecione "Gerir pacotes NuGet". Mude para o separador "Procurar" e procure "Diagnostics.EventFlow":

Pacotes NuGet do EventFlow na IU do gestor de pacotes NuGet do Visual Studio

Verá uma lista de vários pacotes apresentados, etiquetados com "Entradas" e "Saídas". O EventFlow suporta vários fornecedores e analisadores de registos diferentes. O serviço que aloja o EventFlow deve incluir pacotes adequados consoante a origem e o destino dos registos de aplicações. Além do pacote serviceFabric principal, também precisa de, pelo menos, uma Entrada e Saída configuradas. Por exemplo, pode adicionar os seguintes pacotes para enviar eventos eventSource para o Application Insights:

  • Microsoft.Diagnostics.EventFlow.Inputs.EventSource para capturar dados da classe EventSource do serviço e de EventSources padrão, como Microsoft-ServiceFabric-Services e Microsoft-ServiceFabric-Actors)
  • Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights(vamos enviar os registos para um recurso do Aplicação Azure Insights)
  • Microsoft.Diagnostics.EventFlow.ServiceFabric(ativa a inicialização do pipeline do EventFlow a partir da configuração do serviço Service Fabric e comunica quaisquer problemas com o envio de dados de diagnóstico como relatórios de estado de funcionamento do Service Fabric)

Nota

Microsoft.Diagnostics.EventFlow.Inputs.EventSourceo pacote requer que o projeto de serviço seja direcionado .NET Framework 4.6 ou mais recente. Certifique-se de que define a arquitetura de destino adequada nas propriedades do projeto antes de instalar este pacote.

Depois de todos os pacotes serem instalados, o próximo passo é configurar e ativar o EventFlow no serviço.

Configurar e ativar a coleção de registos

O pipeline do EventFlow responsável pelo envio dos registos é criado a partir de uma especificação armazenada num ficheiro de configuração. O Microsoft.Diagnostics.EventFlow.ServiceFabric pacote instala um ficheiro de configuração do EventFlow inicial na PackageRoot\Config pasta da solução, com o nome eventFlowConfig.json. Este ficheiro de configuração tem de ser modificado para capturar dados da classe de serviço EventSource predefinida e quaisquer outras entradas que pretenda configurar e enviar dados para o local adequado.

Nota

Se o ficheiro de projeto tiver o formato VisualStudio 2017, o eventFlowConfig.json ficheiro não será adicionado automaticamente. Para corrigir este problema, crie o ficheiro na Config pasta e defina a ação de compilação como Copy if newer.

Eis um eventFlowConfig.json de exemplo com base nos pacotes NuGet mencionados acima:

{
  "inputs": [
    {
      "type": "EventSource",
      "sources": [
        { "providerName": "Microsoft-ServiceFabric-Services" },
        { "providerName": "Microsoft-ServiceFabric-Actors" },
        // (replace the following value with your service's ServiceEventSource name)
        { "providerName": "your-service-EventSource-name" }
      ]
    }
  ],
  "filters": [
    {
      "type": "drop",
      "include": "Level == Verbose"
    }
  ],
  "outputs": [
    {
      "type": "ApplicationInsights",
      // (replace the following value with your AI resource's instrumentation key)
      "instrumentationKey": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "schemaVersion": "2016-08-11"
}

O nome do ServiceEventSource do serviço é o valor da propriedade Nome da EventSourceAttribute aplicada à classe ServiceEventSource. É tudo especificado no ServiceEventSource.cs ficheiro, que faz parte do código de serviço. Por exemplo, no fragmento de código seguinte, o nome do ServiceEventSource é MyCompany-Application1-Stateless1:

[EventSource(Name = "MyCompany-Application1-Stateless1")]
internal sealed class ServiceEventSource : EventSource
{
    // (rest of ServiceEventSource implementation)
}

Tenha em atenção que o eventFlowConfig.json ficheiro faz parte do pacote de configuração do serviço. As alterações a este ficheiro podem ser incluídas em atualizações completas ou apenas de configuração do serviço, sujeitas a verificações de estado de funcionamento de atualização do Service Fabric e reversão automática se ocorrer uma falha de atualização. Para obter mais informações, veja Atualização da aplicação do Service Fabric.

A secção filtros da configuração permite-lhe personalizar ainda mais as informações que vão passar pelo pipeline do EventFlow para as saídas, permitindo-lhe remover ou incluir determinadas informações ou alterar a estrutura dos dados do evento. Para obter mais informações sobre a filtragem, veja Filtros do EventFlow.

O passo final é instanciar o pipeline do EventFlow no código de arranque do seu serviço, localizado no Program.cs ficheiro:

using System;
using System.Diagnostics;
using System.Threading;
using Microsoft.ServiceFabric;
using Microsoft.ServiceFabric.Services.Runtime;

// **** EventFlow namespace
using Microsoft.Diagnostics.EventFlow.ServiceFabric;

namespace Stateless1
{
    internal static class Program
    {
        /// <summary>
        /// This is the entry point of the service host process.
        /// </summary>
        private static void Main()
        {
            try
            {
                // **** Instantiate log collection via EventFlow
                using (var diagnosticsPipeline = ServiceFabricDiagnosticPipelineFactory.CreatePipeline("MyApplication-MyService-DiagnosticsPipeline"))
                {

                    ServiceRuntime.RegisterServiceAsync("Stateless1Type",
                    context => new Stateless1(context)).GetAwaiter().GetResult();

                    ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Stateless1).Name);

                    Thread.Sleep(Timeout.Infinite);
                }
            }
            catch (Exception e)
            {
                ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
                throw;
            }
        }
    }
}

O nome transmitido como o parâmetro do CreatePipeline método do ServiceFabricDiagnosticsPipelineFactory é o nome da entidade de estado de funcionamento que representa o pipeline de recolha de registos do EventFlow. Este nome é utilizado se o EventFlow encontrar e efetuar um erro e reportá-lo através do subsistema de estado de funcionamento do Service Fabric.

Utilizar as definições do Service Fabric e os parâmetros da aplicação no eventFlowConfig

O EventFlow suporta a utilização de definições do Service Fabric e parâmetros de aplicação para configurar as definições do EventFlow. Pode consultar os parâmetros de definições do Service Fabric com esta sintaxe especial para valores:

servicefabric:/<section-name>/<setting-name>

<section-name> é o nome da secção de configuração do Service Fabric e <setting-name> é a definição de configuração que fornece o valor que será utilizado para configurar uma definição do EventFlow. Para ler mais sobre como fazê-lo, aceda a Suporte para definições do Service Fabric e parâmetros de aplicação.

Verificação

Inicie o seu serviço e observe a janela de saída de Depuração no Visual Studio. Depois de o serviço ser iniciado, deve começar a ver provas de que o seu serviço está a enviar registos para o resultado que configurou. Navegue para a plataforma de visualização e análise de eventos e confirme que os registos começaram a aparecer (pode demorar alguns minutos).

Passos seguintes