Fråga efter mappningsdata från VM Insights
När du aktiverar processer och beroenden samlas data i VM-insikter, dator- och processinventeringsdata in för att stödja kartfunktionen. Förutom att analysera dessa data med kartan kan du fråga dem direkt med Log Analytics. I den här artikeln beskrivs tillgängliga data och exempelfrågor.
VM Insights samlar in prestanda- och anslutningsmått, dator- och processinventeringsdata och hälsotillståndsinformation och vidarebefordrar dem till Log Analytics-arbetsytan i Azure Monitor. Dessa data är tillgängliga för frågor i Azure Monitor. Du kan använda dessa data i scenarier som omfattar migreringsplanering, kapacitetsanalys, identifiering och prestandafelsökning på begäran.
Viktigt!
Du måste ha processer och beroenden aktiverade för att VM-insikter ska kunna skapas för de tabeller som beskrivs i den här artikeln.
Mappa poster
En post genereras per timme för varje unik dator och process utöver de poster som genereras när en process eller dator startar eller läggs till i VM Insights. Fälten och värdena i tabellen VMComputer mappar till fälten för datorresursen i ServiceMap Azure Resource Manager-API:et. Fälten och värdena i VMProcess-tabellen mappas till fälten för processresursen i ServiceMap Azure Resource Manager-API:et. Fältet _ResourceId
matchar namnfältet i motsvarande Resource Manager-resurs.
Det finns internt genererade egenskaper som du kan använda för att identifiera unika processer och datorer:
- Dator: Använd _ResourceId för att unikt identifiera en dator på en Log Analytics-arbetsyta.
- Process: Använd _ResourceId för att unikt identifiera en process på en Log Analytics-arbetsyta.
Eftersom flera poster kan finnas för en angiven process och dator inom ett angivet tidsintervall kan frågor returnera mer än en post för samma dator eller process. Om du bara vill inkludera den senaste posten lägger du till | summarize arg_max(TimeGenerated, *) by ResourceId
i frågan.
Anslutningar och portar
VMConnection och VMBoundPort innehåller information om anslutningarna för en dator (inkommande och utgående) och de serverportar som är öppna/aktiva på dem. Anslutningsmått exponeras också via API:er som ger möjlighet att hämta ett visst mått under en tidsperiod. TCP-anslutningar till följd av att accepteras på en lyssningssocket är inkommande, medan anslutningar som skapas genom anslutning till en viss IP-adress och port är utgående. Egenskapen Direction
representerar riktningen för en anslutning, som kan anges till antingen inbound
eller outbound
.
Poster i dessa tabeller genereras från data som rapporteras av beroendeagenten. Varje post representerar en observation över ett tidsintervall på 1 minut. Egenskapen TimeGenerated
anger början på tidsintervallet. Varje post innehåller information för att identifiera respektive entitet, dvs. anslutning eller port, och mått som är associerade med den entiteten. För närvarande rapporteras endast nätverksaktivitet som inträffar med TCP via IPv4.
För att hantera kostnader och komplexitet representerar anslutningsposter inte enskilda fysiska nätverksanslutningar. Flera fysiska nätverksanslutningar grupperas i en logisk anslutning, som sedan återspeglas i respektive tabell. Det innebär att poster i VMConnection
tabellen representerar en logisk gruppering och inte de enskilda fysiska anslutningar som observeras. Fysisk nätverksanslutning som delar samma värde för följande attribut under ett visst intervall på en minut aggregeras till en enda logisk post i VMConnection
.
Mått
VMConnection och VMBoundPort innehåller måttdata med information om mängden data som skickas och tas emot på en viss logisk anslutning eller nätverksport (BytesSent
, BytesReceived
). Dessutom ingår svarstiden, vilket är hur länge anroparen väntar på att en begäran som skickas över en anslutning ska bearbetas och besvaras av fjärrslutpunkten (ResponseTimeMax
, ResponseTimeMin
, ResponseTimeSum
). Svarstiden som rapporteras är en uppskattning av den verkliga svarstiden för det underliggande programprotokollet. Den beräknas med hjälp av heuristik baserat på observation av dataflödet mellan käll- och målslutet för en fysisk nätverksanslutning. Konceptuellt är det skillnaden mellan den tid då den sista byte för en begäran lämnar avsändaren och den tid då den sista byte av svaret kommer tillbaka till den. Dessa två tidsstämplar används för att avgränsa begärande- och svarshändelser på en viss fysisk anslutning. Skillnaden mellan dem representerar svarstiden för en enskild begäran.
Den här algoritmen är en uppskattning som kan fungera med varierande grad av framgång beroende på det faktiska programprotokollet som används för en viss nätverksanslutning. Den aktuella metoden fungerar till exempel bra för begärandesvarsbaserade protokoll som HTTP(S), men fungerar inte med enkelriktade eller meddelandeköbaserade protokoll.
Några viktiga saker att tänka på är:
- Om en process accepterar anslutningar på samma IP-adress men över flera nätverksgränssnitt rapporteras en separat post för varje gränssnitt.
- Poster med jokertecken-IP innehåller ingen aktivitet. De ingår för att representera det faktum att en port på datorn är öppen för inkommande trafik.
- För att minska verbositet och datavolym utelämnas poster med jokertecken-IP när det finns en matchande post (för samma process, port och protokoll) med en specifik IP-adress. När en jokertecken-IP-post utelämnas anges postegenskapen
IsWildcardBind
med den specifika IP-adressen tillTrue
för att indikera att porten exponeras över alla gränssnitt på rapportdatorn. - Portar som endast är bundna i ett specifikt gränssnitt har
IsWildcardBind
angetts tillFalse
.
Namngivning och klassificering
För enkelhetens skull ingår IP-adressen för fjärrslutet för en anslutning i egenskapen RemoteIp
. För inkommande anslutningar RemoteIp
är samma som SourceIp
, medan för utgående anslutningar är det samma som DestinationIp
. Egenskapen RemoteDnsCanonicalNames
representerar dns-kanoniska namn som rapporterats av datorn för RemoteIp
. Egenskapen RemoteDnsQuestions
representerar DE DNS-frågor som rapporterats av datorn för RemoteIp
. Egenskapen RemoveClassification
är reserverad för framtida användning.
Skadlig IP-adress
Varje RemoteIp
egenskap i VMConnection
tabellen kontrolleras mot en uppsättning IP-adresser med känd skadlig aktivitet. RemoteIp
Om identifieras som skadlig fylls följande egenskaper i. Om IP-adressen inte anses vara skadlig är egenskaperna tomma.
MaliciousIp
IndicatorThreadType
Description
TLPLevel
Confidence
Severity
FirstReportedDateTime
LastReportedDateTime
IsActive
ReportReferenceLink
AdditionalInformation
Exempel på kartfrågor
Visa en lista över alla kända datorer
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId
När startades den virtuella datorn senast om
let Today = now(); VMComputer | extend DaysSinceBoot = Today - BootTime | summarize by Computer, DaysSinceBoot, BootTime | sort by BootTime asc
Sammanfattning av virtuella Azure-datorer efter avbildning, plats och SKU
VMComputer | where AzureLocation != "" | summarize by Computer, AzureImageOffering, AzureLocation, AzureImageSku
Visa en lista över den fysiska minneskapaciteten för alla hanterade datorer
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project PhysicalMemoryMB, Computer
Lista datornamn, DNS, IP och OPERATIVSYSTEM
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project Computer, OperatingSystemFullName, DnsNames, Ipv4Addresses
Hitta alla processer med "sql" på kommandoraden
VMProcess | where CommandLine contains_cs "sql" | summarize arg_max(TimeGenerated, *) by _ResourceId
Hitta en dator (den senaste posten) efter resursnamn
search in (VMComputer) "m-4b9c93f9-bc37-46df-b43c-899ba829e07b" | summarize arg_max(TimeGenerated, *) by _ResourceId
Hitta en dator (den senaste posten) efter IP-adress
search in (VMComputer) "10.229.243.232" | summarize arg_max(TimeGenerated, *) by _ResourceId
Visa en lista över alla kända processer på en angiven dator
VMProcess | where Machine == "m-559dbcd8-3130-454d-8d1d-f624e57961bc" | summarize arg_max(TimeGenerated, *) by _ResourceId
Visa en lista över alla datorer som kör SQL Server
VMComputer | where AzureResourceName in ((search in (VMProcess) "*sql*" | distinct Machine)) | distinct Computer
Visa en lista över alla unika produktversioner av curl i mitt datacenter
VMProcess | where ExecutableName == "curl" | distinct ProductVersion
Trender för skickade och mottagna byte
VMConnection | summarize sum(BytesSent), sum(BytesReceived) by bin(TimeGenerated,1hr), Computer | order by Computer desc | render timechart
Vilka virtuella Azure-datorer som skickar flest byte
VMConnection | join kind=fullouter(VMComputer) on $left.Computer == $right.Computer | summarize count(BytesSent) by Computer, AzureVMSize | sort by count_BytesSent desc
Länkstatustrender
VMConnection | where TimeGenerated >= ago(24hr) | where Computer == "acme-demo" | summarize dcount(LinksEstablished), dcount(LinksLive), dcount(LinksFailed), dcount(LinksTerminated) by bin(TimeGenerated, 1h) | render timechart
Trend för anslutningsfel
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
Bundna portar
VMBoundPort
| where TimeGenerated >= ago(24hr)
| where Computer == 'admdemo-appsvr'
| distinct Port, ProcessName
Antal öppna portar mellan datorer
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by Computer, Machine, Port, Protocol
| summarize OpenPorts=count() by Computer, Machine
| order by OpenPorts desc
Poängsätta processer på din arbetsyta efter antalet portar som de har öppna
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by ProcessName, Port, Protocol
| summarize OpenPorts=count() by ProcessName
| order by OpenPorts desc
Aggregerat beteende för varje port
Den här frågan kan sedan användas för att poängsätta portar efter aktivitet, till exempel portar med mest inkommande/utgående trafik eller portar med de flesta anslutningar.
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
Sammanfatta utgående anslutningar från en grupp med datorer
// 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
Nästa steg
- Kom igång med att skriva loggfrågor i Azure Monitor genom att granska hur du använder Log Analytics.
- Läs mer om att skriva sökfrågor.