Samouczek: rozwiązywanie problemów z aplikacją usługi App Service za pomocą usługi Azure Monitor

W tym samouczku pokazano, jak rozwiązywać problemy z aplikacją usługi App Service przy użyciu usługi Azure Monitor. Przykładowa aplikacja zawiera kod przeznaczony do wyczerpania pamięci i powodować błędy HTTP 500, dzięki czemu można zdiagnozować i rozwiązać problem przy użyciu usługi Azure Monitor. Po zakończeniu masz przykładową aplikację działającą w App Service dla systemu Linux zintegrowaną z usługą Azure Monitor.

Usługa Azure Monitor maksymalizuje dostępność i wydajność aplikacji i usług, zapewniając kompleksowe rozwiązanie do zbierania, analizowania i działania na telemetrii ze środowisk chmurowych i lokalnych.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Konfigurowanie aplikacji internetowej za pomocą usługi Azure Monitor
  • Wysyłanie dzienników konsoli do usługi Log Analytics
  • Używanie zapytań dzienników do identyfikowania i rozwiązywania problemów z błędami aplikacji internetowej

Kroki opisane w tym samouczku można wykonać w systemie macOS, Linux i Windows.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

Tworzenie zasobów platformy Azure

Najpierw uruchom kilka poleceń lokalnie, aby skonfigurować przykładową aplikację do użycia z tym samouczkiem. Polecenia tworzą zasoby platformy Azure, tworzą użytkownika wdrożenia i wdrażają przykładową aplikację na platformie Azure. Zostanie wyświetlony monit o podanie hasła dostarczonego w ramach tworzenia użytkownika wdrożenia.

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

Konfigurowanie usługi Azure Monitor

Tworzenie obszaru roboczego usługi Log Analytics

Po wdrożeniu przykładowej aplikacji w usłudze aplikacja systemu Azure możesz skonfigurować możliwość monitorowania w celu rozwiązywania problemów z aplikacją w przypadku wystąpienia problemów. Usługa Azure Monitor przechowuje dane dziennika w obszarze roboczym usługi Log Analytics. Obszar roboczy to kontener zawierający dane i informacje o konfiguracji.

W tym kroku utworzysz obszar roboczy usługi Log Analytics, aby skonfigurować usługę Azure Monitor przy użyciu aplikacji.

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

Tworzenie ustawienia diagnostycznego

Ustawienia diagnostyczne mogą służyć do zbierania metryk dla niektórych usług platformy Azure w dziennikach usługi Azure Monitor na potrzeby analizy z innymi danymi monitorowania przy użyciu zapytań dzienników. Na potrzeby tego samouczka włączysz serwer internetowy i standardowe dzienniki danych wyjściowych/błędów. Zobacz obsługiwane typy dzienników , aby uzyskać pełną listę typów dzienników i opisów.

Uruchom następujące polecenia, aby utworzyć ustawienia diagnostyczne dla dzienników AppServiceConsoleLogs (standardowe dane wyjściowe/błąd) i AppServiceHTTPLogs (dzienniki serwera internetowego). Zastąp <wartości nazwa> aplikacji i <nazwa> obszaru roboczego swoimi wartościami.

Uwaga

Dwa pierwsze polecenia i workspaceID, to zmienne, resourceID które mają być używane w poleceniu az monitor diagnostic-settings create. Aby uzyskać więcej informacji na temat tego polecenia, zobacz Tworzenie ustawień diagnostycznych przy użyciu interfejsu wiersza polecenia platformy Azure.

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}]'

Rozwiązywanie problemów z aplikacją

Przejdź do http://<app-name>.azurewebsites.net.

Przykładowa aplikacja ImageConverter konwertuje dołączone obrazy z JPG na PNG. Usterka została celowo umieszczona w kodzie tego samouczka. W przypadku wybrania wystarczającej liczby obrazów aplikacja generuje błąd HTTP 500 podczas konwersji obrazu. Wyobraź sobie, że ten scenariusz nie był brany pod uwagę w fazie opracowywania. Aby rozwiązać ten problem, użyjesz usługi Azure Monitor.

Sprawdzanie, czy aplikacja działa

Aby przekonwertować obrazy, kliknij Tools i wybierz pozycję Convert to PNG.

Click Tools and select Convert to PNG

Wybierz dwa pierwsze obrazy i kliknij pozycję convert. Spowoduje to pomyślne przekonwertowanie.

Select the first two images

Przerywanie pracy aplikacji

Teraz, gdy aplikacja została zweryfikowana przez pomyślne przekonwertowanie dwóch obrazów, spróbujemy przekonwertować pierwsze pięć obrazów.

Convert first five images

Ta akcja kończy się niepowodzeniem HTTP 500 i powoduje błąd, który nie został przetestowany podczas programowania.

The convert will result in a HTTP 500 error

Wyświetlanie dzienników dzienników za pomocą zapytania

Zobaczmy, jakie dzienniki są dostępne w obszarze roboczym usługi Log Analytics.

Kliknij ten link obszaru roboczego usługi Log Analytics, aby uzyskać dostęp do obszaru roboczego w witrynie Azure Portal.

W witrynie Azure Portal wybierz obszar roboczy usługi Log Analytics.

Rejestrowanie zapytań

Zapytania dzienników ułatwiają pełne zastosowanie wartości danych zebranych w dziennikach usługi Azure Monitor. Zapytania dzienników służą do identyfikowania dzienników zarówno w polach AppServiceHTTPLogs, jak i AppServiceConsoleLogs. Zobacz omówienie zapytania dziennika, aby uzyskać więcej informacji na temat zapytań dzienników.

Wyświetlanie dzienników AppServiceHTTPLogs za pomocą zapytania dziennika

Teraz, gdy uzyskujemy dostęp do aplikacji, wyświetlmy dane skojarzone z żądaniami HTTP znajdującymi się w pliku AppServiceHTTPLogs.

  1. Kliknij Logs pozycję w obszarze nawigacji po lewej stronie.

Log Anlytics Worksace Logs

  1. appservice Wyszukaj i kliknij dwukrotnie plik AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Kliknij pozycję Run.

Log Analytics Workspace App Service HTTP Logs

Zapytanie AppServiceHTTPLogs zwraca wszystkie żądania w ciągu ostatnich 24 godzin. Kolumna ScStatus zawiera stan HTTP. Aby zdiagnozować HTTP 500 błędy, ogranicz ScStatus wartość do 500 i uruchom zapytanie, jak pokazano poniżej:

AppServiceHTTPLogs
| where ScStatus == 500

Wyświetlanie dzienników AppServiceConsoleLogs za pomocą zapytania dziennika

Teraz, po potwierdzeniu protokołu HTTP 500s, przyjrzyjmy się standardowym wyjściowym/błędom aplikacji. Te dzienniki znajdują się w obszarze "AppServiceConsoleLogs".

(1) Kliknij + , aby utworzyć nowe zapytanie.

(2) Kliknij dwukrotnie tabelę AppServiceConsoleLogs i kliknij przycisk Run.

Ponieważ konwertowanie pięciu obrazów powoduje błędy serwera, możesz sprawdzić, czy aplikacja również zapisuje błędy, filtrując pod kątem ResultDescription błędów, jak pokazano poniżej:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

W kolumnie ResultDescription zostanie wyświetlony następujący błąd:

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/

Dołączanie do dzienników AppServiceHTTPLogs i AppServiceConsoleLogs

Teraz, gdy zidentyfikowano zarówno błędy HTTP 500s, jak i standardowe, należy potwierdzić, czy istnieje korelacja między tymi komunikatami. Następnie połączysz tabele na podstawie sygnatury czasowej TimeGenerated.

Uwaga

Zostało przygotowane zapytanie, które wykonuje następujące czynności:

  • Filtruje dzienniki HTTP pod kątem błędów 500
  • Zapytania dotyczące dzienników konsoli
  • Sprzęża tabele na TimeGenerated

Uruchom poniższe zapytanie:

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;

W kolumnie ResultDescription zobaczysz następujący błąd w tym samym czasie co błędy serwera internetowego:

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/

Komunikat stwierdza, że pamięć została wyczerpana w wierszu 20 z process.php. Teraz potwierdzono, że aplikacja wygenerowała błąd podczas błędu HTTP 500. Przyjrzyjmy się kodowi, aby zidentyfikować problem.

Identyfikowanie błędu

W katalogu lokalnym otwórz process.php wiersz i spójrz na wiersz 20.

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

Pierwszym argumentem jest $imgArray[$x]zmienna przechowująca wszystkie pliki JPG (w pamięci) wymagające konwersji. imagepng Jednak wymaga tylko przekonwertowania obrazu, a nie wszystkich obrazów. Wstępne ładowanie obrazów nie jest konieczne i może powodować wyczerpanie pamięci, co prowadzi do http 500s. Zaktualizujmy kod, aby załadować obrazy na żądanie, aby sprawdzić, czy rozwiązuje problem. Następnie ulepszysz kod, aby rozwiązać problem z pamięcią.

Naprawianie aplikacji

Lokalne aktualizowanie i ponowne wdrażanie kodu

Aby obsłużyć wyczerpanie pamięci, należy wprowadzić następujące zmiany process.php :

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

Zatwierdź zmiany w narzędziu Git, a następnie wypchnij zmiany kodu na platformę Azure.

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

Przechodzenie do aplikacji platformy Azure

Przejdź do http://<app-name>.azurewebsites.net.

Konwertowanie obrazów nie powinno już powodować błędów HTTP 500.

PHP app running in Azure App Service

Czyszczenie zasobów

W poprzednich krokach utworzono zasoby platformy Azure w grupie zasobów. Jeśli te zasoby nie będą raczej potrzebne w przyszłości, usuń grupę zasobów, uruchamiając następujące polecenie w usłudze Cloud Shell:

az group delete --name myResourceGroup

Wykonanie tego polecenia może potrwać około minutę.

Usuń ustawienie diagnostyczne za pomocą następującego polecenia:

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

Które czynności umiesz wykonać:

  • Skonfigurowano aplikację internetową za pomocą usługi Azure Monitor
  • Wysłane dzienniki do usługi Log Analytics
  • Używane zapytania dzienników do identyfikowania i rozwiązywania problemów z błędami aplikacji internetowej

Następne kroki