Tutorial: Überwachen und Diagnostizieren einer ASP.NET Core-Anwendung in Service Fabric mithilfe von Application Insights

Dieses Tutorial ist der fünfte Teil einer Reihe. Es beschreibt die Schritte zum Konfigurieren von Überwachung und Diagnose für eine ASP.NET Core-Anwendung, die in einem Service Fabric-Cluster mithilfe von Application Insights ausgeführt wird. Aus der Anwendung, die im ersten Teil des Tutorials erstellt wurde (Erstellen einer .NET Service Fabric-Anwendung), werden Telemetriedaten gesammelt.

Im vierten Teil der Tutorialserie lernen Sie Folgendes:

  • Konfigurieren von Application Insights für Ihre Anwendung
  • Sammeln von Antworttelemetriedaten zur Ablaufverfolgung der HTTP-Kommunikation zwischen Diensten
  • Verwenden der App-Übersichtsfunktion in Application Insights
  • Hinzufügen von benutzerdefinierten Ereignissen mithilfe der Application Insights-API

In dieser Tutorialserie lernen Sie Folgendes:

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen können, müssen Sie Folgendes tun:

Laden Sie die Beispielanwendung „Voting“ herunter.

Falls Sie die Beispielanwendung „Voting“ aus Teil 1 dieser Tutorialreihe nicht erstellt haben, können Sie sie herunterladen. Führen Sie in einem Befehlsfenster oder -terminal den folgenden Befehl aus, um das Beispielrepository für die App auf Ihren lokalen Computer zu klonen.

git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart

Einrichten einer Application Insights-Ressource

Application Insights ist eine Azure-Plattform zum Verwalten von Anwendungsleistungen und die für Service Fabric empfohlene Plattform für die Überwachung und Diagnose von Anwendungen.

Navigieren Sie zum Azure-Portal, um eine Application Insights-Ressource zu erstellen. Wählen Sie im linken Navigationsmenü Ressource erstellen aus, um den Azure Marketplace zu öffnen. Wählen Sie Überwachung + Verwaltung und dann Application Insights aus.

Erstellen einer neuen AI-Ressource

Sie müssen nun die erforderlichen Informationen zu den Attributen der Ressource ausfüllen, die erstellt werden sollen. Geben Sie einen entsprechenden Namen, eine Ressourcengruppe und ein Abonnement ein. Legen Sie den Speicherort auf den Ort fest, auf dem Sie Ihren Service Fabric-Cluster in Zukunft bereitstellen möchten. In diesem Tutorial wird die App auf einem lokalen Cluster bereitgestellt, sodass das Feld Speicherort nicht relevant ist. Der Anwendungstyp sollte unverändert bei „ASP.NET-Webanwendung“ bleiben.

AI-Ressourcenattribute

Wenn Sie die erforderlichen Informationen ausgefüllt haben, wählen Sie Erstellen aus, um die Ressource bereitzustellen. Dies sollte ungefähr eine Minute dauern.

Hinzufügen von Application Insights zum Anwendungsdienst

Klicken Sie zum Starten von Visual Studio 2019 mit erhöhten Rechten mit der rechten Maustaste auf das Visual Studio-Symbol im Startmenü, und wählen Sie Als Administrator ausführen aus. Wählen Sie Datei>Öffnen>Projekt/Projektmappe aus, und navigieren Sie zur Abstimmungsanwendung (die entweder in Teil 1 des Tutorials erstellt oder von Git geklont wurde). Öffnen Sie Voting.sln. Wählen Sie Ja aus, wenn Sie zum Wiederherstellen der NuGet-Pakete der Anwendung aufgefordert werden.

Führen Sie die folgenden Schritte aus, um Application Insights für VotingWeb- und VotingData-Dienste zu konfigurieren:

  1. Klicken Sie mit der rechten Maustaste auf den Namen des Diensts und dann auf Hinzufügen > Verbundene Dienste > Überwachung mit Application Insights.

    Konfigurieren von AI

Hinweis

Abhängig vom Projekttyp müssen Sie nach dem Rechtsklick auf den Dienstnamen unter Umständen auf „Hinzufügen“ > „Application Insights-Telemetrie“ klicken.

  1. Wählen Sie Erste Schritte aus.

  2. Melden Sie sich bei dem Konto an, das Sie für Ihr Azure-Abonnement verwenden, und wählen Sie das Abonnement aus, in dem Sie die Application Insights-Ressource erstellt haben. Suchen Sie die Ressource unter Vorhandene Application Insights-Ressource im Dropdownmenü „Ressource“. Wählen Sie Registrieren aus, um Application Insights zu Ihrem Dienst hinzuzufügen.

    Registrieren von AI

  3. Klicken Sie auf Fertig stellen, sobald das angezeigte Dialogfeld die Aktion abgeschlossen hat.

Hinweis

Stellen Sie sicher, dass Sie die oben aufgeführten Schritte für beide Dienste der Anwendung durchführen, um die Konfiguration von Application Insights für die Anwendung abzuschließen. Für beide Dienste wird dieselbe Application Insights-Ressource verwendet, damit eingehende und ausgehende Anforderungen und die Kommunikation zwischen den Diensten angezeigt werden.

Hinzufügen des NuGet-Pakets „Microsoft.ApplicationInsights.ServiceFabric.Native“ zu den Diensten

Application Insights verfügt über zwei für Service Fabric spezifische NuGet-Pakete, die abhängig vom Szenario verwendet werden können. Eines wird mit den nativen Service Fabric-Diensten verwendet, das andere mit Containern und ausführbaren Gastanwendungsdateien. In diesem Fall wird das NuGet-Paket „Microsoft.ApplicationInsights.ServiceFabric.Native“ verwendet, um das Verständnis des Dienstkontexts zu nutzen, das dieses mit sich bringt. Weitere Informationen zum Application Insights SDK und zu den für Service Fabric spezifischen NuGet-Paketen finden Sie unter Microsoft Application Insights für Service Fabric.

Folgende Schritte sind für das Einrichten des NuGet-Pakets erforderlich:

  1. Klicken Sie oben im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe „Voting“ , und wählen Sie NuGet-Pakete für Projektmappe verwalten... aus.
  2. Wählen Sie im oberen Navigationsmenü des Fensters „NuGet – Projektmappe“ Durchsuchen aus, und aktivieren Sie neben der Suchleiste das Feld Vorabversion einbeziehen.

Hinweis

Gegebenenfalls müssen Sie vor der Installation des Application Insights-Pakets auch das Paket „Microsoft.ServiceFabric.Diagnostics.Internal“ installieren, sofern es nicht bereits vorinstalliert war.

  1. Suchen Sie nach Microsoft.ApplicationInsights.ServiceFabric.Native, und wählen Sie das entsprechende NuGet-Paket aus.

  2. Aktivieren Sie auf der rechten Seite die zwei Kontrollkästchen neben den beiden Diensten in der Anwendung (VotingWeb und VotingData), und wählen Sie Installieren aus. KI sdk Nuget

  3. Wählen Sie im angezeigten Dialogfeld Änderungen überprüfen die Option OK aus, und akzeptieren Sie die Lizenzbedingungen. Dadurch wird das Hinzufügen des NuGet-Pakets zu den Diensten abgeschlossen.

  4. Sie müssen nun den Telemetrieinitialisierer in beiden Diensten einrichten. Öffnen Sie dazu VotingWeb.cs und VotingData.cs. Führen Sie für beide folgende Schritte aus:

    1. Fügen Sie diese zwei using-Anweisungen jeweils vor <ServiceName>.cs und nach den vorhandenen using-Anweisungen hinzu:
    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.ApplicationInsights.ServiceFabric;
    
    1. Fügen Sie in beiden Dateien in der geschachtelten return-Anweisung von CreateServiceInstanceListeners() oder CreateServiceReplicaListeners() unter ConfigureServices>services mit den anderen deklarierten Singleton-Diensten Folgendes hinzu:
    .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
    

    Dadurch wird der Dienstkontext zu Ihrer Telemetrie hinzugefügt, durch den Sie die Quelle Ihrer Telemetrie in Application Insights besser nachvollziehen können. Ihre geschachtelte return-Anweisung in VotingWeb.cs sollte folgendermaßen aussehen:

    return new WebHostBuilder()
        .UseKestrel()
        .ConfigureServices(
            services => services
                .AddSingleton<HttpClient>(new HttpClient())
                .AddSingleton<FabricClient>(new FabricClient())
                .AddSingleton<StatelessServiceContext>(serviceContext)
                .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
        .UseUrls(url)
        .Build();
    

    In VotingData.cs sollte diese folgendermaßen aussehen:

    return new WebHostBuilder()
        .UseKestrel()
        .ConfigureServices(
            services => services
                .AddSingleton<StatefulServiceContext>(serviceContext)
                .AddSingleton<IReliableStateManager>(this.StateManager)
                .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
        .UseUrls(url)
        .Build();
    

Vergewissern Sie sich, dass die UseApplicationInsights()-Methode in den beiden Dateien VotingWeb.cs und VotingData.cs aufgerufen wird, wie oben gezeigt.

Hinweis

Diese Beispiel-App verwendet HTTP für die Dienstkommunikation. Wenn Sie eine App mit Dienstremoting V2 entwickeln, müssen Sie am gleichen Ort wie oben auch die folgenden Codezeilen hinzufügen.

ConfigureServices(services => services
    ...
    .AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
    .AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)

An diesem Punkt können Sie Ihre Anwendung bereitstellen. Wählen Sie oben Starten aus (oder drücken Sie F5), damit Visual Studio die Anwendung erstellt und packt, richten Sie Ihren lokalen Cluster ein, und stellen Sie die Anwendung darin bereit.

Hinweis

Unter Umständen wird ein Buildfehler angezeigt, wenn keine aktuelle Version des .NET Core SDK installiert ist.

Sobald die Anwendung bereitgestellt ist, navigieren Sie zu localhost:8080. Dort sollte Ihnen die Single-Page-Beispielanwendung „Voting“ angezeigt werden. Stimmen Sie für einige verschiedene Elemente Ihrer Wahl ab, um Beispieldaten und eine Beispieltelemetrie zu erstellen – ich habe mich für Desserts entschieden.

AI-Beispielabstimmungen

Sie können auch ein paar der Abstimmungsoptionen entfernen, wenn Sie ein paar Stimmen hinzugefügt haben.

Anzeigen der Telemetrie und der App-Zuordnung in Application Insights

Navigieren Sie im Azure-Portal zu Ihrer Application Insights-Ressource.

Wählen Sie Übersicht aus, um zurück zur Startseite Ihrer Ressource zu gelangen. Wählen Sie dann oben Suchen aus, um die eingehenden Ablaufverfolgungen anzuzeigen. Es dauert ein paar Minuten, bis die Ablaufverfolgungen in Application Insights angezeigt werden. Falls keine Ablaufverfolgungen angezeigt werden, warten Sie eine Minute, und klicken Sie dann oben auf die Schaltfläche Aktualisieren. KI siehe Ablaufverfolgungen

Wenn Sie im Fenster Suche nach unten scrollen, werden Ihnen alle eingehenden Telemetriedaten angezeigt, die Sie durch Application Insights vordefiniert erhalten. Für jede Aktion, die Sie in der Voting-Anwendung vorgenommen haben, sollten eine ausgehende PUT-Anforderung von VotingWeb (PUT-Stimmen/Put [Name]) und eine eingehende PUT-Anforderung von VotingData (PUT-Abstimmungsdaten/Put [Name]) vorhanden sein, gefolgt von einem Paar von GET-Anforderungen zum Aktualisieren der angezeigten Daten. Außerdem wird eine Ablaufverfolgung der Abhängigkeit für HTTP von „localhost“ angezeigt, da es sich um HTTP-Anforderungen handelt. In diesem Beispiel wird dargestellt, wie eine Stimme hinzugefügt wird:

Ablaufverfolgung einer KI-Beispielanforderung

Sie können eine der Ablaufverfolgungen auswählen, um weitere Details anzuzeigen. Dort sind nützliche Informationen zu der von Application Insights bereitgestellten Anforderung enthalten, einschließlich der Antwortzeit und der Anforderungs-URL. Da Sie die für Service Fabric spezifischen NuGet-Pakete hinzugefügt haben, erhalten Sie ebenfalls Daten zu Ihrer Anwendung im Kontext eines Service Fabric-Clusters im folgenden Abschnitt Benutzerdefinierte Daten. Dies schließt den Dienstkontext ein, sodass Ihnen die PartitionId und die ReplicaId der Quelle der Anforderung angezeigt werden. Außerdem können Sie Probleme besser lokalisieren, wenn Sie Fehler in Ihrer Anwendung diagnostizieren.

AI-Ablaufverfolgungsdetails

Darüber hinaus können Sie im linken Menü der Übersichtsseite Anwendungsübersicht oder das Symbol App-Übersicht auswählen, um zur App-Übersicht mit Ihren beiden verbundenen Diensten zu gelangen.

Screenshot: Hervorhebung der Anwendungsübersicht im linken Menü

Die App-Übersichtsfunktion kann Sie beim Nachvollziehen der Anwendungstopologie unterstützen, insbesondere wenn Sie mehrere verschiedene Dienste hinzufügen, die zusammenarbeiten. Sie erhalten ebenfalls Daten zur Erfolgsrate der Anforderungen und werden bei der Diagnose fehlgeschlagener Anforderungen unterstützt, um nachzuvollziehen, warum Fehler aufgetreten sind. Weitere Informationen zur App-Übersichtsfunktion erhalten Sie unter Application Map in Application Insights (Anwendungszuordnung in Application Insights).

Hinzufügen einer benutzerdefinierten Instrumentierung zu Ihrer Anwendung

Obwohl Application Insights viele vordefinierte Telemetriedaten bereitstellt, sollten Sie weitere benutzerdefinierte Instrumentierungen hinzufügen. Diese können Sie an die Anforderungen Ihres Unternehmens anpassen oder zur Diagnose verwenden, wenn Fehler in Ihrer Anwendung auftreten. Application Insights verfügt über eine API zum Erfassen benutzerdefinierter Ereignisse und Metriken. Mehr dazu finden Sie hier.

Fügen Sie einige benutzerdefinierte Ereignisse zu VoteDataController.cs (unter VotingData>Controller) hinzu, um zu verfolgen, wann Stimmen dem zugrunde liegenden votesDictionary hinzugefügt oder aus diesem gelöscht werden.

  1. Fügen Sie using Microsoft.ApplicationInsights; zum Ende der anderen using-Anweisungen hinzu.
  2. Deklarieren Sie einen neuen TelemetryClient am Anfang der Klasse, nach der Erstellung des IReliableStateManager: private TelemetryClient telemetry = new TelemetryClient();
  3. Fügen Sie in der Put() -Funktion ein Ereignis hinzu, das bestätigt, dass eine Stimme hinzugefügt wurde. Fügen Sie telemetry.TrackEvent($"Added a vote for {name}"); direkt vor der return-Anweisung OkResult hinzu, nachdem die Transaktion abgeschlossen ist.
  4. In Delete() ist eine if/else-Bedingung vorhanden, die auf der Bedingung basiert, dass votesDictionary Stimmen für eine bestimmte Abstimmungsoption enthält.
    1. Fügen Sie nach await tx.CommitAsync() ein Ereignis hinzu, das das Löschen einer Stimme in der if-Anweisung bestätigt: telemetry.TrackEvent($"Deleted votes for {name}");
    2. Fügen Sie vor der return-Anweisung ein Ereignis hinzu, um anzuzeigen, dass der Löschvorgang in der else-Anweisung nicht erfolgt ist: telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

In diesem Beispiel werden die Funktionen Put() und Delete() dargestellt, nachdem die Ereignisse hinzugefügt wurden:

// PUT api/VoteData/name
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
        await tx.CommitAsync();
    }

    telemetry.TrackEvent($"Added a vote for {name}");
    return new OkResult();
}

// DELETE api/VoteData/name
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        if (await votesDictionary.ContainsKeyAsync(tx, name))
        {
            await votesDictionary.TryRemoveAsync(tx, name);
            await tx.CommitAsync();
            telemetry.TrackEvent($"Deleted votes for {name}");
            return new OkResult();
        }
        else
        {
            telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
            return new NotFoundResult();
        }
    }
}

Sobald Sie mit den Änderungen fertig sind, starten Sie die Anwendung, sodass diese erstellt und die aktuelle Version bereitgestellt wird. Sobald die Anwendung bereitgestellt ist, navigieren Sie zu localhost:8080, und fügen Sie Abstimmungsoptionen hinzu, oder löschen Sie sie. Wechseln Sie dann zu Ihrer Application Insights-Ressource zurück, um die Ablaufverfolgungen der letzten Ausführung anzuzeigen. (Wie zuvor kann es ein bis zwei Minuten dauern, bis die Ablaufverfolgungen in Application Insights angezeigt werden.) Für alle Stimmen, die Sie hinzugefügt oder gelöscht haben, sollte nun „Benutzerdefiniertes Ereignis“\* zusammen mit der Antworttelemetrie angezeigt werden.

Benutzerdefinierte Ereignisse

Nächste Schritte

In diesem Tutorial haben Sie Folgendes gelernt:

  • Konfigurieren von Application Insights für Ihre Anwendung
  • Sammeln von Antworttelemetriedaten zur Ablaufverfolgung der HTTP-Kommunikation zwischen Diensten
  • Verwenden der App-Übersichtsfunktion in Application Insights
  • Hinzufügen von benutzerdefinierten Ereignissen mithilfe der Application Insights-API

Da Sie nun die die Überwachung und Diagnose für Ihre ASP.NET-Anwendung eingerichtet haben, probieren Sie Folgendes aus: