Wykonywanie zapytań dotyczących danych mapy z poziomu usługi VM Insights
Po włączeniu procesów i zależności dane spisu komputerów i procesów maszyn wirtualnych są zbierane w celu obsługi funkcji mapy. Oprócz analizowania tych danych za pomocą mapy można wykonywać zapytania bezpośrednio za pomocą usługi Log Analytics. W tym artykule opisano dostępne dane i przedstawiono przykładowe zapytania.
Usługa VM Insights zbiera metryki wydajności i połączenia, dane dotyczące komputera i przetwarzania spisu oraz informacje o stanie kondycji i przekazuje je do obszaru roboczego usługi Log Analytics w usłudze Azure Monitor. Te dane są dostępne do wykonywania zapytań w usłudze Azure Monitor. Te dane można zastosować do scenariuszy obejmujących planowanie migracji, analizę pojemności, odnajdywanie i rozwiązywanie problemów z wydajnością na żądanie.
Ważne
Aby można było utworzyć tabele omówione w tym artykule, musisz mieć włączone procesy i zależności dla szczegółowych informacji o maszynach wirtualnych.
Mapuj rekordy
Jeden rekord jest generowany na godzinę dla każdego unikatowego komputera i procesu oprócz rekordów generowanych podczas uruchamiania procesu lub komputera lub jest dodawany do usługi VM Insights. Pola i wartości w tabeli VMComputer są mapowanie na pola zasobu Maszyny w interfejsie API usługi Azure Resource Manager mapowania. Pola i wartości w tabeli VMProcess są mapowe na pola zasobu Proces w interfejsie API usługi Azure Resource Manager mapy usługi ServiceMap. Pole _ResourceId
pasuje do pola nazwy w odpowiednim zasobie usługi Resource Manager.
Istnieją właściwości generowane wewnętrznie, których można użyć do identyfikowania unikatowych procesów i komputerów:
- Komputer: użyj _ResourceId , aby jednoznacznie zidentyfikować komputer w obszarze roboczym usługi Log Analytics.
- Proces: użyj _ResourceId , aby jednoznacznie zidentyfikować proces w obszarze roboczym usługi Log Analytics.
Ponieważ dla określonego procesu i komputera w określonym zakresie czasu może istnieć wiele rekordów, zapytania mogą zwracać więcej niż jeden rekord dla tego samego komputera lub procesu. Aby uwzględnić tylko najnowszy rekord, dodaj | summarize arg_max(TimeGenerated, *) by ResourceId
go do zapytania.
Połączenia i porty
VmConnection i VMBoundPort zawierają informacje o połączeniach dla maszyny (przychodzącej i wychodzącej) oraz portów serwera, które są otwarte/aktywne na nich. Metryki połączenia są również udostępniane za pośrednictwem interfejsów API, które zapewniają środki uzyskania określonej metryki w przedziale czasu. Połączenia TCP wynikające z akceptowania gniazda nasłuchiwania są przychodzące, podczas gdy połączenia utworzone przez połączenie z danym adresem IP i portem są wychodzące. Właściwość Direction
reprezentuje kierunek połączenia, które można ustawić na inbound
wartość lub outbound
.
Rekordy w tych tabelach są generowane na podstawie danych zgłaszanych przez agenta zależności. Każdy rekord reprezentuje obserwację w 1-minutowym przedziale czasu. Właściwość TimeGenerated
wskazuje początek interwału czasu. Każdy rekord zawiera informacje umożliwiające zidentyfikowanie odpowiedniej jednostki, czyli połączenia lub portu oraz metryk skojarzonych z tą jednostką. Obecnie zgłaszane jest tylko działanie sieciowe, które występuje przy użyciu protokołu TCP za pośrednictwem protokołu IPv4.
Aby zarządzać kosztami i złożonością, rekordy połączeń nie reprezentują pojedynczych połączeń sieci fizycznych. Wiele połączeń sieci fizycznych jest pogrupowanych w połączenie logiczne, które zostanie następnie odzwierciedlone w odpowiedniej tabeli. Oznacza to, że rekordy w VMConnection
tabeli reprezentują grupowanie logiczne, a nie poszczególne połączenia fizyczne, które są obserwowane. Połączenie sieci fizycznej współużytkuje tę samą wartość dla następujących atrybutów w danym interwale jednominutowym, które są agregowane w jednym rekordzie logicznym w programie VMConnection
.
Metryki
VmConnection i VMBoundPort zawierają dane metryk z informacjami o ilości danych wysłanych i odebranych na danym połączeniu logicznym lub porcie sieciowym (BytesSent
, BytesReceived
). Uwzględniana jest również czas odpowiedzi, czyli czas oczekiwania wywołania na żądanie wysłane przez połączenie, które ma zostać przetworzone i na które odpowiada zdalny punkt końcowy (ResponseTimeMax
, ResponseTimeMin
, ResponseTimeSum
). Zgłoszony czas odpowiedzi to szacowanie rzeczywistego czasu odpowiedzi podstawowego protokołu aplikacji. Jest obliczana przy użyciu heurystyki na podstawie obserwacji przepływu danych między źródłem a docelowym końcem połączenia sieciowego fizycznego. Koncepcyjnie jest to różnica między czasem ostatniego bajtu żądania opuszcza nadawcę, a czasem powrotu do niego ostatniego bajtu odpowiedzi. Te dwa znaczniki czasu służą do oznaczania zdarzeń żądania i odpowiedzi na danym połączeniu fizycznym. Różnica między nimi reprezentuje czas odpowiedzi pojedynczego żądania.
Ten algorytm jest przybliżeniem, które może działać z różnym stopniem sukcesu w zależności od rzeczywistego protokołu aplikacji używanego dla danego połączenia sieciowego. Na przykład bieżące podejście działa dobrze w przypadku protokołów opartych na żądaniach, takich jak HTTP(S), ale nie działa z protokołami jednokierunkowymi ani opartymi na kolejkach komunikatów.
Oto kilka ważnych kwestii, które należy wziąć pod uwagę:
- Jeśli proces akceptuje połączenia na tym samym adresie IP, ale za pośrednictwem wielu interfejsów sieciowych, zgłaszany jest oddzielny rekord dla każdego interfejsu.
- Rekordy z adresem IP z symbolami wieloznacznymi nie zawierają żadnych działań. Są one dołączone do reprezentowania faktu, że port na maszynie jest otwarty dla ruchu przychodzącego.
- Aby zmniejszyć szczegółowość i ilość danych, rekordy z wieloznacznym adresem IP zostaną pominięte, gdy istnieje pasujący rekord (dla tego samego procesu, portu i protokołu) z określonym adresem IP. Po pominięciu rekordu IP z symbolem wieloznacznymi właściwość rekordu z określonym adresem IP jest ustawiona tak,
IsWildcardBind
aby wskazaćTrue
, że port jest uwidoczniony za pośrednictwem każdego interfejsu maszyny raportowania. - Porty powiązane tylko w określonym interfejsie mają
IsWildcardBind
ustawioną wartośćFalse
.
Nazewnictwo i klasyfikacja
Dla wygody adres IP zdalnego końca połączenia znajduje się we RemoteIp
właściwości . W przypadku połączeń przychodzących RemoteIp
wartość jest taka sama jak SourceIp
, natomiast w przypadku połączeń wychodzących jest taka sama jak DestinationIp
. Właściwość RemoteDnsCanonicalNames
reprezentuje nazwy kanoniczne DNS zgłaszane przez maszynę dla .RemoteIp
Właściwość RemoteDnsQuestions
reprezentuje pytania DNS zgłaszane przez maszynę dla RemoteIp
. Właściwość jest zarezerwowana RemoveClassification
do użytku w przyszłości.
Złośliwy adres IP
Każda RemoteIp
właściwość w VMConnection
tabeli jest sprawdzana względem zestawu adresów IP ze znanym złośliwym działaniem. Jeśli element RemoteIp
zostanie zidentyfikowany jako złośliwy, zostaną wypełnione następujące właściwości. Jeśli adres IP nie jest uważany za złośliwy, właściwości są puste.
MaliciousIp
IndicatorThreadType
Description
TLPLevel
Confidence
Severity
FirstReportedDateTime
LastReportedDateTime
IsActive
ReportReferenceLink
AdditionalInformation
Przykładowe zapytania mapy
Wyświetl listę wszystkich znanych maszyn
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId
Kiedy maszyna wirtualna została ostatnio uruchomiona ponownie
let Today = now(); VMComputer | extend DaysSinceBoot = Today - BootTime | summarize by Computer, DaysSinceBoot, BootTime | sort by BootTime asc
Podsumowanie maszyn wirtualnych platformy Azure według obrazu, lokalizacji i jednostki SKU
VMComputer | where AzureLocation != "" | summarize by Computer, AzureImageOffering, AzureLocation, AzureImageSku
Wyświetlanie listy pojemności pamięci fizycznej wszystkich zarządzanych komputerów
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project PhysicalMemoryMB, Computer
Wyświetlanie listy nazw komputerów, DNS, IP i systemu operacyjnego
VMComputer | summarize arg_max(TimeGenerated, *) by _ResourceId | project Computer, OperatingSystemFullName, DnsNames, Ipv4Addresses
Znajdowanie wszystkich procesów za pomocą polecenia "sql" w wierszu polecenia
VMProcess | where CommandLine contains_cs "sql" | summarize arg_max(TimeGenerated, *) by _ResourceId
Znajdowanie maszyny (najnowszego rekordu) według nazwy zasobu
search in (VMComputer) "m-4b9c93f9-bc37-46df-b43c-899ba829e07b" | summarize arg_max(TimeGenerated, *) by _ResourceId
Znajdowanie maszyny (najnowszego rekordu) według adresu IP
search in (VMComputer) "10.229.243.232" | summarize arg_max(TimeGenerated, *) by _ResourceId
Wyświetlanie listy wszystkich znanych procesów na określonej maszynie
VMProcess | where Machine == "m-559dbcd8-3130-454d-8d1d-f624e57961bc" | summarize arg_max(TimeGenerated, *) by _ResourceId
Wyświetl listę wszystkich komputerów z uruchomionym programem SQL Server
VMComputer | where AzureResourceName in ((search in (VMProcess) "*sql*" | distinct Machine)) | distinct Computer
Wyświetl listę wszystkich unikatowych wersji produktu curl w moim centrum danych
VMProcess | where ExecutableName == "curl" | distinct ProductVersion
Bajty wysłane i odebrane trendy
VMConnection | summarize sum(BytesSent), sum(BytesReceived) by bin(TimeGenerated,1hr), Computer | order by Computer desc | render timechart
Które maszyny wirtualne platformy Azure przesyłają najwięcej bajtów
VMConnection | join kind=fullouter(VMComputer) on $left.Computer == $right.Computer | summarize count(BytesSent) by Computer, AzureVMSize | sort by count_BytesSent desc
Trendy stanu połączenia
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 niepowodzeń połączeń
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
Powiązane porty
VMBoundPort
| where TimeGenerated >= ago(24hr)
| where Computer == 'admdemo-appsvr'
| distinct Port, ProcessName
Liczba otwartych portów na maszynach
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by Computer, Machine, Port, Protocol
| summarize OpenPorts=count() by Computer, Machine
| order by OpenPorts desc
Ocenianie procesów w obszarze roboczym według liczby otwartych portów
VMBoundPort
| where Ip != "127.0.0.1"
| summarize by ProcessName, Port, Protocol
| summarize OpenPorts=count() by ProcessName
| order by OpenPorts desc
Zachowanie agregacji dla każdego portu
To zapytanie może następnie służyć do oceniania portów według aktywności, na przykład portów z większością ruchu przychodzącego/wychodzącego lub portów z większością połączeń.
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
Podsumowywanie połączeń wychodzących z grupy maszyn
// 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
Następne kroki
- Rozpocznij pracę z pisaniem zapytań dzienników w usłudze Azure Monitor, przeglądając sposób korzystania z usługi Log Analytics.
- Dowiedz się więcej o pisaniu zapytań wyszukiwania.