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:
- Se un processo accetta connessioni sullo stesso indirizzo IP ma su più interfacce di rete, viene segnalato un record separato per ogni interfaccia.
- 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.
- 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 suTrue
per indicare che la porta viene esposta su ogni interfaccia del computer di report. - Le porte associate solo su un'interfaccia specifica sono
IsWildcardBind
impostateFalse
su .
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 SourceIp
a , mentre per le connessioni in uscita è uguale DestinationIp
a . 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
- Per iniziare a scrivere query di log in Monitoraggio di Azure, vedere come usare Log Analytics.
- Altre informazioni sulla scrittura di query di ricerca.