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:
- Erstellen einer .NET Service Fabric-Anwendung
- Bereitstellen der Anwendung in einem Remotecluster
- Hinzufügen eines HTTPS-Endpunkts zu einem ASP.NET Core-Front-End-Dienst
- Konfigurieren von CI/CD mit Azure Pipelines
- Einrichten der Überwachung und Diagnose für die Anwendung
Voraussetzungen
Bevor Sie mit diesem Tutorial beginnen können, müssen Sie Folgendes tun:
- Wenn Sie kein Azure-Abonnement besitzen, erstellen Sie ein kostenloses Konto.
- Installieren Sie Visual Studio 2019 und die Workloads Azure-Entwicklung und ASP.NET und Webentwicklung.
- Installieren Sie das Service Fabric SDK.
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.
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.
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:
Klicken Sie mit der rechten Maustaste auf den Namen des Diensts und dann auf Hinzufügen > Verbundene Dienste > Überwachung mit Application Insights.
Hinweis
Abhängig vom Projekttyp müssen Sie nach dem Rechtsklick auf den Dienstnamen unter Umständen auf „Hinzufügen“ > „Application Insights-Telemetrie“ klicken.
Wählen Sie Erste Schritte aus.
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.
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:
- 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.
- 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.
Suchen Sie nach
Microsoft.ApplicationInsights.ServiceFabric.Native
, und wählen Sie das entsprechende NuGet-Paket aus.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.
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.
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:
- 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;
- 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.
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.
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:
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.
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.
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.
- Fügen Sie
using Microsoft.ApplicationInsights;
zum Ende der anderen using-Anweisungen hinzu. - Deklarieren Sie einen neuen TelemetryClient am Anfang der Klasse, nach der Erstellung des IReliableStateManager:
private TelemetryClient telemetry = new TelemetryClient();
- 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. - In Delete() ist eine if/else-Bedingung vorhanden, die auf der Bedingung basiert, dass votesDictionary Stimmen für eine bestimmte Abstimmungsoption enthält.
- 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}");
- 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");
- Fügen Sie nach await tx.CommitAsync() ein Ereignis hinzu, das das Löschen einer Stimme in der if-Anweisung bestätigt:
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.
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:
- Erkunden Sie die Überwachung und Diagnose in Service Fabric.
- Service Fabric event analysis with Application Insights (Service Fabric-Ereignisanalyse mit Application Insights)
- Weitere Informationen zu Application Insights finden Sie unter Application Insights Documentation (Dokumentation zu Application Insights)