Consultar dados de mapa de Insights da VM
Quando você habilita processos e dependências em Insights da VM, dados de inventário de computador e 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.
Os insights da VM coletam métricas de desempenho e conexão, de dados de inventário do processo e do computador, de informações do estado de integridade e os encaminha para o workspace do Log Analytics no Azure Monitor. Esses dados ficam 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, descoberta e solução de problemas de desempenho sob demanda.
Importante
Você deve ter processos e dependências habilitados para Insights da VM para que as tabelas discutidas neste artigo sejam criadas.
Registros do mapa
Um registro é gerado por hora para cada computador e processo exclusivo, além dos registros gerados quando um processo ou computador inicia ou é adicionado aos Insights da VM. Os campos e valores na tabela VMComputer mapeiam para os campos do recurso Computador na API de ServiceMap do Azure Resource Manager. Os campos e valores na tabela VMProcess mapeiam para os campos do recurso Processo na API de ServiceMap do Azure Resource Manager. O campo _ResourceId
corresponde ao campo de nome no recurso correspondente do Resource Manager.
Há propriedades geradas internamente que você pode usar para identificar computadores e processos exclusivos:
- Computador: use _ResourceId para identificar um computador com exclusividade em um workspace do Log Analytics.
- Processo: use _ResourceId para identificar um processo com exclusividade em um workspace do Log Analytics.
Como vários registros podem existir para um processo e computador específicos em um intervalo de tempo específico, as consultas podem retornar mais de um registro para o mesmo computador ou processo. Para incluir somente o registro mais recente, adicione | summarize arg_max(TimeGenerated, *) by ResourceId
à consulta.
Conexões e portas
VMConnection e VMBoundPort fornece informações sobre as conexões de um computador (entrada e saída) e as portas que estão abertas/ativas neles. As Métricas de Conexão também são expostas através de APIs que fornecem meios para obter uma métrica específica durante um intervalo de tempo. As conexões TCP resultantes de aceitar um soquete de escuta são de entrada, ao passo que aquelas criadas pela conexão a uma porta e um IP especificados são de saída. A propriedade Direction
representa a direção de uma conexão, que pode ser definida como inbound
ou outbound
.
Os registros nessas tabelas são gerados com base em dados relatados pelo Dependency Agent. Cada registro representa uma observação durante o intervalo de tempo de um minuto. A propriedade TimeGenerated
indica o início do intervalo de tempo. Cada registro contém informações para identificar a respectiva entidade, ou seja, conexão ou porta, bem como as métricas associadas àquela entidade. Atualmente, apenas as atividades de rede que usam TCP via IPv4 são relatadas.
Para gerenciar o custo e a complexidade, os registros de conexão não representam as conexões de rede física individuais. Várias conexões de rede física são agrupadas em uma conexão lógica, o que é refletido na respectiva tabela. Ou seja, os registros na tabela VMConnection
representam um agrupamento lógico, não as conexões físicas individuais sendo observadas. As conexões de rede física que compartilham o mesmo valor para os atributos a seguir durante o intervalo especificado de um minuto são agregadas em um único registro lógico em 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 ou porta de rede (BytesSent
, BytesReceived
). Também está incluído o tempo de resposta, que é quanto tempo o chamador aguarda uma solicitação enviada em uma conexão para ser processada e respondida pelo ponto de extremidade remoto (ResponseTimeMax
, ResponseTimeMin
, ResponseTimeSum
). O tempo de resposta relatado é uma estimativa do tempo real de resposta do protocolo do aplicativo subjacente. É calculado usando uma heurística baseada na observação do fluxo de dados entre a origem e a extremidade de destino de uma conexão de rede física. Conceitualmente, trata-se da diferença entre a hora em que o último byte de uma solicitação deixa o emissor e a hora em que o último byte da resposta volta para ele. Esses dois carimbos de data/hora são usados para delinear os eventos de solicitação e resposta em determinada conexão física. A diferença entre eles representa o tempo de resposta de uma única solicitação.
Esse algoritmo é uma aproximação que pode funcionar com diferentes graus de sucesso, dependendo do protocolo do aplicativo real usado em um determinada conexão de rede. Por exemplo, a abordagem atual funciona bem para os protocolos baseados em solicitação-resposta, como o HTTP(S), mas não funciona com protocolos unidirecionais ou baseados em filas de mensagens.
Alguns pontos importantes a serem considerados incluem:
- Se um processo aceita conexões no mesmo endereço IP, mas em várias interfaces de rede, é relatado um registro separado para cada interface.
- Os registros com IP curinga não conterão nenhuma atividade. Eles são incluídos para representar o fato de que uma porta no computador está aberta para o tráfego de entrada.
- Para reduzir o nível de detalhes e o volume de dados, os registros com IP curinga serão omitidos quando houver um registro correspondente (para o mesmo processo, porta e protocolo) com um endereço IP específico. Quando um registro IP curinga for omitido, a propriedade de registro
IsWildcardBind
com o endereço IP específico será definida comoTrue
para indicar que a porta está exposta em cada interface do computador que gera os relatórios. - As portas associadas somente a uma interface específica tem
IsWildcardBind
definida comoFalse
.
Nomenclatura e Classificação
Para sua conveniência, o endereço IP da extremidade remota de uma conexão é incluído na propriedade RemoteIp
. No caso das conexões de entrada, RemoteIp
é igual a SourceIp
, já para conexões de saída, é igual a DestinationIp
. A propriedade RemoteDnsCanonicalNames
representa os nomes DNS aceitos relatados pelo computador para RemoteIp
. A propriedade RemoteDnsQuestions
representa as perguntas DNS relatadas pelo computador para RemoteIp
. A propriedade RemoveClassification
está reservada para uso futuro.
IP malicioso
Todas as propriedades RemoteIp
na tabela VMConnection
são verificadas com um conjunto de IPs com atividades mal-intencionadas conhecidas. Se RemoteIp
for identificado como mal-intencionado, as propriedades a seguir serão populadas. Se o IP não for considerado mal-intencionado, as propriedades estarão vazias.
MaliciousIp
IndicatorThreadType
Description
TLPLevel
Confidence
Severity
FirstReportedDateTime
LastReportedDateTime
IsActive
ReportReferenceLink
AdditionalInformation
Exemplo de consultas de mapa
Listar todos os computadores conhecidos
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId
Quando a VM foi reiniciada 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, localização 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 o nome, DNS, IP e sistema operacional do computador
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project Computer, OperatingSystemFullName, DnsNames, Ipv4Addresses
Localizar todos os processos com “sql” na linha de comando
VMProcess | where CommandLine contains_cs "sql" | summarize arg_max(TimeGenerated, *) by _ResourceId
Localizar um computador (registro mais recente) por nome de recurso
search in (VMComputer) "m-4b9c93f9-bc37-46df-b43c-899ba829e07b" | summarize arg_max(TimeGenerated, *) by _ResourceId
Localizar um computador (registro 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 um computador especificado
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 de produto exclusivas de curl em meu datacenter
VMProcess | where ExecutableName == "curl" | distinct ProductVersion
Tendências de bytes enviados e recebidos
VMConnection | summarize sum(BytesSent), sum(BytesReceived) by bin(TimeGenerated,1hr), Computer | order by Computer desc | render timechart
Quais VMs do Azure transmite a maioria dos bytes
VMConnection | join kind=fullouter(VMComputer) on $left.Computer == $right.Computer | summarize count(BytesSent) by Computer, AzureVMSize | sort by count_BytesSent desc
Vincular tendências de status
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 associadas
VMBoundPort
| where TimeGenerated >= ago(24hr)
| where Computer == 'admdemo-appsvr'
| distinct Port, ProcessName
Número de portas abertas nos computadores
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by Computer, Machine, Port, Protocol
| summarize OpenPorts=count() by Computer, Machine
| order by OpenPorts desc
Pontuar processos em seu workspace pelo número de portas que eles têm abertas
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by ProcessName, Port, Protocol
| summarize OpenPorts=count() by ProcessName
| order by OpenPorts desc
Agregar comportamento para cada porta
Essa consulta pode ser usada para pontuar portas por atividade, por exemplo, portas com mais tráfego de entrada/saída, portas com a maioria das 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 a partir de um grupo de computadores
// 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óximas etapas
- Comece a escrever consultas de log no Azure Monitor analisando Como usar o Log Analytics.
- Saiba mais sobre como escrever consultas de pesquisa.