Übung – Verwenden von OpenTelemetry-Daten in einer cloudeigenen Anwendung
In dieser Übung erhalten Sie eine bessere Sichtbarkeit aller Daten, die von OpenTelemetry in Ihrer App generiert werden. Sie schließen das Hinzufügen der Diagnosefunktion zum Store-Dienst ab. Damit fügen Sie prometheus und Grafana zu den eShopLite Diensten hinzu und betrachten einige der erfassten Metriken. Der nächste Schritt besteht darin, Zipkin hinzuzufügen und die verteilten Ablaufverfolgungen anzuzeigen. Schließlich fügen Sie Ihrer App Application Insights hinzu und verwenden sie zum Anzeigen der Daten.
Hinzufügen von Prometheus und Grafana
Prometheus und Grafana stellen Docker-Images bereit, die das Hinzufügen zu Ihren Projekten erleichtern. Sie fügen sie in die Datei docker-compose.yml im Stammverzeichnis Ihrer Lösung ein.
Wählen Sie im EXPLORER-Bereich die docker-compose.yml Datei aus.
Fügen Sie dieses YAML am Ende der Datei hinzu:
prometheus: image: prom/prometheus container_name: prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' ports: - 9090:9090 restart: unless-stopped volumes: - ./prometheus:/etc/prometheus grafana: image: grafana/grafana container_name: grafana ports: - 3000:3000 restart: unless-stopped environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=grafana volumes: - ./grafana/datasource:/etc/grafana/provisioning/datasources
Im vorherigen Docker-Yaml werden zwei neue Dienste hinzugefügt: Prometheus und Grafana. Der Abschnitt "Prometheus" konfiguriert einen Container für die Reaktion auf Port 9090. Er ordnet den Prometheus-Ordner zu und erwartet eine Datei namens prometheus.yml. Der Grafana-Abschnitt konfiguriert einen Container für die Reaktion auf Port 3000. Es ordnet drei Ordner in einem Grafana-Ordner zu.
Konfigurieren von Prometheus
Prometheus muss so konfiguriert werden, dass er weiß, wo die Metriken erfasst werden sollen. Sie fügen dem Prometheus-Ordner eine prometheus.yml Datei hinzu.
Klicken Sie im EXPLORER-Bereich mit der rechten Maustaste auf den Ordner "dotnet-observability ", und wählen Sie dann "Neuer Ordner" aus.
Geben Sie im Namensfeld prometheus ein.
Klicken Sie im EXPLORER-Bereich mit der rechten Maustaste auf den Ordner prometheus , und wählen Sie dann "Neue Datei" aus.
Geben Sie im Namensfeld prometheus.yml ein.
Geben Sie im Datei-Editor folgendes YAML ein:
global: scrape_interval: 1s scrape_configs: - job_name: 'products' static_configs: - targets: ['backend:8080'] - job_name: 'store' static_configs: - targets: ['frontend:8080']Im vorherigen YAML wird Prometheus so konfiguriert, dass Metriken aus den Back-End- und Front-End-Diensten verschrottet werden. Da die App in Docker ausgeführt wird, sind die Hostnamen die Dienstnamen.
Wählen Sie STRG+S aus, um die Datei zu speichern.
Konfigurieren von Grafana
Grafana muss so konfiguriert werden, dass er weiß, wo die Metriken erfasst werden sollen.
Klicken Sie im EXPLORER-Bereich mit der rechten Maustaste auf den Dotnet-Observability-Ordner , und wählen Sie dann "Neuer Ordner" aus.
Geben Sie im Namensfeld grafana ein.
Klicken Sie mit der rechten Maustaste auf den Grafana-Ordner , und wählen Sie dann "Neuer Ordner" aus.
Geben Sie im Feld "Name" die Datenquelle ein.
Klicken Sie mit der rechten Maustaste auf den Grafana-Ordner , und wählen Sie dann "Neuer Ordner" aus.
Geben Sie im Feld "Name" dashboard ein.
Erweitern Sie den Grafana-Ordner , klicken Sie mit der rechten Maustaste auf den Ordner "Datenquelle ", und wählen Sie dann "Neue Datei" aus.
Geben Sie im Namensfeld datasource.yml ein.
Geben Sie auf der Registerkarte "Editor" folgendes YAML ein:
apiVersion: 1 datasources: - name: Prometheus type: prometheus url: http://prometheus:9090 isDefault: true access: proxy editable: trueIm vorherigen YAML wird Grafana so konfiguriert, dass Prometheus als Datenquelle verwendet wird.
Wählen Sie STRG+S aus, um die Datei zu speichern.
Aktualisieren Ihrer ASP.NET Core-App, um Metriken für Prometheus verfügbar zu machen
Jetzt ist das Diagnoseprojekt nur so konfiguriert, dass Metriken für die Konsole verfügbar gemacht werden. Sie aktualisieren das Projekt, um stattdessen Metriken für Prometheus verfügbar zu machen.
Wechseln Sie unten im TERMINALbereich zum Ordner " Diagnose ".
Führen Sie den folgenden Befehl aus:
cd .\eShopLite\Diagnostics\Entfernen Sie das
OpenTelemetry.Exporter.ConsolePaket:dotnet remove package OpenTelemetry.Exporter.ConsoleFügen Sie das
OpenTelemetry.Exporter.Prometheus.AspNetCore-Paket hinzu:dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore --prereleaseErweitern Sie im EXPLORER-Bereich den Diagnoseordner , und wählen Sie dann DiagnosticServiceCollectionExtensions.cs aus.
Ersetzen Sie den Konsolenexporteur
.AddConsoleExporter();durch diesen Code:.AddPrometheusExporter();Fügen Sie am Ende der Datei vor dem letzten
}den folgenden Code hinzu:public static void MapObservability(this IEndpointRouteBuilder routes) { routes.MapPrometheusScrapingEndpoint(); }Dieser Code fügt jedem Dienst, der dies mit ihrer App enthält, einen Prometheus-Scraping-Endpunkt hinzu. Auf diese Weise kann Prometheus Metriken von
http://service/metricsabrufen.Wählen Sie STRG+S aus, um die Datei zu speichern.
Verfügbarmachen von Metriken im Store-Dienst
Die App ist derzeit nur so konfiguriert, dass Metriken für den Produktdienst verfügbar gemacht werden. Sie aktualisieren die App, um Metriken für den Store-Dienst verfügbar zu machen.
Klicken Sie im Explorer-Bereich unter dem Lösungs-Explorer mit der rechten Maustaste auf das Projekt "Store", und wählen Sie dann „Projektverweis hinzufügen“ aus.
Wählen Sie Diagnose.
Erweitern Sie im EXPLORER-Bereich den Store-Ordner , und wählen Sie dann Program.cs aus.
Fügen Sie unter dem Codekommentar
// Add observability code hereeinen Aufruf der Diagnosemethode hinzu:builder.Services.AddObservability("Store", builder.Configuration);Fügen Sie vor der
app.Run()Methode diesen Code hinzu:app.MapObservability();Diese Methode fügt dem Store-Dienst den Prometheus-Scraping-Endpunkt hinzu.
Wählen Sie STRG+S aus, um die Datei zu speichern.
Erweitern Sie im EXPLORER-Bereich den Ordner "Produkt ", und wählen Sie dann Program.cs aus.
Fügen Sie vor der
app.Run()Methode diesen Code hinzu:app.MapObservability();Diese Methode fügt den Prometheus-Scraping-Endpunkt zum Dienst "Produkte " hinzu.
Wählen Sie STRG+S aus, um die Datei zu speichern.
Teste die neuen Observability-Funktionen
Sie testen nun die neuen Observability-Features, die Sie der App hinzugefügt haben.
Wechseln Sie im TERMINAL-Bereich unten zum Ordner dotnet-observability/eShopLite .
cd ..Aktualisieren Sie die App-Container.
dotnet publish /p:PublishProfile=DefaultContainerWechseln Sie zum Ordner "dotnet-observability ", und starten Sie die App mit Docker:
cd .. docker compose upWählen Sie auf der Registerkarte "PORTS" die Option "Im Browser für Prometheus öffnen" (9090) aus. Wenn Sie Visual Studio Code lokal nutzen, öffnen Sie einen Browser und wechseln Sie auf einer neuen Registerkarte zur Prometheus-App
http://localhost:9090.Wählen Sie im oberen Menü "Status" und dann " Ziele" aus.
Die Produkte und Store- -Dienste sollten als UP aufgeführt werden.
Wählen Sie auf der Registerkarte "PORTS" die Option "Im Browser für Grafana öffnen" (3000) aus. Wenn Sie lokal in Visual Studio Code arbeiten, öffnen Sie einen Browser und gehen Sie auf einer neuen Registerkarte zur Grafana-App
http://localhost:3000.Geben Sie den Benutzernamen admin ein.
Geben Sie das Kennwort grafana ein.
Wählen Sie "Erstes Dashboard erstellen" aus.
Wählen Sie Dashboard importieren aus.
Wechseln Sie auf einer neuen Registerkarte zu GitHub , und öffnen Sie die JSON-Datei ASP.NET Core-Dashboard .
Kopieren Sie die Rohdatendatei.
Fügen Sie den JSON-Code in das Textfeld " Importieren über das Dashboard-JSON-Modell " ein.
Wählen Sie und laden Sie.
Wählen Sie im Dropdown-Menü der Prometheus-DatenquellePrometheus aus.
Klicken Sie auf Importieren.
Es sollte ein Dashboard mit Metriken für die Produkte und Store-Dienste angezeigt werden. Wählen Sie den Auftrag aus, der zwischen den beiden Diensten geändert werden soll.
Wählen Sie im TERMINALbereichSTRG+C aus, um die App zu beenden.
Zipkin hinzufügen
Sie erweitern jetzt die Tracing-Funktionen der App, indem Sie Zipkin hinzufügen. Wie bereits zuvor fügen Sie Ihrer App einen Zipkin-Container hinzu und konfigurieren ihn so, dass eine Verbindung mit dem OpenTelemetry-Sammler hergestellt wird. Anschließend fügen Sie der App den Zipkin-Exporter "OpenTelemetry" hinzu.
Wählen Sie im EXPLORER-Bereich die docker-compose.yml Datei im Ordner "dotnet-observability " aus.
Fügen Sie
prometheusundzipkinindepends_onfürfrontendhinzu.depends_on: - backend - prometheus - zipkinFügen Sie
prometheusin dasdepends_onfür dasbackendhinzu.depends_on: - prometheusHinzufügen von Umgebungsvariablen für Zipkin zu BOTH
frontendundbackend:environment: - ZIPKIN_URL=http://zipkin:9411Die beiden Dienste sollten wie folgt aussehen:
frontend: image: storeimage build: context: . dockerfile: ./eShopLite/Store/Dockerfile environment: - ProductEndpoint=http://backend:8080 - ZIPKIN_URL=http://zipkin:9411 ports: - "32000:8080" depends_on: - backend - prometheus - zipkin backend: image: productservice build: context: . dockerfile: ./eShopLite/Products/Dockerfile environment: - ZIPKIN_URL=http://zipkin:9411 ports: - "32001:8080" depends_on: - prometheusFügen Sie dieses YAML am Ende der Datei hinzu:
zipkin: image: openzipkin/zipkin ports: - 9411:9411Im vorherigen YAML wird der App ein Zipkin-Container hinzugefügt. Er konfiguriert den Zipkin-Container so, dass er auf Port 9411 reagiert.
Wählen Sie STRG+S aus, um die Datei zu speichern.
Wechseln Sie im TERMINALbereich zum Ordner " Diagnose ".
cd ./eShopLite/Diagnostics/Fügen Sie die Zipkin-Exportpakete hinzu.
dotnet add package OpenTelemetry.Exporter.Zipkin --prereleaseErweitern Sie im EXPLORER-Bereich den Diagnoseordner , und wählen Sie dann DiagnosticServiceCollectionExtensions.cs aus.
Fügen Sie am Ende der Liste der Tracing-Anbieter Zipkin hinzu.
// add the tracing providers .WithTracing(tracing => { tracing.SetResourceBuilder(resource) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddSqlClientInstrumentation() .AddZipkinExporter(zipkin => { var zipkinUrl = configuration["ZIPKIN_URL"] ?? "http://zipkin:9411"; zipkin.Endpoint = new Uri($"{zipkinUrl}/api/v2/spans"); }); });Wählen Sie STRG+S aus, um die Datei zu speichern.
Wechseln Sie im TERMINAL-Bereich unten zum Ordner dotnet-observability/eShopLite .
cd ..Aktualisieren Sie die App-Container.
dotnet publish /p:PublishProfile=DefaultContainerWechseln Sie zum Ordner "dotnet-observability ", und starten Sie die App mit Docker:
cd .. docker compose upWählen Sie auf der Registerkarte "PORTS" die Option "Im Browser für Prometheus öffnen" (9090) aus. Wenn Sie das lokal in Visual Studio Code ausführen, öffnen Sie einen neuen Browser-Tab und gehen Sie zur Zipkin-App
http://localhost:9411.Wählen Sie im Menü "Abhängigkeiten" aus.
Wählen Sie im TERMINALbereichSTRG+C aus, um die App zu beenden.
Hinzufügen von Application Insights
Der letzte Schritt besteht darin, Ihrer App Application Insights hinzuzufügen.
Erstellen der Application Insights-Ressource in Azure
Melden Sie sich im TERMINALbereich bei Azure an.
az login --use-device-codeZeigen Sie Ihr ausgewähltes Azure-Abonnement an.
az account show -o tableWenn das falsche Abonnement ausgewählt ist, wählen Sie die richtige aus, indem Sie den Befehl "az account set" verwenden .
Fügen Sie die Erweiterung für Application Insights hinzu.
az extension add -n application-insightsErstellen Sie eine Application Insights-Ressource.
az monitor app-insights component create --app eShopLiteInsights --location eastus --kind web -g eShopLiteSie sollten diese Ausgabe sehen:
{ "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "applicationId": "eShopLiteInsights", "applicationType": "web", "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/", "creationDate": "2023-11-10T16:50:00.950726+00:00", "disableIpMasking": null, "etag": "\"3a02952a-0000-0100-0000-654e5f380000\"", "flowType": "Bluefield", "hockeyAppId": null, "hockeyAppToken": null, "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/eShopLite/providers/microsoft.insights/components/eShopLiteInsights", "immediatePurgeDataOn30Days": null, "ingestionMode": "ApplicationInsights", "instrumentationKey": "00000000-0000-0000-0000-000000000000", "kind": "web", "location": "eastus", "name": "eShopLiteInsights", "privateLinkScopedResources": null, "provisioningState": "Succeeded", "publicNetworkAccessForIngestion": "Enabled", "publicNetworkAccessForQuery": "Enabled", "requestSource": "rest", "resourceGroup": "eShopLite", "retentionInDays": 90, "samplingPercentage": null, "tags": {}, "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "type": "microsoft.insights/components" }Kopieren Sie aus dem vorherigen zurückgegebenen JSON-Code
connectionStringohne ". Beispiel:InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/Wählen Sie im EXPLORER-Bereich die docker-compose.yml Datei aus.
Sie fügen eine Umgebungsvariable hinzu, die vom Diagnoseprojekt zum Herstellen einer Verbindung mit Application Insights verwendet wird. Fügen Sie diesen YAML dem Store-Dienst hinzu:
environment: - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/Ersetzen Sie die vorangehende Verbindungszeichenfolge durch die Zeichenfolge, die Sie aus der Azure CLI kopiert haben.
Wiederholen Sie diese Schritte für den Dienst "Produkte ". Das endgültige YAML sollte wie folgt aussehen:
frontend: image: storeimage build: context: . dockerfile: ./eShopLite/Store/Dockerfile environment: - ProductEndpoint=http://backend:8080 - ZIPKIN_URL=http://zipkin:9411 - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/ ports: - "32000:8080" depends_on: - backend - prometheus - zipkin backend: image: productservice build: context: . dockerfile: ./eShopLite/Products/Dockerfile environment: - ZIPKIN_URL=http://zipkin:9411 - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/Wählen Sie STRG+S aus, um die Datei zu speichern.
Wechseln Sie im TERMINALbereich zum Ordner " Diagnose ".
cd .\eShopLite\Diagnostics\Fügen Sie das Application Insights-Exporterpaket hinzu.
dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore --prereleaseWählen Sie im Bereich "ERKUNDEN " den Ordner " Diagnose" und dann DiagnosticServiceCollectionExtensions.cs aus.
Fügen Sie oben in der Datei diese
usingAnweisung hinzu:using Azure.Monitor.OpenTelemetry.AspNetCore;Fügen Sie nach
var otelBuilder = services.AddOpenTelemetry();diesen Code hinzu:if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"])) { otelBuilder.UseAzureMonitor(); }Wählen Sie STRG+S aus, um die Datei zu speichern.
Wechseln Sie im TERMINAL-Bereich unten zum Ordner dotnet-observability/eShopLite .
cd ..Aktualisieren Sie die App-Container.
dotnet publish /p:PublishProfile=DefaultContainerWechseln Sie zum Ordner "dotnet-observability ", und starten Sie die App mit Docker:
cd .. docker compose upMelden Sie sich beim Azure-Portal mit denselben Anmeldeinformationen an, die Sie für die Anmeldung bei der Azure CLI verwendet haben.
Wählen Sie im Azure-Portal Ressourcengruppen aus.
Wählen Sie die eShopLite-Ressourcengruppe aus.
Wählen Sie die Ressource "eShopLiteInsights Application Insights" aus.
Wählen Sie das Anwendungsdashboard aus.
Um Änderungen an Metriken anzuzeigen, greifen Sie auf die eShopLite App zurück und ändern Sie den Bestand. Aktualisieren Sie dann das Application Insights-Dashboard.
Drücken Sie im TERMINALbereichSTRG+C , um die App zu beenden.


