مشاركة عبر


الاستعلام عن بيانات الخريطة من VM Insights

عند تمكين العمليات والتبعيات، في نتائج تحليلات الجهاز الظاهري، يتم جمع بيانات مخزون الكمبيوتر والعمليات لدعم ميزة الخريطة. بالإضافة إلى تحليل هذه البيانات باستخدام الخريطة، يمكنك الاستعلام عنها مباشرة باستخدام Log Analytics. توضح هذه المقالة البيانات المتوفرة وتوفر نماذج من الاستعلامات.

تجمع VM Insights مقاييس الأداء والاتصال وبيانات المخزون للكمبيوتر والعملية ومعلومات الحالة الصحية وتحيلها إلى مساحة عمل Log Analytics في Azure Monitor. هذه البيانات متاحة للاستعلام في Azure Monitor. يمكنك تطبيق هذه البيانات على السيناريوهات التي تتضمن التخطيط للترحيل، وتحليل السعة، والاكتشاف، واستكشاف أخطاء الأداء، وإصلاحها عند الطلب.

هام

يجب أن يكون لديك عمليات وتبعيات ممكنة ل VM insights للجداول التي تمت مناقشتها في هذه المقالة ليتم إنشاؤها.

تعيين السجلات

يتم إنشاء سجل واحد في الساعة لكل كمبيوتر ومعالجة فريدة بالإضافة إلى السجلات التي يتم إنشاؤها عند بدء عملية أو كمبيوتر أو إضافتها إلى VM Insights. تعين الحقول والقيم في جدول VMComputer إلى حقول مورد الجهاز في ServiceMap Azure Resource Manager API. تعين الحقول والقيم في جدول VMProcess إلى حقول مورد العملية في ServiceMap Azure Resource Manager API. يتطابق _ResourceId الحقل مع حقل الاسم في مورد Resource Manager المقابل.

توجد خصائص تم إنشاؤها داخليًا يمكنك استخدامها لتعريف العمليات وأجهزة الكمبيوتر الفريدة:

  • الكمبيوتر: استخدم _ResourceId لتعريف جهاز كمبيوتر بشكل فريد في مساحة عمل Log Analytics.
  • العملية: استخدم _ResourceId لتحديد عملية في مساحة عمل Log Analytics بشكل فريد.

نظرًا لأنه من الممكن أن توجد العديد من السجلات لعملية محددة وجهاز كمبيوتر محدد خلال نطاق زمني محدد، يمكن أن ينتج عن الاستعلامات أكثر من سجل واحد لنفس الكمبيوتر أو العملية. لتضمين أحدث سجل فقط، أضف | summarize arg_max(TimeGenerated, *) by ResourceId إلى الاستعلام.

التوصيلات والمنافذ

يوفر VMConnection وVMBoundPort معلومات حول الاتصالات للجهاز (الواردة والصادرة) ومنافذ الخادم المفتوحة/النشطة عليها. كما يتم عرض مقاييس الاتصال عبر واجهات برمجة التطبيقات التي توفر الوسائل للحصول على مقياس معين خلال فترة زمنية. اتصالات TCP الناتجة عن القبول على مأخذ توصيل الاستماع واردة، بينما الاتصالات التي تم إنشاؤها عن طريق الاتصال ب IP معين والمنفذ صادرة. Direction تمثل الخاصية اتجاه الاتصال، والذي يمكن تعيينه إلى أو inbound outbound.

يتم إنشاء السجلات في هذه الجداول من البيانات التي أبلغ عنها عامل التبعية. يمثل كل سجل ملاحظة خلال فترة زمنية مدتها دقيقة واحدة. TimeGenerated تشير الخاصية إلى بداية الفاصل الزمني. يحتوي كل سجل على معلومات لتحديد الكيان المعني، أي الاتصال أو المنفذ، والمقاييس المقترنة بهذا الكيان. يتم حاليًا الإبلاغ فقط عن نشاط الشبكة الذي يُنفذ باستخدام بروتوكول التحكم في الإرسال (TCP) عبر IPv4.

لإدارة التكلفة والتعقيد، لا تمثل سجلات الاتصال اتصالات الشبكة الفعلية الفردية. يتم تجميع الاتصالات المتعددة للشبكة الفعلية في اتصال منطقي، والذي ينعكس بعد ذلك في الجدول المعني. بمعنى، تمثل السجلات في VMConnection الجدول تجميعا منطقيا وليس الاتصالات المادية الفردية التي تتم ملاحظتها. يتم تجميع اتصال الشبكة الفعلي الذي يشارك نفس القيمة للسمات التالية أثناء فاصل زمني معين مدته دقيقة واحدة، في سجل منطقي واحد في VMConnection.

المقاييس

يتضمن VMConnection وVMBoundPort بيانات قياسية مع معلومات حول حجم البيانات المرسلة والمستلمة على اتصال منطقي معين أو منفذ شبكة (BytesSent، BytesReceived). يتم تضمين أيضا وقت الاستجابة، وهو المدة التي ينتظرها المتصل حتى تتم معالجة طلب تم إرساله عبر اتصال والاستجابة له بواسطة نقطة النهاية البعيدة (ResponseTimeMax، ResponseTimeMin، ). ResponseTimeSum وقت الاستجابة المُبلّغ عنه هو تقدير لوقت الاستجابة الحقيقي الذي يستغرقه بروتوكول التطبيق الأساسي. يتم حسابها باستخدام الأساليب الإرشادية استنادا إلى مراقبة تدفق البيانات بين المصدر والوجهة لاتصال شبكة فعلية. من الناحية المفاهيمية، إنه الفرق بين الوقت الذي يترك فيه البايت الأخير من الطلب المرسل، والوقت الذي يصل فيه البايت الأخير من الاستجابة إليه. يُستخدم هذان الطابعان الزمنيان لتحديد أحداث الطلب والاستجابة على اتصال فعلي معين. يمثل الفرق بينهما وقت استجابة طلب واحد.

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

وتشمل بعض النقاط الهامة التي يجب مراعاتها ما يلي:

  1. إذا قبلت عملية الاتصالات على نفس عنوان IP ولكن عبر واجهات شبكة متعددة، يتم الإبلاغ عن سجل منفصل لكل واجهة.
  2. لا تحتوي السجلات ذات عنوان IP لحرف البدل على أي نشاط. يتم تضمينها لتمثيل حقيقة أن منفذا على الجهاز مفتوح لنسبة استخدام الشبكة الواردة.
  3. لتقليل الإسهاب وحجم البيانات، يتم حذف السجلات ذات عنوان IP لحرف البدل عندما يكون هناك سجل مطابق (لنفس العملية والمنفذ والبروتوكول) بعنوان IP محدد. عند حذف سجل IP لحرف بدل، IsWildcardBind يتم تعيين خاصية السجل مع عنوان IP المحدد للإشارة إلى True أن المنفذ يتعرض عبر كل واجهة من جهاز إعداد التقارير.
  4. تم IsWildcardBind تعيين المنافذ المرتبطة فقط على واجهة معينة إلى False.

التسمية والتصنيف

للراحة، يتم تضمين عنوان IP للنهاية البعيدة للاتصال في الخاصية RemoteIp . بالنسبة للاتصالات الواردة، RemoteIp هي نفسها SourceIp، بينما بالنسبة للاتصالات الصادرة، فهي مماثلة DestinationIpل . RemoteDnsCanonicalNames تمثل الخاصية أسماء DNS المتعارف عليها التي أبلغ عنها الجهاز ل RemoteIp. RemoteDnsQuestions تمثل الخاصية أسئلة DNS التي أبلغ عنها الجهاز ل RemoteIp. RemoveClassification الخاصية محجوزة للاستخدام في المستقبل.

عنوان IP ضار

يتم التحقق من كل RemoteIp خاصية في VMConnection الجدول مقابل مجموعة من عناوين IP ذات النشاط الضار المعروف. RemoteIp إذا تم تعريف على أنه ضار، يتم ملء الخصائص التالية. إذا لم يعتبر IP ضارا، تكون الخصائص فارغة.

  • MaliciousIp
  • IndicatorThreadType
  • Description
  • TLPLevel
  • Confidence
  • Severity
  • FirstReportedDateTime
  • LastReportedDateTime
  • IsActive
  • ReportReferenceLink
  • AdditionalInformation

نماذج استعلامات الخريطة

سرد جميع الأجهزة المعروفة

VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId

متى تمت إعادة تشغيل الجهاز الظاهري آخر جهاز ظاهري

let Today = now(); VMComputer | extend DaysSinceBoot = Today - BootTime | summarize by Computer, DaysSinceBoot, BootTime | sort by BootTime asc

ملخص أجهزة Azure الظاهرية حسب الصورة والموقع وSKU

VMComputer | where AzureLocation != "" | summarize by Computer, AzureImageOffering, AzureLocation, AzureImageSku

سرد سعة الذاكرة الفعلية لجميع أجهزة الكمبيوتر المدارة

VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project PhysicalMemoryMB, Computer

سرد اسم الكمبيوتر وDNS وIP ونظام التشغيل

VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project Computer, OperatingSystemFullName, DnsNames, Ipv4Addresses

البحث عن جميع العمليات باستخدام "sql" في سطر الأوامر

VMProcess | where CommandLine contains_cs "sql" | summarize arg_max(TimeGenerated, *) by _ResourceId

البحث عن جهاز (أحدث سجل) حسب اسم المورد

search in (VMComputer) "m-4b9c93f9-bc37-46df-b43c-899ba829e07b" | summarize arg_max(TimeGenerated, *) by _ResourceId

البحث عن جهاز (أحدث سجل) حسب عنوان IP

search in (VMComputer) "10.229.243.232" | summarize arg_max(TimeGenerated, *) by _ResourceId

سرد جميع العمليات المعروفة على جهاز محدد

VMProcess | where Machine == "m-559dbcd8-3130-454d-8d1d-f624e57961bc" | summarize arg_max(TimeGenerated, *) by _ResourceId

سرد جميع أجهزة الكمبيوتر التي تعمل على SQL Server

VMComputer | where AzureResourceName in ((search in (VMProcess) "*sql*" | distinct Machine)) | distinct Computer

سرد جميع إصدارات المنتجات الفريدة من curl في مركز البيانات الخاص بي

VMProcess | where ExecutableName == "curl" | distinct ProductVersion

وحدات البايت المرسلة والاتجاهات المستلمة

VMConnection | summarize sum(BytesSent), sum(BytesReceived) by bin(TimeGenerated,1hr), Computer | order by Computer desc | render timechart

الأجهزة الظاهرية ل Azure التي ترسل أكبر عدد من وحدات البايت

VMConnection | join kind=fullouter(VMComputer) on $left.Computer == $right.Computer | summarize count(BytesSent) by Computer, AzureVMSize | sort by count_BytesSent desc

ربط اتجاهات الحالة

VMConnection | where TimeGenerated >= ago(24hr) | where Computer == "acme-demo" | summarize dcount(LinksEstablished), dcount(LinksLive), dcount(LinksFailed), dcount(LinksTerminated) by bin(TimeGenerated, 1h) | render timechart

اتجاه فشل الاتصال

VMConnection | where Computer == "acme-demo" | extend bythehour = datetime_part("hour", TimeGenerated) | project bythehour, LinksFailed | summarize failCount = count() by bythehour | sort by bythehour asc | render timechart

المنافذ المنضمة

VMBoundPort
| where TimeGenerated >= ago(24hr)
| where Computer == 'admdemo-appsvr'
| distinct Port, ProcessName

عدد المنافذ المفتوحة عبر الأجهزة

VMBoundPort
| where Ip != "127.0.0.1"
| summarize by Computer, Machine, Port, Protocol
| summarize OpenPorts=count() by Computer, Machine
| order by OpenPorts desc

تسجيل العمليات في مساحة العمل الخاصة بك حسب عدد المنافذ المفتوحة

VMBoundPort
| where Ip != "127.0.0.1"
| summarize by ProcessName, Port, Protocol
| summarize OpenPorts=count() by ProcessName
| order by OpenPorts desc

السلوك التجميعي لكل منفذ

يمكن بعد ذلك استخدام هذا الاستعلام لتسجيل المنافذ حسب النشاط، على سبيل المثال، المنافذ التي بها معظم حركة المرور الواردة/الصادرة أو المنافذ التي بها معظم الاتصالات.

VMBoundPort
| where Ip != "127.0.0.1"
| summarize BytesSent=sum(BytesSent), BytesReceived=sum(BytesReceived), LinksEstablished=sum(LinksEstablished), LinksTerminated=sum(LinksTerminated), arg_max(TimeGenerated, LinksLive) by Machine, Computer, ProcessName, Ip, Port, IsWildcardBind
| project-away TimeGenerated
| order by Machine, Computer, Port, Ip, ProcessName

تلخيص الاتصالات الصادرة من مجموعة من الأجهزة

// the machines of interest
let machines = datatable(m: string) ["m-82412a7a-6a32-45a9-a8d6-538354224a25"];
// map of ip to monitored machine in the environment
let ips=materialize(VMComputer
| summarize ips=makeset(todynamic(Ipv4Addresses)) by MonitoredMachine=AzureResourceName
| mvexpand ips to typeof(string));
// all connections to/from the machines of interest
let out=materialize(VMConnection
| where Machine in (machines)
| summarize arg_max(TimeGenerated, *) by ConnectionId);
// connections to localhost augmented with RemoteMachine
let local=out
| where RemoteIp startswith "127."
| project ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol, RemoteIp, RemoteMachine=Machine;
// connections not to localhost augmented with RemoteMachine
let remote=materialize(out
| where RemoteIp !startswith "127."
| join kind=leftouter (ips) on $left.RemoteIp == $right.ips
| summarize by ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol, RemoteIp, RemoteMachine=MonitoredMachine);
// the remote machines to/from which we have connections
let remoteMachines = remote | summarize by RemoteMachine;
// all augmented connections
(local)
| union (remote)
//Take all outbound records but only inbound records that come from either //unmonitored machines or monitored machines not in the set for which we are computing dependencies.
| where Direction == 'outbound' or (Direction == 'inbound' and RemoteMachine !in (machines))
| summarize by ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol, RemoteIp, RemoteMachine
// identify the remote port
| extend RemotePort=iff(Direction == 'outbound', DestinationPort, 0)
// construct the join key we'll use to find a matching port
| extend JoinKey=strcat_delim(':', RemoteMachine, RemoteIp, RemotePort, Protocol)
// find a matching port
| join kind=leftouter (VMBoundPort 
| where Machine in (remoteMachines) 
| summarize arg_max(TimeGenerated, *) by PortId 
| extend JoinKey=strcat_delim(':', Machine, Ip, Port, Protocol)) on JoinKey
// aggregate the remote information
| summarize Remote=makeset(iff(isempty(RemoteMachine), todynamic('{}'), pack('Machine', RemoteMachine, 'Process', Process1, 'ProcessName', ProcessName1))) by ConnectionId, Direction, Machine, Process, ProcessName, SourceIp, DestinationIp, DestinationPort, Protocol

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