Tutorial: Solucionar problemas de um aplicativo do Serviço de Aplicativo com o Azure Monitor

Este tutorial mostra como solucionar problemas de um aplicativo do Serviço de Aplicativo usando o Azure Monitor. O aplicativo de exemplo inclui o código destinado a esgotar a memória e causar erros HTTP 500 para que você possa diagnosticar e corrigir o problema usando o Azure Monitor. Quando tiver terminado, você tem um aplicativo de exemplo em execução no Serviço de Aplicativo no Linux integrado ao Azure Monitor.

O Azure Monitor maximiza a disponibilidade e o desempenho de seus aplicativos e serviços fornecendo uma solução abrangente para coletar, analisar e agir em relação a dados telemétricos de seus ambientes locais e de nuvem.

Neste tutorial, você aprende a:

  • Configurar um aplicativo Web com o Azure Monitor
  • Enviar logs do console para o Log Analytics
  • Usar consultas de log para identificar e solucionar problemas de erros do aplicativo Web

Você pode seguir as etapas deste tutorial no macOS, no Linux e no Windows.

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

Para concluir este tutorial, você precisará:

Criar recursos do Azure

Primeiro, você executa vários comandos localmente para configurar um aplicativo de exemplo para usar com este tutorial. Os comandos criam recursos do Azure e um usuário de implantação e implantam o aplicativo de exemplo no Azure. Você é solicitado pela senha que foi fornecida como parte da criação do usuário de implantação.

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

Configurar o Azure Monitor

Criar um workspace do Log Analytics

Agora que já implantou o aplicativo de exemplo no Serviço de Aplicativo do Azure, você configura a funcionalidade de monitoramento para solucionar problemas do aplicativo, quando surgirem. O Azure Monitor armazena dados de log em um workspace do Log Analytics. Um workspace é um contêiner que inclui dados e informações de configuração.

Nesta etapa, você criará um workspace do Log Analytics para configurar o Azure Monitor com seu aplicativo.

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

Criar uma configuração de diagnóstico

As configurações de diagnóstico podem ser usadas para coletar métricas de determinados serviços do Azure em logs do Azure Monitor para análise com outros dados de monitoramento usando consultas de log. Neste tutorial, você habilitará o servidor Web e os logs de saída/erro padrão. Confira tipos de log compatíveis para obter uma lista completa de tipos de log e descrições.

Execute os seguintes comandos para criar configurações de diagnóstico para AppServiceConsoleLogs (saída/erro padrão) e AppServiceHTTPLogs (logs de servidor Web). Substitua <app-name> e <workspace-name> pelos seus valores.

Observação

Os dois primeiros comandos, resourceID e workspaceID, são variáveis a serem usadas no comando az monitor diagnostic-settings create. Confira Criar configurações de diagnóstico usando a CLI do Azure para obter mais informações 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}]'

Solucionar problemas do aplicativo

Navegue até http://<app-name>.azurewebsites.net.

O aplicativo de exemplo, ImageConverter, converte as imagens incluídas de JPG para PNG. Um bug foi intencionalmente colocado no código para este tutorial. Se você selecionar imagens suficientes, o aplicativo produzirá um erro HTTP 500 durante a conversão de imagem. Imagine que esse cenário não foi considerado durante a fase de desenvolvimento. Você usará Azure Monitor para solucionar o erro.

Verificar se o aplicativo funciona

Para converter imagens, clique em Tools e selecione Convert to PNG.

Click Tools and select Convert to PNG

Selecione as duas primeiras imagens e clique em convert. Isso é convertido com êxito.

Select the first two images

Interromper o aplicativo

Agora que você verificou o aplicativo convertendo duas imagens com êxito, tentamos converter as primeiras cinco imagens.

Convert first five images

Essa ação falha e produz um erro HTTP 500 que não foi testado durante o desenvolvimento.

The convert will result in a HTTP 500 error

Usar a consulta de logs para exibir logs do Azure Monitor

Vejamos quais logs estão disponíveis no workspace do Log Analytics.

Clique neste link do workspace do Log Analytics para acessar seu workspace no portal do Azure.

No Portal do Azure, selecione o espaço de trabalho do Log Analytics.

Consultas de logs

As consultas de log ajudam você a aproveitar tudo o que os dados coletados nos logs do Azure Monitor têm a oferecer. Use as consultas de log para identificar os logs em AppServiceHTTPLogs e AppServiceConsoleLogs. Confira a visão geral da consulta de log para obter mais informações sobre consultas de log.

Exibir AppServiceHTTPLogs com a consulta de log

Agora que acessamos o aplicativo, vamos exibir os dados associados às solicitações HTTP, encontrados no AppServiceHTTPLogs.

  1. Clique em Logs na navegação à esquerda.

Log Anlytics Worksace Logs

  1. Procure appservice e clique duas vezes em AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Clique no Run.

Log Analytics Workspace App Service HTTP Logs

A consulta AppServiceHTTPLogs retorna todas as solicitações nas últimas 24 horas. A coluna ScStatus contém o status HTTP. Para diagnosticar os erros HTTP 500, limite o ScStatus a 500 e execute a consulta, conforme mostrado abaixo:

AppServiceHTTPLogs
| where ScStatus == 500

Exibir AppServiceConsoleLogs com a consulta de log

Agora que você confirmou os erros 500 em HTTP, vamos dar uma olhada na saída/erros padrão do aplicativo. Esses logs são encontrados em "AppServiceConsoleLogs".

(1) Clique em + para criar uma consulta.

(2) Clique duas vezes na tabela AppServiceConsoleLogs e clique em Run.

Como a conversão de cinco imagens resulta em erros de servidor, você pode ver se o aplicativo também está gravando erros filtrando ResultDescription para ver se há erros, como mostrado abaixo:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

Na coluna ResultDescription, você vê o seguinte erro:

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/

Unir AppServiceHTTPLogs e AppServiceConsoleLogs

Agora que você identificou os erros HTTP 500 e padrão, precisa confirmar se há uma correlação entre essas mensagens. Em seguida, você une as tabelas com base no carimbo de data/hora, TimeGenerated.

Observação

Uma consulta que faz o seguinte foi preparada para você:

  • Filtra HTTPLogs quanto a erros 500
  • Consulta logs do console
  • Une as tabelas em TimeGenerated

Execute a seguinte 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;

Na coluna ResultDescription, você verá o seguinte erro ao mesmo tempo que erros do 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/

A mensagem declara que a memória foi esgotada na linha 20 de process.php. Agora você confirmou que o aplicativo produziu um erro durante o erro HTTP 500. Vamos dar uma olhada no código para identificar o problema.

Identificar o erro

No diretório local, abra o process.php e examine a linha 20.

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

O primeiro argumento, $imgArray[$x], é uma variável que mantém todas as JPGs (na memória) que precisam de conversão. No entanto, imagepng só precisa que a imagem seja convertida e não todas as imagens. O pré-carregamento das imagens não é necessário e podem estar causando o esgotamento de memória, levando aos erros HTTP 500. Vamos atualizar o código para carregar imagens sob demanda para ver se ele resolve o problema. Em seguida, você aprimora o código para resolver o problema de memória.

Corrigir o aplicativo

Atualizar localmente e reimplantar o código

Você faz as seguintes alterações em process.php para lidar com o esgotamento de memória:

<?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 suas alterações no Git e, em seguida, envie as alterações de código por push para o Azure.

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

Navegar até o aplicativo do Azure

Navegue até http://<app-name>.azurewebsites.net.

A conversão de imagens já não deve mais produzir os erros HTTP 500.

PHP app running in Azure App Service

Limpar os recursos

Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você acha que não precisará desses recursos no futuro, exclua o grupo de recursos executando o seguinte comando no Cloud Shell:

az group delete --name myResourceGroup

Esse comando pode demorar um pouco para ser executado.

Exclua a configuração de diagnóstico com o seguinte comando:

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

O que você aprendeu:

  • Configurou um aplicativo Web com Azure Monitor
  • Enviou logs ao Log Analytics
  • Usou consultas de log para identificar e solucionar problemas de erros do aplicativo Web

Próximas etapas