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 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 terminar, você terá 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 telemetria de seus ambientes locais e na nuvem.
Neste tutorial, irá aprender 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 erros de aplicativos Web
Pode seguir os passos neste tutorial em macOS, Linux e Windows.
Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.
Pré-requisitos
Para concluir este tutorial, precisa de:
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.
Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.
Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.
Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando 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, criam um usuário de implantação e implantam o aplicativo de exemplo no Azure. Você será solicitado a fornecer a senha 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 espaço de trabalho do Log Analytics
Agora que você implantou o aplicativo de exemplo no Serviço de Aplicativo do Azure, você configura o recurso de monitoramento para solucionar problemas do aplicativo quando surgirem problemas. O Azure Monitor armazena dados de log em um espaço de trabalho do Log Analytics. Um espaço de trabalho é um contêiner que inclui dados e informações de configuração.
Nesta etapa, você cria um espaço de trabalho 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 para determinados serviços do Azure nos Logs do Azure Monitor para análise com outros dados de monitoramento usando consultas de log. Para este tutorial, você habilita o servidor Web e os logs de saída/erro padrão. Consulte os tipos de log suportados 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 padrão/erro) e AppServiceHTTPLogs (logs do servidor Web). Substitua <app-name> e <workspace-name> pelos seus valores.
Nota
Os dois primeiros comandos resourceID
e workspaceID
, são variáveis a serem usadas no comando az monitor diagnostic-settings create . Consulte Criar configurações de diagnóstico usando a CLI do Azure para obter mais informações sobre esse 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}]'
Resolução de problemas da aplicação
Navegue para http://<app-name>.azurewebsites.net
.
O aplicativo de exemplo, ImageConverter, converte imagens incluídas de JPG
em PNG
. Um bug foi deliberadamente colocado no código deste tutorial. Se você selecionar imagens suficientes, o aplicativo produzirá um erro HTTP 500 durante a conversão de imagem. Imagine que este cenário não foi considerado durante a fase de desenvolvimento. Você usará o Azure Monitor para solucionar o erro.
Verifique se o aplicativo funciona
Para converter imagens, clique e Tools
selecione Convert to PNG
.
Selecione as duas primeiras imagens e clique em convert
. Isso é convertido com êxito.
Quebre o aplicativo
Agora que você verificou o aplicativo convertendo duas imagens com sucesso, tentamos converter as cinco primeiras imagens.
Esta ação falha e produz um erro que não foi testado durante o HTTP 500
desenvolvimento.
Usar a consulta de log para exibir os logs do Azure Monitor
Vamos ver quais logs estão disponíveis no espaço de trabalho do Log Analytics.
Clique neste link de espaço de trabalho do Log Analytics para acessar seu espaço de trabalho no portal do Azure.
No portal do Azure, selecione seu espaço de trabalho do Log Analytics.
Registar consultas
As consultas de log ajudam você a aplicar totalmente o valor dos dados coletados nos Logs do Azure Monitor. Você usa consultas de log para identificar os logs em AppServiceHTTPLogs e AppServiceConsoleLogs. Consulte a visão geral da consulta de log para obter mais informações sobre consultas de log.
Exibir AppServiceHTTPLogs com consulta de log
Agora que acessamos o aplicativo, vamos visualizar os dados associados a solicitações HTTP, encontrados no AppServiceHTTPLogs
.
- Clique na
Logs
navegação à esquerda.
- Procure
appservice
e clique duas vezes emAppServiceHTTPLogs
.
- Clique em
Run
.
A AppServiceHTTPLogs
consulta retorna todas as solicitações nas últimas 24 horas. A coluna ScStatus
contém o status HTTP. Para diagnosticar os HTTP 500
erros, limite a ScStatus
500 e execute a consulta, conforme mostrado abaixo:
AppServiceHTTPLogs
| where ScStatus == 500
Exibir AppServiceConsoleLogs com consulta de log
Agora que você confirmou o HTTP 500s, vamos dar uma olhada na saída/erros padrão do aplicativo. Esses logs são encontrados em 'AppServiceConsoleLogs'.
(1) Clique +
para criar uma nova consulta.
(2) Clique duas vezes na AppServiceConsoleLogs
tabela e clique em Run
.
Como a conversão de cinco imagens resulta em erros do servidor, você pode ver se o aplicativo também está gravando erros filtrando ResultDescription
por erros, como mostra abaixo:
AppServiceConsoleLogs |
where ResultDescription contains "error"
ResultDescription
Na coluna, você verá 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/
Junte-se a AppServiceHTTPLogs e AppServiceConsoleLogs
Agora que você identificou HTTP 500s e erros padrão, você precisa confirmar se há uma correlação entre essas mensagens. Em seguida, junte as tabelas com base no carimbo de data/hora, TimeGenerated
.
Nota
Foi preparada uma consulta que faz o seguinte:
- Filtra HTTPLogs para erros 500
- Consulta logs do console
- Junta-se às mesas 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;
ResultDescription
Na coluna, você verá o seguinte erro ao mesmo tempo que os 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 afirma que a memória foi esgotada na linha 20 do 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 e olhe para a process.php
linha 20.
imagepng($imgArray[$x], $filename);
O primeiro argumento, $imgArray[$x]
, é uma variável que contém todos os 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 de imagens não é necessário e pode estar causando o esgotamento da memória, levando a HTTP 500s. Vamos atualizar o código para carregar imagens sob demanda para ver se ele resolve o problema. Em seguida, você melhora o código para resolver o problema de memória.
Corrigir o aplicativo
Atualizar localmente e reimplementar o código
Você faz as seguintes alterações para process.php
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);
}
Consolide as suas alterações no Git e envie as alterações ao código para o Azure.
git commit -am "Load images on-demand in process.php"
git push azure main
Navegue até o aplicativo do Azure
Navegue para http://<app-name>.azurewebsites.net
.
A conversão de imagens não deve mais produzir os erros HTTP 500.
Clean up resources (Limpar recursos)
Nos passos anteriores, criou os recursos do Azure num grupo de recursos. Se achar que não vai precisar destes recursos no futuro, execute o seguinte comando no Cloud Shell para eliminar o grupo de recursos:
az group delete --name myResourceGroup
Este comando pode demorar alguns minutos a ser executado.
Exclua a configuração de diagnóstico com o seguinte comando:
az monitor diagnostic-settings delete --resource $resourceID -n myMonitorLogs
O que aprendeu:
- Configurado um aplicativo Web com o Azure Monitor
- Logs enviados para o Log Analytics
- Consultas de log usadas para identificar e solucionar erros de aplicativos Web