Tutoriel : Résoudre les problèmes d’une application App Service avec Azure Monitor

Ce tutoriel montre comment résoudre les problèmes liés à une application App Service à l'aide d'Azure Monitor. L’exemple d’application inclut le code destiné à saturer la mémoire et à générer des erreurs HTTP 500. Il vous permet ainsi de diagnostiquer et de résoudre le problème à l’aide d’Azure Monitor. Quand vous aurez terminé, vous disposerez d’un exemple d’application s’exécutant dans App Service sur Linux intégré à Azure Monitor.

Azure Monitor optimise la disponibilité et les performances de vos applications et services en fournissant une solution complète pour collecter, analyser et utiliser la télémétrie de vos environnements cloud et locaux.

Dans ce tutoriel, vous allez apprendre à :

  • Configurer une application web avec Azure Monitor.
  • Envoyer des journaux de console à Log Analytics.
  • Utiliser des requêtes de journal pour identifier et résoudre les erreurs d’une application web.

Vous pouvez suivre les étapes de ce tutoriel sur macOS, Linux, Windows.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Prérequis

Pour suivre ce didacticiel, vous avez besoin des éléments suivants :

Créer des ressources Azure

Tout d’abord, vous devez exécuter plusieurs commandes localement pour configurer l’exemple d’application que vous utiliserez avec ce tutoriel. Les commandes créent des ressources Azure, créent un utilisateur de déploiement et déploient l’exemple d’application sur Azure. Le mot de passe que vous avez fourni dans le cadre de la création de l’utilisateur du déploiement vous est demandé.

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

Configurer Azure Monitor

Créer un espace de travail Log Analytics

Vous avez déployé l’exemple d’application dans Azure App Service. À présent, vous configurez la fonctionnalité de supervision pour résoudre les problèmes affectant l’application. Azure Monitor stocke les données de journal dans un espace de travail Log Analytics. Un espace de travail est un conteneur qui renferme des données ainsi que des informations de configuration.

Au cours de cette étape, vous allez créer un espace de travail Log Analytics pour configurer Azure Monitor avec votre application.

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

Créer un paramètre de diagnostic

Les paramètres de diagnostic permettent de collecter des métriques pour certains services Azure dans les journaux Azure Monitor afin de les analyser avec d’autres données de surveillance à l’aide de requêtes de journal. Pour ce tutoriel, vous devez activer les journaux de serveur web et de sorties/d’erreurs standard. Pour obtenir la liste complète des types de journaux avec leurs descriptions, consultez Types de journaux pris en charge.

Exécutez les commandes suivantes pour créer des paramètres de diagnostic pour AppServiceConsoleLogs (sorties/erreurs standard) et AppServiceHTTPLogs (journaux de serveur web). Remplacez app-name> et workspace-name> par vos valeurs.

Notes

Les deux premières commandes, resourceID et workspaceID, sont des variables à utiliser dans la commande az monitor diagnostic-settings create. Pour plus d’informations sur cette commande, consultez Créer des paramètres de diagnostic à l’aide d’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}]'

Résoudre les problèmes de l’application

Accédez à http://<app-name>.azurewebsites.net.

L’exemple d’application ImageConverter convertit les images incluses du format JPG au format PNG. Pour ce tutoriel, un bogue a été délibérément placé dans le code. Si vous sélectionnez un certain nombre d’images, l’application génère une erreur HTTP 500 durant leur conversion. Imaginez que ce scénario n’ait pas été envisagé pendant la phase de développement. Vous utiliserez Azure Monitor pour corriger l’erreur.

Vérification du bon fonctionnement de l’application

Pour convertir des images, cliquez sur Tools et sélectionnez Convert to PNG.

Click Tools and select Convert to PNG

Sélectionnez les deux premières images, puis cliquez sur convert. Cette conversion s’effectue correctement.

Select the first two images

Faire planter l’application

Vous avez vérifié le bon fonctionnement de l’application en convertissant deux images. À présent, vous essayez de convertir les cinq premières images.

Convert first five images

Cette action échoue et génère une erreur HTTP 500 qui n’a pas été testée pendant le développement.

The convert will result in a HTTP 500 error

Utiliser une requête de journal pour visualiser les journaux Azure Monitor

Voyons quels journaux sont disponibles dans l’espace de travail Log Analytics.

Cliquez sur ce lien vers l’espace de travail Log Analytics pour accéder à votre espace de travail dans le portail Azure.

Dans le portail Azure, sélectionnez votre espace de travail Log Analytics.

Requêtes dans les journaux

Les requêtes de journal vous permettent d’appliquer pleinement la valeur des données collectées dans les journaux d’activité Azure Monitor. Vous utilisez des requêtes de journal pour identifier les journaux dans AppServiceHTTPLogs et AppServiceConsoleLogs. Pour plus d’informations sur les requêtes de journal, consultez la vue d’ensemble des requêtes de journal.

Visualiser AppServiceHTTPLogs en utilisant une requête de journal

Nous avons accédé à l’application. À présent, nous allons visualiser les données associées aux requêtes HTTP, se trouvant dans AppServiceHTTPLogs.

  1. Cliquez sur Logs dans le volet de navigation de gauche.

Log Anlytics Worksace Logs

  1. Recherchez appservice, puis double-cliquez sur AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Cliquez sur Run.

Log Analytics Workspace App Service HTTP Logs

La requête AppServiceHTTPLogs retourne toutes les requêtes des dernières 24 heures. La colonne ScStatus contient l’état HTTP. Pour diagnostiquer les erreurs HTTP 500, limitez l’état ScStatus à 500 et exécutez la requête comme indiqué ci-dessous :

AppServiceHTTPLogs
| where ScStatus == 500

Visualiser AppServiceConsoleLogs en utilisant une requête de journal

Vous avez identifié les erreurs HTTP 500. À présent, vous allez observer les sorties/erreurs standard de l’application. Ces journaux se trouvent dans « AppServiceConsoleLogs ».

(1) Cliquez sur + pour créer une requête.

(2) Double-cliquez sur la table AppServiceConsoleLogs, puis cliquez sur Run.

Comme la conversion de cinq images entraîne des erreurs de serveur, vous pouvez voir si l’application consigne également des erreurs en filtrant ResultDescription sur les erreurs comme indiqué ci-dessous :

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

Vous voyez l’erreur suivante dans la colonne ResultDescription :

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/

Joindre AppServiceHTTPLogs et AppServiceConsoleLogs

Vous avez identifié les erreurs HTTP 500 et les erreurs standard. À présent, vous devez vérifier s’il existe une corrélation entre ces messages. Ensuite, vous devez joindre les tables en fonction de l’horodatage, TimeGenerated.

Notes

Une requête effectuant les opérations suivantes a été préparée pour vous :

  • Elle filtre HTTPLogs sur les erreurs 500.
  • Elle interroge les journaux de la console.
  • Elle joint les tables sur TimeGenerated.

Exécutez la requête suivante :

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;

La colonne ResultDescription présente l’erreur suivante en même temps que les erreurs de serveur web :

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/

Le message indique que la mémoire est saturée à la ligne 20 de process.php. Vous avez pu constater que l’application a généré une erreur quand l’erreur HTTP 500 s’est produite. À présent, examinons le code pour identifier le problème.

Identifier l’erreur

Dans le répertoire local, ouvrez le fichier process.php et examinez la ligne 20.

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

Le premier argument, $imgArray[$x], est une variable qui contient toutes les images JPG (en mémoire) à convertir. Toutefois, imagepng a besoin de l’image en cours de conversion uniquement et non de toutes les images. Le préchargement des images n’est pas nécessaire et peut entraîner la saturation de la mémoire, générant des erreurs HTTP 500. Nous allons mettre à jour le code pour charger les images à la demande et voir si ceci résout le problème. Ensuite, vous améliorez le code pour résoudre le problème de mémoire.

Corriger l’application

Mettre à jour localement et redéployer le code

Vous devez apporter les modifications suivantes à process.php pour résoudre le problème de saturation de la mémoire :

<?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);
}

Validez vos modifications dans Git, puis envoyez les modifications de code à Azure.

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

Accéder à l’application Azure

Accédez à http://<app-name>.azurewebsites.net.

La conversion des images ne doit plus générer d’erreurs HTTP 500.

PHP app running in Azure App Service

Nettoyer les ressources

Au cours des étapes précédentes, vous avez créé des ressources Azure au sein d’un groupe de ressources. Si vous ne pensez pas avoir besoin de ces ressources à l’avenir, supprimez le groupe de ressources en exécutant la commande suivante dans Cloud Shell :

az group delete --name myResourceGroup

L’exécution de cette commande peut prendre une minute.

Supprimez le paramètre de diagnostic à l’aide de la commande suivante :

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

Vous avez appris à effectuer les opérations suivantes :

  • Configurer une application web avec Azure Monitor.
  • Envoyer des journaux à Log Analytics.
  • Utiliser des requêtes de journal pour identifier et corriger les erreurs d’application web.

Étapes suivantes