Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве показано, как устранить неполадки с приложением Службы приложений Azure с помощью Azure Monitor. Пример приложения содержит код, предназначенный для исчерпания памяти и возникновения ошибок HTTP 500, чтобы можно было диагностировать и устранить проблему с помощью Azure Monitor. По завершении вы получите пример приложения, работающего в Службе приложений в Linux, интегрированном с Azure Monitor.
Azure Monitor обеспечивает максимальную доступность и производительность приложений и служб, предоставляя комплексное решение для сбора, анализа и выполнения системных журналов из облачных и локальных сред.
В этом руководстве описано следующее:
- настройка веб-приложения для работы с Azure Monitor;
- отправка журналов консоли в Log Analytics;
- Использование запросов журналов для выявления и устранения ошибок веб-приложения
Вы можете выполнить действия, описанные в этом руководстве, в macOS, Linux или Windows.
Необходимые компоненты
Подписка Azure. Если у вас нет аккаунта Azure, создайте бесплатную учетную запись перед началом.
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье "Начало работы с Azure Cloud Shell".
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других параметрах входа см. в статье "Проверка подлинности в Azure с помощью Azure CLI".
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений и управление ими с помощью Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
Создание ресурсов Azure
Сначала выполните несколько команд, чтобы настроить пример приложения для использования с этим руководством. Следующие команды создают ресурсы Azure, создают пользователя развертывания и развертывают пример приложения в Azure. Вам будет предложено ввести пароль, предоставленный в рамках создания пользователя развертывания.
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.4" --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
Настройка Azure Monitor
Создание рабочей области Log Analytics
После развертывания примера приложения в Службе приложений Azure настройте возможность мониторинга, чтобы устранить неполадки при возникновении проблем. Azure Monitor хранит данные журналов в рабочей области Log Analytics. Рабочей областью называется контейнер, который содержит данные и сведения о конфигурации.
На этом шаге вы создадите рабочую область Log Analytics, чтобы настроить применение Azure Monitor для приложения.
az monitor log-analytics workspace create --resource-group myResourceGroup --workspace-name myMonitorWorkspace
Создание параметра диагностики
Azure Monitor использует параметры диагностики для сбора метрик для определенных служб Azure для анализа с другими данными мониторинга с помощью запросов журнала. Для работы с этим руководством вы включите ведение журналов веб-сервера, а также журналов ошибок и стандартного потока вывода. Полный список типов журналов и описаний см. в разделе "Поддерживаемые журналы ресурсов".
Выполните следующие команды, чтобы создать параметры диагностики для AppServiceConsoleLogs (стандартный вывод/ошибки) и AppServiceHTTPLogs (логи веб-сервера). Замените заполнители <app-name> и <workspace-name> своими значениями.
resourceID=$(az webapp show -g myResourceGroup -n <app-name> --query id --output tsv)
workspaceID=$(az monitor log-analytics workspace show -g myResourceGroup --workspace-name myMonitorWorkspace --query id --output tsv)
az monitor diagnostic-settings create --resource $resourceID \
--workspace $workspaceID \
-n myMonitorLogs \
--logs '[{"category": "AppServiceConsoleLogs", "enabled": true},
{"category": "AppServiceHTTPLogs", "enabled": true}]'
Примечание.
Первые две команды, resourceID и workspaceID, создают переменные для использования в команде az monitor diagnostics-settings create. Дополнительные сведения см. в статье "Создание параметров диагностики с помощью Azure CLI".
Устранение неполадок в приложении
Перейдите в http://<app-name>.azurewebsites.net.
Пример приложения ImageConverter преобразует изображения из JPG в PNG. Ошибка была намеренно помещена в код для этого руководства. Если выбрать достаточно изображений, приложение создает ошибку HTTP 500 во время преобразования изображений. Предположим, что такой сценарий был упущен на этапе разработки. Для устранения этой ошибки вы примените Azure Monitor.
Проверка работы приложения
Чтобы преобразовать изображения, выберите "Сервис " и нажмите кнопку "Преобразовать в PNG".
Выберите первые два изображения и нажмите кнопку "Преобразовать". Это успешно преобразуется.
Аварийное завершение приложения
После успешной проверки приложения преобразуйте два изображения, попробуйте преобразовать первые пять образов.
Это действие завершается ошибкой и создает ошибку HTTP 500, которая не была проверена во время разработки.
Использование запроса по журналам для просмотра журналов Azure Monitor
Давайте посмотрим, какие журналы доступны в рабочей области Log Analytics.
Выберите эту ссылку на рабочую область Log Analytics , чтобы получить доступ к рабочей области на портале Azure.
На портале Azure выберите рабочую область Log Analytics.
Запросы журнала
Запросы по журналам позволяют с пользой применить все данные, собранные в журналах Azure Monitor. Вы используете запросы журналов для идентификации журналов как в AppServiceHTTPLogs, так и в AppServiceConsoleLogs. Дополнительные сведения см. в статье "Запросы журналов" в Azure Monitor.
Просмотр AppServiceHTTPLogs с помощью запросов по журналам
После доступа к приложению просмотрите данные, связанные с HTTP-запросами, найденные в AppServiceHTTPLogs.
Выберите Логи в боковом меню.
Найдите службу приложений и дважды щелкните AppServiceHTTPLogs.
Выберите Выполнить.
Запрос AppServiceHTTPLogs возвращает все запросы за последние 24 часа. Столбец ScStatus содержит состояние HTTP. Чтобы диагностировать ошибки HTTP 500, ограничьте ScStatus до 500 и выполните запрос:
AppServiceHTTPLogs
| where ScStatus == 500
Просмотр AppServiceConsoleLogs с помощью запросов по журналам
После подтверждения HTTP 500s просмотрите стандартные выходные данные и ошибки из приложения. Эти журналы находятся в AppServiceConsoleLogs.
Выберите + , чтобы создать новый запрос.
Дважды щелкните таблицу AppServiceConsoleLogs и выберите "Выполнить".
Так как преобразование пяти изображений приводит к ошибкам сервера, вы можете увидеть, пишет ли приложение ошибки, фильтруя ResultDescription по ошибкам:
AppServiceConsoleLogs |
where ResultDescription contains "error"
В столбце ResultDescription появится следующая ошибка:
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/
Объединение данных из AppServiceHTTPLogs и AppServiceConsoleLogs
После выявления ошибок HTTP 500 и стандартных ошибок необходимо подтвердить, есть ли корреляция между этими сообщениями. Объедините таблицы на основе временной метки TimeGenerated.
Примечание.
Для вас был подготовлен запрос, который выполняет следующее:
- отбор ошибок 500 из журналов HTTP;
- запрос по журналам консоли;
- объединение таблиц по значению
TimeGenerated.
Выполните приведенный ниже запрос:
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 вы увидите следующую ошибку одновременно с ошибками веб-сервера:
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/
Сообщение указывает, что память была исчерпана в строке 20 process.php. Теперь вы подтвердили, что приложение создало ошибку HTTP 500. Давайте посмотрим на код приложения, чтобы найти проблему.
Определение ошибки
В локальном каталоге App-Service-Troubleshoot-Azure-Monitor откройте process.php и просмотрите строку 20.
imagepng($imgArray[$x], $filename);
Первый аргумент ($imgArray[$x]) является переменной для хранения (в памяти) всех преобразуемых изображений в формате JPG. Но в imagepng требуется только одно изображение, которое преобразовывается в текущий момент, а не все сразу. Предварительная загрузка образов не требуется и может привести к нехватке памяти, что приводит к ошибкам HTTP 500. Давайте обновим код, чтобы загрузить изображения по запросу, чтобы узнать, устранена ли проблема. Затем улучшайте код, чтобы устранить проблему с памятью.
Исправление приложения
Обновление на локальном компьютере и повторное развертывание кода
Внесите следующие изменения в 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);
}
Зафиксируйте изменения в Git, а затем отправьте изменения кода в Azure.
git commit -am "Load images on-demand in process.php"
git push azure main
Переход к приложению Azure
Перейдите в http://<app-name>.azurewebsites.net.
Преобразование изображений больше не должно создавать ошибки HTTP 500.
Очистка ресурсов
На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов, выполнив следующую команду в Cloud Shell:
az group delete --name myResourceGroup
Выполнение этой команды может занять минуту.
Удалите параметры диагностики, выполнив следующую команду:
az monitor diagnostic-settings delete --resource $resourceID -n myMonitorLogs
Связанный контент
- Запросы по журналам в Azure Monitor
- Troubleshoot an app in Azure App Service using Visual Studio (Устранение неполадок приложения в Службе приложений Azure с помощью Visual Studio)
- Анализ журналов приложения в HDInsight
- Учебник. Выполнение нагрузочного теста для выявления узких мест производительности в веб-приложении