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:

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

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.

Fare clic su Strumenti e selezionare Converti in PNG

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

Selezionare le prime due immagini

Interrompere l'app

Dopo avere verificato l'app convertendo correttamente due immagini, si prova a convertire le prime cinque immagini.

Convertire le prime cinque immagini

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

La conversione restituirà un errore HTTP 500

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.

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

Log dell'area di lavoro Log Analytics

  1. Cercare appservice e fare doppio clic su AppServiceHTTPLogs.

Tabelle dell'area di lavoro Log Analytics

  1. Fare clic su Run.

AppServiceHTTPLogs dell'area di lavoro Log Analytics

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.

App PHP in esecuzione nel Servizio app di Azure

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