共用方式為


從 VM Insights 查詢對應數據

當您 啟用進程和相依性時,會在 VM 深入解析中收集計算機和進程清查數據,以支持對應功能。 除了使用地圖分析此數據之外,您還可以使用Log Analytics直接查詢。 本文說明可用的數據,並提供範例查詢。

VM Insights 會收集效能和連線計量、計算機和處理清查數據,以及健康情況狀態資訊,並將其轉送至 Azure 監視器中的 Log Analytics 工作區。 Azure 監視器中的查詢可使用此資料。 您可以將此資料套用至各種案例,包括移轉規劃、容量分析、探索和隨選效能疑難排解。

重要

您必須啟用 VM 深入解析的程式和相依性,才能建立本文中所討論的數據表。

對應記錄

除了進程或計算機啟動或新增至 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

連線和連接埠

VMConnectionVMBoundPort 提供機器連線的相關信息(輸入和輸出),以及開啟/使用中伺服器埠的相關信息。 連線計量也會透過 API 公開,以提供在時間範圍期間取得特定計量的方法。 在接聽套接字上接受所產生的 TCP 連線是輸入,而連線到指定 IP 和埠所建立的連線則為輸出。 屬性 Direction 代表連接的方向,可以設定為 inboundoutbound

這些資料表中的記錄皆產生自 Dependency Agent 所報告的資料。 每筆記錄皆代表在 1 分鐘時間間隔內的觀測。 TimeGenerated 屬性指示時間間隔的開始。 每個記錄都包含用來識別個別實體的資訊,也就是連接或埠,以及與該實體相關聯的計量。 目前只會報告透過 IPv4 使用 TCP 而發生的網路活動。

為了管理成本及複雜性,連線記錄不代表個別實體網路連線。 將多個實體網路連線群組為一個邏輯連線,其接著會反映於各自的資料表中。 也就是說,數據表中的 VMConnection 記錄代表邏輯群組,而不是觀察到的個別實體連線。 在指定的一分鐘間隔內,共用下列屬性相同值的實體網路聯機會匯總成 中的 VMConnection單一邏輯記錄。

計量

VMConnectionVMBoundPort 包含計量數據,其中包含指定邏輯連線或網路埠上所傳送和接收之數據量的相關信息(BytesSentBytesReceived。 此外,還包括回應時間,也就是呼叫端等候透過連線傳送要求的時間長度,由遠端端端點 (ResponseTimeMax、 、 ResponseTimeMinResponseTimeSum) 回應。 所報告的回應時間是基礎應用程式通訊協定的真正回應時間估計值。 這會使用啟發學習法,根據實體網路連線來源和目的端之間資料流程的觀測計算而來的。 概念上,這是要求的最後一個位元組離開傳送端的時間,以及回應的最後一個位元組傳回給它的到達時間之間的差異。 這兩個時間戳記可用來描述指定實體連線上的要求和回應事件。 它們之間的差異代表單一要求的回應時間。

此演算法是一種近似值,可根據用於指定網路連線的實際應用程式通訊協定,以不同程度的成功運作。 例如,目前的方法非常適用以要求-回應為基礎的通訊協定 (例如 HTTP (S)),但不適用單向或以訊息佇列為基礎的通訊協定。

需要考慮的一些重點包括:

  1. 如果行程接受相同IP位址上的連線,但透過多個網路介面,則會報告每個介面的個別記錄。
  2. 具有通配符 IP 的記錄不包含任何活動。 包含這些連線代表機器的連接埠對傳入流量開放。
  3. 若要減少詳細資訊和數據磁碟區,當有相符的記錄時,會省略具有通配符IP的記錄(針對同一個進程、埠和通訊協定使用特定IP位址)。 省略通配符IP記錄時,會將具有特定IP位址的記錄屬性設定為 TrueIsWildcardBind以指出埠會透過報表機器的每個介面公開。
  4. 僅限於特定介面的連接埠會將 IsWildcardBind 設定為 False

命名和分類

為方便起見,RemoteIp 屬性包含遠端連線的 IP 位址。 對於傳入連線,RemoteIpSourceIp 相同,而對於傳出連線,則與 DestinationIp 相同。 RemoteDnsCanonicalNames 屬性代表機器針對 RemoteIp 報告的 DNS 規範名稱。 屬性 RemoteDnsQuestions 代表計算機 RemoteIp針對 回報的 DNS 問題。 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

VM 上次重新啟動的時間

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

依映像、位置和 SKU 的 Azure VM 摘要

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

列出所有受管理計算機的實體記憶體容量

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

列出計算機名稱、DNS、IP 和 OS

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 VM 正在傳輸最多位元組

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

下一步