Sdílet prostřednictvím


Agregace a shromažďování událostí pomocí EventFlow

Microsoft Diagnostics EventFlow může směrovat události z uzlu do jednoho nebo více cílů monitorování. Vzhledem k tomu, že je součástí projektu služby jako balíček NuGet, kód a konfigurace EventFlow cestují spolu se službou, čímž se eliminuje problém s konfigurací jednotlivých uzlů, který jsme zmínili dříve o Azure Diagnostics. EventFlow běží v rámci procesu služby a připojuje se přímo k nakonfigurovaným výstupům. Kvůli přímému připojení funguje EventFlow pro nasazení Azure, kontejneru a místních služeb. Při spouštění EventFlow ve scénářích s vysokou hustotou, například v kontejneru, buďte opatrní, protože každý kanál EventFlow vytváří externí připojení. Pokud tedy hostujete několik procesů, získáte několik odchozích připojení. To není pro aplikace Service Fabric tolik problém, protože všechny repliky ServiceType běží ve stejném procesu, což omezuje počet odchozích připojení. EventFlow také nabízí filtrování událostí, takže se odesílají pouze události, které odpovídají zadanému filtru.

Nastavení EventFlow

Binární soubory EventFlow jsou k dispozici jako sada balíčků NuGet. Pokud chcete přidat EventFlow do projektu služby Service Fabric, klikněte pravým tlačítkem na projekt v Průzkumník řešení a zvolte Spravovat balíčky NuGet. Přepněte na kartu Procházet a vyhledejte "Diagnostics.EventFlow":

Balíčky NuGet EventFlow v uživatelském rozhraní správce balíčků NuGet sady Visual Studio

Zobrazí se seznam různých balíčků označených jako Vstupy a Výstupy. EventFlow podporuje různé poskytovatele protokolování a analyzátory. Služba hostující EventFlow by měla obsahovat příslušné balíčky v závislosti na zdroji a cíli aplikačních protokolů. Kromě základního balíčku ServiceFabric potřebujete také nakonfigurovat alespoň jeden vstup a výstup. Můžete například přidat následující balíčky pro odesílání událostí EventSource do Application Insights:

  • Microsoft.Diagnostics.EventFlow.Inputs.EventSource zachytávání dat z třídy EventSource služby a ze standardních zdrojů událostí, jako jsou Microsoft-ServiceFabric-Services a Microsoft-ServiceFabric-Actors)
  • Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights(protokoly pošleme do prostředku Aplikace Azure Insights.)
  • Microsoft.Diagnostics.EventFlow.ServiceFabric(umožňuje inicializaci kanálu EventFlow z konfigurace služby Service Fabric a hlásí případné problémy s odesíláním diagnostických dat jako sestavy stavu Service Fabric.

Poznámka

Microsoft.Diagnostics.EventFlow.Inputs.EventSource balíček vyžaduje, aby projekt služby cílil na rozhraní .NET Framework 4.6 nebo novější. Před instalací tohoto balíčku se ujistěte, že jste ve vlastnostech projektu nastavili příslušnou cílovou architekturu.

Po instalaci všech balíčků je dalším krokem konfigurace a povolení eventflow ve službě.

Konfigurace a povolení shromažďování protokolů

Kanál EventFlow zodpovědný za odesílání protokolů se vytvoří ze specifikace uložené v konfiguračním souboru. Balíček Microsoft.Diagnostics.EventFlow.ServiceFabric nainstaluje počáteční konfigurační soubor EventFlow do PackageRoot\Config složky řešení s názvem eventFlowConfig.json. Tento konfigurační soubor je potřeba upravit tak, aby zaznamenával data z výchozí třídy služby EventSource a všechny další vstupy, které chcete konfigurovat, a odesílat data na příslušné místo.

Poznámka

Pokud má soubor projektu formát VisualStudio 2017, eventFlowConfig.json soubor se automaticky nepřidá. Pokud chcete tento problém vyřešit, vytvořte soubor ve Config složce a nastavte akci sestavení na Copy if newer.

Tady je ukázkový soubor eventFlowConfig.json založený na výše uvedených balíčcích NuGet:

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

Název serviceEventSource je hodnota Name vlastnost EventSourceAttribute použité na ServiceEventSource třídy. Všechno je uvedené v ServiceEventSource.cs souboru , který je součástí kódu služby. Například v následujícím fragmentu kódu má ServiceEventSource název MyCompany-Application1-Stateless1:

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

Všimněte si, že eventFlowConfig.json soubor je součástí konfiguračního balíčku služby. Změny tohoto souboru můžou být součástí úplného upgradu služby nebo upgradu pouze konfigurace, v závislosti na kontrolách stavu upgradu Service Fabric a automatickém vrácení zpět v případě selhání upgradu. Další informace najdete v tématu Upgrade aplikace Service Fabric.

Oddíl filtrů v konfiguraci umožňuje dále přizpůsobit výstupy informací, které budou procházet kanálem EventFlow, a umožnit tak vyřadit nebo zahrnout určité informace nebo změnit strukturu dat událostí. Další informace o filtrování najdete v tématu Filtry eventflow.

Posledním krokem je vytvoření instance kanálu EventFlow ve spouštěcím kódu vaší služby, který se nachází v Program.cs souboru:

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

Název předaný jako parametr CreatePipeline metody ServiceFabricDiagnosticsPipelineFactory je název entity stavu představující kanál shromažďování protokolů EventFlow. Tento název se používá v případě, že EventFlow narazí na chybu a nahlásí ji prostřednictvím subsystému stavu Service Fabric.

Použití nastavení a parametrů aplikace Service Fabric v eventFlowConfig

EventFlow podporuje konfiguraci nastavení EventFlow pomocí nastavení a parametrů aplikace Service Fabric. Na parametry nastavení Service Fabric můžete odkazovat pomocí této speciální syntaxe pro hodnoty:

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

<section-name> je název oddílu konfigurace Service Fabric a <setting-name> jedná se o nastavení konfigurace, které poskytuje hodnotu, která se použije ke konfiguraci nastavení EventFlow. Další informace o tom, jak to udělat, najdete v tématu Podpora nastavení Service Fabric a parametrů aplikace.

Ověření

Spusťte službu a podívejte se na okno výstupu ladění v sadě Visual Studio. Po spuštění služby byste měli začít vidět důkaz, že služba odesílá záznamy do výstupu, který jste nakonfigurovali. Přejděte na platformu pro analýzu a vizualizaci událostí a ověřte, že se protokoly začaly zobrazovat (může to trvat několik minut).

Další kroky