Esercitazione: Risolvere i problemi di un'app servizio app con Monitoraggio di Azure

Questa esercitazione illustra come risolvere i problemi di un'app del servizio app con Monitoraggio di Azure. L'app di esempio include il codice destinato a esaurire la memoria e a causare errori HTTP 500, in modo da poter diagnosticare e risolvere il problema con Monitoraggio di Azure. Al termine, è disponibile un'app di esempio in esecuzione in servizio app in Linux integrata con Monitoraggio di Azure.

Monitoraggio di Azure ottimizza la disponibilità e le prestazioni delle applicazioni e dei servizi in uso offrendo una soluzione completa per raccogliere e analizzare la telemetria e intervenire di conseguenza dal cloud e dagli ambienti locali.

In questa esercitazione apprenderai a:

  • Configurare un'app Web con Monitoraggio di Azure
  • Inviare i log della console a Log Analytics
  • Usare le query su log per identificare e risolvere i problemi relativi agli errori delle app Web

I passaggi illustrati in questa esercitazione possono essere eseguiti in macOS, Linux e Windows.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

Prerequisiti

Per completare questa esercitazione è necessario:

Creazione di risorse Azure

Prima di tutto, si eseguono diversi comandi in locale per configurare un'app di esempio da usare con questa esercitazione. I comandi creano risorse di Azure, creano un utente di distribuzione e distribuiscono l'app di esempio in Azure. Viene richiesta la password specificata come parte della creazione dell'utente di distribuzione.

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

Configurare Monitoraggio di Azure

Creare un'area di lavoro Log Analytics

Dopo aver distribuito l'app di esempio nel servizio app Azure, è possibile configurare la funzionalità di monitoraggio per risolvere i problemi dell'app in caso di problemi. Monitoraggio di Azure archivia i dati di log in un'area di lavoro Log Analytics. Un'area di lavoro è un contenitore che include informazioni sui dati e sulla configurazione.

In questo passaggio viene creata un'area di lavoro Log Analytics per configurare Monitoraggio di Azure con l'app.

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

Creare un'impostazione di diagnostica

È possibile usare le impostazioni di diagnostica per raccogliere le metriche per determinati servizi di Azure nei log di Monitoraggio di Azure per l'analisi con altri dati di monitoraggio usando le query su log. Per questa esercitazione si abilitano il server Web e i log di output standard e/o degli errori. Vedere i tipi di log supportati per un elenco completo dei tipi di log e delle descrizioni.

Eseguire i comandi seguenti per creare le impostazioni di diagnostica per AppServiceConsoleLogs (output standard/errori) e AppServiceHTTPLogs (log del server Web). Sostituire <app-name> e <workspace-name> con i valori.

Nota

I primi due comandi e resourceIDworkspaceID, sono variabili da usare nel comando az monitor diagnostic-settings create . Vedere Creare le impostazioni di diagnostica usando l'interfaccia della riga di comando di Azure per altre informazioni su questo comando.

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}]'

Risoluzione dei problemi dell'app

Passa a http://<app-name>.azurewebsites.net.

L'app di esempio, ImageConverter, converte le immagini incluse da JPG a PNG. Per questa esercitazione è stato deliberatamente inserito nel codice un bug. Se si selezionano immagini sufficienti, l'app genera un errore HTTP 500 durante la conversione dell'immagine. Si supponga che questo scenario non sia stato preso in considerazione durante la fase di sviluppo. Per risolvere l'errore, viene usato Monitoraggio di Azure.

Verificare il funzionamento dell'app

Per convertire le immagini, fare clic su Tools e selezionare Convert to PNG.

Click Tools and select Convert to PNG

Selezionare le prime due immagini e fare clic su convert. La conversione viene eseguita correttamente.

Select the first two images

Interrompere l'app

Ora che l'app è stata verificata convertendo due immagini correttamente, si tenta di convertire le prime cinque immagini.

Convert first five images

Questa azione ha esito negativo e genera un errore HTTP 500 che non è stato testato durante lo sviluppo.

The convert will result in a HTTP 500 error

Usare una query su log per visualizzare i log di Monitoraggio di Azure

Verranno ora visualizzati i log disponibili nell'area di lavoro Log Analytics.

Fare clic su questo collegamento dell'area di lavoro Log Analytics per accedere all'area di lavoro nel portale di Azure.

Nel portale di Azure selezionare l'area di lavoro Log Analytics.

Query di log

Le query di log consentono di applicare completamente il valore dei dati raccolti nei log di Monitoraggio di Azure. Le query su log vengono usate per identificare i log sia in AppServiceHTTPLogs che in AppServiceConsoleLogs. Per altre informazioni sulle query su log, vedere Panoramica delle query su log.

Visualizzare AppServiceHTTPLogs con una query su log

Dopo avere eseguito l'accesso all'app, vengono visualizzati i dati associati alle richieste HTTP disponibili in AppServiceHTTPLogs.

  1. Fare clic su Logs nel riquadro di spostamento a sinistra.

Log Anlytics Worksace Logs

  1. Cercare appservice e fare doppio clic su AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Fare clic su Run.

Log Analytics Workspace App Service HTTP Logs

La query su AppServiceHTTPLogs restituisce tutte le richieste nelle ultime 24 ore. La colonna ScStatus contiene lo stato HTTP. Per diagnosticare gli errori HTTP 500, limitare la colonna ScStatus a 500 ed eseguire la query, come illustrato di seguito:

AppServiceHTTPLogs
| where ScStatus == 500

Visualizzare AppServiceConsoleLogs con una query su log

Dopo avere verificato gli errori HTTP 500, verranno esaminati l'output standard e/o gli errori dell'app. Questi log si trovano in 'AppServiceConsoleLogs'.

(1) Fare clic su + per creare una nuova query.

(2) Fare doppio clic sulla tabella AppServiceConsoleLogs e fare clic su Run.

Poiché la conversione di cinque immagini genera errori del server, è possibile verificare se l'app scrive gli errori filtrando ResultDescription per gli errori, come illustrato di seguito:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

ResultDescription Nella colonna viene visualizzato l'errore seguente:

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/

Unire AppServiceHTTPLogs e AppServiceConsoleLogs

Dopo avere identificato sia gli errori HTTP 500 che gli errori standard, è necessario verificare se esiste una correlazione tra questi messaggi. Successivamente, si uniscono le tabelle in base al timestamp TimeGenerated.

Nota

È stata preparata una query che esegue le operazioni seguenti:

  • Filtra HTTPLogs per gli errori 500
  • Esegue query sui log della console
  • Unisce le tabelle in base a TimeGenerated

Eseguire la query riportata di seguito:

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;

Nella colonna ResultDescription verrà visualizzato l'errore seguente insieme agli errori del server 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/

Il messaggio indica che la memoria è stata esaurita nella riga 20 di process.php. Si è verificato ora che l'applicazione ha generato un errore durante l'errore HTTP 500. Verrà ora esaminato il codice per identificare il problema.

Identificare l'errore

Nella directory locale aprire il file process.php e guardare la riga 20.

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

Il primo argomento $imgArray[$x] è una variabile che contiene tutti i JPG (in memoria) che necessitano di conversione. Tuttavia, imagepng necessita solo dell'immagine da convertire e non di tutte le immagini. Il precaricamento delle immagini non è necessario e potrebbe causare l'esaurimento della memoria, generando gli errori HTTP 500. Verrà ora aggiornato il codice per caricare le immagini su richiesta per verificare se il problema è stato risolto. Successivamente, si migliora il codice per risolvere il problema di memoria.

Correggere l'app

Aggiornare e ridistribuire il codice in locale

Per gestire l'esaurimento della memoria, si apportano le seguenti modifiche al file process.php:

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

Eseguire il commit delle modifiche in Git e quindi effettuare il push delle modifiche al codice in Azure.

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

Passare all'app Azure

Passa a http://<app-name>.azurewebsites.net.

La conversione delle immagini non genererà più gli errori HTTP 500.

PHP app running in Azure App Service

Pulire le risorse

Nei passaggi precedenti sono state create risorse di Azure in un gruppo di risorse. Se si ritiene che queste risorse non saranno necessarie in futuro, eliminare il gruppo di risorse eseguendo questo comando in Cloud Shell:

az group delete --name myResourceGroup

L'esecuzione del comando può richiedere un minuto.

Eliminare l'impostazione di diagnostica con il comando seguente:

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

Contenuto dell'esercitazione:

  • Configurazione di un'app Web con Monitoraggio di Azure
  • Invio di log a Log Analytics
  • Uso di query su log per identificare e risolvere i problemi relativi agli errori delle app Web

Passaggi successivi