مشاركة عبر


استخدام المراقبة والتشخيص مع قوالب Windows VM وAzure Resource Manager

يوفر ملحق Azure Diagnostics إمكانات المراقبة والتشخيص على جهاز Azure الظاهري المستند إلى Windows. يمكنك تمكين هذه الإمكانات على الجهاز الظاهري عن طريق تضمين الملحق كجزء من قالب Azure Resource Manager. راجع تأليف قوالب Azure Resource Manager باستخدام ملحقات الجهاز الظاهري للحصول على مزيد من المعلومات حول تضمين أي ملحق كجزء من قالب الجهاز الظاهري. توضح هذه المقالة كيف يمكنك إضافة ملحق Azure Diagnostics إلى قالب جهاز ظاهري Windows.

مهم

الترحيل من ملحق Azure Diagnostic

سيتم إهمال ملحق Azure Diagnostics في 31 مارس 2026. بعد هذا التاريخ، لن تقدم Microsoft دعما لملحق Azure Diagnostics.

لضمان استمرار الدعم والوصول إلى الميزات الجديدة، يجب عليك الترحيل من ملحقات Azure Diagnostics لنظام التشغيل Linux (LAD) وWindows (WAD) إلى Azure Monitor Agent، والذي يمكنه جمع نفس البيانات وإرسالها إلى وجهات متعددة بما في ذلك مساحات عمل Log Analytics وAzure Event Hubs وAzure Storage. قم بإزالة LAD أو WAD بعد تكوين عامل Azure Monitor لتجنب البيانات المكررة.

كبديل للتخزين، يجب إرسال البيانات إلى جدول يحتوي على الخطة المساعدة في مساحة عمل Log Analytics للتسجيل الفعال من حيث التكلفة.

للتحقق من الملحقات المثبتة على جهاز ظاهري واحد، حدد الملحقات + التطبيقات ضمن الإعدادات على الجهاز الظاهري الخاص بك. لمراجعة الملحقات المثبتة على جميع الأجهزة الظاهرية في الاشتراكات التي يمكنك الوصول إليها، استخدم الاستعلام التالي في Azure Resource Graph:

resources
| where type contains "extension"
| extend parsedProperties = parse_json(properties)
| extend publisher = tostring(parsedProperties.publisher)
| project-away parsedProperties
| where publisher == "Microsoft.Azure.Diagnostics"
| distinct id

ينتج عن هذا نتائج مشابهة لما يلي:

لقطة شاشة توضح نتائج نموذج استعلام Azure Resource Graph.

‏‫ملاحظة‬

جرب مساعدة VM للحصول على تشخيصات أسرع. نوصي بتشغيل مساعدة VM لويندوز أو VM Assist لنظام لينكس. تساعدك أدوات التشخيص المستندة إلى البرنامج النصي هذه على تحديد المشكلات الشائعة التي تؤثر على عامل ضيف جهاز Azure الظاهري وسلامة الجهاز الظاهري بشكل عام.

إذا كنت تواجه مشاكل في الأداء مع الأجهزة الافتراضية، قبل التواصل مع الدعم، قم بتشغيل هذه الأدوات.

إضافة ملحق 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 Diagnostics بشكل فريد.

يمكن استخدام قيمة خاصية الاسم للإشارة إلى الملحق في مجموعة الموارد. يتيح تعيينه على وجه التحديد على Microsoft.Insights.VMDiagnosticsSettings التعرف عليه بسهولة بواسطة مدخل Microsoft Azure، مما يضمن ظهور مخططات المراقبة بشكل صحيح في مدخل Microsoft Azure.

يحدد typeHandlerVersion إصدار الملحق الذي ترغب في استخدامه. يضمن تعيين الإصدار الثانوي autoUpgradeMinorVersion إلى true حصولك على أحدث إصدار ثانوي من الامتداد المتاح. يوصى بشدة بتعيين autoUpgradeMinorVersion دائما ليكون صحيحا دائما حتى تتمكن دائما من استخدام أحدث امتداد تشخيص متاح مع جميع الميزات الجديدة وإصلاحات الأخطاء.

يحتوي عنصر الإعدادات على خصائص تكوينات للملحق التي يمكن تعيينها وقراءتها مرة أخرى من الملحق (يشار إليها أحيانا باسم التكوين العام). تحتوي خاصية xmlcfg على تكوين يستند إلى xml لسجلات التشخيص وعدادات الأداء وما إلى ذلك التي يتم جمعها بواسطة عامل التشخيص. راجع مخطط تكوين التشخيص للحصول على مزيد من المعلومات حول مخطط xml نفسه. تتمثل إحدى الممارسات الشائعة في تخزين تكوين xml الفعلي كمتغير في قالب Azure Resource Manager ثم تسلسلها وترميزها base64 لتعيين قيمة xmlcfg. راجع القسم الخاص بمتغيرات تكوين التشخيص لفهم المزيد حول كيفية تخزين xml في المتغيرات. تحدد الخاصية storageAccount اسم حساب التخزين الذي يتم نقل بيانات التشخيص إليه.

يمكن تعيين الخصائص الموجودة في protectedSettings (يشار إليها أحيانا باسم التكوين الخاص) ولكن لا يمكن قراءتها مرة أخرى بعد تعيينها. إن طبيعة الكتابة فقط للإعدادات المحمية تجعله مفيدا لتخزين الأسرار مثل مفتاح حساب التخزين حيث تتم كتابة بيانات التشخيص.

تحديد حساب تخزين التشخيص كمعلمات

يفترض مقتطف json لملحق التشخيص أعلاه معلمتين موجودتين: diagnosticsStorageAccountNameو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')))]",

تشير قيمة التجميع القياسي ل PT1M و PT1H إلى التجميع على مدى دقيقة والتجميع على مدار ساعة ، على التوالي.

جداول WADMetrics في التخزين

ينشئ تكوين المقاييس أعلاه جداول في حساب تخزين بيانات التشخيص باستخدام اصطلاحات التسمية التالية:

  • WADMetrics: بادئة قياسية لجميع جداول WADMetrics
  • PT1H أو PT1M: يشير إلى أن الجدول يحتوي على بيانات مجمعة على مدار ساعة واحدة أو دقيقة واحدة
  • P10D: يشير إلى أن الجدول يحتوي على بيانات لمدة 10 أيام من وقت بدء الجدول في جمع البيانات
  • V2S: سلسلة ثابتة
  • yyyymmdd: التاريخ الذي بدأ فيه الجدول في جمع البيانات

مثال: يحتوي WADMetricsPT1HP10DV2S20151108 على بيانات مقاييس مجمعة على مدار ساعة لمدة 10 أيام بدءا من 11-Nov-2015

يحتوي كل جدول WADMetrics على الأعمدة التالية:

  • PartitionKey: يتم إنشاء مفتاح القسم استنادا إلى قيمة resourceID لتحديد مورد الجهاز الظاهري بشكل فريد. على سبيل المثال: 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.
  • الحد الأقصى: القيمة القصوى لعداد الأداء خلال فترة التجميع.
  • الحد الأدنى: الحد الأدنى لقيمة عداد الأداء خلال فترة التجميع.
  • الإجمالي: مجموع جميع قيم عداد الأداء التي تم الإبلاغ عنها خلال فترة التجميع.
  • العدد: إجمالي عدد القيم التي تم الإبلاغ عنها لعداد الأداء.
  • المتوسط: متوسط القيمة (الإجمالي/العدد) لعداد الأداء خلال فترة التجميع.

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