البرنامج التعليمي: استكشاف أخطاء تطبيق 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 مجاني قبل أن تبدأ.
المتطلبات الأساسية
لإكمال هذا البرنامج التعليمي، تحتاج إلى:
استخدم بيئة Bash في Azure Cloud Shell. لمزيد من المعلومات، راجع التشغيل السريع ل Bash في Azure Cloud Shell.
إذا كنت تفضل تشغيل أوامر مرجع CLI محلياً قم بتثبيت CLI Azure. إذا كنت تعمل على نظام تشغيل Windows أو macOS، ففكر في تشغيل Azure CLI في حاوية Docker. لمزيد من المعلومات، راجع كيفية تشغيل Azure CLI في حاوية Docker.
إذا كنت تستخدم تثبيت محلي، يُرجى تسجيل الدخول إلى Azure CLI مستخدمًا أمر az login. لإنهاء عملية المصادقة، اتبع الخطوات المعروضة في جهازك. للحصول على خيارات أخرى لتسجيل دخول، راجع تسجيل الدخول باستخدام Azure CLI.
عندما يُطلب منك، قم بتثبيت ملحق Azure CLI عند الاستخدام لأول مرة. لمزيد من المعلومات بشأن الامتدادات، راجع استخدام امتدادات مع Azure CLI.
يُرجى تشغيل إصدار az للوصول إلى الإصدار والمكتبات التابعة التي تم تثبيتها. للتحديث لآخر إصدار، يُرجى تشغيل تحديث az.
إنشاء موارد 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
.
حدد أول صورتين وانقر فوق convert
. يتم تحويل هذا بنجاح.
فصل التطبيق
الآن بعد أن تحققت من التطبيق عن طريق تحويل صورتين بنجاح، نحاول تحويل الصور الخمس الأولى.
فشل هذا الإجراء وينتج HTTP 500
خطأ لم يتم اختباره أثناء التطوير.
استخدام استعلام السجل لعرض سجلات Azure Monitor
لنرى ما هي السجلات المتوفرة في مساحة عمل Log Analytics.
انقر فوق رابط مساحة عمل Log Analytics للوصول إلى مساحة العمل الخاصة بك في مدخل Microsoft Azure.
في مدخل Microsoft Azure، حدد مساحة عمل Log Analytics.
استعلامات السجل
تساعدك استعلامات السجل على تطبيق قيمة البيانات التي تم تجميعها في Azure Monitor Logs بشكلٍ كامل. يمكنك استخدام استعلامات السجل لتعريف السجلات في كل من AppServiceHTTPLogs وAppServiceConsoleLogs. راجع نظرة عامة على استعلامات السجل للحصول على مزيد من المعلومات حول استعلامات السجل.
راجع AppServiceHTTPLogs مع استعلام السجل
والآن بعد أن وصلنا إلى التطبيق، دعونا نستعرض البيانات المرتبطة بطلبات HTTP، الموجودة في AppServiceHTTPLogs
.
- انقر فوق
Logs
من التنقل إلى اليسار.
- ابحث عن
appservice
وانقر نقرًا مزدوجًاAppServiceHTTPLogs
فوق.
- انقر فوق
Run
.
الاستعلام 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.
تنظيف الموارد
في الخطوات السابقة، أنشأت موارد Azure في إحدى مجموعات الموارد. إذا لم تتوقع احتياجك لهذه الموارد في المستقبل، فاحذف مجموعة الموارد من خلال تشغيل الأمر التالي في Cloud Shell:
az group delete --name myResourceGroup
ربما يستغرق الأمر بضع دقائق للتشغيل.
حذف إعداد التشخيص مع الأمر التالي:
az monitor diagnostic-settings delete --resource $resourceID -n myMonitorLogs
ما تعلمته:
- تكوين تطبيق ويب باستخدام Azure Monitor
- سجلات مرسلة إلى Log Analytics
- استخدام استعلامات السجل لتحديد أخطاء تطبيق الويب واستكشافها وإصلاحها