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 reser EventFlow-kod och konfiguration med tjänsten, vilket eliminerar konfigurationsproblemet per nod som nämndes tidigare om Azure Diagnostics. EventFlow körs i din tjänstprocess 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, och detta 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 Istraživač rešenja och väljer "Hantera NuGet-paket". Växla till fliken "Bläddra" och sök efter "Diagnostics.EventFlow
":
Du ser en lista över olika paket som visas, märkta med "Indata" och "Utdata". EventFlow har stöd för 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 in- och utdata konfigurerad. 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 standardhändelsekällor 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
(möjliggör initiering av EventFlow-pipelinen från Service Fabric-tjänstkonfigurationen och rapporterar eventuella problem med att skicka diagnostikdata som Service Fabric-hälsorapporter)
Kommentar
Microsoft.Diagnostics.EventFlow.Inputs.EventSource
-paketet kräver att tjänstprojektet riktar in sig på .NET Framework 4.6 eller senare. Se till att du anger rätt 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 loggsamling
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.
Kommentar
Om projektfilen har VisualStudio 2017-format eventFlowConfig.json
läggs filen inte till automatiskt. Åtgärda detta genom att skapa filen i Config
mappen och ange byggåtgärden till Copy if newer
.
Här är ett exempel 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 är en del av tjänstkonfigurationspaketet. Ändringar i den här filen kan inkluderas i fullständiga eller endast konfigurationsuppgraderingar 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 inkludera 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 ServiceFabricDiagnosticsPipelineFactory
för är namnet på hälsoentiteten som representerar pipelinen för Händelseflödesloggsamling. Det här namnet används om EventFlow stöter på och fel och rapporterar det via Service Fabric-hälsoundersystemet.
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å avsnittet Service Fabric-konfiguration 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 Support 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 för 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).