Aggregazione e raccolta di eventi con EventFlow

Microsoft Diagnostics EventFlow può indirizzare gli eventi da un nodo a una o più destinazioni di monitoraggio. Poiché è incluso come pacchetto NuGet nel progetto del servizio, il codice e la configurazione di EventFlow vanno di pari passo con il servizio, eliminando i problemi di configurazione specifici di ogni nodo indicati in precedenza e relativi a Diagnostica di Azure. EventFlow viene eseguito nel processo del servizio e si connette direttamente agli output configurati. A causa della connessione diretta, EventFlow funziona con le distribuzioni dei servizi in Azure, nei contenitori e in locale. Se si esegue EventFlow in scenari a densità elevata, ad esempio in un contenitore, è necessario prestare attenzione perché ogni pipeline di EventFlow stabilisce una connessione esterna. Pertanto, se si ospitano molti processi, si ottengono molte connessioni in uscita. Questo non costituisce un problema per le applicazioni di Service Fabric, perché tutte le repliche di ServiceType sono eseguite nello stesso processo e ciò limita il numero di connessioni in uscita. EventFlow offre anche i filtri per gli eventi, in modo che vengano inviati solo gli eventi corrispondenti al filtro specificato.

Configurare EventFlow

I file binari di EventFlow sono disponibili come set di pacchetti NuGet. Per aggiungere EventFlow a un progetto di servizio di Service Fabric, fare clic con il pulsante destro del mouse sul progetto nel Esplora soluzioni e scegliere "Gestisci pacchetti NuGet". Passare alla scheda "Sfoglia" e cercare "Diagnostics.EventFlow":

Pacchetti NuGet di EventFlow nell'interfaccia utente di gestione pacchetti NuGet di Visual Studio

Verrà visualizzato un elenco dei vari pacchetti evidenziati, con etichetta "Input" e "Output". EventFlow supporta diversi provider di accesso e analizzatori. Il servizio che ospita EventFlow deve includere pacchetti appropriati a seconda dell'origine e della destinazione dei log applicazioni. Oltre al pacchetto di base ServiceFabric, è anche necessario aver configurato almeno un Input e un Output. È ad esempio possibile aggiungere i pacchetti seguenti per inviare eventi EventSource ad Application Insights:

  • Microsoft.Diagnostics.EventFlow.Inputs.EventSource per acquisire dati dalla classe EventSource del servizio e da origini eventi standard, ad esempio Microsoft-ServiceFabric-Services e Microsoft-ServiceFabric-Actors)
  • Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights, i log verranno inviati a una risorsa di Azure Application Insights
  • Microsoft.Diagnostics.EventFlow.ServiceFabric, consente l'inizializzazione della pipeline EventFlow dalla configurazione del servizio di Service Fabric e segnala eventuali problemi tramite l'invio di dati di diagnostica in forma di report sull'integrità di Service Fabric

Nota

Per il pacchetto Microsoft.Diagnostics.EventFlow.Inputs.EventSource il progetto di servizio deve puntare a .NET Framework 4.6 o versione successiva. Assicurarsi di impostare il framework di destinazione corretto nelle proprietà del progetto prima di installare questo pacchetto.

Dopo aver installato tutti i pacchetti, è necessario configurare e abilitare EventFlow nel servizio.

Configurare e abilitare la raccolta di log

La pipeline EventFlow, responsabile dell'invio dei log, viene creata da una specifica archiviata in un file di configurazione. Il pacchetto Microsoft.Diagnostics.EventFlow.ServiceFabric installa un file di configurazione EventFlow iniziale nella cartella PackageRoot\Config della soluzione denominata eventFlowConfig.json. Questo file di configurazione deve essere modificato per l'acquisizione di dati dalla classe EventSource del servizio predefinito, oltre a qualsiasi altro input che si desidera configurare, e per l'invio di dati alla destinazione appropriata.

Nota

Se il file di progetto è nel formato di Visual Studio 2017, il file eventFlowConfig.json non verrà aggiunto automaticamente. Per correggere questo problema, creare il file nella cartella Config e impostare l'azione di compilazione su Copy if newer.

Ecco un esempio di eventFlowConfig.json basato sui pacchetti NuGet indicati in precedenza:

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

Il nome dell'oggetto ServiceEventSource del servizio è il valore della proprietà Name dell'oggetto EventSourceAttribute applicato alla classe ServiceEventSource. Tutto questo è specificato nel file ServiceEventSource.cs, che fa parte del codice del servizio. Ad esempio, nel frammento di codice seguente il nome dell'oggetto ServiceEventSource è MyCompany-Application1-Stateless1:

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

Si noti che il file eventFlowConfig.json fa parte del pacchetto di configurazione del servizio. Le modifiche apportate a questo file possono essere incluse in aggiornamenti del servizio completi o della sola configurazione, in base ai controlli di integrità dell'aggiornamento di Service Fabric e al ripristino dello stato precedente automatico in caso di errore di aggiornamento. Per altre informazioni, vedere Aggiornamento delle applicazioni di Service Fabric.

La sezione dei filtri della configurazione consente di personalizzare ulteriormente le informazioni che si intende far passare attraverso la pipeline EventFlow fino agli output, consentendo di eliminare o includere determinate informazioni o di modificare la struttura dei dati dell'evento. Per altre informazioni sui filtri, controllare i filtri EventFlow.

Il passaggio finale consiste nel creare un'istanza della pipeline EventFlow nel codice di avvio del servizio, situato nel file 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;
            }
        }
    }
}

Il nome passato come parametro del metodo CreatePipeline di ServiceFabricDiagnosticsPipelineFactory è il nome dell'entità di integrità che rappresenta la pipeline di raccolta di log EventFlow. Questo nome viene usato se EventFlow rileva un errore e lo segnala tramite il sottosistema di integrità di Service Fabric.

Usare le impostazioni di Service Fabric e i parametri dell'applicazione in eventFlowConfig

EventFlow supporta l'uso delle impostazioni di Service Fabric e dei parametri dell'applicazione per configurare le impostazioni di EventFlow. È possibile fare riferimento ai parametri delle impostazioni di Service Fabric usando questa sintassi speciale per i valori:

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

<section-name> è il nome della sezione di configurazione di Service Fabric e <setting-name> è l'impostazione di configurazione che indica il valore che verrà usato per configurare un'impostazione EventFlow. Per altre informazioni su come effettuare questa operazione, passare a Support for Service Fabric settings and application parameters (Supporto per le impostazioni e i parametri dell'applicazione Service Fabric).

Verifica

Avviare il servizio e osservare la finestra dell'output di debug di Visual Studio. Dopo l'avvio del servizio, dovrebbero essere visibili le prove dell'invio di record del servizio all'output configurato. Passare alla piattaforma di analisi e visualizzazione di eventi e confermare che i log vengono visualizzati. Questa operazione potrebbe richiedere alcuni minuti.

Passaggi successivi