Tutorial: Verwenden von Kusto-Abfragen in Azure Data Explorer und Azure Monitor

Die beste Möglichkeit, um mehr über die Kusto-Abfragesprache zu erfahren, besteht darin, einige grundlegende Abfragen zu untersuchen, um ein „Gefühl“ für die Sprache zu bekommen. Es wird empfohlen, eine Datenbank mit ein paar Beispieldaten zu verwenden. Die in diesem Tutorial gezeigten Abfragen sollten mit dieser Datenbank ausgeführt werden. Die StormEvents-Tabelle in der-Beispieldatenbank enthält Informationen zu Stürmen, die in den USA aufgetreten sind.

Zeilen zählen

Unsere Beispieldatenbank enthält eine Tabelle namens StormEvents. wir möchten herausfinden, wie groß die Tabelle ist. Daher wird der Inhalt in einen Operator weitergeleitet, der die Zeilen in der Tabelle zählt.

Syntaxhinweis: Eine Abfrage ist eine Datenquelle (normalerweise ein Tabellenname), optional gefolgt von einem oder mehreren Paaren des Pipe-Zeichens (senkrechter Strich) und einem tabellarischen Operator.

StormEvents | count

So sieht die Ausgabe aus:

Anzahl
59066

Weitere Informationen finden Sie unter count-Operator.

Auswählen einer Teilmenge von Spalten: project

Verwenden Sie project, um nur die gewünschten Spalten auszuwählen. Weitere Informationen finden Sie im folgenden Beispiel, in dem die beiden Operatoren project und take verwendet werden.

Filtern nach booleschem Ausdruck: where

Sehen wir uns nur flood-Ereignisse in California im Februar 2007 an:

StormEvents
| where StartTime > datetime(2007-02-01) and StartTime < datetime(2007-03-01)
| where EventType == 'Flood' and State == 'CALIFORNIA'
| project StartTime, EndTime , State , EventType , EpisodeNarrative

So sieht die Ausgabe aus:

StartTime EndTime State EventType EpisodeNarrative
2007-02-19 00:00:00.0000000 2007-02-19 08:00:00.0000000 CALIFORNIA Hochwasser Ein Frontensystem, das sich über das südliche San-Joaquin-Tal bewegte, brachte in den frühen Morgenstunden des 19. kurze Perioden starken Regens in das westliche Kern County. Geringfügige Überschwemmungen wurden für den State Highway 166 bei Taft gemeldet.

Anzeigen von n Zeilen: take

Sehen Sie wir uns ein paar Daten an. Was befindet sich in einer zufälligen Stichprobe von fünf Zeilen?

StormEvents
| take 5
| project  StartTime, EndTime, EventType, State, EventNarrative  

So sieht die Ausgabe aus:

StartTime EndTime EventType State EventNarrative
2007-09-18 20:00:00.0000000 2007-09-19 18:00:00.0000000 Starker Regen FLORIDA Bis zu 23 cm Regen fielen in einem Zeitraum von 24 Stunden in Teilen der Küste von Volusia County.
2007-09-20 21:57:00.0000000 2007-09-20 22:05:00.0000000 Tornado FLORIDA Ein Tornado traf in der Stadt Eustis am nördlichen Ende des West Crooked Lake auf Land. Der Tornado wuchs schnell auf Stärke EF1 an, während er in nordnordwestlicher Richtung durch Eustis zog. Seine Spur blieb knapp unter 3,2 km und hatte eine maximale Breite von 300 Metern. Der Tornado zerstörte 7 Häuser. 27 Häuser wurden schwer beschädigt, 81 Häuser meldeten geringfügige Schäden. Es gab keine schweren Verletzten, und der Eigentumsschaden wurde auf USD 6,2 Millionen beziffert.
2007-09-29 08:11:00.0000000 2007-09-29 08:11:00.0000000 Wasserhose ATLANTIC SOUTH Südöstlich von Melbourne Beach bildete sich im Atlantik eine Wasserhose, die sich kurz darauf in Richtung Ufer bewegte.
2007-12-20 07:50:00.0000000 2007-12-20 07:53:00.0000000 Sturm MISSISSIPPI Zahlreiche große Bäume wurden umgelegt, wobei einige Stromleitungen beschädigt wurden. Im östlichen Adams County kam es zu Schäden.
2007-12-30 16:00:00.0000000 2007-12-30 16:05:00.0000000 Sturm GEORGIA Die Bezirksleitstelle berichtete, dass mehrere Bäume entlang der Quincey Batten Loop in der Nähe der State Road 206 umgelegt wurden. Die Kosten für die Beseitigung der Bäume wurden geschätzt.

take zeigt jedoch Zeilen aus der Tabelle in keiner bestimmten Reihenfolge, also sortieren wir sie. (limit ist ein Alias für take und hat denselben Effekt.)

Sortieren von Ergebnissen: sort, top

  • Syntaxhinweis: Einige Operatoren besitzen Parameter, die mit Schlüsselwörtern wie by eingeführt werden.
  • Im folgenden Beispiel sortiert desc Ergebnisse in absteigender, und asc sortiert Ergebnisse in aufsteigender Reihenfolge.

Zeige mir die ersten n Zeilen, sortiert nach einer bestimmten Spalte:

StormEvents
| top 5 by StartTime desc
| project  StartTime, EndTime, EventType, State, EventNarrative  

So sieht die Ausgabe aus:

StartTime EndTime EventType State EventNarrative
2007-12-31 22:30:00.0000000 2007-12-31 23:59:00.0000000 Wintersturm MICHIGAN Dieses schwere Schneeereignis setzte sich bis in die frühen Morgenstunden am Neujahrstag fort.
2007-12-31 22:30:00.0000000 2007-12-31 23:59:00.0000000 Wintersturm MICHIGAN Dieses schwere Schneeereignis setzte sich bis in die frühen Morgenstunden am Neujahrstag fort.
2007-12-31 22:30:00.0000000 2007-12-31 23:59:00.0000000 Wintersturm MICHIGAN Dieses schwere Schneeereignis setzte sich bis in die frühen Morgenstunden am Neujahrstag fort.
2007-12-31 23:53:00.0000000 2007-12-31 23:53:00.0000000 Starker Wind CALIFORNIA In den Bergen von Ventura County wurden Winde aus Nord bis Nordost mit Böen bis zu 95 km/h gemeldet.
2007-12-31 23:53:00.0000000 2007-12-31 23:53:00.0000000 Starker Wind CALIFORNIA Der Warm Springs RAWs-Sensor hat nördliche Windböen mit bis zu 95 km/h gemeldet.

Sie können dieselben Ergebnisse erzielen, indem Sie sort und dann take verwenden:

StormEvents
| sort by StartTime desc
| take 5
| project  StartTime, EndTime, EventType, EventNarrative

Berechnen abgeleiteter Spalten: extend

Erstellen einer neuen Spalte durch Berechnen eines Werts in jeder Zeile:

StormEvents
| limit 5
| extend Duration = EndTime - StartTime 
| project StartTime, EndTime, Duration, EventType, State

So sieht die Ausgabe aus:

StartTime EndTime Duration EventType State
2007-09-18 20:00:00.0000000 2007-09-19 18:00:00.0000000 22:00:00 Starker Regen FLORIDA
2007-09-20 21:57:00.0000000 2007-09-20 22:05:00.0000000 00:08:00 Tornado FLORIDA
2007-09-29 08:11:00.0000000 2007-09-29 08:11:00.0000000 00:00:00 Wasserhose ATLANTIC SOUTH
2007-12-20 07:50:00.0000000 2007-12-20 07:53:00.0000000 00:03:00 Sturm MISSISSIPPI
2007-12-30 16:00:00.0000000 2007-12-30 16:05:00.0000000 00:05:00 Sturm GEORGIA

Es ist möglich, einen Spaltennamen wiederzuverwenden und derselben Spalte ein Berechnungsergebnis zuzuweisen.

Beispiel:

print x=1
| extend x = x + 1, y = x
| extend x = x + 1

So sieht die Ausgabe aus:

x y
3 1

Skalarausdrücke können alle gängigen Operatoren enthalten (+, -, *, /, %), und ferner steht eine Reihe nützlicher Funktionen zur Verfügung.

Aggregieren von Zeilengruppen: summarize

Zählen der Anzahl der Ereignisse, die in jedem Bundesstaat auftreten:

StormEvents
| summarize event_count = count() by State

summarize gruppiert Zeilen, die denselben Wert in der by-Klausel haben, und verwendet dann eine Aggregationsfunktion (z. B.count), um jede Gruppe zu einer einzelnen Zeile zu kombinieren. In diesem Fall gibt es für jeden Bundesstaat eine Zeile, und eine Spalte für die Anzahl der Zeilen in diesem Bundesstaat.

Es steht eine Reihe von Aggregationsfunktionen zur Verfügung. Sie können mehrere Aggregationsfunktionen in einem summarize-Operator verwenden, um mehrere berechnete Spalten zu erzeugen. Beispielsweise könnten wir die Anzahl von Sturmen pro Staat abrufen und die Summe der eindeutigen Arten von Sturm pro Staat. Anschließend könnten wir top verwenden, um die meisten von Stürmen betroffenen Bundesstaaten zu erhalten:

StormEvents 
| summarize StormCount = count(), TypeOfStorms = dcount(EventType) by State
| top 5 by StormCount desc

So sieht die Ausgabe aus:

State StormCount TypeOfStorms
TEXAS 4701 27
KANSAS 3166 21
IOWA 2337 19
ILLINOIS 2022 23
MISSOURI 2016 20

In den Ergebnissen eines summarize-Operators:

  • Jede Spalte ist in by benannt.
  • Jeder berechnete Ausdruck hat eine Spalte.
  • Jede Kombination von by-Werten hat eine Zeile.

Zusammenfassen nach Skalarwerten

Sie können Skalarwerte (numerisch, Uhrzeit oder Intervall) in der by-Klausel verwenden, aber Sie sollten die Werte in Intervallen platzieren, indem Sie die bin ()-Funktion verwenden:

StormEvents
| where StartTime > datetime(2007-02-14) and StartTime < datetime(2007-02-21)
| summarize event_count = count() by bin(StartTime, 1d)

Die Abfrage reduziert alle Zeitstempel auf Intervalle von einem Tag:

StartTime event_count
2007-02-14 00:00:00.0000000 180
2007-02-15 00:00:00.0000000 66
2007-02-16 00:00:00.0000000 164
2007-02-17 00:00:00.0000000 103
2007-02-18 00:00:00.0000000 22
2007-02-19 00:00:00.0000000 52
2007-02-20 00:00:00.0000000 60

Die bin()-Funktion ist mit der floor()-Funktion in vielen Sprachen identisch. Sie reduziert jeden Wert auf das nächste Vielfache des von Ihnen angegebenen Rundungswerts, damit summarize die Zeilen den Gruppen zuweisen kann.

Anzeigen eines Diagramms oder einer Tabelle: render

Sie können zwei Spalten projizieren und sie dann als x-Achse und y-Achse eines Diagramms verwenden:

StormEvents 
| summarize event_count=count(), mid = avg(BeginLat) by State 
| sort by mid
| where event_count > 1800
| project State, event_count
| render columnchart

Screenshot, der ein Säulendiagramm der Anzahl von Sturmereignissen nach Bundesstaat zeigt.

Obwohl wir im project-Vorgang mid entfernt haben, benötigen wir es weiterhin, wenn das Diagramm die Bundesstaaten in dieser Reihenfolge anzeigen soll.

Streng genommen ist render eher eine Funktion des Clients anstatt Bestandteil der Abfragesprache. Dennoch ist es in die Sprache integriert und eignet sich für das Visualisieren Ihrer Ergebnisse.

Zeitdiagramme

Wenn wir nun zu numerischen Intervallen zurückkehren, zeigen wir eine Zeitreihe an:

StormEvents
| summarize event_count=count() by bin(StartTime, 1d)
| render timechart

Screenshot eines Liniendiagramms von Ereignissen in Intervallen nach Zeit.

Mehrere Reihen

Verwenden Sie mehrere Werte in einer summarize by -Klausel, um eine separate Zeile für jede Kombination von Werten zu erstellen:

StormEvents 
| where StartTime > datetime(2007-06-04) and StartTime < datetime(2007-06-10) 
| where Source in ("Source","Public","Emergency Manager","Trained Spotter","Law Enforcement")
| summarize count() by bin(StartTime, 10h), Source

Screenshot, der eine Tabellenanzahl nach Quelle zeigt.

Fügen Sie im vorangehenden Beispiel einfach den Begriff render hinzu: | render timechart.

Screenshot, der eine Tabellenanzahl nach Quelle zeigt.

Beachten Sie, dass render timechart die erste Spalte als x-Achse verwendet und dann die anderen Spalten als separate Linien anzeigt.

Durchschnittlicher Tageszyklus

Wie variiert die Aktivität im Verlauf eines durchschnittlichen Tages?

Zählen Sie die Ereignisse nach Zeit, gerundet auf 1 Tag, und in Stundenintervallen. Hier verwenden wir floor anstelle von bin:

StormEvents
| extend hour = floor(StartTime % 1d , 1h)
| summarize event_count=count() by hour
| sort by hour asc
| render timechart

Screenshot, der eine Zeitdiagrammanzahl nach Quelle zeigt.

Derzeit werden Dauerangaben von render nicht ordnungsgemäß bezeichnet, aber wir könnten stattdessen | render columnchart verwenden:

Screenshot, der eine Säulendiagrammanzahl nach Stunde anzeigt.

Vergleichen mehrerer täglicher Reihen

Wie variiert die Aktivität im Verlauf des Tages in unterschiedlichen Bundesstaaten?

StormEvents
| extend hour= floor( StartTime % 1d , 1h)
| where State in ("GULF OF MEXICO","MAINE","VIRGINIA","WISCONSIN","NORTH DAKOTA","NEW JERSEY","OREGON")
| summarize event_count=count() by hour, State
| render timechart

Screenshot eines Zeitdiagramms nach Stunde und Bundesstaat.

Dividieren Sie durch 1h, um die x-Achsenwerte in eine Stundenzahl anstelle einer Dauer umzuwandeln:

StormEvents
| extend hour= floor( StartTime % 1d , 1h)/ 1h
| where State in ("GULF OF MEXICO","MAINE","VIRGINIA","WISCONSIN","NORTH DAKOTA","NEW JERSEY","OREGON")
| summarize event_count=count() by hour, State
| render columnchart

Screenshot, der ein Säulendiagramm nach Stunde und Bundesstaat zeigt.

Verknüpfen von Datentypen

Wie würden Sie zwei spezifische Ereignistypen suchen und dabei herausfinden, in welchem Bundesstaat jeder davon aufgetreten ist?

Sie können Sturmereignisse des ersten EventType und zweiten EventType abrufen und dann die beiden Sätze über State verknüpfen:

StormEvents
| where EventType == "Lightning"
| join (
    StormEvents 
    | where EventType == "Avalanche"
) on State  
| distinct State

Screenshot, der das Verknüpfen der Ereignisse „Blitz“ und „Lawine“ zeigt.

Benutzersitzungsbeispiel für join

In diesem Abschnitt wird die StormEvents-Tabelle nicht verwendet.

Angenommen, Sie haben Daten, die Ereignisse enthalten, die den Start und das Ende jeder Benutzersitzung mit einer eindeutigen ID markieren.

Wie würden Sie feststellen, wie lange die einzelnen Benutzersitzungen dauern?

Mit extend können Sie einen Alias für die beiden Zeitstempel angeben und dann die Sitzungsdauer berechnen:

Events
| where eventName == "session_started"
| project start_time = timestamp, stop_time, country, session_id
| join ( Events
    | where eventName == "session_ended"
    | project stop_time = timestamp, session_id
    ) on session_id
| extend duration = stop_time - start_time
| project start_time, stop_time, country, duration
| take 10

Screenshot einer Tabelle mit Ergebnissen für Benutzersitzungen mit extend.

Es empfiehlt sich, project nur die relevanten Spalten auszuwählen, bevor Sie die Verknüpfung ausführen. Benennen Sie in derselben Klausel die timestamp Spalte um.

Darstellen einer Verteilung

Um wieder zu der StormEvents-Tabelle zurückzukehren, wie viele Stürme unterschiedlicher Längen sind vorhanden?

StormEvents
| extend  duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize event_count = count()
    by bin(duration, 5m)
| sort by duration asc
| render timechart

Screenshot der Zeitdiagrammergebnisse für die Ereignisanzahl nach Dauer.

Alternativ können Sie auch | render columnchart verwenden:

Screenshot eines Säulendiagramms für das Ereignisanzahl-Zeitdiagramm nach Dauer.

Perzentile

Welche Bereiche von Dauerwerten finden wir in verschiedene Prozentsätzen von Stürmen?

Um diese Informationen abzurufen, verwenden Sie die vorherige Abfrage aus der Zeichnung einer Verteilung, ersetzen render Sie jedoch durch:

| summarize percentiles(duration, 5, 20, 50, 80, 95)

In diesem Fall haben wir keine by-Klausel verwendet, sodass die Ausgabe eine einzelne Zeile ist:

Screenshot einer Tabelle mit Ergebnissen für summarize-Quantile nach Dauer.

In der Ausgabe erkennen wir Folgendes:

  • 5 % der Stürme dauern weniger als 5 Minuten.
  • 50 % der Sturme dauerten weniger als 1 Stunde und 25 Minuten.
  • 95 % der Stürme dauerten weniger als 2 Stunden und 50 Minuten.

Um eine gesonderte Aufschlüsselung für jeden Bundesstaat zu erhalten, verwenden Sie die Spalte state separat mit beiden summarize-Operatoren:

StormEvents
| extend  duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize event_count = count()
    by bin(duration, 5m), State
| sort by duration asc
| summarize percentiles(duration, 5, 20, 50, 80, 95) by State

Tabelle der summarize-Quantildauern nach Bundesstaat.

Prozentangaben

Mit der Tabelle "StormEvents" können wir den Prozentsatz der direkten Verletzungen aller Verletzungen berechnen.

StormEvents
| where (InjuriesDirect > 0) and (InjuriesIndirect > 0) 
| extend Percentage = (  100 * InjuriesDirect / (InjuriesDirect + InjuriesIndirect) )
| project StartTime, InjuriesDirect, InjuriesIndirect, Percentage

Die Abfrage entfernt Nullanzahleinträge:

StartTime VerletzungenDirect VerletzungenIndirect Prozentwert
2007-05-01T16:50:00Z 1 1 50
2007-08-10T21:25:00Z 7 2 77
2007-08-23T12:05:00Z 7 22 24
2007-08-23T14:20:00Z 3 2 60
2007-09-10T13:45:00Z 4 1 80
2007-12-06T08:30:00Z 3 3 50
2007-12-08T12:00:00Z 1 1 50

Zuweisen eines Ergebnisses zu einer Variablen: let

Verwenden Sie let, um die einzelnen Teile des Abfrageausdrucks im vorangehenden join-Beispiel zu separieren. Die Ergebnisse sind wie folgt unverändert:

let LightningStorms = 
    StormEvents
    | where EventType == "Lightning";
let AvalancheStorms = 
    StormEvents
    | where EventType == "Avalanche";
LightningStorms 
| join (AvalancheStorms) on State
| distinct State

Tipp

Fügen Sie im Kusto-Explorer, um die gesamte Abfrage auszuführen, keine leeren Zeilen zwischen den Teilen der Abfrage hinzu. Zwei Anweisungen müssen durch ein Semikolon getrennt werden.

Kombinieren von Daten aus mehreren Datenbanken in einer Abfrage

In der folgenden Abfrage muss sich die Logs-Tabelle in Ihrer Standarddatenbank befinden:

Logs | where ...

Verwenden Sie die folgende Syntax, um auf eine Tabelle in einer anderen Datenbank zuzugreifen:

database("db").Table

Wenn Sie z. B. Datenbanken mit den Namen Diagnostics und Telemetry haben und einige der Daten in den beiden Tabellen korrelieren möchten, können Sie die folgende Abfrage verwenden (vorausgesetzt, Diagnostics ist Ihre Standarddatenbank):

Logs | join database("Telemetry").Metrics on Request MachineId | ...

Verwenden Sie diese Abfrage, wenn Ihre Standarddatenbank Telemetry ist:

union Requests, database("Diagnostics").Logs | ...

Bei den vorherigen beiden Abfragen wird davon ausgegangen, dass sich beide Datenbanken im Cluster befinden, mit dem Sie gerade verbunden sind. Wenn sich die Telemetry-Datenbank in einem Cluster mit dem Namen TelemetryCluster.kusto.windows.net befand, verwenden Sie diese Abfrage, um darauf zuzugreifen:

Logs | join cluster("TelemetryCluster").database("Telemetry").Metrics on Request MachineId | ...

Hinweis

Wenn der Cluster angegeben wird, ist die Datenbank obligatorisch.

Weitere Informationen zum Kombinieren von Daten aus mehreren Datenbanken in einer Abfrage finden Sie unter datenbankübergreifende Abfragen.

Nächste Schritte

Am besten erfahren Sie mehr über die Azure Data Explorer Abfragesprache, um einige grundlegende Abfragen zu betrachten, um ein "Gefühl" für die Sprache zu erhalten. Diese Abfragen ähneln Abfragen im Azure-Data Explorer-Lernprogramm, verwenden jedoch Daten aus allgemeinen Tabellen in einem Azure Log Analytics-Arbeitsbereich.

Führen Sie diese Abfragen aus, indem Sie Log Analytics im Azure-Portal verwenden. Log Analytics ist ein Tool, das Sie zum Schreiben von Protokollabfragen verwenden können. Verwenden Sie Protokolldaten in Azure Monitor, und werten Sie dann die Ergebnisse der Protokollabfrage aus. Wenn Sie mit Log Analytics nicht vertraut sind, absolvieren Sie das Log Analytics-Tutorial.

Alle Abfragen in diesem Tutorial verwenden die Log Analytics-Demoumgebung. Sie können Ihre eigene Umgebung verwenden, aber Ihnen fehlen dann möglicherweise einige der hier verwendeten Tabellen. Da die Daten in der Demoumgebung nicht statisch sind, können die Ergebnisse Ihrer Abfragen geringfügig von den hier gezeigten Ergebnissen abweichen.

Zeilen zählen

Die InsightsMetrics-Tabelle enthält Leistungsdaten, die von Erkenntnissen wie Azure Monitor für VMs und Azure Monitor für Container erfasst werden. Um herauszufinden, wie groß die Tabelle ist, führen wir den Inhalt in einen Operator aus, der Zeilen zählt.

Eine Abfrage ist eine Datenquelle (normalerweise ein Tabellenname), optional gefolgt von einem oder mehreren Paaren des Rohrzeichens und einiger tabellarischer Operator. In diesem Fall werden alle Datensätze aus der InsightsMetrics-Tabelle zurückgegeben und dann an den count-Operator gesendet. Der count-Operator zeigt die Ergebnisse an, weil der Operator der letzte Befehl in der Abfrage ist.

InsightsMetrics | count

So sieht die Ausgabe aus:

Anzahl
1\.263.191

Filtern nach booleschem Ausdruck: where

Die AzureActivity-Tabelle verfügt über Einträge aus dem Azure-Aktivitätsprotokoll, das Einblicke in Ereignisse auf Abonnementebene oder Verwaltungsgruppenebene bietet, die in Azure auftreten. Sehen wir uns nur Critical-Einträge in einer bestimmten Woche an.

Der where-Operator ist gängig in der Kusto-Abfragesprache. where filtert eine Tabelle zu Zeilen, die bestimmten Kriterien entsprechen. Das folgende Beispiel verwendet mehrere Befehle. Zuerst ruft die Abfrage alle Datensätze für die Tabelle ab. Anschließend filtert sie die Daten nach nur Einträgen, die in dem Zeitbereich liegen. Schließlich filtert sie diese Ergebnisse nach nur Datensätzen, die die Stufe Critical haben.

Hinweis

Zusätzlich zur Angabe eines Filters in Ihrer Abfrage mithilfe der TimeGenerated-Spalte können Sie den Zeitbereich in Log Analytics angeben. Weitere Informationen finden Sie unter Protokollabfragebereich und Zeitbereich in Azure Monitor Log Analytics.

AzureActivity
| where TimeGenerated > datetime(10-01-2020) and TimeGenerated < datetime(10-07-2020)
| where Level == 'Critical'

Screenshot mit den Ergebnissen des where-Operatorbeispiels.

Auswählen einer Teilmenge von Spalten: project

Verwenden Sie project, um nur die gewünschten Spalten einzuschließen. Aufbauend auf dem vorherigen Beispiel begrenzen wir die Ausgabe auf bestimmte Spalten:

AzureActivity
| where TimeGenerated > datetime(10-01-2020) and TimeGenerated < datetime(10-07-2020)
| where Level == 'Critical'
| project TimeGenerated, Level, OperationNameValue, ResourceGroup, _ResourceId

Screenshot mit den Ergebnissen des project-Operatorbeispiels.

Anzeigen von n Zeilen: take

NetworkMonitoring enthält Überwachungsdaten für virtuelle Azure-Netzwerke. Verwenden wir den Operator zum Anzeigen von 10 Zufallsbeispielzeilen in dieser Tabelle. Die Abbildung zeigt einige Zeilen aus einer Tabelle in keiner bestimmten Reihenfolge an:

NetworkMonitoring
| take 10
| project TimeGenerated, Computer, SourceNetwork, DestinationNetwork, HighLatency, LowLatency

Screenshot mit den Ergebnissen des take-Operatorbeispiels.

Sortieren von Ergebnissen: sort, top

Anstelle zufälliger Datensätze können wir die letzten fünf Datensätze zurückgeben, indem wir zuerst nach Zeit sortieren:

NetworkMonitoring
| sort by TimeGenerated desc
| take 5
| project TimeGenerated, Computer, SourceNetwork, DestinationNetwork, HighLatency, LowLatency

Sie können dieses exakte Verhalten erzielen, indem Sie stattdessen den top-Operator verwenden:

NetworkMonitoring
| top 5 by TimeGenerated desc
| project TimeGenerated, Computer, SourceNetwork, DestinationNetwork, HighLatency, LowLatency

Screenshot mit den Ergebnissen des top-Operatorbeispiels.

Berechnen abgeleiteter Spalten: extend

Der extend-Operator ähnelt project, aber er fügt dem Satz von Spalten hinzu, anstatt ihn zu ersetzen. Sie können beide Operatoren verwenden, um eine neue Spalte auf Grundlage einer Berechnung für jede Zeile zu erstellen.

Die Perf-Tabelle enthält Leistungsdaten, die von virtuellen Computern erfasst werden, auf denen der Log Analytics-Agent ausgeführt wird.

Perf
| where ObjectName == "LogicalDisk" and CounterName == "Free Megabytes"
| project TimeGenerated, Computer, FreeMegabytes = CounterValue
| extend FreeGigabytes = FreeMegabytes / 1000

Screenshot mit den Ergebnissen des extend-Operatorbeispiels.

Aggregieren von Zeilengruppen: summarize

Der summarize-Operator gruppiert Zeilen mit denselben Werten in der by-Klausel. Anschließend verwendet er eine Aggregationsfunktion wie count, um jede Gruppe in einer einzelnen Zeile zu kombinieren. Es steht eine Reihe von Aggregationsfunktionen zur Verfügung. Sie können mehrere Aggregationsfunktionen in einem summarize-Operator verwenden, um mehrere berechnete Spalten zu erzeugen.

Die SecurityEvent-Tabelle enthält Sicherheitsereignisse wie Anmeldungen und Prozesse, die auf überwachten Computern gestartet wurden. Sie können zählen, wie viele Ereignisse jeder Ebene auf den einzelnen Computern aufgetreten sind. In diesem Beispiel wird für jede Kombination aus Computer und Ebene eine Zeile erstellt. Eine Spalte enthält die Anzahl der Ereignisse.

SecurityEvent
| summarize count() by Computer, Level

Screenshot mit den Ergebnissen des „summarize count“-Operatorbeispiels.

Zusammenfassen nach Skalarwerten

Sie können nach Skalarwerten wie Zahlen und Zeitwerten aggregieren, aber Sie sollten die bin()-Funktion verwenden, um Zeilen in getrennte Datensätze zu gruppieren. Wenn Sie beispielsweise eine TimeGeneratedZeile für die meisten Zeitwerte aggregiert haben, erhalten Sie eine Zeile. Verwenden Sie bin() zum Konsolidieren von Werten pro Stunde oder Tag.

Die Tabelle InsightsMetrics enthält Leistungsdaten, die nach Erkenntnissen aus Azure Monitor für VMs und Azure Monitor für Container organisiert sind. Die folgende Abfrage zeigt die stündliche durchschnittliche Prozessorauslastung für mehrere Computer:

InsightsMetrics
| where Computer startswith "DC"
| where Namespace  == "Processor" and Name == "UtilizationPercentage"
| summarize avg(Val) by Computer, bin(TimeGenerated, 1h)

Screenshot mit den Ergebnissen des avg-Operatorbeispiels.

Anzeigen eines Diagramms oder einer Tabelle: render

Der render-Operator gibt an, wie die Ausgabe der Abfrage gerendert wird. Log Analytics rendert die Ausgabe standardmäßig als Tabelle. Sie können nach der Ausführung der Abfrage verschiedene Diagrammtypen auswählen. Der render-Operator lässt sich nützlicherweise in Abfragen aufnehmen, in denen normalerweise ein bestimmter Diagrammtyp bevorzugt wird.

Das folgende Beispiel zeigt die stündliche durchschnittliche Prozessorauslastung für einen einzelnen Computer. Die Ausgabe wird als Zeitdiagramm gerendert.

InsightsMetrics
| where Computer == "DC00.NA.contosohotels.com"
| where Namespace  == "Processor" and Name == "UtilizationPercentage"
| summarize avg(Val) by Computer, bin(TimeGenerated, 1h)
| render timechart

Screenshot mit den Ergebnissen des render-Operatorbeispiels.

Arbeiten mit mehreren Reihen

Verwenden Sie mehrere Werte in einer summarize by-Klausel verwenden, zeigt das Diagramm für jeden Satz von Werten eine gesonderte Reihe an:

InsightsMetrics
| where Computer startswith "DC"
| where Namespace  == "Processor" and Name == "UtilizationPercentage"
| summarize avg(Val) by Computer, bin(TimeGenerated, 1h)
| render timechart

Screenshot mit den Ergebnissen des render-Operatorbeispiels mit mehreren Reihen.

Verknüpfen von Daten aus zwei Tabellen

Was ist, wenn Sie Daten aus zwei Tabellen in einer einzelnen Abfrage abrufen müssen? Sie können den join-Operator verwenden, um Zeilen aus mehreren Tabellen in einem einzigen Resultset zu kombinieren. Jede Tabelle muss eine Spalte mit einem übereinstimmenden Wert aufweisen, damit der Verknüpfungsvorgang (join) weiß, welche Zeilen zugeordnet werden müssen.

VMComputer ist eine Tabelle, die Azure Monitor für VMs verwendet, um Details zu den von überwachten virtuellen Computern zu speichern. InsightsMetrics enthält Leistungsdaten, die von diesen virtuellen Computern erfasst werden. Ein in InsightsMetrics erfasster Wert ist verfügbarer Arbeitsspeicher, aber nicht der Prozentsatz des verfügbaren Arbeitsspeichers. Um den Prozentsatz zu berechnen, benötigen wir den physischen Arbeitsspeicher für jeden virtuellen Computer. Dieser Wert findet sich in VMComputer.

In der folgenden Beispiel Abfrage wird eine Verknüpfung (join) verwendet, um diese Berechnung auszuführen. Der distinct-Operator wird mit VMComputer verwendet, weil Details regelmäßig von jedem Computer erfasst werden. Daher enthält die Tabelle mehrere Zeilen für jeden Computer. Die beiden Tabellen werden mithilfe der Computer Spalte verknüpft. Eine Zeile wird in dem resultierenden Satz erstellt, der Spalten aus beiden Tabellen für jede Zeile enthält, in InsightsMetricsder der Wert Computer denselben Wert in der Computer Spalte VMComputerin hat.

VMComputer
| distinct Computer, PhysicalMemoryMB
| join kind=inner (
    InsightsMetrics
    | where Namespace == "Memory" and Name == "AvailableMB"
    | project TimeGenerated, Computer, AvailableMemoryMB = Val
) on Computer
| project TimeGenerated, Computer, PercentMemory = AvailableMemoryMB / PhysicalMemoryMB * 100

Screenshot mit den Ergebnissen des join-Operatorbeispiels.

Zuweisen eines Ergebnisses zu einer Variablen: let

Verwenden Sie let, um das Lesen und Verwalten von Abfragen zu vereinfachen. Sie können diesen Operator verwenden, um die Ergebnisse einer Abfrage einer Variablen zuzuweisen, die Sie später verwenden können. Mit der let-Anweisung kann die Abfrage im vorangehenden Beispiel wie folgt umgeschrieben werden:

let PhysicalComputer = VMComputer
    | distinct Computer, PhysicalMemoryMB;
let AvailableMemory = InsightsMetrics
    | where Namespace == "Memory" and Name == "AvailableMB"
    | project TimeGenerated, Computer, AvailableMemoryMB = Val;
PhysicalComputer
| join kind=inner (AvailableMemory) on Computer
| project TimeGenerated, Computer, PercentMemory = AvailableMemoryMB / PhysicalMemoryMB * 100

Screenshot mit den Ergebnissen des let-Operatorbeispiels.

Nächste Schritte