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:
Gebruik de Bash-omgeving in Azure Cloud Shell. Zie quickstart voor Bash in Azure Cloud Shell voor meer informatie.
Installeer de Azure CLI, indien gewenst, om CLI-referentieopdrachten uit te voeren. Als u in Windows of macOS werkt, kunt u Azure CLI uitvoeren in een Docker-container. Zie De Azure CLI uitvoeren in een Docker-container voor meer informatie.
Als u een lokale installatie gebruikt, meldt u zich aan bij Azure CLI met behulp van de opdracht az login. Volg de stappen die worden weergegeven in de terminal, om het verificatieproces te voltooien. Raadpleeg Aanmelden bij Azure CLI voor aanvullende aanmeldingsopties.
Installeer de Azure CLI-extensie bij het eerste gebruik, wanneer u hierom wordt gevraagd. Raadpleeg Extensies gebruiken met Azure CLI voor meer informatie over extensies.
Voer az version uit om de geïnstalleerde versie en afhankelijke bibliotheken te vinden. Voer az upgrade uit om te upgraden naar de nieuwste versie.
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
.
Selecteer de eerste twee afbeeldingen en klik op convert
. Dit wordt geconverteerd.
Onderbreek de app
Nu u de app hebt geverifieerd door twee afbeeldingen te converteren, proberen we de eerste vijf afbeeldingen te converteren.
Deze actie mislukt en resulteert in een HTTP 500
-fout die niet is getest tijdens de ontwikkeling.
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
.
- Klik op
Logs
in de navigatiebalk aan de linkerkant.
- Ga naar
appservice
en dubbelklik opAppServiceHTTPLogs
.
- Klik op
Run
.
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.
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