Dela via


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:

  1. Om en process accepterar anslutningar på samma IP-adress men över flera nätverksgränssnitt rapporteras en separat post för varje gränssnitt.
  2. 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.
  3. 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 till True för att indikera att porten exponeras över alla gränssnitt på rapportdatorn.
  4. Portar som endast är bundna i ett specifikt gränssnitt har IsWildcardBind angetts till False.

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