البرنامج التعليمي: استكشاف أخطاء تطبيق App Service مع Azure Monitor

يوضح هذا البرنامج التعليمي كيفية استكشاف أخطاء تطبيق App Service باستخدام Azure Monitor. يتضمن التطبيق عينة التعليمات البرمجية التي تهدف إلى استنفاد الذاكرة وتسبب أخطاء HTTP 500، حتى تتمكن من تشخيص وإصلاح المشكلة باستخدام Azure Monitor. عند الانتهاء، يكون لديك نموذج تطبيق يعمل على App Service على Linux متكامل مع Azure Monitor.

Azure Monitor يزيد من توفر وأداء تطبيقاتك وخدماتك من خلال تقديم حل شامل لجمع وتحليل والقياس من البيئات السحابية والأماكن.

في هذا البرنامج التعليمي، تتعلم كيفية:

  • تكوين تطبيق ويب باستخدام Azure Monitor
  • إرسال سجلات وحدة التحكم إلى Log Analytics
  • استخدام استعلامات السجل لتحديد أخطاء تطبيق الويب واستكشافها وإصلاحها

يمكنك اتباع الخطوات في هذا البرنامج التعليمي على macOS، Linux، Windows.

إذا لم يكن لديك اشتراك في Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.

المتطلبات الأساسية

لإكمال هذا البرنامج التعليمي، تحتاج إلى:

إنشاء موارد 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 App Service، يمكنك تكوين إمكانية المراقبة لاستكشاف أخطاء التطبيق وإصلاحها عند ظهور مشكلات. يعمل Azure Monitor على تخزين بيانات السجل في مساحة عمل Log Analytics. مساحة العمل هي حاوية تتضمن معلومات البيانات والتكوين.

في هذه الخطوة، يمكنك إنشاء مساحة عمل "Log Analytics" لتكوين Azure Monitor مع التطبيق الخاص بك.

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

إنشاء إعداد تشخيصي

يمكن استخدام إعدادات التشخيص لجمع مقاييس خدمات معينة من Azure في Azure Monitor Logs لتحليلها باستخدام بيانات مراقبة أخرى باستخدام استعلامات السجل. أما البرنامج التعليمي، فيمكنك تمكين خادم الويب وسجلات الإخراج/الخطأ القياسية. راجع أنواع السجلات المعتمدة للحصول على قائمة كاملة بأنواع السجلات والأوصاف.

يمكنك تشغيل الأوامر التالية لإنشاء إعدادات التشخيص لـ AppServiceConsoleLogs (الإخراج/الخطأ القياسي) وAppServiceHTTPLogs (سجلات خادم الويب). استبدل <app-name> و<workspace-name> بالقيم الخاصة بك.

إشعار

يعتبر أول أمرين، وهما resourceID وworkspaceID، متغيرين لاستخدامهما في الأمر az monitor diagnostic-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.

Click Tools and select Convert to PNG

حدد أول صورتين وانقر فوق convert. يتم تحويل هذا بنجاح.

Select the first two images

فصل التطبيق

الآن بعد أن تحققت من التطبيق عن طريق تحويل صورتين بنجاح، نحاول تحويل الصور الخمس الأولى.

Convert first five images

فشل هذا الإجراء وينتج HTTP 500 خطأ لم يتم اختباره أثناء التطوير.

The convert will result in a HTTP 500 error

استخدام استعلام السجل لعرض سجلات Azure Monitor

لنرى ما هي السجلات المتوفرة في مساحة عمل Log Analytics.

انقر فوق رابط مساحة عمل Log Analytics للوصول إلى مساحة العمل الخاصة بك في مدخل Microsoft Azure.

في مدخل Microsoft Azure، حدد مساحة عمل Log Analytics.

استعلامات السجل

تساعدك استعلامات السجل على تطبيق قيمة البيانات التي تم تجميعها في Azure Monitor Logs بشكلٍ كامل. يمكنك استخدام استعلامات السجل لتعريف السجلات في كل من AppServiceHTTPLogs وAppServiceConsoleLogs. راجع نظرة عامة على استعلامات السجل للحصول على مزيد من المعلومات حول استعلامات السجل.

راجع AppServiceHTTPLogs مع استعلام السجل

والآن بعد أن وصلنا إلى التطبيق، دعونا نستعرض البيانات المرتبطة بطلبات HTTP، الموجودة في AppServiceHTTPLogs.

  1. انقر فوق Logs من التنقل إلى اليسار.

Log Anlytics Worksace Logs

  1. ابحث عن appservice وانقر نقرًا مزدوجًا AppServiceHTTPLogs فوق.

Log analytics Workspace Tables

  1. انقر فوق Run .

Log Analytics Workspace App Service HTTP Logs

الاستعلام AppServiceHTTPLogs بإرجاع كافة الطلبات في الساعات الـ 24 الماضية. يحتوي العمود ScStatus على حالة HTTP. لتشخيص HTTP 500 الأخطاء، حدد ScStatus العدد حتى 500 ثم شغِّل الاستعلام، كما هو موضح أدناه:

AppServiceHTTPLogs
| where ScStatus == 500

عرض AppServiceConsoleLogs مع استعلام السجل

الآن بعد تأكيد HTTP 500s، دعونا نلقي نظرة على الإخراج القياسي/الأخطاء من التطبيق. تم العثور على هذه السجلات في '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 500s والأخطاء القياسية، تحتاج إلى تأكيد ما إذا كان هناك ارتباط بين هذه الرسائل. بعد ذلك، يمكنك ضم الجداول معًا استنادًا إلى الطابع الزمني، TimeGenerated.

إشعار

تم إعداد الاستعلام لك والذي ينفذ ما يلي:

  • تصفية HTTPLogs لـ 500 خطأ
  • سجلات وحدة تحكم الاستعلامات
  • انضم إلى الجداول على 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]، في متغير يحمل كافة JPGs (في الذاكرة) التي تحتاج إلى تحويل. ومع ذلك، imagepng يحتاج فقط الصورة التي تحول وليس كل الصور. لا تكون الصور المحملة مسبقًا ضرورية، وربما تسبب استنفاد الذاكرة، ما يؤدي إلى حدوث HTTP 500s. دعونا نحدث التعليمات البرمجية لتحميل الصور عند الطلب لمعرفة ما إذا كان هذا سيحل المشكلة. بعد ذلك، يمكنك تحسين التعليمات البرمجية لمعالجة مشكلة الذاكرة.

إصلاح التطبيق

إجراء تحديث محلي وإعادة نشر التعليمات البرمجية

إجراء التغييرات التالية 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.

PHP app running in Azure App Service

تنظيف الموارد

في الخطوات السابقة، أنشأت موارد Azure في إحدى مجموعات الموارد. إذا لم تتوقع احتياجك لهذه الموارد في المستقبل، فاحذف مجموعة الموارد من خلال تشغيل الأمر التالي في Cloud Shell:

az group delete --name myResourceGroup

ربما يستغرق الأمر بضع دقائق للتشغيل.

حذف إعداد التشخيص مع الأمر التالي:

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

ما تعلمته:

  • تكوين تطبيق ويب باستخدام Azure Monitor
  • سجلات مرسلة إلى Log Analytics
  • استخدام استعلامات السجل لتحديد أخطاء تطبيق الويب واستكشافها وإصلاحها

الخطوات التالية