Agregação e coleta de eventos usando EventFlow

Microsoft Diagnostics EventFlow pode encaminhar eventos de um nó a um ou mais destinos de monitoramentos. Como ele está incluído como um pacote NuGet em seu projeto de serviço, o código e a configuração do EventFlow viajam com o serviço, eliminando o problema de configuração por nó mencionado anteriormente sobre o Diagnóstico do Azure. O EventFlow é executado em seu processo de serviço e conecta-se diretamente às saídas configuradas. Devido a essa conexão direta, o EventFlow funciona para o Azure, o contêiner e as implantações de serviço locais. Tenha cuidado se você executar EventFlow em cenários de alta densidade, como em um contêiner, pois cada pipeline EventFlow faz uma conexão externa. Então, se você hospedar vários processos, obterá várias conexões de saída! Isso não é tanto uma preocupação para aplicativos de Service Fabric, porque todas as réplicas de um ServiceType são executadas no mesmo processo e isso limita o número de conexões de saída. O EventFlow também oferece a filtragem de eventos e, portanto, somente os eventos que correspondem ao filtro especificado são enviadas.

Configurar EventFlow

EventFlow binários estão disponíveis como um conjunto de pacotes do NuGet. Para adicionar EventFlow a um projeto de serviço do Service Fabric, clique com botão direito do mouse no projeto no Gerenciador de Soluções e escolha "Gerenciar pacotes NuGet". Alternar para a guia "Navegar" e pesquisar por "Diagnostics.EventFlow":

Pacotes do EventFlow NuGet no Gerenciador de pacotes do NuGet do Visual Studio da interface do usuário

Você verá uma lista de vários pacotes, rotulados como "Entradas" e "Saídas". O EventFlow dá suporte a vários provedores de log e analisadores diferentes. O serviço que hospeda EventFlow deve incluir pacotes apropriados dependendo da origem e destino para os logs de aplicativo. Além do pacote principal do Service Fabric, você também precisa de pelo menos uma Entrada e Saída configuradas. Por exemplo, você pode adicionar os seguintes pacotes para enviar eventos EventSource ao Application Insights:

  • Microsoft.Diagnostics.EventFlow.Inputs.EventSource para capturar dados de classe do 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 logs para um recurso do Azure Application Insights)
  • Microsoft.Diagnostics.EventFlow.ServiceFabric(habilita a inicialização do pipeline EventFlow da configuração do serviço Service Fabric e relata quaisquer problemas com o envio de dados de diagnóstico como relatórios de integridade do Service Fabric)

Observação

O pacote Microsoft.Diagnostics.EventFlow.Inputs.EventSource requer que o projeto de serviço tenha como destino o .NET Framework 4.6 ou mais recente. Certifique-se de que definir a estrutura de destino apropriada nas propriedades do projeto antes de instalar este pacote.

Depois que todos os pacotes são instalados, a próxima etapa é configurar e habilitar EventFlow no serviço.

Configurar e habilitar a coleta de logs

O pipeline de EventFlow, responsável pelo envio de logs, é criado de uma especificação armazenada em um arquivo de configuração. O Microsoft.Diagnostics.EventFlow.ServiceFabricpacote instala um arquivo de configuração inicial do EventFlow em PackageRoot\Config pasta da solução, chamada eventFlowConfig.json. Esse arquivo de configuração precisa ser modificado para capturar dados da classe EventSource do serviço padrão e quaisquer outras entradas que você deseja configurar, bem como enviar dados ao local apropriado.

Observação

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

Aqui está 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 da ServiceEventSource do serviço é o valor da propriedade Nome do EventSourceAttribute aplicado à classe ServiceEventSource. Isso é especificado no arquivo ServiceEventSource.cs, que faz parte do código do serviço. Por exemplo, no snippet de código a seguir, o nome do ServiceEventSource é MyCompany-Application1-Stateless1:

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

Observe que o arquivo eventFlowConfig.json faz parte do pacote de configuração de serviço. As alterações feitas neste arquivo podem ser incluídas em atualizações completo - ou apenas da configuração do serviço, sujeito a verificações de integridade de atualização do Service Fabric e a reversão automática se houver falha na atualização. Para saber mais, confira Atualização de aplicativos do Service Fabric.

A seção Filtros da configuração permite que você personalize as informações que passarão pelo pipeline EventFlow para as saídas, permitindo que você descarte ou inclua determinadas informações ou altere ainda mais a estrutura dos dados do evento. Para saber mais sobre filtragem, confira Filtros EventFlow.

A etapa final é criar uma instância de pipeline de EventFlow no código de inicialização do serviço, localizado no arquivo Program.cs:

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 passado como o parâmetro do método CreatePipeline do ServiceFabricDiagnosticsPipelineFactory é o nome da entidade de integridade que representa o pipeline de coleta de logs de EventFlow. Esse nome será usado se EventFlow encontrar um erro e o reportar por meio do subsistema de integridade do Service Fabric.

Usar configurações do Service Fabric e parâmetros de aplicativo em eventFlowConfig

O EventFlow dá suporte ao uso de configurações do Service Fabric e parâmetros de aplicativo para a definição de suas configurações. Você pode se referir aos parâmetros de configuração do Service Fabric usando essa sintaxe especial para valores:

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

<section-name> é o nome da seção de configuração do Service Fabric e <setting-name> é a configuração que fornece o valor que será usado para definir uma configuração de EventFlow. Para ler mais sobre como fazer isso, acesse o Suporte para parâmetros de aplicativo e configurações do Service Fabric.

Verificação

Inicie o serviço e observe a depuração janela saída no Visual Studio. Depois que o serviço é iniciado, você deve começar a ver evidências de que ele está enviando registros para a saída que você configurou. Navegue até a plataforma de análise e visualização de eventos e confirme se os logs começaram a ser mostrados (isso pode levar alguns minutos).

Próximas etapas