Gebeurtenisaggregatie en -verzameling met behulp van EventFlow

Microsoft Diagnostics EventFlow kan gebeurtenissen van een knooppunt naar een of meer bewakingsbestemmingen routeren. Omdat deze is opgenomen als een NuGet-pakket in uw serviceproject, gaan EventFlow-code en -configuratie met de service mee, waardoor het configuratieprobleem per knooppunt dat eerder over Azure Diagnostics is vermeld, wordt geëlimineerd. EventFlow wordt uitgevoerd binnen uw serviceproces en maakt rechtstreeks verbinding met de geconfigureerde uitvoer. Vanwege de directe verbinding werkt EventFlow voor azure-, container- en on-premises service-implementaties. Wees voorzichtig als u EventFlow uitvoert in high-densityscenario's, zoals in een container, omdat elke EventFlow-pijplijn een externe verbinding maakt. Dus als u meerdere processen host, krijgt u verschillende uitgaande verbindingen. Dit is niet zozeer een probleem voor Service Fabric-toepassingen, omdat alle replica's van een ServiceType uitvoering in hetzelfde proces worden uitgevoerd en dit het aantal uitgaande verbindingen beperkt. EventFlow biedt ook gebeurtenisfiltering, zodat alleen de gebeurtenissen worden verzonden die overeenkomen met het opgegeven filter.

EventFlow instellen

Binaire EventFlow-bestanden zijn beschikbaar als een set NuGet-pakketten. Als u EventFlow wilt toevoegen aan een Service Fabric-serviceproject, klikt u met de rechtermuisknop op het project in de Solution Explorer en kiest u NuGet-pakketten beheren. Ga naar het tabblad Bladeren en zoek naar 'Diagnostics.EventFlow':

EventFlow NuGet-pakketten in De gebruikersinterface van NuGet-pakketbeheer van Visual Studio

U ziet een lijst met verschillende pakketten, met het label 'Invoer' en 'Uitvoer'. EventFlow ondersteunt verschillende logboekregistratieproviders en -analyseprogramma's. De service die EventFlow host, moet de juiste pakketten bevatten, afhankelijk van de bron en bestemming voor de toepassingslogboeken. Naast het ServiceFabric-kernpakket moet er ook ten minste één invoer en uitvoer zijn geconfigureerd. U kunt bijvoorbeeld de volgende pakketten toevoegen om EventSource-gebeurtenissen naar Application Insights te verzenden:

  • Microsoft.Diagnostics.EventFlow.Inputs.EventSource om gegevens vast te leggen uit de Klasse EventSource van de service en van standaard EventSources, zoals Microsoft-ServiceFabric-Services en Microsoft-ServiceFabric-Actors)
  • Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights(we gaan de logboeken verzenden naar een Azure-toepassing Insights-resource)
  • Microsoft.Diagnostics.EventFlow.ServiceFabric(maakt initialisatie van de EventFlow-pijplijn vanuit service fabric-serviceconfiguratie mogelijk en rapporteert eventuele problemen met het verzenden van diagnostische gegevens als Service Fabric-statusrapporten)

Notitie

Microsoft.Diagnostics.EventFlow.Inputs.EventSource-pakket vereist dat het serviceproject is gericht op .NET Framework 4.6 of hoger. Zorg ervoor dat u het juiste doelframework instelt in projecteigenschappen voordat u dit pakket installeert.

Nadat alle pakketten zijn geïnstalleerd, is de volgende stap het configureren en inschakelen van EventFlow in de service.

Logboekverzameling configureren en inschakelen

De EventFlow-pijplijn die verantwoordelijk is voor het verzenden van de logboeken, wordt gemaakt op basis van een specificatie die is opgeslagen in een configuratiebestand. Het Microsoft.Diagnostics.EventFlow.ServiceFabric pakket installeert een eventflow-configuratiebestand dat wordt gestart onder PackageRoot\Config de oplossingsmap, met de naam eventFlowConfig.json. Dit configuratiebestand moet worden gewijzigd om gegevens vast te leggen uit de standaardserviceklasse EventSource en andere invoer die u wilt configureren, en om gegevens naar de juiste plaats te verzenden.

Notitie

Als het projectbestand de VisualStudio 2017-indeling heeft, wordt het eventFlowConfig.json bestand niet automatisch toegevoegd. Als u dit wilt oplossen, maakt u het bestand in de Config map en stelt u de build-actie in op Copy if newer.

Hier volgt een voorbeeld van eventFlowConfig.json op basis van de hierboven genoemde NuGet-pakketten:

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

De naam van service ServiceEventSource is de waarde van de eigenschap Name van de EventSourceAttribute die is toegepast op de klasse ServiceEventSource. Dit is allemaal opgegeven in het ServiceEventSource.cs bestand, dat deel uitmaakt van de servicecode. In het volgende codefragment is de naam van de ServiceEventSource bijvoorbeeld MyCompany-Application1-Stateless1:

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

eventFlowConfig.json Het bestand maakt deel uit van het serviceconfiguratiepakket. Wijzigingen in dit bestand kunnen worden opgenomen in volledige of alleen-configuratie-upgrades van de service, afhankelijk van service-upgradestatuscontroles en automatisch terugdraaien als er een upgradefout optreedt. Zie Upgrade van Service Fabric-toepassing voor meer informatie.

Met de sectie filters van de configuratie kunt u de informatie die via de EventFlow-pijplijn gaat verder aanpassen aan de uitvoer, zodat u bepaalde informatie kunt verwijderen of opnemen, of de structuur van de gebeurtenisgegevens kunt wijzigen. Zie EventFlow-filters voor meer informatie over filteren.

De laatste stap bestaat uit het instantiëren van de EventFlow-pijplijn in de opstartcode van uw service, die zich in Program.cs het bestand bevindt:

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

De naam die als parameter van de CreatePipeline methode van de ServiceFabricDiagnosticsPipelineFactory is doorgegeven, is de naam van de statusentiteit die de pijplijn voor de EventFlow-logboekverzameling vertegenwoordigt. Deze naam wordt gebruikt als EventFlow een fout aantreft en deze rapporteert via het Service Fabric-statussubsysteem.

Service Fabric-instellingen en toepassingsparameters gebruiken in eventFlowConfig

EventFlow ondersteunt het gebruik van Service Fabric-instellingen en toepassingsparameters voor het configureren van EventFlow-instellingen. U kunt Service Fabric-instellingenparameters raadplegen met behulp van deze speciale syntaxis voor waarden:

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

<section-name> is de naam van de Service Fabric-configuratiesectie en <setting-name> is de configuratie-instelling die de waarde aangeeft die wordt gebruikt voor het configureren van een EventFlow-instelling. Ga naar Ondersteuning voor Service Fabric-instellingen en -toepassingsparameters voor meer informatie over hoe u dit doet.

Verificatie

Start uw service en bekijk het uitvoervenster Foutopsporing in Visual Studio. Nadat de service is gestart, ziet u bewijs dat uw service records verzendt naar de uitvoer die u hebt geconfigureerd. Navigeer naar uw platform voor gebeurtenisanalyse en visualisatie en controleer of logboeken zijn begonnen te verschijnen (dit kan enkele minuten duren).

Volgende stappen