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.
Wählen Sie die ersten beiden Bilder aus, und klicken Sie auf convert
. Es wird erfolgreich konvertiert.
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.
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.
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
.
- Klicken Sie im linken Navigationsbereich auf
Logs
.
- Suchen Sie nach
appservice
, und doppelklicken Sie aufAppServiceHTTPLogs
.
- Klicken Sie auf
Run
.
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.
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
- Abfrageprotokolle mit Azure Monitor
- Troubleshooting Azure App Service in Visual Studio (Problembehandlung für Azure App Service in Visual Studio)
- Analyze app Logs in HDInsight (Analyse von App-Protokollen in HDInsight)
- Tutorial: Ausführen eines Auslastungstests zum Identifizieren von Leistungsengpässen in einer Web-App