다음을 통해 공유


VM Insights에서 맵 데이터 쿼리

프로세스 및 종속성을 사용하도록 설정하면 VM 인사이트에서 컴퓨터 및 프로세스 인벤토리 데이터가 수집되어 맵 기능을 지원합니다. 맵을 사용하여 이 데이터를 분석하는 것 외에도 Log Analytics를 사용하여 직접 쿼리할 수 있습니다. 이 문서에서는 사용 가능한 데이터를 설명하고 샘플 쿼리를 제공합니다.

VM Insights는 성능 및 연결 메트릭, 컴퓨터 및 프로세스 인벤토리 데이터 및 상태 정보를 수집하고 Azure Monitor의 Log Analytics 작업 영역으로 전달합니다. 이 데이터는 Azure Monitor에서 쿼리에 사용할 수 있습니다. 마이그레이션 계획, 용량 분석, 검색 및 주문형 성능 문제 해결을 포함하는 시나리오에 이 데이터를 적용할 수 있습니다.

Important

이 문서에서 설명하는 테이블에 대한 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 하나 inbound 또는 outbound로 설정할 수 있는 연결의 방향을 나타냅니다.

이러한 테이블의 레코드는 종속성 에이전트에서 보고된 데이터에서 생성됩니다. 모든 레코드는 1분 간격의 관찰을 나타냅니다. TimeGenerated 속성은 시간 간격의 시작을 나타냅니다. 각 레코드에는 해당 엔터티, 즉 연결 또는 포트 및 해당 엔터티와 연결된 메트릭을 식별하는 정보가 포함됩니다. 현재 IPv4를 통해 TCP를 사용하여 발생하는 네트워크 활동만 보고됩니다.

비용 및 복잡성을 관리하기 위해 연결 레코드는 개별 물리적 네트워크 연결을 나타내지 않습니다. 여러 물리적 네트워크 연결은 논리적 연결로 그룹화됩니다. 그런 다음, 각 테이블에 반영됩니다. 즉, 테이블의 VMConnection 레코드는 관찰되는 개별 물리적 연결이 아니라 논리적 그룹화입니다. 지정된 1분 간격 동안 다음 특성에 대해 동일한 값을 공유하는 실제 네트워크 연결은 단일 논리 레코드 VMConnection로 집계됩니다.

메트릭

VMConnectionVMBoundPort 에는 지정된 논리 연결 또는 네트워크 포트(BytesSent, BytesReceived)에서 보내고 받은 데이터의 볼륨에 대한 정보가 포함된 메트릭 데이터가 포함됩니다. 또한 호출자가 연결을 통해 전송된 요청을 원격 엔드포인트(ResponseTimeMax, ResponseTimeMin, ResponseTimeSum)에서 처리하고 응답할 때까지 대기하는 응답 시간도 포함됩니다. 보고된 응답 시간은 기본 애플리케이션 프로토콜의 true 응답 시간에 대한 추정치입니다. 물리적 네트워크 연결의 원본 및 대상 끝 사이의 데이터 흐름을 관찰하여 그에 따른 추론 방식을 사용하여 계산됩니다. 개념적으로는 발신자가 요청의 마지막 바이트를 보낸 시간과 응답의 마지막 바이트가 다시 도착할 때의 시간 사이에는 차이가 있습니다. 이러한 두 타임스탬프는 지정된 물리적 연결에서 요청 및 응답 이벤트를 설명하는 데 사용됩니다. 그 차이는 단일 요청의 응답 시간을 나타냅니다.

이 알고리즘은 지정된 네트워크 연결에 사용되는 실제 애플리케이션 프로토콜에 따라 다양한 성공 수준으로 작동할 수 있는 근사치입니다. 예를 들어, 현재 접근 방식은 HTTP(S)와 같은 프로토콜 기반 요청-응답에는 적합하지만, 단방향 또는 메시지 큐 기반 프로토콜에는 작동하지 않습니다.

고려해야 할 몇 가지 중요한 사항은 다음과 같습니다.

  1. 프로세스에서 동일한 IP 주소와 여러 네트워크 인터페이스에 대한 연결을 허용하는 경우 각 인터페이스에 대한 별도의 레코드가 보고됩니다.
  2. 와일드카드 IP가 있는 레코드에는 활동이 없습니다. 해당 프로토콜은 머신에 있는 포트가 인바운드 트래픽에 대해 열려 있음을 나타내기 위해 포함됩니다.
  3. 세부 정보 표시 및 데이터 볼륨을 줄이기 위해 와일드카드 IP가 있는 레코드는 특정 IP 주소와 일치하는 레코드(동일한 프로세스, 포트 및 프로토콜)가 있는 경우 생략됩니다. 와일드카드 IP 레코드를 생략 IsWildcardBind 하면 특정 IP 주소가 있는 레코드 속성이 보고 컴퓨터의 모든 인터페이스에 포트가 노출됨을 나타내도록 True 설정됩니다.
  4. 특정 인터페이스에서만 바인딩된 포트의 IsWildcardBindFalse로 설정됩니다.

이름 지정 및 분류

편의를 위해 연결의 원격 끝 IP 주소는 RemoteIp 속성에 포함됩니다. 인바운드 연결의 경우 RemoteIpSourceIp와 동일하지만, 아웃바운드 연결의 경우 DestinationIp와 동일합니다. RemoteDnsCanonicalNames 속성은 RemoteIp에 대한 머신에서 보고된 DNS 정식 이름을 나타냅니다. 이 속성은 RemoteDnsQuestions 컴퓨터 RemoteIp에서 보고한 DNS 질문을 나타냅니다. RemoveClassification 속성 사용 하도록 예약 됩니다.

악성 IP

테이블의 VMConnection 모든 RemoteIp 속성은 알려진 악의적인 활동이 있는 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

다음 단계