Esercitazione: Risolvere i problemi di un'app del 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, si ha un'app di esempio in esecuzione nel 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:
Usare l'ambiente Bash in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido su Bash in Azure Cloud Shell.
Se si preferisce eseguire i comandi di riferimento dell'interfaccia della riga di comando in locale, installare l'interfaccia della riga di comando di Azure. Per l'esecuzione in Windows o macOS, è consigliabile eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker. Per altre informazioni, vedere Come eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker.
Se si usa un'installazione locale, accedere all'interfaccia della riga di comando di Azure con il comando az login. Per completare il processo di autenticazione, seguire la procedura visualizzata nel terminale. Per altre opzioni di accesso, vedere Accedere tramite l'interfaccia della riga di comando di Azure.
Quando richiesto, al primo utilizzo installare l'estensione dell'interfaccia della riga di comando di Azure. Per altre informazioni sulle estensioni, vedere Usare le estensioni con l'interfaccia della riga di comando di Azure.
Eseguire az version per trovare la versione e le librerie dipendenti installate. Per eseguire l'aggiornamento alla versione più recente, eseguire az upgrade.
Creazione di risorse Azure
Prima di tutto, si eseguono diversi comandi localmente per configurare un'app di esempio da usare con questa esercitazione. I comandi creano le risorse di Azure, creano un utente della distribuzione e distribuiscono l'app di esempio ad Azure. Viene richiesta la password specificata in precedenza nel corso della creazione dell'utente della 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 al Servizio app di Azure, è possibile configurare la funzionalità di monitoraggio per la risoluzione dei problemi dell'app quando si verificano. 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
Nota
Per Log Analytics in Monitoraggio di Azure si paga per l'inserimento e la conservazione dei dati.
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 appropriati.
Nota
I primi due comandi, resourceID
e workspaceID
, 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 seleziona un numero sufficiente di immagini, l'app genera un errore HTTP 500 durante la conversione delle immagini. 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
.
Selezionare le prime due immagini e fare clic su convert
. La conversione viene eseguita correttamente.
Interrompere l'app
Dopo avere verificato l'app convertendo correttamente due immagini, si prova a convertire le prime cinque immagini.
Questa azione ha esito negativo e genera un errore HTTP 500
che non è stato testato durante lo sviluppo.
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 su log consentono di applicare appieno 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
.
- Fare clic su
Logs
nel riquadro di spostamento a sinistra.
- Cercare
appservice
e fare doppio clic suAppServiceHTTPLogs
.
- Fare clic su
Run
.
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"
Nella colonna ResultDescription
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, è possibile migliorare 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.
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