Tutorial: Solución de problemas de una aplicación de App Service con Azure Monitor

En este tutorial se muestra cómo solucionar los problemas de una aplicación de App Service mediante Azure Monitor. La aplicación de ejemplo incluye código destinado a agotar la memoria y provocar errores HTTP 500, de modo que puede diagnosticar y corregir el problema mediante Azure Monitor. Cuando haya terminado, tendrá una aplicación de ejemplo que se ejecuta en App Service en Linux integrado con Azure Monitor.

Azure Monitor maximiza la disponibilidad y el rendimiento de las aplicaciones y los servicios con una completa solución que permite recopilar, analizar y actuar sobre datos de telemetría tanto en la nube como en entornos locales.

En este tutorial, aprenderá a:

  • Configurar una aplicación web con Azure Monitor
  • Enviar los registros de consola a Log Analytics
  • Usar consultas de registro para identificar y solucionar problemas de errores de la aplicación web

También puede seguir los pasos de este tutorial en macOS, Linux, Windows.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

Para completar este tutorial, necesita:

Creación de recursos de Azure

En primer lugar, se ejecutarán varios comandos de forma local para configurar una aplicación de ejemplo para usarla con este tutorial. Los comandos crean recursos de Azure, crean un usuario de implementación e implementan la aplicación de ejemplo en Azure. Se le pedirá la contraseña que proporcionó como parte de la creación del usuario de implementación.

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

Configuración de Azure Monitor

Creación de un área de trabajo de Log Analytics

Ahora que ha implementado la aplicación de ejemplo en Azure App Service, configurará la funcionalidad de supervisión para solucionar los problemas de la aplicación cuando estos surjan. Azure Monitor almacena datos de registro en un área de trabajo de Log Analytics. Un área de trabajo es un contenedor que incluye datos e información de configuración.

En este paso, creará un área de trabajo de Log Analytics para configurar Azure Monitor con la aplicación.

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

Creación de una configuración de diagnóstico

Las configuraciones de diagnóstico se pueden usar para recopilar métricas para determinados servicios de Azure en los registros de Azure Monitor para analizarlas con otros datos de supervisión mediante consultas de registro. En este tutorial, habilitará el servidor web y los registros de error y salida estándar. Consulte los tipos de registro admitidos para obtener una lista completa de los tipos de registro y sus descripciones.

Ejecute los siguientes comandos para crear la configuración de diagnóstico para AppServiceConsoleLogs (error y salida estándar) y AppServiceHTTPLogs (registros del servidor web). Reemplace <app-name> y <workspace-name> por sus valores.

Nota:

Los dos primeros comandos, resourceID y workspaceID, son variables que se usarán en el comando az monitor diagnostic-settings create. Consulte Creación de una configuración de diagnóstico con la CLI de Azure para más información sobre este 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}]'

Solución de problemas de la aplicación

Vaya a http://<app-name>.azurewebsites.net.

La aplicación de ejemplo, ImageConverter, convierte las imágenes incluidas de JPG a PNG. Se ha colocado deliberadamente un error en el código de este tutorial. Si selecciona suficientes imágenes, la aplicación generará un error HTTP 500 durante la conversión de imágenes. Imagine que este escenario no se tuvo en cuenta durante la fase de desarrollo. Usará Azure Monitor para solucionar el error.

Comprobación del funcionamiento de la aplicación

Para convertir las imágenes, haga clic en Tools y seleccione Convert to PNG.

Click Tools and select Convert to PNG

Seleccione las dos primeras imágenes y haga clic en convert. Esto se convierte correctamente.

Select the first two images

Interrupción de la aplicación

Ahora que ha comprobado que la aplicación convierte dos imágenes correctamente, intentaremos convertir las cinco primeras imágenes.

Convert first five images

Esta acción no se realiza correctamente y genera un error HTTP 500 que no se probó durante el desarrollo.

The convert will result in a HTTP 500 error

Uso de una consulta de registro para ver los registros de Azure Monitor

Veamos qué registros están disponibles en el área de trabajo de Log Analytics.

Haga clic en este vínculo al área de trabajo de Log Analytics para acceder al área de trabajo en Azure Portal.

En Azure Portal, seleccione el área de trabajo de Log Analytics.

Consultas de registros

Las consultas de registro ayudan a aplicar al máximo el valor de los datos recopilados en los registros de Azure Monitor. Las consultas de registro se usan para identificar los registros tanto en AppServiceHTTPLogs como en AppServiceConsoleLogs. Consulte Introducción a las consultas de registro para más información sobre las consultas de registro.

Visualización de AppServiceHTTPLogs con una consulta de registro

Ahora que hemos accedido a la aplicación, vamos a ver los datos asociados a las solicitudes HTTP, que se encuentran en AppServiceHTTPLogs.

  1. Haga clic en Logs en el panel de navegación de la izquierda.

Log Anlytics Worksace Logs

  1. Busque appservice y haga doble clic en AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Haga clic en Run.

Log Analytics Workspace App Service HTTP Logs

La consulta AppServiceHTTPLogs devuelve todas las solicitudes de las últimas 24 horas. La columna ScStatus contiene el estado HTTP. Para diagnosticar los errores HTTP 500, limite ScStatus a 500 y ejecute la consulta, como se muestra a continuación:

AppServiceHTTPLogs
| where ScStatus == 500

Visualización de AppServiceConsoleLogs con una consulta de registro

Ahora que ha confirmado los errores HTTP 500, eche un vistazo a los errores y la salida estándar de la aplicación. Estos registros se encuentran en "AppServiceConsoleLogs".

(1) Haga clic en + para crear una nueva consulta.

(2) Haga doble clic en la tabla AppServiceConsoleLogs y haga clic en Run.

Dado que la conversión de cinco imágenes da como resultado errores de servidor, puede ver si la aplicación también escribe errores filtrando ResultDescription en busca de errores, como se muestra a continuación:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

En la columna ResultDescription, verá el siguiente error:

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/

Combinación de AppServiceHTTPLogs y AppServiceConsoleLogs

Ahora que ha identificado los errores HTTP 500 y los errores estándar, es preciso confirmar si hay una correlación entre estos mensajes. A continuación, se combinan las tablas en función de la marca de tiempo, TimeGenerated.

Nota

Se ha preparado una consulta que hace lo siguiente:

  • Filtra HTTPLogs en busca de errores 500
  • Consulta los registros de consola
  • Combina las tablas en función de TimeGenerated

Ejecute la siguiente consulta:

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;

En la columna ResultDescription, verá el siguiente error al mismo tiempo que los errores del servidor 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/

El mensaje indica que se ha agotado la memoria en la línea 20 de process.php. Ahora ha confirmado que la aplicación generó un error durante el error HTTP 500. Echemos un vistazo al código para identificar el problema.

Identificación del error

En el directorio local, abra el archivo process.php y mire en la línea 20.

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

El primer argumento, $imgArray[$x], es una variable que contiene todos los archivos JPG (en memoria) que se deben convertir. Sin embargo, imagepng solo necesita la imagen que se va a convertir y no todas las imágenes. La carga previa de imágenes no es necesaria y puede causar el agotamiento de la memoria, lo que conduce a errores HTTP 500. Vamos a actualizar el código para cargar las imágenes a petición para ver si se resuelve el problema. A continuación, se mejorará el código para solucionar el problema de memoria.

Corrección de la aplicación

Actualización local y nueva implementación del código

Realice los cambios siguientes en process.php para controlar el agotamiento de la memoria:

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

Confirme los cambios en Git y, después, inserte los cambios de código en Azure.

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

Navegación hasta la aplicación de Azure

Vaya a http://<app-name>.azurewebsites.net.

La conversión de imágenes no debe generar más errores HTTP 500.

PHP app running in Azure App Service

Limpieza de recursos

En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar varios segundos en ejecutarse.

Elimine la configuración de diagnóstico con el siguiente comando:

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

¿Qué ha aprendido?

  • Ha configurado una aplicación web con Azure Monitor
  • Ha enviado registros a Log Analytics
  • Ha utilizado consultas de registro para identificar y solucionar problemas de errores de la aplicación web

Pasos siguientes