Zelfstudie: Problemen met een App Service-app oplossen met Azure Monitor

In deze zelfstudie ziet u hoe u problemen met een App Service oplost met behulp van Azure Monitor. De voorbeeld-app bevat code die is bedoeld om het geheugen uit te putten en HTTP 500-fouten te veroorzaken, zodat u het probleem kunt vaststellen en oplossen met behulp van Azure Monitor. Wanneer u klaar bent, hebt u een voorbeeld-app die wordt uitgevoerd op App Service op Linux geïntegreerd met Azure Monitor.

Met Azure Monitor worden de beschikbaarheid en prestaties van uw toepassing en services gemaximaliseerd door een uitgebreide oplossing te bieden waarmee u telemetriegegevens kunt verzamelen en analyseren, en op basis hiervan kunt handelen, zowel in de cloud als on-premises.

In deze zelfstudie leert u het volgende:

  • Een web-app configureren met Azure Monitor
  • Console-logboeken verzenden naar Log Analytics
  • Logboekquery's gebruiken om web-app-fouten op te sporen en op te lossen

U kunt de stappen in deze zelfstudie volgen voor macOS, Linux en Windows.

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

Vereisten

U hebt het volgende nodig om deze zelfstudie te voltooien:

Azure-resources maken

Eerst voert u verschillende opdrachten lokaal uit om een voorbeeld-app in te stellen voor gebruik met deze zelfstudie. Met de opdrachten maakt u Azure-resources, maakt u een implementatiegebruiker en implementeert u de voorbeeld-app in Azure. U wordt gevraagd om het wachtwoord dat is opgegeven als onderdeel van het maken van de implementatiegebruiker.

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

Azure Monitor configureren

Een Log Analytics-werkruimte maken

Nu u de voorbeeld-app hebt geïmplementeerd in Azure-app Service, configureert u de bewakingsfunctie om de app op te lossen wanneer er problemen optreden. In Azure Monitor worden logboekgegevens opgeslagen in a Log Analytics-werkruimte. Een werkruimte is een container die gegevens en configuratie-informatie bevat.

In deze stap maakt u een Log Analytics-werkruimte om Azure Monitor te configureren met uw app.

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

Een diagnostische instelling maken

Diagnostische instellingen kunnen worden gebruikt om metrische gegevens voor bepaalde Azure-Services te verzamelen in Azure Monitor-logboeken, voor analyse met andere bewakingsinformatie met behulp van logboekquery's. Voor deze zelfstudie schakelt u de webserverlogboeken en standaardlogboeken voor uitvoer/fouten in. Zie Ondersteunde logboektypen voor een volledige lijst met logboektypen en beschrijvingen.

U voert de volgende opdrachten uit om diagnostische instellingen te maken voor AppServiceConsoleLogs (standaardlogboeken voor uitvoer/fouten) en AppServiceHTTPLogs (webserverlogboeken). Vervang <de app-naam en <werkruimtenaam>> door uw waarden.

Notitie

De eerste twee opdrachten, resourceID en , zijn variabelen die moeten worden gebruikt in de opdracht az monitor diagnostic-settings createworkspaceID. Zie Diagnostische instellingen maken met behulp van Azure CLI voor meer informatie over deze opdracht.

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

Problemen met de app oplossen

Blader naar http://<app-name>.azurewebsites.net.

Met de voorbeeld-app, ImageConverter, worden opgenomen afbeeldingen geconverteerd van JPG naar PNG. Voor deze zelfstudie is opzettelijk een bug in de code geplaatst. Als u voldoende afbeeldingen selecteert, produceert de app een HTTP 500-fout tijdens de conversie van afbeeldingen. Stel dat dit scenario niet is overwogen tijdens de ontwikkelingsfase. U gebruikt Azure Monitor om de fout op te lossen.

Controleren of de app werkt

Als u afbeeldingen wilt converteren, klikt u op Tools en selecteert u Convert to PNG.

Click Tools and select Convert to PNG

Selecteer de eerste twee afbeeldingen en klik op convert. Dit wordt geconverteerd.

Select the first two images

Onderbreek de app

Nu u de app hebt geverifieerd door twee afbeeldingen te converteren, proberen we de eerste vijf afbeeldingen te converteren.

Convert first five images

Deze actie mislukt en resulteert in een HTTP 500-fout die niet is getest tijdens de ontwikkeling.

The convert will result in a HTTP 500 error

Logboekquery gebruiken om Azure Monitor-logboeken weer te geven

Laten we kijken welke logboeken beschikbaar zijn in de Log Analytics-werkruimte.

Klik op deze koppeling voor Log Analytics-werkruimte om toegang te krijgen tot uw werkruimte in Azure Portal.

Selecteer in Azure Portal uw Log Analytics-werkruimte.

Logboekquery's

Met logboekquery's kunt u de waarde van de gegevens die worden verzameld in Azure Monitor-logboeken volledig toepassen. U gebruikt logboekquery's om de logboeken te identificeren in zowel AppServiceHTTPLogs als AppServiceConsoleLogs. Bekijk het overzicht voor logboekquery’s voor meer informatie over logboekquery's.

AppServiceHTTPLogs weergeven met logboekquery

Nu we toegang hebben tot de app, gaan we de gegevens bekijken die zijn gekoppeld aan HTTP-aanvragen in de AppServiceHTTPLogs.

  1. Klik op Logs in de navigatiebalk aan de linkerkant.

Log Anlytics Worksace Logs

  1. Ga naar appservice en dubbelklik op AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Klik op Run.

Log Analytics Workspace App Service HTTP Logs

Met de query AppServiceHTTPLogs worden alle aanvragen van de afgelopen 24 uur geretourneerd. De kolom ScStatus bevat de HTTP-status. Als u de HTTP 500-fouten wilt vaststellen, beperkt u de ScStatus tot 500 en voert u de query uit, zoals hieronder wordt weergegeven:

AppServiceHTTPLogs
| where ScStatus == 500

AppServiceConsoleLogs weergeven met logboekquery

Nu u de HTTP 500-fouten hebt bevestigd, gaan we kijken naar de standaardlogboeken voor uitvoer/fouten van de app. Deze logboeken vindt u in AppServiceConsoleLogs.

(1) Klik op + om een nieuwe query te maken.

(2) Dubbelklik op de tabel AppServiceConsoleLogs en klik op Run.

Omdat het converteren van vijf afbeeldingen resulteert in serverfouten, kunt u kijken of de app ook fouten schrijft door ResultDescription te filteren op fouten, zoals hieronder wordt weergegeven:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

In de ResultDescription kolom ziet u de volgende fout:

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/

AppServiceHTTPLogs en AppServiceConsoleLogs koppelen

Nu u zowel HTTP 500-fouten als standaardfouten hebt geïdentificeerd, moet u controleren of er een correlatie bestaat tussen deze berichten. Vervolgens voegt u de tabellen samen op basis van het tijdstempel, TimeGenerated.

Notitie

Er is een query voorbereid die het volgende doet:

  • HTTPLogs filteren op 500-fouten
  • Query’s uitvoeren op console-logboeken
  • De tabellen samenvoegen in TimeGenerated

Voer de volgende query uit.

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;

In de kolom ResultDescription ziet u de volgende fout op hetzelfde moment als webserverfouten:

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/

In het bericht staat dat het geheugen is uitgeput op regel 20 van process.php. U hebt nu bevestigd dat de toepassing een fout heeft veroorzaakt tijdens de HTTP 500-fout. We gaan nu kijken naar de code om het probleem te identificeren.

De fout identificeren

Open process.php in de lokale map en kijk naar regel 20.

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

Het eerste argument, $imgArray[$x], is een variabele met alle JPG’s (in het geheugen) die moeten worden geconverteerd. Voor imagepng hoeft echter alleen deze afbeelding te worden geconverteerd, en niet alle afbeeldingen. Het is niet nodig om afbeeldingen vooraf te laden en dit is mogelijk de oorzaak van de geheugenuitputting, wat leidt tot HTTP 500-fouten. We gaan de code bijwerken om afbeeldingen op aanvraag te laden om te zien of het probleem hierdoor wordt opgelost. Vervolgens verbetert u de code om het geheugenprobleem op te lossen.

De app herstellen

De code lokaal bijwerken en opnieuw implementeren

U brengt de volgende wijzigingen aan in process.php om de geheugenuitputting af te handelen:

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

Leg uw wijzigingen vast in Git en push de codewijzigingen vervolgens naar Azure.

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

Naar de Azure-app bladeren

Blader naar http://<app-name>.azurewebsites.net.

Als het goed is, levert het converteren van afbeeldingen nu geen HTTP 500-fouten meer op.

PHP app running in Azure App Service

Resources opschonen

In de voorgaande stappen hebt u Azure-resources in een resourcegroep gemaakt. Als u deze resources niet meer nodig denkt te hebben, verwijdert u de resourcegroep door de volgende opdracht in Cloud Shell uit te voeren:

az group delete --name myResourceGroup

Het kan een minuut duren voordat deze opdracht is uitgevoerd.

Verwijder de diagnostische instelling met de volgende opdracht:

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

Wat u hebt geleerd:

  • Een web-app configureren met Azure Monitor
  • Logboeken verzenden naar Log Analytics
  • Logboekquery's gebruiken om web-app-fouten op te sporen en op te lossen

Volgende stappen