Eseguire query sui dati della mappa da Informazioni dettagliate macchina virtuale

Quando si abilitano processi e dipendenze, in Informazioni dettagliate macchina virtuale, i dati di inventario del computer e dei processi vengono raccolti per supportare la funzionalità di mappa. Oltre ad analizzare questi dati con la mappa, è possibile eseguire query direttamente con Log Analytics. Questo articolo descrive i dati disponibili e fornisce query di esempio.

Vm Insights raccoglie le metriche delle prestazioni e della connessione, i dati di inventario e elabora i dati di inventario e le informazioni sullo stato di integrità e le inoltra all'area di lavoro Log Analytics in Monitoraggio di Azure. Questi dati sono disponibili per eseguire query in Monitoraggio di Azure. Questi dati possono essere applicati a diversi scenari, tra cui la pianificazione della migrazione, l'analisi della capacità, l'individuazione e la risoluzione dei problemi di prestazioni on demand.

Importante

È necessario disporre di processi e dipendenze abilitati per informazioni dettagliate sulle macchine virtuali per le tabelle descritte in questo articolo da creare.

Mappare i record

Un record viene generato ogni ora per ogni computer e processo univoco, oltre ai record generati quando un processo o un computer viene avviato o aggiunto a Informazioni dettagliate macchina virtuale. I campi e i valori nella tabella VMComputer vengono mappati ai campi della risorsa Computer nell'API ServiceMap di Azure Resource Manager. I campi e i valori nella tabella VMProcess sono mappati ai campi della risorsa Processo nell'API Di Azure Resource Manager serviceMap. Il _ResourceId campo corrisponde al campo nome nella risorsa di Resource Manager corrispondente.

Sono disponibili proprietà generate internamente che è possibile usare per identificare processi e computer univoci:

  • Computer: usare _ResourceId per identificare in modo univoco un computer in un'area di lavoro Log Analytics.
  • Processo: usare _ResourceId per identificare in modo univoco un processo in un'area di lavoro Log Analytics.

Poiché possono essere presenti vari record per un determinato processo o computer in un intervallo di tempo specificato, le query possono restituire più di un record per lo stesso computer o processo. Per includere solo il record più recente, aggiungere | summarize arg_max(TimeGenerated, *) by ResourceId alla query.

Connessioni e porte

VMConnection e VMBoundPort forniscono informazioni sulle connessioni per un computer (in ingresso e in uscita) e sulle porte server aperte/attive. Le metriche di connessione vengono esposte anche tramite API che forniscono i mezzi per ottenere una metrica specifica durante un intervallo di tempo. Le connessioni TCP risultanti dall'accettazione su un socket di ascolto sono in ingresso, mentre le connessioni create connettendosi a un indirizzo IP e una porta specificati sono in uscita. La Direction proprietà rappresenta la direzione di una connessione, che può essere impostata su inbound o outbound.

I record in queste tabelle vengono generati dai dati segnalati da Dependency Agent. Ogni record rappresenta un'osservazione di un intervallo di tempo di un minuto. La TimeGenerated proprietà indica l'inizio dell'intervallo di tempo. Ogni record contiene informazioni per identificare la rispettiva entità, ovvero la connessione o la porta e le metriche associate a tale entità. Attualmente, viene segnalata solo l'attività di rete che si verifica tramite TCP su IPv4.

Per gestire i costi e la complessità, i record di connessione non rappresentano singole connessioni di rete fisiche. Più connessioni di rete fisiche vengono raggruppate in una connessione logica, che viene quindi riflessa nella rispettiva tabella. Ciò significa che i record nella VMConnection tabella rappresentano un raggruppamento logico e non le singole connessioni fisiche osservate. La connessione di rete fisica condivide lo stesso valore per gli attributi seguenti durante un determinato intervallo di un minuto, viene aggregata in un singolo record logico in VMConnection.

Metrica

VMConnection e VMBoundPort includono i dati delle metriche con informazioni sul volume di dati inviati e ricevuti in una determinata connessione logica o porta di rete (BytesSent, BytesReceived). È incluso anche il tempo di risposta, ovvero il tempo di attesa da parte del chiamante per l'elaborazione di una richiesta inviata tramite una connessione e la risposta da parte dell'endpoint remoto (ResponseTimeMax, ResponseTimeMin, ResponseTimeSum). Il tempo di risposta segnalato è una stima del tempo di risposta effettivo del protocollo dell'applicazione sottostante. Viene calcolato usando l'euristica in base all'osservazione del flusso di dati tra l'origine e la destinazione di una connessione di rete fisica. Concettualmente, corrisponde alla differenza tra il momento in cui l'ultimo byte di una richiesta lascia il mittente e il momento in cui l'ultimo byte della risposta torna al mittente. Questi due timestamp vengono usati per delineare gli eventi di richiesta e di risposta in una determinata connessione fisica. La differenza tra di essi rappresenta il tempo di risposta di una singola richiesta.

Questo algoritmo è un'approssimazione che può funzionare con un grado di esito positivo variabile a seconda del protocollo applicazione effettivo usato per una determinata connessione di rete. L'attuale approccio, ad esempio, funziona bene con protocolli basati su richiesta-risposta, come HTTP(S), ma non con protocolli unidirezionali o protocolli basati su coda messaggi.

Alcuni aspetti importanti da considerare includono:

  1. Se un processo accetta connessioni sullo stesso indirizzo IP ma su più interfacce di rete, viene segnalato un record separato per ogni interfaccia.
  2. I record con IP con caratteri jolly non contengono attività. Sono inclusi per rappresentare il fatto che una porta nel computer è aperta per il traffico in ingresso.
  3. Per ridurre il livello di dettaglio e il volume di dati, i record con IP con caratteri jolly vengono omessi quando è presente un record corrispondente (per lo stesso processo, porta e protocollo) con un indirizzo IP specifico. Quando viene omesso un record IP con caratteri jolly, la IsWildcardBind proprietà del record con l'indirizzo IP specifico è impostata su True per indicare che la porta viene esposta su ogni interfaccia del computer di report.
  4. Le porte associate solo su un'interfaccia specifica sono IsWildcardBind impostate Falsesu .

Denominazione e classificazione

Per praticità, l'indirizzo IP dell'estremità remota di una connessione è incluso nella RemoteIp proprietà . Per le connessioni in ingresso, RemoteIp è uguale SourceIpa , mentre per le connessioni in uscita è uguale DestinationIpa . La RemoteDnsCanonicalNames proprietà rappresenta i nomi canonici DNS segnalati dal computer per RemoteIp. La RemoteDnsQuestions proprietà rappresenta le domande DNS segnalate dal computer per RemoteIp. La proprietà RemoveClassification è riservata per utilizzi futuri.

Indirizzi IP dannosi

Ogni RemoteIp proprietà della VMConnection tabella viene verificata in base a un set di indirizzi IP con attività dannose note. RemoteIp Se viene identificato come dannoso, vengono popolate le proprietà seguenti. Se l'INDIRIZZO IP non è considerato dannoso, le proprietà sono vuote.

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

Query di mapping di esempio

Elencare tutti i computer noti

VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId

Data dell'ultimo riavvio della macchina virtuale

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

Riepilogo delle macchine virtuali di Azure per immagine, posizione e SKU

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

Elencare la capacità di memoria fisica di tutti i computer gestiti

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

Elencare nome computer, DNS, IP e sistema operativo

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

Trovare tutti i processi con "sql" nella riga di comando

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

Trovare un computer (record più recente) in base al nome della risorsa

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

Trovare un computer (record più recente) in base all'indirizzo IP

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

Elencare tutti i processi noti in un computer specificato

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

Elencare tutti i computer che eseguono SQL Server

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

Elencare tutte le versioni univoce del prodotto curl nel data center

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

Byte inviati e ricevuti

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

Quali macchine virtuali di Azure trasmettono il maggior numero di byte

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

Tendenze dello stato dei collegamenti

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

Tendenza degli errori di connessione

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

Porte associate

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

Numero di porte aperte tra computer

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

Assegnare un punteggio ai processi nell'area di lavoro in base al numero di porte aperte

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

Comportamento aggregato per ogni porta

Questa query può quindi essere usata per assegnare punteggi alle porte in base all'attività, ad esempio porte con la maggior parte del traffico in ingresso/in uscita o porte con la maggior parte delle connessioni.

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

Riepilogare le connessioni in uscita da un gruppo di computer

// 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

Passaggi successivi