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.

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

Quebre o aplicativo

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

Convert first five images

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

The convert will result in a HTTP 500 error

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.

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

Log Anlytics Worksace Logs

  1. Procure appservice e clique duas vezes em AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Clique em Run.

Log Analytics Workspace App Service HTTP Logs

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.

PHP app running in Azure App Service

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

Próximos passos