Självstudie: Felsöka en App Service-app med Azure Monitor

Den här självstudien visar hur du felsöker en App Service-app med hjälp av Azure Monitor. Exempelappen innehåller kod som är avsedd att förbruka minne och orsaka HTTP 500-fel, så att du kan diagnostisera och åtgärda problemet med hjälp av Azure Monitor. När du är klar har du en exempelapp som körs på en App Service på Linux integrerad med Azure Monitor.

Azure Monitor maximerar tillgängligheten och prestandan för dina program och tjänster genom att leverera en heltäckande lösning för att samla in, analysera och agera på telemetri från molnet och lokala miljöer.

I den här guiden får du lära dig att:

  • Konfigurera en webbapp med Azure Monitor
  • Skicka konsolloggar till Log Analytics
  • Använda loggfrågor för att identifiera och felsöka webbappfel

Du kan följa stegen i den här självstudien i macOS, Linux och Windows.

Om du inte har en Azure-prenumerationkan du skapa ett kostnads fritt konto innan du börjar.

Förutsättningar

För att slutföra den här självstudien behöver du:

Skapa Azure-resurser

Först kör du flera kommandon lokalt för att konfigurera en exempelapp som ska användas med den här självstudien. Kommandona skapar Azure-resurser, skapar en distributionsanvändare och distribuerar exempelappen till Azure. Du uppmanas att ange det lösenord som anges som en del av skapandet av distributionsanvändaren.

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|7.3" --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

Konfigurera Azure Monitor

Skapa en Log Analytics-arbetsyta

Nu när du har distribuerat exempelappen till Azure App Service du konfigurera övervakningsfunktioner för att felsöka appen när problem uppstår. Azure Monitor lagrar loggdata på en Log Analytics-arbetsyta. En arbetsyta är en container som innehåller data och konfigurationsinformation.

I det här steget skapar du en Log Analytics-arbetsyta för att konfigurera Azure Monitor med din app.

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

Skapa en diagnostikinställning

Diagnostikinställningar kan användas för att samla in mått för vissa Azure-tjänster i Azure Monitor-loggar för analys med andra övervakningsdata med hjälp av loggfrågor. I den här självstudien aktiverar du webbservern och standardloggar för utdata/fel. En fullständig lista över loggtyper och beskrivningar finns i Loggtyper som stöds.

Du kör följande kommandon för att skapa diagnostikinställningar för AppServiceConsoleLogs (standardutdata/fel) och AppServiceHTTPLogs (webbserverloggar). Ersätt <app-name> och med dina <workspace-name> värden.

Anteckning

De två första resourceID workspaceID kommandona, och , är variabler som ska användas i az monitor diagnostic-settings create kommandot . Mer information om det här kommandot finns i Skapa diagnostikinställningar med 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}]'

Felsöka appen

Gå till http://<app-name>.azurewebsites.net.

Exempelappen ImageConverter konverterar inkluderade bilder från JPG till PNG . En bugg har avsiktligt placerats i koden för den här självstudien. Om du väljer tillräckligt många bilder genererar appen ett HTTP 500-fel under avbildningskonverteringen. Imagine det här scenariot inte övervägdes under utvecklingsfasen. Du använder en Azure Monitor för att felsöka felet.

Kontrollera att appen fungerar

Om du vill konvertera bilder klickar Tools du på och väljer Convert to PNG .

Klicka på Verktyg och välj Konvertera till PNG

Välj de två första bilderna och klicka på convert . Detta kommer att konverteras.

Välj de två första bilderna

Bryt appen

Nu när du har verifierat appen genom att konvertera två bilder ska vi försöka konvertera de första fem bilderna.

Konvertera de första fem bilderna

Den här åtgärden misslyckas och HTTP 500 genererar ett fel som inte har testats under utvecklingen.

Konverteringen resulterar i ett HTTP 500-fel

Använda loggfråga för att visa Azure Monitor loggar

Nu ska vi se vilka loggar som är tillgängliga på Log Analytics-arbetsytan.

Klicka på länken för Log Analytics-arbetsytan för att komma åt din arbetsyta Azure Portal.

I Azure Portal väljer du Log Analytics-arbetsytan.

Loggfrågor

Loggfrågor hjälper dig att helt tillämpa värdet för de data som samlas in i Azure Monitor Loggar. Du använder loggfrågor för att identifiera loggarna i både AppServiceHTTPLogs och AppServiceConsoleLogs. Se loggfrågans översikt för mer information om loggfrågor.

Visa AppServiceHTTPLogs med loggfråga

Nu när vi har använt appen ska vi visa de data som är associerade med HTTP-begäranden som finns i AppServiceHTTPLogs .

  1. Klicka Logs i det vänstra navigeringsfönstret.

Log Anlytics Worksace-loggar

  1. Sök efter appservice och dubbelklicka på AppServiceHTTPLogs .

Tabeller för Log Analytics-arbetsyta

  1. Klicka på Run.

HTTP-loggar App Service Log Analytics-arbetsyta

Frågan AppServiceHTTPLogs returnerar alla begäranden under de senaste 24 timmarna. Kolumnen innehåller ScStatus HTTP-statusen. Om du vill HTTP 500 diagnostisera felen begränsar du ScStatus till 500 och kör frågan enligt nedan:

AppServiceHTTPLogs
| where ScStatus == 500

Visa AppServiceConsoleLogs med loggfråga

Nu när du har bekräftat HTTP 500-talet ska vi ta en titt på standardutdata/-fel från appen. Dessa loggar finns i "AppServiceConsoleLogs".

(1) Klicka för + att skapa en ny fråga.

(2) Dubbelklicka på tabellen AppServiceConsoleLogs och klicka på Run .

Eftersom konvertering av fem avbildningar resulterar i serverfel kan du se om appen även skriver fel genom att filtrera efter ResultDescription fel, som du ser nedan:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

I ResultDescription kolumnen visas följande fel:

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/

Ansluta till AppServiceHTTPLogs och AppServiceConsoleLogs

Nu när du har identifierat både HTTP 500-fel och standardfel måste du bekräfta om det finns en korrelation mellan dessa meddelanden. Därefter sammanfogar du tabellerna baserat på tidsstämpeln TimeGenerated .

Anteckning

En fråga har förberetts åt dig som gör följande:

  • Filtrerar HTTPLogs för 500-fel
  • Frågor om konsolloggar
  • Sammanfogar tabellerna på TimeGenerated

Kör följande fråga:

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;

I ResultDescription kolumnen visas följande fel samtidigt som webbserverfel:

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/

Meddelandet säger att minnet har förbrukats på rad 20 i process.php . Nu har du bekräftat att programmet skapade ett fel under HTTP 500-felet. Låt oss ta en titt på koden för att identifiera problemet.

Identifiera felet

I den lokala katalogen öppnar du process.php och tittar på rad 20.

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

Det första argumentet, $imgArray[$x] , är en variabel som innehåller alla JPEG:er (i minnet) som behöver konvertering. Dock behöver imagepng bara avbildningen konverteras och inte alla avbildningar. Förinläsning av bilder är inte nödvändigt och kan orsaka minnesutmattning, vilket leder till HTTP 500-tal. Nu ska vi uppdatera koden för att läsa in bilder på begäran för att se om det löser problemet. Nu ska du förbättra koden för att åtgärda minnesproblemet.

Åtgärda appen

Uppdatera lokalt och distribuera om koden

Du gör följande ändringar i för process.php att hantera minnesanvändningen:

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

Spara ändringarna på Git och skicka sedan kodändringarna till Azure.

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

Bläddra till Azure-appen

Gå till http://<app-name>.azurewebsites.net.

Konvertering av avbildningar bör inte längre generera HTTP 500-fel.

PHP-app som körs i Azure App Service

Rensa resurser

I de föregående stegen skapade du Azure-resurser i en resursgrupp. Om du inte tror att du behöver dessa resurser i framtiden tar du bort resursgruppen genom att köra följande kommando i Cloud Shell:

az group delete --name myResourceGroup

Det kan några minuter att köra kommandot.

Ta bort diagnostikinställningen med följande kommando:

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

Vad du lärt dig:

  • Konfigurerat en webbapp med Azure Monitor
  • Skickade loggar till Log Analytics
  • Använda loggfrågor för att identifiera och felsöka webbappfel

Nästa steg