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á:
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, confira Início Rápido para Bash no Azure Cloud Shell.
Se preferir executar os comandos de referência da CLI localmente, instale a CLI do Azure. Para execuções no Windows ou no macOS, considere executar a CLI do Azure em um contêiner do Docker. Para obter mais informações, confira Como executar a CLI do Azure em um contêiner do Docker.
Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para ver outras opções de entrada, confira Conectar-se com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar extensões com a CLI do Azure.
Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.
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
.
Selecione as duas primeiras imagens e clique em convert
. Isso é convertido com êxito.
Interromper o aplicativo
Agora que você verificou o aplicativo convertendo duas imagens com êxito, tentamos converter as primeiras cinco imagens.
Essa ação falha e produz um erro HTTP 500
que não foi testado durante o desenvolvimento.
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
.
- Clique em
Logs
na navegação à esquerda.
- Procure
appservice
e clique duas vezes emAppServiceHTTPLogs
.
- Clique em
Run
.
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.
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