Agregação e coleta de eventos usando EventFlow
O Microsoft Diagnostics EventFlow pode rotear eventos de um nó para um ou mais destinos de monitoramento. Como ele está incluído como um pacote NuGet em seu projeto de serviço, o código EventFlow e a configuração viajam com o serviço, eliminando o problema de configuração por nó mencionado anteriormente sobre o Diagnóstico do Azure. O EventFlow é executado dentro do seu processo de serviço e se conecta diretamente às saídas configuradas. Devido à conexão direta, o EventFlow funciona para implantações do Azure, contêiner e serviço local. Tenha cuidado se você executar o EventFlow em cenários de alta densidade, como em um contêiner, porque cada pipeline do EventFlow faz uma conexão externa. Então, se você hospedar vários processos, você obtém várias conexões de saída! Isso não é tão preocupante para os aplicativos do Service Fabric, porque todas as réplicas de uma ServiceType
execução são executadas no mesmo processo, e isso limita o número de conexões de saída. O EventFlow também oferece filtragem de eventos, para que apenas os eventos que correspondem 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 mouse no projeto no Gerenciador de Soluções e escolha "Gerenciar pacotes NuGet". Mude para o separador "Procurar" e procure por "Diagnostics.EventFlow
":
Você verá uma lista de vários pacotes aparecerem, rotulados com "Entradas" e "Saídas". O EventFlow suporta vários provedores e analisadores de log diferentes. O serviço que hospeda o EventFlow deve incluir pacotes apropriados, dependendo da origem e do destino dos logs do aplicativo. Além do pacote principal do ServiceFabric, 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 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 logs para um recurso do Azure Application Insights)Microsoft.Diagnostics.EventFlow.ServiceFabric
(permite a inicialização do pipeline do EventFlow a partir 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)
Nota
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 definir a estrutura de destino apropriada nas propriedades do projeto antes de instalar este pacote.
Depois que todos os pacotes estiverem instalados, a próxima etapa é configurar e habilitar o EventFlow no serviço.
Configurar e habilitar a coleta de logs
O pipeline EventFlow responsável pelo envio dos logs é criado a partir de uma especificação armazenada em um arquivo de configuração. O Microsoft.Diagnostics.EventFlow.ServiceFabric
pacote instala um arquivo de configuração inicial do EventFlow na PackageRoot\Config
pasta da solução, chamada eventFlowConfig.json
. Esse arquivo de configuração precisa ser modificado para capturar dados da classe de serviço EventSource
padrão e quaisquer outras entradas que você deseja configurar e enviar dados para o local apropriado.
Nota
Se o arquivo de projeto tiver o formato VisualStudio 2017, o eventFlowConfig.json
arquivo não será adicionado automaticamente. Para corrigir isso, crie o Config
arquivo na pasta e defina a ação de compilação como Copy if newer
.
Aqui está um exemplo de eventFlowConfig.json 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 de ServiceEventSource do serviço é o valor da propriedade Name do EventSourceAttribute
aplicado à classe ServiceEventSource. Tudo é especificado no ServiceEventSource.cs
arquivo, que faz parte do código de serviço. Por exemplo, no trecho 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 eventFlowConfig.json
o arquivo faz parte do pacote de configuração de serviço. As alterações nesse arquivo podem ser incluídas em atualizações completas ou somente de configuração do serviço, sujeitas a verificações de integridade de atualização do Service Fabric e reversão automática se houver falha na atualização. Para obter mais informações, consulte Atualização do aplicativo Service Fabric.
A seção de filtros da configuração permite que você personalize ainda mais as informações que passarão pelo pipeline do EventFlow para as saídas, permitindo que você solte ou inclua determinadas informações ou altere a estrutura dos dados do evento. Para obter mais informações sobre filtragem, consulte Filtros EventFlow.
A etapa final é instanciar o pipeline do EventFlow no código de inicialização do serviço, localizado no Program.cs
arquivo:
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 CreatePipeline
método do é o nome da entidade de integridade que representa o pipeline de coleta de log EventFlow ServiceFabricDiagnosticsPipelineFactory
. Esse nome é usado se o EventFlow encontrar erros e reportá-los por meio do subsistema de integridade do Service Fabric.
Usar configurações do Service Fabric e parâmetros de aplicativo em eventFlowConfig
O EventFlow oferece suporte ao uso de configurações do Service Fabric e parâmetros de aplicativo para definir as configurações do EventFlow. Você pode consultar os parâmetros de configurações do Service Fabric usando esta 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 definição de configuração que fornece o valor que será usado para definir uma configuração de EventFlow. Para ler mais sobre como fazer isso, vá para Suporte para configurações do Service Fabric e parâmetros do aplicativo.
Verificação
Inicie seu serviço e observe a janela de saída Debug no Visual Studio. Depois que o serviço for iniciado, você deve começar a ver evidências de que seu serviço está enviando registros para a saída que você configurou. Navegue até sua plataforma de análise e visualização de eventos e confirme se os logs começaram a aparecer (pode levar alguns minutos).