Händelseaggregering och insamling med EventFlow

Microsoft Diagnostics EventFlow kan dirigera händelser från en nod till ett eller flera övervakningsmål. Eftersom det ingår som ett NuGet-paket i tjänstprojektet överförs EventFlow-kod och konfiguration med tjänsten, vilket eliminerar konfigurationsproblemet per nod som nämndes tidigare om Azure Diagnostics. EventFlow körs i tjänstprocessen och ansluter direkt till de konfigurerade utdata. På grund av direktanslutningen fungerar EventFlow för Azure, containerdistributioner och lokala tjänstdistributioner. Var försiktig om du kör EventFlow i scenarier med hög densitet, till exempel i en container, eftersom varje EventFlow-pipeline gör en extern anslutning. Så om du är värd för flera processer får du flera utgående anslutningar! Detta är inte lika mycket ett problem för Service Fabric-program, eftersom alla repliker av en ServiceType körning i samma process, vilket begränsar antalet utgående anslutningar. EventFlow erbjuder även händelsefiltrering, så att endast de händelser som matchar det angivna filtret skickas.

Konfigurera EventFlow

EventFlow-binärfiler är tillgängliga som en uppsättning NuGet-paket. Om du vill lägga till EventFlow i ett Service Fabric-tjänstprojekt högerklickar du på projektet i Solution Explorer och väljer "Hantera NuGet-paket". Växla till fliken "Bläddra" och sök efter "Diagnostics.EventFlow":

EventFlow NuGet-paket i Visual Studio NuGet-pakethanterarens användargränssnitt

Du ser en lista över olika paket som visas, märkta med "Indata" och "Utdata". EventFlow stöder olika loggningsproviders och analysverktyg. Tjänsten som är värd för EventFlow bör innehålla lämpliga paket beroende på källan och målet för programloggarna. Förutom det grundläggande ServiceFabric-paketet behöver du också minst en konfigurerad indata och utdata. Du kan till exempel lägga till följande paket för att skicka EventSource-händelser till Application Insights:

  • Microsoft.Diagnostics.EventFlow.Inputs.EventSource för att samla in data från tjänstens EventSource-klass och från Standard EventSources som Microsoft-ServiceFabric-Services och Microsoft-ServiceFabric-Actors)
  • Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights(vi kommer att skicka loggarna till en Azure Application Insights-resurs)
  • Microsoft.Diagnostics.EventFlow.ServiceFabric(aktiverar initiering av EventFlow-pipelinen från Service Fabric-tjänstkonfigurationen och rapporterar eventuella problem med att skicka diagnostikdata som Service Fabric-hälsorapporter)

Anteckning

Microsoft.Diagnostics.EventFlow.Inputs.EventSource-paketet kräver att tjänstprojektet riktar sig mot .NET Framework 4.6 eller senare. Se till att du anger lämpligt målramverk i projektegenskaper innan du installerar det här paketet.

När alla paket har installerats är nästa steg att konfigurera och aktivera EventFlow i tjänsten.

Konfigurera och aktivera logginsamling

EventFlow-pipelinen som ansvarar för att skicka loggarna skapas från en specifikation som lagras i en konfigurationsfil. Paketet Microsoft.Diagnostics.EventFlow.ServiceFabric installerar en startkonfigurationsfil för EventFlow under PackageRoot\Config lösningsmappen med namnet eventFlowConfig.json. Den här konfigurationsfilen måste ändras för att samla in data från standardtjänstklassen EventSource och andra indata som du vill konfigurera och skicka data till rätt plats.

Anteckning

Om projektfilen har VisualStudio 2017-format eventFlowConfig.json läggs filen inte till automatiskt. Åtgärda problemet genom att skapa filen i Config mappen och ange build-åtgärden till Copy if newer.

Här är ett exempel på eventFlowConfig.json baserat på De NuGet-paket som nämns ovan:

{
  "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"
}

Namnet på tjänstens ServiceEventSource är värdet för egenskapen Name för den EventSourceAttribute som tillämpas på klassen ServiceEventSource. Allt anges i ServiceEventSource.cs filen, som är en del av tjänstkoden. I följande kodfragment är till exempel namnet på ServiceEventSource MyCompany-Application1-Stateless1:

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

Observera att eventFlowConfig.json filen ingår i tjänstkonfigurationspaketet. Ändringar i den här filen kan inkluderas i fullständiga eller konfigurationsspecifika uppgraderingar av tjänsten, med förbehåll för Hälsokontroller för Service Fabric-uppgradering och automatisk återställning om uppgraderingen misslyckas. Mer information finns i Uppgradering av Service Fabric-program.

Med filteravsnittet i konfigurationen kan du ytterligare anpassa den information som ska gå igenom EventFlow-pipelinen till utdata, så att du kan släppa eller ta med viss information eller ändra strukturen för händelsedata. Mer information om filtrering finns i EventFlow-filter.

Det sista steget är att instansiera EventFlow-pipelinen i tjänstens startkod, som finns i Program.cs filen:

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;
            }
        }
    }
}

Namnet som skickas som parameter för CreatePipeline metoden för ServiceFabricDiagnosticsPipelineFactory är namnet på hälsoentiteten som representerar eventflow-logginsamlingspipelinen. Det här namnet används om EventFlow påträffar och fel och rapporterar det via Undersystemet för Service Fabric-hälsotillstånd.

Använda Service Fabric-inställningar och programparametrar i eventFlowConfig

EventFlow stöder användning av Service Fabric-inställningar och programparametrar för att konfigurera EventFlow-inställningar. Du kan referera till Service Fabric-inställningsparametrar med den här speciella syntaxen för värden:

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

<section-name> är namnet på konfigurationsavsnittet för Service Fabric och <setting-name> är konfigurationsinställningen som anger det värde som ska användas för att konfigurera en EventFlow-inställning. Mer information om hur du gör detta finns i Stöd för Service Fabric-inställningar och programparametrar.

Verifiering

Starta tjänsten och observera felsökningsutdatafönstret i Visual Studio. När tjänsten har startats bör du börja se bevis på att tjänsten skickar poster till de utdata som du har konfigurerat. Gå till din plattform för händelseanalys och visualisering och bekräfta att loggarna har börjat visas (kan ta några minuter).

Nästa steg