Tutorial: Problembehandlung für eine App Service-App mit Azure Monitor

In diesem Tutorial wird veranschaulicht, wie Sie mit Azure Monitor die Problembehandlung für eine App Service-App durchführen. Die Beispiel-App enthält Code, mit dem der Arbeitsspeicher ausgelastet wird und HTTP 500-Fehler verursacht werden, damit Sie das Problem mit Azure Monitor diagnostizieren und beheben können. Nach Abschluss des Vorgangs verfügen Sie über eine Beispiel-App, die über App Service unter Linux mit Integration von Azure Monitor ausgeführt wird.

Azure Monitor maximiert die Verfügbarkeit und Leistung Ihrer Anwendungen und Dienste durch die Bereitstellung einer umfassenden Lösung für das Sammeln, Analysieren und Reagieren auf Telemetriedaten aus Ihren cloudbasierten und lokalen Umgebungen.

In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:

  • Konfigurieren einer Web-App mit Azure Monitor
  • Senden von Konsolenprotokollen an Log Analytics
  • Verwenden von Protokollabfragen zum Identifizieren und Beheben von Web-App-Problemen

Die Schritte in diesem Tutorial können unter macOS, Linux und Windows ausgeführt werden.

Wenn Sie kein Azure-Abonnement haben, erstellen Sie ein kostenloses Azure-Konto, bevor Sie beginnen.

Voraussetzungen

Für dieses Tutorial benötigen Sie Folgendes:

  • Verwenden Sie die Bash-Umgebung in Azure Cloud Shell. Weitere Informationen finden Sie unter Schnellstart für Bash in Azure Cloud Shell.

  • Wenn Sie CLI-Referenzbefehle lieber lokal ausführen, installieren Sie die Azure CLI. Wenn Sie Windows oder macOS ausführen, sollten Sie die Azure CLI in einem Docker-Container ausführen. Weitere Informationen finden Sie unter Ausführen der Azure CLI in einem Docker-Container.

    • Wenn Sie eine lokale Installation verwenden, melden Sie sich mithilfe des Befehls az login bei der Azure CLI an. Führen Sie die in Ihrem Terminal angezeigten Schritte aus, um den Authentifizierungsprozess abzuschließen. Informationen zu anderen Anmeldeoptionen finden Sie unter Anmelden mit der Azure CLI.

    • Installieren Sie die Azure CLI-Erweiterung beim ersten Einsatz, wenn Sie dazu aufgefordert werden. Weitere Informationen zu Erweiterungen finden Sie unter Verwenden von Erweiterungen mit der Azure CLI.

    • Führen Sie az version aus, um die installierte Version und die abhängigen Bibliotheken zu ermitteln. Führen Sie az upgrade aus, um das Upgrade auf die aktuelle Version durchzuführen.

Erstellen von Azure-Ressourcen

Zunächst führen Sie lokal mehrere Befehle aus, um eine Beispiel-App für die Nutzung mit diesem Tutorial einzurichten. Mit den Befehlen werden Azure-Ressourcen und ein Bereitstellungsbenutzer erstellt, und die Beispiel-App wird in Azure bereitgestellt. Sie werden zum Eingeben des Kennworts aufgefordert, das bei der Erstellung des Bereitstellungsbenutzers angegeben wurde.

az group create --name myResourceGroup --location "South Central US"
az webapp deployment user set --user-name <username> --password <password>
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku B1 --is-linux
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|8.1" --deployment-local-git
az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
git clone https://github.com/Azure-Samples/App-Service-Troubleshoot-Azure-Monitor
cd App-Service-Troubleshoot-Azure-Monitor
git branch -m main
git remote add azure <url-from-app-webapp-create>
git push azure main

Konfigurieren von Azure Monitor

Erstellen eines Log Analytics-Arbeitsbereichs

Nachdem Sie die Beispiel-App nun in Azure App Service bereitgestellt haben, konfigurieren Sie die Überwachungsfunktion, um bei Problemen die Problembehandlung für die App durchführen zu können. Azure Monitor speichert Protokolldaten in einem Log Analytics-Arbeitsbereich. Bei einem Arbeitsbereich handelt es sich um einen Container, der Daten und Konfigurationsinformationen enthält.

In diesem Schritt erstellen Sie einen Log Analytics-Arbeitsbereich, um Azure Monitor mit Ihrer App zu konfigurieren.

az monitor log-analytics workspace create --resource-group myResourceGroup --workspace-name myMonitorWorkspace

Erstellen einer Diagnoseeinstellung

Mit Diagnoseeinstellungen können Metriken für bestimmte Azure-Dienste in Azure Monitor-Protokollen erfasst werden, um dann mit anderen Überwachungsdaten anhand von Protokollabfragen analysiert zu werden. In diesem Tutorial aktivieren Sie den Webserver und die standardmäßigen Ausgabe- bzw. Fehlerprotokolle. Eine umfassende Liste mit den Protokolltypen und Beschreibungen finden Sie unter Unterstützte Protokolltypen.

Sie führen die folgenden Befehle aus, um Diagnoseeinstellungen für AppServiceConsoleLogs (Standardausgabe/-fehler) und AppServiceHTTPLogs (Webserverprotokolle) zu erstellen. Ersetzen Sie <app-name> und <workspace-name> durch Ihre Werte.

Hinweis

Die ersten beiden Befehle (resourceID und workspaceID) sind Variablen, die im Befehl az monitor diagnostic-settings create verwendet werden sollen. Weitere Informationen zu diesem Befehl finden Sie unter Erstellen von Diagnoseeinstellungen mithilfe der Azure CLI.

resourceID=$(az webapp show -g myResourceGroup -n <app-name> --query id --output tsv)

workspaceID=$(az monitor log-analytics workspace show -g myResourceGroup --workspace-name <workspace-name> --query id --output tsv)

az monitor diagnostic-settings create --resource $resourceID \
 --workspace $workspaceID \
 -n myMonitorLogs \
 --logs '[{"category": "AppServiceConsoleLogs", "enabled": true},
  {"category": "AppServiceHTTPLogs", "enabled": true}]'

Durchführen der Problembehandlung für die App

Navigieren Sie zu http://<app-name>.azurewebsites.net.

Die Beispiel-App „ImageConverter“ konvertiert Bilder von JPG in PNG. Für dieses Tutorial wurde absichtlich ein Fehler in den Code eingefügt. Wenn Sie genügend Bilder auswählen, generiert die App bei der Bildkonvertierung einen HTTP 500-Fehler. Stellen Sie sich vor, dass dieses Szenario während der Entwicklungsphase nicht berücksichtigt wurde. Sie nutzen Azure Monitor, um die Problembehandlung für den Fehler durchzuführen.

Überprüfen, ob die Anwendung ordnungsgemäß ausgeführt wird

Klicken Sie zum Konvertieren von Bildern auf Tools, und wählen Sie Convert to PNG aus.

Click Tools and select Convert to PNG

Wählen Sie die ersten beiden Bilder aus, und klicken Sie auf convert. Es wird erfolgreich konvertiert.

Select the first two images

Auslösen des Fehlers für die App

Nachdem Sie die App nun überprüft haben, indem Sie die beiden Bilder erfolgreich konvertiert haben, versuchen wir nun, die ersten fünf Bilder zu konvertieren.

Convert first five images

Diese Aktion ist nicht erfolgreich, und es wird ein Fehler vom Typ HTTP 500 generiert, der während der Entwicklung nicht im Testumfang enthalten war.

The convert will result in a HTTP 500 error

Verwenden der Protokollabfrage zum Anzeigen von Azure Monitor-Protokollen

Wir sehen uns nun an, welche Protokolle im Log Analytics-Arbeitsbereich verfügbar sind.

Klicken Sie auf diesen Link für den Log Analytics-Arbeitsbereich, um im Azure-Portal auf Ihren Arbeitsbereich zuzugreifen.

Wählen Sie im Azure-Portal Ihren Log Analytics-Arbeitsbereich aus.

Protokollabfragen

Mithilfe von Protokollabfragen können Sie die Daten, die in Azure Monitor-Protokollen erfasst werden, in vollem Umfang nutzen. Sie verwenden Protokollabfragen, um die Protokolle sowohl in „AppServiceHTTPLogs“ als auch in „AppServiceConsoleLogs“ zu identifizieren. Weitere Informationen zu Protokollabfragen finden Sie unter Übersicht über Protokollabfragen in Azure Monitor.

Anzeigen von „AppServiceHTTPLogs“ mit Protokollabfrage

Nachdem Sie nun auf die App zugegriffen haben, sehen wir uns die Daten an, die HTTP-Anforderungen zugeordnet sind. Sie befinden sich in AppServiceHTTPLogs.

  1. Klicken Sie im linken Navigationsbereich auf Logs.

Log Anlytics Worksace Logs

  1. Suchen Sie nach appservice, und doppelklicken Sie auf AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Klicken Sie auf die Run.

Log Analytics Workspace App Service HTTP Logs

Mit der Abfrage AppServiceHTTPLogs werden alle Anforderungen der letzten 24 Stunden zurückgegeben. Die Spalte ScStatus enthält den HTTP-Status. Begrenzen Sie ScStatus auf den Wert „500“, und führen Sie die Abfrage wie unten gezeigt aus, um die Fehler vom Typ HTTP 500 zu diagnostizieren:

AppServiceHTTPLogs
| where ScStatus == 500

Anzeigen von „AppServiceConsoleLogs“ mit Protokollabfrage

Nachdem Sie die HTTP 500-Fehler bestätigt haben, sehen wir uns nun die Standardausgabe bzw. -fehler der App an. Diese Protokolle befinden sich in „AppServiceConsoleLogs“.

(1) Klicken Sie auf +, um eine neue Abfrage zu erstellen.

(2) Doppelklicken Sie auf die Tabelle AppServiceConsoleLogs, und klicken Sie anschließend auf Run.

Da die Konvertierung von fünf Bildern zu Serverfehlern führt, können Sie verfolgen, ob von der App ebenfalls Fehler geschrieben werden, indem Sie nach ResultDescription filtern. Dies ist hier dargestellt:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

In der Spalte „ResultDescription“ wird der folgende Fehler angezeigt:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted 
(tried to allocate 16384 bytes) in /home/site/wwwroot/process.php on line 20, 
referer: http://<app-name>.azurewebsites.net/

Verknüpfen von „AppServiceHTTPLogs“ und „AppServiceConsoleLogs“

Nachdem Sie nun sowohl HTTP 500-Fehler als auch Standardfehler identifiziert haben, müssen Sie überprüfen, ob eine Korrelation zwischen diesen Meldungen besteht. Als Nächstes verknüpfen Sie die Tabellen anhand des Zeitstempels TimeGenerated miteinander.

Hinweis

Es ist eine Abfrage verfügbar, die Folgendes bewirkt:

  • Filtern von „HTTPLogs“ nach 500-Fehlern
  • Abfragen von Konsolenprotokollen
  • Verknüpfen der Tabellen in TimeGenerated

Führen Sie die folgende Abfrage aus:

let myHttp = AppServiceHTTPLogs | where  ScStatus == 500 | project TimeGen=substring(TimeGenerated, 0, 19), CsUriStem, ScStatus;  

let myConsole = AppServiceConsoleLogs | project TimeGen=substring(TimeGenerated, 0, 19), ResultDescription;

myHttp | join myConsole on TimeGen | project TimeGen, CsUriStem, ScStatus, ResultDescription;

In der Spalte ResultDescription wird der folgende Fehler zusammen mit Webserverfehlern angezeigt:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted 
(tried to allocate 16384 bytes) in /home/site/wwwroot/process.php on line 20, 
referer: http://<app-name>.azurewebsites.net/

Der Meldungszustandspeicher in Zeile 20 von process.php ist voll ausgelastet. Sie haben nun bestätigt, dass von der Anwendung beim Auftreten des HTTP 500-Fehlers ein Fehler generiert wurde. Wir sehen uns den Code an, um das Problem zu identifizieren.

Identifizieren des Fehlers

Öffnen Sie im lokalen Verzeichnis die Datei process.php, und sehen Sie sich Zeile 20 an.

imagepng($imgArray[$x], $filename);

Das erste Argument ($imgArray[$x]) ist eine Variable mit allen JPG-Dateien (In-Memory), die konvertiert werden müssen. Für imagepng werden aber nicht alle Bilder benötigt, sondern nur das jeweils zu konvertierende Bild. Das Vorabladen von Bildern ist nicht erforderlich und führt ggf. zur vollständigen Arbeitsspeicherauslastung, sodass sich HTTP 500-Fehler ergeben. Wir aktualisieren den Code, um Bilder bedarfsabhängig zu laden und zu ermitteln, ob das Problem hierdurch gelöst wird. Als Nächstes verbessern Sie den Code, um das Speicherproblem zu beseitigen.

Problembehebung in der App

Lokales Aktualisieren und erneutes Bereitstellen des Codes

Sie nehmen die folgenden Änderungen an process.php vor, um die vollständige Auslastung des Arbeitsspeichers zu vermeiden:

<?php

//Retrieve query parameters
$maxImages = $_GET['images'];
$imgNames  = explode(",",$_GET['imgNames']);

//Load JPEGs into an array (in memory)
for ($x=0; $x<$maxImages; $x++){
    $filename = './images/converted_' . substr($imgNames[$x],0,-4) . '.png';
    imagepng(imagecreatefromjpeg("./images/" . $imgNames[$x]), $filename);
}

Führen Sie für Ihre Änderungen in Git einen Commit aus, und übertragen Sie dann die Codeänderungen mithilfe von Push an Azure.

git commit -am "Load images on-demand in process.php"
git push azure main

Navigieren zur Azure-App

Navigieren Sie zu http://<app-name>.azurewebsites.net.

Beim Konvertieren von Bildern sollten die HTTP 500-Fehler nun nicht mehr auftreten.

PHP app running in Azure App Service

Bereinigen von Ressourcen

In den vorherigen Schritten haben Sie Azure-Ressourcen in einer Ressourcengruppe erstellt. Wenn Sie diese Ressourcen in Zukunft nicht mehr benötigen, löschen Sie die Ressourcengruppe, indem Sie den folgenden Befehl in Cloud Shell ausführen:

az group delete --name myResourceGroup

Die Ausführung dieses Befehls kann eine Minute in Anspruch nehmen.

Löschen Sie die Diagnoseeinstellung mit dem folgenden Befehl:

az monitor diagnostic-settings delete --resource $resourceID -n myMonitorLogs

Sie haben Folgendes gelernt:

  • Konfigurieren einer Web-App mit Azure Monitor
  • Senden von Protokollen an Log Analytics
  • Verwenden von Protokollabfragen zum Identifizieren und Beheben von Web-App-Problemen

Weitere Schritte