استخدام المراقبة والتشخيصات مع جهاز ظاهري بنظام التشغيل Windows وقوالب Azure Resource Manager
يوفر ملحق Azure Diagnostics إمكانات المراقبة والتشخيص على جهاز Azure ظاهري يستند إلى Windows. يمكنك تمكين هذه الإمكانات على الجهاز الظاهري عن طريق تضمين الملحق كجزء من قالب Azure Resource Manager. راجع تأليف قوالب Azure Resource Manager باستخدام ملحقات الأجهزة الظاهرية للحصول على مزيد من المعلومات حول تضمين أي ملحق كجزء من قالب الجهاز الظاهري. توضح هذه المقالة كيفية إضافة ملحق Azure Diagnostics إلى قالب جهاز ظاهري يعمل بنظام التشغيل Windows.
إضافة ملحق Azure Diagnostics إلى تعريف مورد الجهاز الظاهري
لتمكين ملحق التشخيص على جهاز ظاهري بنظام Windows، تحتاج إلى إضافة الملحق كمورد الجهاز الظاهري في قالب Resource Manager.
بالنسبة إلى جهاز ظاهري بسيط يستند إلى Resource Manager، أضف تكوين الملحق إلى صفيف الموارد للجهاز الظاهري:
"resources": [
{
"name": "Microsoft.Insights.VMDiagnosticsSettings",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2015-06-15",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
],
"tags": {
"displayName": "AzureDiagnostics"
},
"properties": {
"publisher": "Microsoft.Azure.Diagnostics",
"type": "IaaSDiagnostics",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {
"xmlCfg": "[base64(concat(variables('wadcfgxstart'), variables('wadmetricsresourceid'), variables('vmName'), variables('wadcfgxend')))]",
"storageAccount": "[parameters('existingdiagnosticsStorageAccountName')]"
},
"protectedSettings": {
"storageAccountName": "[parameters('existingdiagnosticsStorageAccountName')]",
"storageAccountKey": "[listkeys(variables('accountid'), '2015-05-01-preview').key1]",
"storageAccountEndPoint": "https://core.windows.net"
}
}
}
]
هناك اتفاقية شائعة أخرى تتمثل في إضافة تكوين الملحق في عقدة الموارد الجذرية للقالب بدلاً من تعريفه ضمن عقدة موارد الجهاز الظاهري. باستخدام هذا النهج، يجب عليك تحديد علاقة هرمية بين الملحق والجهاز الظاهري بشكل صريح مع قيم الاسم والنوع. على سبيل المثال:
"name": "[concat(variables('vmName'),'Microsoft.Insights.VMDiagnosticsSettings')]",
"type": "Microsoft.Compute/virtualMachines/extensions",
يرتبط الملحق دائماً بالجهاز الظاهري، ويمكنك إما تعريفه مباشرة ضمن عقدة موارد الجهاز الظاهري مباشرة، أو تعريفه على المستوى الأساسي واستخدام اصطلاح التسمية الهرمي لربطه بالجهاز الظاهري.
بالنسبة إلى مجموعات مقياس الجهاز الظاهري، يتم تحديد تكوين الملحقات في الخاصية extensionProfile الخاصة بـ VirtualMachineProfile.
تقوم خاصية الناشر بقيمة Microsoft.Azure.Diagnostics وخاصية النوع بقيمة IaaSDiagnostics بتعريف ملحق تشخيصات Azure بشكل فريد.
يمكن استخدام قيمة خاصية الاسم للإشارة إلى الملحق في مجموعة الموارد. يتيح تعيينه على وجه التحديد إلى Microsoft.Insights.VMDiagnosticsSettings التعرف عليه بسهولة بواسطة مدخل Microsoft Azure؛ ما يضمن ظهور مخططات المراقبة بشكل صحيح في مدخل Microsoft Azure.
يحدد typeHandlerVersion إصدار الملحق الذي ترغب في استخدامه. يضمن تعيين الإصدار الثانوي autoUpgradeMinorVersion إلى "true" حصولك على أحدث إصدار ثانوي من الملحق المتاح. يوصى بشدة بتعيين autoUpgradeMinorVersion دائما ليكون صحيحا بحيث تحصل دائما على أحدث ملحق تشخيص متوفر مع جميع الميزات الجديدة وإصلاحات الأخطاء.
يحتوي عنصر الإعدادات على خصائص تكوينات للملحق يمكن تعيينها وقراءتها مرة أخرى من الملحق (يُشار إليها أحياناً باسم التكوين العام). تحتوي الخاصية xmlcfg على تكوين يستند إلى xml لسجلات التشخيص وعدادات الأداء وما إلى ذلك التي يتم جمعها بواسطة عامل التشخيص. راجع مخطط تكوين التشخيصات لمزيد من المعلومات حول مخطط xml نفسه. من الممارسات الشائعة، تخزين تكوين xml الفعلي كمتغير في قالب Azure Resource Manager ثم تسلسلها وترميزها base64 لتعيين قيمة xmlcfg. راجع القسم متغيرات تكوين التشخيصات لفهم المزيد حول كيفية تخزين xml في المتغيرات. تحدد الخاصية storageAccount اسم حساب التخزين الذي يتم نقل بيانات التشخيصات إليه.
يمكن تعيين الخصائص في protectedSettings (يشار إليها أحيانا باسم التكوين الخاص) ولكن لا يمكن قراءتها مرة أخرى بعد تعيينها. إن طبيعة الكتابة فقط لـ protectedSettings تجعلها مفيدة لتخزين البيانات السرية مثل مفتاح حساب التخزين حيث تتم كتابة بيانات التشخيصات.
تحديد حساب تخزين التشخيصات كمعلمات
يفترض مقتطف json الخاص بملحق التشخيصات أعلاه معلمتين existingdiagnosticsStorageAccountName وexistingdiagnosticsStorageResourceGroup لتحديد حساب تخزين التشخيصات حيث يتم تخزين بيانات التشخيصات. يؤدي تحديد حساب تخزين التشخيصات كمعلمة إلى تسهيل تغييره عبر بيئات مختلفة، على سبيل المثال قد ترغب في استخدام حساب تخزين تشخيصات مختلف للاختبار وحساب مختلف لتوزيع الإنتاج.
"existingdiagnosticsStorageAccountName": {
"type": "string",
"metadata": {
"description": "The name of an existing storage account to which diagnostics data is transfered."
}
},
"existingdiagnosticsStorageResourceGroup": {
"type": "string",
"metadata": {
"description": "The resource group for the storage account specified in existingdiagnosticsStorageAccountName"
}
}
من أفضل الممارسات تحديد حساب تخزين تشخيص في مجموعة موارد مختلفة عن مجموعة الموارد للجهاز الظاهري. يمكن اعتبار مجموعة الموارد وحدة توزيع لها مدة بقاء خاصة بها، ويمكن توزيع جهاز ظاهري وإعادة توزيعه عند إجراء تحديثات تكوينات جديدة له، ولكن قد ترغب في الاستمرار في تخزين بيانات التشخيصات في نفس حساب التخزين عبر عمليات توزيع الجهاز الظاهري هذه. إن وجود حساب التخزين في مورد مختلف يُمكّن حساب التخزين من قبول البيانات من عمليات توزيع الأجهزة الظاهرية المختلفة؛ ما يسهل استكشاف المشكلات وإصلاحها عبر الإصدارات المختلفة.
إشعار
إذا قمت بإنشاء قالب جهاز ظاهري يعمل بنظام التشغيل Windows من Visual Studio، فقد يتم تعيين حساب التخزين الافتراضي لاستخدام نفس حساب التخزين حيث يتم تحميل VHD للجهاز الظاهري. هذا هو تبسيط الإعداد الأولي للجهاز الظاهري. أعد هيكلة القالب لاستخدام حساب تخزين مختلف يمكن تمريره كمعلمة.
متغيرات تكوين التشخيصات
يحدد مقتطف json السابق لملحق التشخيصات متغير accountid لتبسيط الحصول على مفتاح حساب التخزين لتخزين التشخيصات:
"accountid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/',parameters('existingdiagnosticsStorageResourceGroup'), '/providers/','Microsoft.Storage/storageAccounts/', parameters('existingdiagnosticsStorageAccountName'))]"
يتم تحديد الخاصية xmlcfg لملحق التشخيصات باستخدام متغيرات متعددة متسلسلة معاً. قيم هذه المتغيرات موجودة في xml؛ لذا يجب تخطيها بشكل صحيح عند تعيين متغيرات json.
يصف المثال التالي xml لتكوين التشخيصات الذي يجمع عدّادات الأداء القياسية على مستوى النظام جنباً إلى جنب مع بعض سجلات أحداث Windows وسجلات البنية الأساسية للتشخيصات. تم تخطيها وتنسيقها بشكل صحيح بحيث يمكن لصق التكوين مباشرة في قسم المتغيرات في القالب الخاص بك. راجع مخطط تكوين التشخيصات للحصول على مثال قابل للقراءة البشرية أكثر عن التكوين xml.
"wadlogs": "<WadCfg> <DiagnosticMonitorConfiguration overallQuotaInMB=\"4096\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration\"> <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter=\"Error\"/> <WindowsEventLog scheduledTransferPeriod=\"PT1M\" > <DataSource name=\"Application!*[System[(Level = 1 or Level = 2)]]\" /> <DataSource name=\"Security!*[System[(Level = 1 or Level = 2)]]\" /> <DataSource name=\"System!*[System[(Level = 1 or Level = 2)]]\" /></WindowsEventLog>",
"wadperfcounters1": "<PerformanceCounters scheduledTransferPeriod=\"PT1M\"><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% Processor Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU utilization\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% Privileged Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU privileged time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% User Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU user time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor Information(_Total)\\Processor Frequency\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"CPU frequency\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\System\\Processes\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Processes\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Thread Count\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Threads\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Handle Count\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Handles\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\% Committed Bytes In Use\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Memory usage\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Available Bytes\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory available\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Committed Bytes\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory committed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Commit Limit\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory commit limit\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active time\" locale=\"en-us\"/></PerformanceCounterConfiguration>",
"wadperfcounters2": "<PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Read Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active read time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Write Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active write time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Transfers/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Reads/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk read operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Writes/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk write operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Read Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk read speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Write Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk write speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\LogicalDisk(_Total)\\% Free Space\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk free space (percentage)\" locale=\"en-us\"/></PerformanceCounterConfiguration></PerformanceCounters>",
"wadcfgxstart": "[concat(variables('wadlogs'), variables('wadperfcounters1'), variables('wadperfcounters2'), '<Metrics resourceId=\"')]",
"wadmetricsresourceid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name , '/providers/', 'Microsoft.Compute/virtualMachines/')]",
"wadcfgxend": "\"><MetricAggregation scheduledTransferPeriod=\"PT1H\"/><MetricAggregation scheduledTransferPeriod=\"PT1M\"/></Metrics></DiagnosticMonitorConfiguration></WadCfg>"
تعد عقدة xml لتعريف المقاييس في التكوين أعلاه عنصر تكوين مهماً؛ لأنها تحدد كيفية تجميع عدّادات الأداء المحددة مسبقاً في xml في العقدة PerformanceCounter وتخزينها.
هام
تقود هذه المقاييس مخططات المراقبة والتنبيهات في مدخل Microsoft Azure. يجب تضمين عقدة المقاييس مع resourceID وMetricAggregation في تكوين التشخيصات للجهاز الظاهري إذا كنت تريد رؤية بيانات مراقبة الجهاز الظاهري في مدخل Microsoft Azure.
يوضح المثال التالي xml لتعريفات المقاييس:
<Metrics resourceId="/subscriptions/subscription().subscriptionId/resourceGroups/resourceGroup().name/providers/Microsoft.Compute/virtualMachines/vmName">
<MetricAggregation scheduledTransferPeriod="PT1H"/>
<MetricAggregation scheduledTransferPeriod="PT1M"/>
</Metrics>
تحدد السمة resourceID الجهاز الظاهري في اشتراكك بشكل فريد. تأكد من استخدام وظائف subscription() وresourceGroup() بحيث يقوم القالب تلقائيا بتحديث هذه القيم استنادا إلى الاشتراك ومجموعة الموارد التي تقوم بالنشر إليها.
إذا كنت تقوم بإنشاء أجهزة ظاهرية متعددة في حلقة، يجب عليك ملء قيمة resourceID بوظيفة copyIndex() للتمييز بشكل صحيح بين كل جهاز ظاهري فردي. يمكن تحديث قيمة xmlCfg لدعم ذلك على النحو التالي:
"xmlCfg": "[base64(concat(variables('wadcfgxstart'), variables('wadmetricsresourceid'), concat(parameters('vmNamePrefix'), copyindex()), variables('wadcfgxend')))]",
تشير قيمة MetricAggregation لـ PT1M وPT1H إلى تجميع على مدار دقيقة وتجميع على مدار ساعة، على التوالي.
جداول WADMetrics في التخزين
ينشئ تكوين المقاييس أعلاه جداول في حساب تخزين التشخيصات باستخدام اصطلاحات التسمية التالية:
- WADMetrics: بادئة قياسية لجميع جداول WADMetrics
- PT1H أو PT1M: تشير إلى أن الجدول يحتوي على بيانات مجمعة على مدار ساعة واحدة أو دقيقة واحدة
- P10D: يشير إلى أن الجدول يحتوي على بيانات لمدة 10 أيام من وقت بدء الجدول في جمع البيانات
- V2S: سلسلة ثابتة
- yyyymmdd: تاريخ بدء الجدول في جمع البيانات
مثال: يحتوي WADMetricsPT1HP10DV2S20151108 على بيانات مقاييس مجمعة على مدار ساعة لمدة 10 أيام بدءاً من 11 نوفمبر 2015
يحتوي جدول WADMetrics على الأعمدة التالية:
- PartitionKey: يتم إنشاء مفتاح القسم استناداً إلى قيمة resourceID لتحديد مورد VM بشكل فريد. على سبيل المثال:
002Fsubscriptions:<subscriptionID>:002FresourceGroups:002F<ResourceGroupName>:002Fproviders:002FMicrosoft:002ECompute:002FvirtualMachines:002F<vmName>
- RowKey: يتبع التنسيق
<Descending time tick>:<Performance Counter Name>
. حساب علامة الوقت التنازلي هو الحد الأقصى للعلامات الزمنية مطروحاً منها وقت بداية فترة التجميع. على سبيل المثال، إذا بدأت فترة العينة في 10 نوفمبر 2015 والساعة 00:00 بالتوقيت العالمي المنسق، فسيكون الحساب:DateTime.MaxValue.Ticks - (new DateTime(2015,11,10,0,0,0,DateTimeKind.Utc).Ticks)
. بالنسبة لأداء وحدات البايت المتوفرة للذاكرة، يبدو عداد مفتاح الصف كما يلي:2519551871999999999__:005CMemory:005CAvailable:0020Bytes
- CounterName: هو اسم عدّاد الأداء. يتطابق هذا مع counterSpecifier المعرّف في تكوين xml.
- الحد الأقصى: القيمة القصوى لعدّاد الأداء خلال فترة التجميع.
- الحد الأدنى: الحد الأدنى لقيمة عدّاد الأداء خلال فترة التجميع.
- الإجمالي: مجموع كافة قيم عدّاد الأداء التي تم الإبلاغ عنها خلال فترة التجميع.
- العدد: إجمالي عدد القيم التي تم الإبلاغ عنها لعدّاد الأداء.
- المتوسط: متوسط (الإجمالي/العدد) قيمة عدّاد الأداء خلال فترة التجميع.
الخطوات التالية
- للحصول على نموذج قالب كامل لجهاز ظاهري بنظام Windows مع ملحق تشخيصات، راجع vm-monitoring-diagnostics-extension
- توزيع قالب Azure Resource Manager باستخدام Azure PowerShell أو Azure Command Line
- تعرف على المزيد حول تأليف قوالب Azure Resource Manager