Руководство. Устранение неполадок с приложением Служба приложений с помощью Azure Monitor
В этом учебнике описано, как устранять неполадки в приложении Службы приложений с помощью Azure Monitor. Этот пример приложения содержит код, который занимает всю доступную память и приводит к ошибкам HTTP 500. Эту ошибку вы сможете диагностировать и устранить с помощью Azure Monitor. После завершения работы у вас есть пример приложения, работающего на Служба приложений в Linux интегрированный с Azure Monitor.
Служба Azure Monitor обеспечивает максимальную доступность и производительность приложений и служб, предоставляя полноценное решение для сбора, анализа и обработки данных телеметрии из облачных и локальных сред.
В этом руководстве описано следующее:
- настройка веб-приложения для работы с Azure Monitor;
- отправка журналов консоли в Log Analytics;
- использование запросов по журналам для обнаружения и устранения ошибок в веб-приложениях.
Шаги, описанные в этом руководстве, можно выполнить для macOS, Linux и Windows.
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
Необходимые компоненты
Для работы с этим учебником необходимы указанные ниже компоненты.
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью 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.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
Настройка 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 в журналы Azure Monitor, чтобы анализировать их совместно с другими данными мониторинга с помощью запросов по журналам. Для работы с этим руководством вы включите ведение журналов веб-сервера, а также журналов ошибок и стандартного потока вывода. Полный список типов журналов с описанием см. в статье Поддерживаемые типы журналов.
Чтобы создать параметры диагностики для AppServiceConsoleLogs (стандартный поток вывода и ошибки) и AppServiceHTTPLogs (журналы веб-сервера), нужно выполнить следующие команды. Замените заполнители <app-name> и <workspace-name> своими значениями.
Примечание.
Первые две команды, resourceID
и workspaceID
, создают переменные для использования в команде az monitor diagnostics-settings create. Дополнительные сведения об этой команде см. в разделе Создание параметров диагностики с помощью Azure CLI.
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}]'
Устранение неполадок в приложении
Перейдите в http://<app-name>.azurewebsites.net
.
Этот пример приложения ImageConverter преобразует предоставленные изображения из JPG
в PNG
. В рамках этого руководства в код намеренно добавлена ошибка. Если выбрать достаточно изображений, приложение создает ошибку HTTP 500 во время преобразования изображений. Предположим, что такой сценарий был упущен на этапе разработки. Для устранения этой ошибки вы примените Azure Monitor.
Проверка работы приложения
Чтобы преобразовать изображения, щелкните Tools
(Средства) и выберите Convert to PNG
(Преобразовать в PNG).
Выберите первые два изображения и щелкните convert
(Преобразовать). Это успешно преобразуется.
Аварийное завершение приложения
Теперь, когда вы проверили приложение путем успешного преобразования двух образов, мы пытаемся преобразовать первые пять образов.
Это действие завершается ошибкой с сообщением HTTP 500
, которая не была проверена во время разработки.
Использование запроса по журналам для просмотра журналов Azure Monitor
Давайте посмотрим, какие журналы доступны в рабочей области Log Analytics.
Щелкните эту ссылку на рабочую область Log Analytics, чтобы открыть ее на портале Azure.
На портале Azure выберите рабочую область Log Analytics.
Запросы журнала
Запросы по журналам позволяют с пользой применить все данные, собранные в журналах Azure Monitor. Вы можете применять запросы по журналам, собранным в AppServiceHTTPLogs и AppServiceConsoleLogs. Дополнительные сведения о запросах по журналам см. в этой обзорной статье.
Просмотр AppServiceHTTPLogs с помощью запросов по журналам
Итак, мы получили доступ к приложению, а теперь изучим данные в AppServiceHTTPLogs
, которые связаны с выполненными HTTP-запросами.
- Щелкните
Logs
в области навигации слева.
- Выполните поиск по строке
appservice
и дважды щелкните элементAppServiceHTTPLogs
.
- Нажмите кнопку
Run
.
Запрос AppServiceHTTPLogs
возвращает все запросы за последние 24 часа. Столбец ScStatus
содержит сведения о состоянии HTTP. Чтобы диагностировать ошибки HTTP 500
, установите для ScStatus
ограничение 500 и выполните запрос, как показано ниже:
AppServiceHTTPLogs
| where ScStatus == 500
Просмотр AppServiceConsoleLogs с помощью запросов по журналам
Мы убедились, что возникают ошибки HTTP 500, а теперь перейдем к журналам стандартного потока вывода и ошибок приложения. Эти журналы находятся в AppServiceConsoleLogs.
(1) Щелкните +
, чтобы создать новый запрос.
(2) Дважды щелкните таблицу AppServiceConsoleLogs
, затем выберите Run
.
Поскольку преобразование пяти изображений приводит к ошибкам с сервером, вы можете проверить наличие записей ошибок в приложении, установив фильтр по 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. Давайте посмотрим на код приложения, чтобы найти проблему.
Определение ошибки
В локальном каталоге откройте файл 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;
- отправка журналов в Log Analytics;
- использование запросов по журналам для обнаружения и устранения ошибок в веб-приложениях.
Следующие шаги
- Запросы по журналам в Azure Monitor
- Troubleshoot an app in Azure App Service using Visual Studio (Устранение неполадок приложения в Службе приложений Azure с помощью Visual Studio)
- Анализ журналов приложения в HDInsight
- Учебник. Выполнение нагрузочного теста для выявления узких мест производительности в веб-приложении