Agregacja i zbieranie zdarzeń przy użyciu elementu EventFlow
Przepływ zdarzeń diagnostycznych firmy Microsoft może kierować zdarzenia z węzła do co najmniej jednego miejsca docelowego monitorowania. Ponieważ jest on dołączany jako pakiet NuGet w projekcie usługi, kod EventFlow i konfiguracja są przesyłane z usługą, eliminując problem z konfiguracją dla węzła wymieniony wcześniej na temat Diagnostyka Azure. Przepływ zdarzeń jest uruchamiany w ramach procesu usługi i łączy się bezpośrednio ze skonfigurowanymi danymi wyjściowymi. Ze względu na bezpośrednie połączenie usługa EventFlow działa w przypadku wdrożeń platformy Azure, kontenera i lokalnej usługi. Należy zachować ostrożność, jeśli uruchamiasz przepływ zdarzeń w scenariuszach o wysokiej gęstości, takich jak w kontenerze, ponieważ każdy potok EventFlow nawiązuje połączenie zewnętrzne. Tak więc, jeśli hostujesz kilka procesów, otrzymujesz kilka połączeń wychodzących! Nie jest to tak samo istotne dla aplikacji usługi Service Fabric, ponieważ wszystkie repliki ServiceType
przebiegu w tym samym procesie ograniczają liczbę połączeń wychodzących. Funkcja EventFlow oferuje również filtrowanie zdarzeń, dzięki czemu wysyłane są tylko zdarzenia zgodne z określonym filtrem.
Konfigurowanie przepływu zdarzeń
Pliki binarne EventFlow są dostępne jako zestaw pakietów NuGet. Aby dodać przepływ zdarzeń do projektu usługi Service Fabric, kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań i wybierz pozycję "Zarządzaj pakietami NuGet". Przejdź do karty "Przeglądaj" i wyszukaj ciąg "Diagnostics.EventFlow
":
Zostanie wyświetlona lista różnych pakietów z etykietami "Inputs" i "Outputs". Usługa EventFlow obsługuje różnych dostawców rejestrowania i analizatorów. Usługa hostująca przepływ zdarzeń powinna zawierać odpowiednie pakiety w zależności od źródła i miejsca docelowego dzienników aplikacji. Oprócz podstawowego pakietu ServiceFabric potrzebne jest również co najmniej jedno wejście i wyjście. Możesz na przykład dodać następujące pakiety, aby wysyłać zdarzenia EventSource do usługi Application Insights:
Microsoft.Diagnostics.EventFlow.Inputs.EventSource
przechwytywanie danych z klasy EventSource usługi oraz z standardowych źródeł zdarzeń, takich jak Microsoft-ServiceFabric-Services i Microsoft-ServiceFabric-Actors)Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights
(wyślemy dzienniki do zasobu usługi aplikacja systemu Azure Insights)Microsoft.Diagnostics.EventFlow.ServiceFabric
(umożliwia inicjowanie potoku EventFlow z poziomu konfiguracji usługi Service Fabric i zgłasza wszelkie problemy z wysyłaniem danych diagnostycznych jako raportów kondycji usługi Service Fabric)
Uwaga
Microsoft.Diagnostics.EventFlow.Inputs.EventSource
Pakiet wymaga, aby projekt usługi był przeznaczony dla platformy .NET Framework 4.6 lub nowszej. Przed zainstalowaniem tego pakietu upewnij się, że ustawiono odpowiednią platformę docelową we właściwościach projektu.
Po zainstalowaniu wszystkich pakietów następnym krokiem jest skonfigurowanie i włączenie przepływu zdarzeń w usłudze.
Konfigurowanie i włączanie zbierania dzienników
Potok EventFlow odpowiedzialny za wysyłanie dzienników jest tworzony na podstawie specyfikacji przechowywanej w pliku konfiguracji. Pakiet Microsoft.Diagnostics.EventFlow.ServiceFabric
instaluje początkowy plik konfiguracji EventFlow w PackageRoot\Config
folderze rozwiązania o nazwie eventFlowConfig.json
. Ten plik konfiguracji należy zmodyfikować w celu przechwycenia danych z domyślnej klasy usługi EventSource
oraz wszelkich innych danych wejściowych, które chcesz skonfigurować, i wysłać dane do odpowiedniego miejsca.
Uwaga
Jeśli plik projektu ma format VisualStudio 2017, eventFlowConfig.json
plik nie zostanie automatycznie dodany. Aby rozwiązać ten problem, utwórz plik w folderze Config
i ustaw akcję kompilacji na Copy if newer
.
Oto przykładowy eventFlowConfig.json oparty na pakietach NuGet wymienionych powyżej:
{
"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"
}
Nazwa usługi ServiceEventSource jest wartością właściwości EventSourceAttribute
Name zastosowanej do klasy ServiceEventSource. Wszystkie są określone w ServiceEventSource.cs
pliku, który jest częścią kodu usługi. Na przykład w poniższym fragmencie kodu nazwa elementu ServiceEventSource to MyCompany-Application1-Stateless1:
[EventSource(Name = "MyCompany-Application1-Stateless1")]
internal sealed class ServiceEventSource : EventSource
{
// (rest of ServiceEventSource implementation)
}
Należy pamiętać, że eventFlowConfig.json
plik jest częścią pakietu konfiguracji usługi. Zmiany w tym pliku można uwzględnić w pełnych lub tylko konfiguracji uaktualnień usługi, z zastrzeżeniem kontroli kondycji uaktualnienia usługi Service Fabric i automatycznego wycofywania w przypadku niepowodzenia uaktualniania. Aby uzyskać więcej informacji, zobacz Uaktualnianie aplikacji usługi Service Fabric.
Sekcja filtrów konfiguracji umożliwia dalsze dostosowywanie informacji przechodzących przez potok EventFlow do danych wyjściowych, co umożliwia usunięcie lub dołączenie pewnych informacji lub zmianę struktury danych zdarzenia. Aby uzyskać więcej informacji na temat filtrowania, zobacz Filtry przepływu zdarzeń.
Ostatnim krokiem jest utworzenie wystąpienia potoku EventFlow w kodzie uruchamiania usługi znajdującym się w Program.cs
pliku:
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;
}
}
}
}
Nazwa przekazana jako parametr CreatePipeline
metody ServiceFabricDiagnosticsPipelineFactory
to nazwa jednostki kondycji reprezentującej potok zbierania dzienników EventFlow. Ta nazwa jest używana, jeśli usługa EventFlow napotka błąd i zgłosi ją za pośrednictwem podsystemu kondycji usługi Service Fabric.
Używanie ustawień usługi Service Fabric i parametrów aplikacji w elem. eventFlowConfig
Funkcja EventFlow obsługuje używanie ustawień usługi Service Fabric i parametrów aplikacji do konfigurowania ustawień przepływu zdarzeń. Możesz zapoznać się z parametrami ustawień usługi Service Fabric przy użyciu tej specjalnej składni dla wartości:
servicefabric:/<section-name>/<setting-name>
<section-name>
to nazwa sekcji konfiguracji usługi Service Fabric i <setting-name>
to ustawienie konfiguracji zawierające wartość, która zostanie użyta do skonfigurowania ustawienia EventFlow. Aby dowiedzieć się więcej o tym, jak to zrobić, przejdź do tematu Obsługa ustawień usługi Service Fabric i parametrów aplikacji.
Weryfikacja
Uruchom usługę i obserwuj okno Debugowanie danych wyjściowych w programie Visual Studio. Po uruchomieniu usługi należy zacząć widzieć dowody, że usługa wysyła rekordy do skonfigurowanych danych wyjściowych. Przejdź do platformy analizy zdarzeń i wizualizacji i upewnij się, że dzienniki zaczęły się pojawiać (może upłynąć kilka minut).