Consultar dados de mapa do VM Insights
Quando você habilita processos e dependências, em insights de VM, os dados de inventário do computador e do processo são coletados para dar suporte ao recurso de mapa. Além de analisar esses dados com o mapa, você pode consultá-los diretamente com o Log Analytics. Este artigo descreve os dados disponíveis e fornece consultas de exemplo.
O VM Insights coleta métricas de desempenho e conexão, dados de inventário de computadores e processos e informações de estado de integridade e os encaminha para o espaço de trabalho do Log Analytics no Azure Monitor. Esses dados estão disponíveis para consulta no Azure Monitor. Você pode aplicar esses dados a cenários que incluem planejamento de migração, análise de capacidade, deteção e solução de problemas de desempenho sob demanda.
Importante
Você deve ter processos e dependências habilitados para insights de VM para que as tabelas discutidas neste artigo sejam criadas.
Mapear registos
Um registro é gerado por hora para cada computador e processo exclusivos, além dos registros que são gerados quando um processo ou computador é iniciado ou adicionado ao VM Insights. Os campos e valores na tabela VMComputer são mapeados para campos do recurso Máquina na API ServiceMap Azure Resource Manager. Os campos e valores na tabela VMProcess são mapeados para os campos do recurso Process na API ServiceMap Azure Resource Manager. O _ResourceId
campo corresponde ao campo de nome no recurso correspondente do Resource Manager.
Há propriedades geradas internamente que você pode usar para identificar processos e computadores exclusivos:
- Computador: use o _ResourceId para identificar exclusivamente um computador em um espaço de trabalho do Log Analytics.
- Processo: use _ResourceId para identificar exclusivamente um processo em um espaço de trabalho do Log Analytics.
Como vários registros podem existir para um processo especificado e computador em um intervalo de tempo especificado, as consultas podem retornar mais de um registro para o mesmo computador ou processo. Para incluir apenas o registro mais recente, adicione | summarize arg_max(TimeGenerated, *) by ResourceId
à consulta.
Ligações e portas
VMConnection e VMBoundPort fornecem informações sobre as conexões para uma máquina (entrada e saída) e as portas do servidor que estão abertas/ativas nelas. As métricas de conexão também são expostas por meio de APIs que fornecem os meios para obter uma métrica específica durante uma janela de tempo. As conexões TCP resultantes da aceitação em um soquete de escuta são de entrada, enquanto as conexões criadas pela conexão a um determinado IP e porta são de saída. A Direction
propriedade representa a direção de uma conexão, que pode ser definida como ou inbound
outbound
.
Os registros nessas tabelas são gerados a partir de dados relatados pelo Agente de Dependência. Cada registo representa uma observação num intervalo de tempo de 1 minuto. A TimeGenerated
propriedade indica o início do intervalo de tempo. Cada registro contém informações para identificar a respetiva entidade, ou seja, conexão ou porta, e métricas associadas a essa entidade. Atualmente, apenas a atividade de rede que ocorre usando TCP sobre IPv4 é relatada.
Para gerenciar o custo e a complexidade, os registros de conexão não representam conexões de rede físicas individuais. Várias conexões de rede físicas são agrupadas em uma conexão lógica, que é refletida na respetiva tabela. Ou seja, os registros na VMConnection
tabela representam um agrupamento lógico e não as conexões físicas individuais que estão sendo observadas. A conexão de rede física que compartilha o mesmo valor para os seguintes atributos durante um determinado intervalo de um minuto são agregadas em um único registro lógico no VMConnection
.
Métricas
VMConnection e VMBoundPort incluem dados métricos com informações sobre o volume de dados enviados e recebidos em uma determinada conexão lógica ou porta de rede (BytesSent
, BytesReceived
). Também está incluído o tempo de resposta, que é o tempo que o chamador espera que uma solicitação enviada por uma conexão seja processada e respondida pelo ponto de extremidade remoto (ResponseTimeMax
, ResponseTimeMin
ResponseTimeSum
, ). O tempo de resposta reportado é uma estimativa do tempo de resposta real do protocolo de aplicação subjacente. É calculado usando heurística baseada na observação do fluxo de dados entre a extremidade de origem e de destino de uma conexão de rede física. Conceitualmente, é a diferença entre o momento em que o último byte de uma solicitação sai do remetente e o momento em que o último byte da resposta chega de volta a ele. Esses dois carimbos de data/hora são usados para delinear eventos de solicitação e resposta em uma determinada conexão física. A diferença entre eles representa o tempo de resposta de uma única solicitação.
Este algoritmo é uma aproximação que pode funcionar com vários graus de sucesso, dependendo do protocolo de aplicação real usado para uma determinada conexão de rede. Por exemplo, a abordagem atual funciona bem para protocolos baseados em solicitação-resposta, como HTTP(S), mas não funciona com protocolos unidirecionais ou baseados em fila de mensagens.
Alguns pontos importantes a considerar incluem:
- Se um processo aceitar conexões no mesmo endereço IP, mas em várias interfaces de rede, um registro separado para cada interface será relatado.
- Os registros com IP curinga não contêm atividade. Eles são incluídos para representar o fato de que uma porta na máquina está aberta ao tráfego de entrada.
- Para reduzir a detalhamento e o volume de dados, os registros com IP curinga são omitidos quando há um registro correspondente (para o mesmo processo, porta e protocolo) com um endereço IP específico. Quando um registro IP curinga é omitido, a
IsWildcardBind
propriedade de registro com o endereço IP específico é definida paraTrue
indicar que a porta está exposta em cada interface da máquina de relatório. - As portas que estão vinculadas somente em uma interface específica foram
IsWildcardBind
definidas comoFalse
.
Nomenclatura e classificação
Por conveniência, o endereço IP da extremidade remota de uma conexão está incluído na RemoteIp
propriedade. Para conexões de entrada, RemoteIp
é o mesmo que SourceIp
, enquanto para conexões de saída, é o mesmo que DestinationIp
. A RemoteDnsCanonicalNames
propriedade representa os nomes canônicos DNS relatados pela máquina para RemoteIp
. A RemoteDnsQuestions
propriedade representa as perguntas DNS relatadas pela máquina para RemoteIp
. A RemoveClassification
propriedade está reservada para uso futuro.
IP malicioso
Cada RemoteIp
propriedade na tabela é verificada em relação a VMConnection
um conjunto de IPs com atividade maliciosa conhecida. Se o RemoteIp
for identificado como malicioso, as seguintes propriedades serão preenchidas. Se o IP não for considerado malicioso, as propriedades estarão vazias.
MaliciousIp
IndicatorThreadType
Description
TLPLevel
Confidence
Severity
FirstReportedDateTime
LastReportedDateTime
IsActive
ReportReferenceLink
AdditionalInformation
Exemplos de consultas de mapa
Listar todas as máquinas conhecidas
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId
Quando a VM foi reinicializada pela última vez
let Today = now(); VMComputer | extend DaysSinceBoot = Today - BootTime | summarize by Computer, DaysSinceBoot, BootTime | sort by BootTime asc
Resumo das VMs do Azure por imagem, local e SKU
VMComputer | where AzureLocation != "" | summarize by Computer, AzureImageOffering, AzureLocation, AzureImageSku
Listar a capacidade de memória física de todos os computadores gerenciados
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project PhysicalMemoryMB, Computer
Listar nome do computador, DNS, IP e sistema operacional
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project Computer, OperatingSystemFullName, DnsNames, Ipv4Addresses
Encontre todos os processos com "sql" na linha de comando
VMProcess | where CommandLine contains_cs "sql" | summarize arg_max(TimeGenerated, *) by _ResourceId
Localizar uma máquina (registo mais recente) por nome de recurso
search in (VMComputer) "m-4b9c93f9-bc37-46df-b43c-899ba829e07b" | summarize arg_max(TimeGenerated, *) by _ResourceId
Localizar uma máquina (registo mais recente) por endereço IP
search in (VMComputer) "10.229.243.232" | summarize arg_max(TimeGenerated, *) by _ResourceId
Listar todos os processos conhecidos em uma máquina especificada
VMProcess | where Machine == "m-559dbcd8-3130-454d-8d1d-f624e57961bc" | summarize arg_max(TimeGenerated, *) by _ResourceId
Listar todos os computadores que executam o SQL Server
VMComputer | where AzureResourceName in ((search in (VMProcess) "*sql*" | distinct Machine)) | distinct Computer
Listar todas as versões exclusivas do produto curl no meu datacenter
VMProcess | where ExecutableName == "curl" | distinct ProductVersion
Bytes enviados e tendências recebidas
VMConnection | summarize sum(BytesSent), sum(BytesReceived) by bin(TimeGenerated,1hr), Computer | order by Computer desc | render timechart
Quais VMs do Azure estão transmitindo mais bytes
VMConnection | join kind=fullouter(VMComputer) on $left.Computer == $right.Computer | summarize count(BytesSent) by Computer, AzureVMSize | sort by count_BytesSent desc
Tendências do status do link
VMConnection | where TimeGenerated >= ago(24hr) | where Computer == "acme-demo" | summarize dcount(LinksEstablished), dcount(LinksLive), dcount(LinksFailed), dcount(LinksTerminated) by bin(TimeGenerated, 1h) | render timechart
Tendência de falhas de conexão
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
Portas acopladas
VMBoundPort
| where TimeGenerated >= ago(24hr)
| where Computer == 'admdemo-appsvr'
| distinct Port, ProcessName
Número de portas abertas entre máquinas
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by Computer, Machine, Port, Protocol
| summarize OpenPorts=count() by Computer, Machine
| order by OpenPorts desc
Classifique os processos em seu espaço de trabalho pelo número de portas abertas
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by ProcessName, Port, Protocol
| summarize OpenPorts=count() by ProcessName
| order by OpenPorts desc
Comportamento agregado para cada porta
Essa consulta pode ser usada para pontuar portas por atividade, por exemplo, portas com mais tráfego de entrada/saída ou portas com mais conexões.
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
Resumir as conexões de saída de um grupo de máquinas
// 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
Próximos passos
- Comece a escrever consultas de log no Azure Monitor analisando como usar o Log Analytics.
- Saiba mais sobre como escrever consultas de pesquisa.