Tutoriel : Utiliser des requêtes Kusto dans Azure Data Explorer et Azure MonitorTutorial: Use Kusto queries in Azure Data Explorer and Azure Monitor

La meilleure façon de se familiariser avec le langage de requête Kusto consiste à examiner certaines requêtes de base pour se faire une idée du langage.The best way to learn about the Kusto Query Language is to look at some basic queries to get a "feel" for the language. Nous vous recommandons d’utiliser une base de données avec des exemples de données.We recommend using a database with some sample data. Les requêtes présentées dans ce tutoriel doivent s’exécuter sur cette base de données.The queries that are demonstrated in this tutorial should run on that database. La table StormEvents dans l’exemple de base de données fournit des informations sur les tempêtes survenues aux États-Unis.The StormEvents table in the sample database provides some information about storms that happened in the United States.

Compter les lignesCount rows

Notre exemple de base de données contient une table nommée StormEvents.Our example database has a table called StormEvents. Pour déterminer la taille de la table, nous allons canaliser son contenu vers un opérateur qui compte simplement les lignes que contient la table.To find out how large the table is, we'll pipe its content into an operator that simply counts the rows in the table.

Note sur la syntaxe : une requête est une source de données (généralement un nom de table), éventuellement suivie d’une ou plusieurs paires de caractères de canalisation (barre verticale) et d’un opérateur tabulaire.Syntax note: A query is a data source (usually a table name), optionally followed by one or more pairs of the pipe character and some tabular operator.

StormEvents | count

Voici le format :Here's the output:

NombreCount
5906659066

Pour plus d’informations, consultez opérateur count.For more information, see count operator.

Sélectionnez un sous-ensemble de colonnes : projetSelect a subset of columns: project

Utilisez le projet pour choisir uniquement les colonnes souhaitées.Use project to pick out only the columns you want. Reportez-vous à l’exemple suivant qui utilise à la fois le projet et les opérateurs take.See the following example, which uses both the project and the take operators.

Filtrez par expression booléenne : whereFilter by Boolean expression: where

Voyons uniquement les événements flood survenus en California au cours du mois de février 2007 :Let's see only flood events in California in Feb-2007:

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

Voici le format :Here's the output:

StartTimeStartTime EndTimeEndTime ÉtatState Type d’événementEventType EpisodeNarrativeEpisodeNarrative
2007-02-19 00:00:00.00000002007-02-19 00:00:00.0000000 2007-02-19 08:00:00.00000002007-02-19 08:00:00.0000000 CALIFORNIECALIFORNIA CrueFlood Un système frontal se déplaçant dans la vallée méridionale de San Joaquin a entraîné de brefs épisodes de fortes précipitations dans l’ouest du comté de Kern aux premières heures de la matinée du 19.A frontal system moving across the Southern San Joaquin Valley brought brief periods of heavy rain to western Kern County in the early morning hours of the 19th. Des inondations mineures ont été signalées sur la route nationale 166 près de Taft.Minor flooding was reported across State Highway 166 near Taft.

Afficher n lignes : takeShow n rows: take

Voyons quelques données.Let's see some data. Qu’est-ce qu’un échantillon aléatoire de cinq lignes ?What's in a random sample of five rows?

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

Voici le format :Here's the output:

StartTimeStartTime EndTimeEndTime Type d’événementEventType ÉtatState EventNarrativeEventNarrative
2007-09-18 20:00:00.00000002007-09-18 20:00:00.0000000 2007-09-19 18:00:00.00000002007-09-19 18:00:00.0000000 Fortes précipitationsHeavy Rain FLORIDEFLORIDA Jusqu’à 228 mm de pluie ont chuté en 24 heures dans différentes parties de la zone côtière du comté de Volusia.As much as 9 inches of rain fell in a 24-hour period across parts of coastal Volusia County.
2007-09-20 21:57:00.00000002007-09-20 21:57:00.0000000 2007-09-20 22:05:00.00000002007-09-20 22:05:00.0000000 TornadeTornado FLORIDEFLORIDA Une tornade a touché la ville d’Eustis à l’extrémité nord du lac West Crooked.A tornado touched down in the Town of Eustis at the northern end of West Crooked Lake. La tornade s’est rapidement intensifiée pour atteindre la force EF1 alors qu’elle se déplaçait vers le nord-nord-ouest en traversant Eustis.The tornado quickly intensified to EF1 strength as it moved north northwest through Eustis. Elle a laissé une empreinte d’une longueur d’environ 3 km et d’une largeur maximale de 275 mètres.The track was just under two miles long and had a maximum width of 300 yards. Elle a détruit 7 maisons.The tornado destroyed 7 homes. Vingt-sept maisons ont subi des dommages importants et 81 autres des dommages mineurs.Twenty seven homes received major damage and 81 homes reported minor damage. Il n’y a eu aucun blessé grave et les dommages matériels sont évalués à 6,2 millions de dollars.There were no serious injuries and property damage was set at $6.2 million.
2007-09-29 08:11:00.00000002007-09-29 08:11:00.0000000 2007-09-29 08:11:00.00000002007-09-29 08:11:00.0000000 Trombe marineWaterspout ATLANTIQUE SUDATLANTIC SOUTH Une trombe s’est formée dans l’Atlantique au sud-est de Melbourne Beach et s’est brièvement déplacée vers le littoral.A waterspout formed in the Atlantic southeast of Melbourne Beach and briefly moved toward shore.
2007-12-20 07:50:00.00000002007-12-20 07:50:00.0000000 2007-12-20 07:53:00.00000002007-12-20 07:53:00.0000000 Vent d’orageThunderstorm Wind MISSISSIPPIMISSISSIPPI De nombreux arbres de grande taille sont tombés, dont certains sur des lignes électriques.Numerous large trees were blown down with some down on power lines. Les dégâts se sont produits dans l’est du comté d’Adams.Damage occurred in eastern Adams county.
2007-12-30 16:00:00.00000002007-12-30 16:00:00.0000000 2007-12-30 16:05:00.00000002007-12-30 16:05:00.0000000 Vent d’orageThunderstorm Wind GEORGIEGEORGIA La dépêche du comté a rapporté que plusieurs arbres sont tombés le long de Quincey Batten Loop, près de la route nationale 206.The county dispatch reported several trees were blown down along Quincey Batten Loop near State Road 206. Le coût de leur enlèvement a été estimé.The cost of tree removal was estimated.

Mais l’opérateur take affiche les lignes du tableau sans ordre particulier. Alors, trions-lesBut take shows rows from the table in no particular order, so let's sort them. (limit est un alias de take et a le même effet).(limit is an alias for take and has the same effect.)

Ordonner les résultats : sort, topOrder results: sort, top

  • Note sur la syntaxe : certains opérateurs ont des paramètres introduits par des mots clés tels que by.Syntax note: Some operators have parameters that are introduced by keywords like by.
  • Dans l’exemple suivant, desc affiche les résultats dans l’ordre décroissant et asc dans l’ordre croissant.In the following example, desc orders results in descending order and asc orders results in ascending order.

Afficher les n premières lignes, ordonnées sur une colonne spécifique :Show me the first n rows, ordered by a specific column:

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

Voici le format :Here's the output:

StartTimeStartTime EndTimeEndTime Type d’événementEventType ÉtatState EventNarrativeEventNarrative
2007-12-31 22:30:00.00000002007-12-31 22:30:00.0000000 2007-12-31 23:59:00.00000002007-12-31 23:59:00.0000000 Tempête hivernaleWinter Storm MICHIGANMICHIGAN Ces fortes chutes de neige se sont poursuivies jusqu’aux petites heures du matin le jour de l’an.This heavy snow event continued into the early morning hours on New Year's Day.
2007-12-31 22:30:00.00000002007-12-31 22:30:00.0000000 2007-12-31 23:59:00.00000002007-12-31 23:59:00.0000000 Tempête hivernaleWinter Storm MICHIGANMICHIGAN Ces fortes chutes de neige se sont poursuivies jusqu’aux petites heures du matin le jour de l’an.This heavy snow event continued into the early morning hours on New Year's Day.
2007-12-31 22:30:00.00000002007-12-31 22:30:00.0000000 2007-12-31 23:59:00.00000002007-12-31 23:59:00.0000000 Tempête hivernaleWinter Storm MICHIGANMICHIGAN Ces fortes chutes de neige se sont poursuivies jusqu’aux petites heures du matin le jour de l’an.This heavy snow event continued into the early morning hours on New Year's Day.
2007-12-31 23:53:00.00000002007-12-31 23:53:00.0000000 2007-12-31 23:53:00.00000002007-12-31 23:53:00.0000000 Vent fortHigh Wind CALIFORNIECALIFORNIA Des vents du nord au nord-est avec des rafales à environ 93 km par heure ont été signalés dans les montagnes du comté de Ventura.North to northeast winds gusting to around 58 mph were reported in the mountains of Ventura county.
2007-12-31 23:53:00.00000002007-12-31 23:53:00.0000000 2007-12-31 23:53:00.00000002007-12-31 23:53:00.0000000 Vent fortHigh Wind CALIFORNIECALIFORNIA Le capteur RAWS de Warm Springs a signalé des vents du nord avec des rafales à 93 km par heure.The Warm Springs RAWS sensor reported northerly winds gusting to 58 mph.

Vous pouvez obtenir le même résultat en utilisant les opérateurs sort, puis take :You can achieve the same result by using sort, and then take:

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

Calculer des colonnes dérivées : extendCompute derived columns: extend

Créer une colonne en calculant une valeur dans chaque ligne :Create a new column by computing a value in every row:

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

Voici le format :Here's the output:

StartTimeStartTime EndTimeEndTime DurationDuration Type d’événementEventType ÉtatState
2007-09-18 20:00:00.00000002007-09-18 20:00:00.0000000 2007-09-19 18:00:00.00000002007-09-19 18:00:00.0000000 22:00:0022:00:00 Fortes précipitationsHeavy Rain FLORIDEFLORIDA
2007-09-20 21:57:00.00000002007-09-20 21:57:00.0000000 2007-09-20 22:05:00.00000002007-09-20 22:05:00.0000000 00:08:0000:08:00 TornadeTornado FLORIDEFLORIDA
2007-09-29 08:11:00.00000002007-09-29 08:11:00.0000000 2007-09-29 08:11:00.00000002007-09-29 08:11:00.0000000 00:00:0000:00:00 Trombe marineWaterspout ATLANTIQUE SUDATLANTIC SOUTH
2007-12-20 07:50:00.00000002007-12-20 07:50:00.0000000 2007-12-20 07:53:00.00000002007-12-20 07:53:00.0000000 00:03:0000:03:00 Vent d’orageThunderstorm Wind MISSISSIPPIMISSISSIPPI
2007-12-30 16:00:00.00000002007-12-30 16:00:00.0000000 2007-12-30 16:05:00.00000002007-12-30 16:05:00.0000000 00:05:0000:05:00 Vent d’orageThunderstorm Wind GEORGIEGEORGIA

Il est possible de réutiliser un nom de colonne et d’attribuer un résultat de calcul à la même colonne.It's possible to reuse a column name and assign a calculation result to the same column.

Exemple :Example:

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

Voici le format :Here's the output:

xx yy
33 11

Les expressions scalaires peuvent inclure tous les opérateurs usuels (+, -, *, /, %), et une série de fonctions utiles sont disponibles.Scalar expressions can include all the usual operators (+, -, *, /, %), and a range of useful functions are available.

Agréger des groupes de lignes : summarizeAggregate groups of rows: summarize

Compter le nombre d’événements qui se produisent dans chaque État :Count the number of events occur in each state:

StormEvents
| summarize event_count = count() by State

L’opérateur summarize regroupe les lignes qui ont les mêmes valeurs dans la clause by, puis utilise une fonction d’agrégation (par exemple, count) pour combiner chaque groupe dans une seule ligne.summarize groups together rows that have the same values in the by clause, and then uses an aggregation function (for example, count) to combine each group in a single row. Dans ce cas, il y a une ligne pour chaque État et une colonne pour le nombre de lignes dans cet État.In this case, there's a row for each state and a column for the count of rows in that state.

Une série de fonctions d’agrégation sont disponibles.A range of aggregation functions are available. Vous pouvez utiliser plusieurs fonctions d’agrégation dans un seul opérateur summarize pour produire plusieurs colonnes calculées.You can use several aggregation functions in one summarize operator to produce several computed columns. Par exemple, nous pourrions obtenir le nombre de tempêtes dans chaque État, ainsi que la somme des tempêtes d’un type unique par État.For example, we could get the count of storms in each state and also a sum of a unique type of storms per state. Ensuite, nous pourrions utiliser l’opérateur top pour obtenir les États les plus touchés par les tempêtes :Then, we could use top to get the most storm-affected states:

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

Voici le format :Here's the output:

ÉtatState StormCountStormCount TypeOfStormsTypeOfStorms
TEXASTEXAS 47014701 2727
KANSASKANSAS 31663166 2121
IOWAIOWA 23372337 1919
ILLINOISILLINOIS 20222022 2323
MISSOURIMISSOURI 20162016 2020

Dans les résultats d’un opérateur summarize :In the results of a summarize operator:

  • Chaque colonne est nommée dans by.Each column is named in by.
  • Chaque expression calculée a une colonne.Each computed expression has a column.
  • Chaque combinaison de valeurs by comporte une ligne.Each combination of by values has a row.

Résumer en fonction de valeurs scalairesSummarize by scalar values

Vous pouvez utiliser des valeurs scalaires (numériques, de temps ou d’intervalle) dans la clause by, mais vous voudrez les mettre dans des classes en utilisant la fonction bin() :You can use scalar (numeric, time, or interval) values in the by clause, but you'll want to put the values into bins by using the bin() function:

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

La requête réduit tous les horodatages à des intervalles d’un jour :The query reduces all the timestamps to intervals of one day:

StartTimeStartTime event_countevent_count
2007-02-14 00:00:00.00000002007-02-14 00:00:00.0000000 180180
2007-02-15 00:00:00.00000002007-02-15 00:00:00.0000000 6666
2007-02-16 00:00:00.00000002007-02-16 00:00:00.0000000 164164
2007-02-17 00:00:00.00000002007-02-17 00:00:00.0000000 103103
2007-02-18 00:00:00.00000002007-02-18 00:00:00.0000000 2222
2007-02-19 00:00:00.00000002007-02-19 00:00:00.0000000 5252
2007-02-20 00:00:00.00000002007-02-20 00:00:00.0000000 6060

La fonction bin() est identique à la fonction floor() dans de nombreux langages.The bin() is the same as the floor() function in many languages. Elle réduit simplement chaque valeur au multiple le plus proche du modulo que vous fournissez, afin que l’opérateur summarize puisse attribuer les lignes à des groupes.It simply reduces every value to the nearest multiple of the modulus that you supply, so that summarize can assign the rows to groups.

Afficher un graphique ou une table : renderDisplay a chart or table: render

Vous pouvez projeter deux colonnes et les utiliser comme axes des abscisses et des ordonnées d’un graphique :You can project two columns and use them as the x-axis and the y-axis of a chart:

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

Capture d’écran montrant un histogramme du nombre d’événements de tempête par État.

Bien que nous ayons supprimé mid dans l’opération project, nous en avons encore besoin si nous voulons que le graphique affiche les États dans cet ordre.Although we removed mid in the project operation, we still need it if we want the chart to display the states in that order.

Strictement parlant, l’opérateur render est une fonctionnalité du client plutôt qu’une partie du langage de requête.Strictly speaking, render is a feature of the client rather than part of the query language. Toutefois, il est intégré dans le langage et est utile pour visionner vos résultats.Still, it's integrated into the language, and it's useful for envisioning your results.

Graphiques temporelsTimecharts

Revenons aux compartiments numériques et affichons une série chronologique :Going back to numeric bins, let's display a time series:

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

Capture d’écran d’un graphique en courbes d’événements compartimentés par heure.

Séries multiplesMultiple series

Utilisez plusieurs valeurs dans une clause summarize by afin de créer une ligne distincte pour chaque combinaison de valeurs :Use multiple values in a summarize by clause to create a separate row for each combination of values:

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

Capture d’écran montrant un nombre de tables par source.

Ajoutez simplement le terme render à l’exemple précédent : | render timechart.Just add the render term to the preceding example: | render timechart.

Capture d’écran montrant un nombre de graphiques en courbes par source.

Notez que l’opérateur render timechart utilise la première colonne comme axe des abscisses, puis affiche les autres colonnes sous forme de courbes distinctes.Notice that render timechart uses the first column as the x-axis, and then displays the other columns as separate lines.

Cycle moyen quotidienDaily average cycle

Comment l’activité varie-t-elle au cours d’une journée moyenne ?How does activity vary over the average day?

Comptez les événements en fonction du modulo de temps d’un jour, compartimentés en heures.Count events by the time modulo one day, binned into hours. Ici, nous utilisons l’opérateur floor au lieu de l’opérateur bin :Here, we use floor instead of bin:

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

Capture d’écran montrant un nombre de graphiques temporels par heure.

Actuellement, l’opérateur render n’étiquette pas les durées correctement, mais nous pourrions utiliser l’opérateur | render columnchart à la place :Currently, render doesn't label durations properly, but we could use | render columnchart instead:

Capture d’écran montrant un nombre d’histogrammes par heure.

Comparer plusieurs séries quotidiennesCompare multiple daily series

Comment l’activité varie-t-elle au cours de la journée dans les différents États ?How does activity vary over the time of day in different states?

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

Capture d’écran d’un graphique temporel par heure et État.

Divisez par 1h pour transformer l’axe des abscisses en un nombre d’heures au lieu d’une durée :Divide by 1h to turn the x-axis into an hour number instead of a duration:

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

Capture d’écran montrant un histogramme par heure et par État.

Joindre des types de donnéesJoin data types

Comment trouver deux types d’événements spécifiques et l’État dans lequel chacun s’est produit ?How would you find two specific event types and in which state each of them happened?

Vous pouvez extraire des événements de tempête avec le premier EventType et le deuxième EventType, puis joindre les deux jeux sur State :You can pull storm events with the first EventType and the second EventType, and then join the two sets on State:

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

Capture d’écran montrant comment joindre les événements de foudre et d’avalanche.

Exemple de session utilisateur de l’opérateur joinUser session example of join

Cette section n’utilise pas le tableau StormEvents.This section doesn't use the StormEvents table.

Supposons que vous avez des données qui incluent des événements marquant le début et la fin de chaque session utilisateur avec un ID unique pour chaque session.Assume you have data that includes events that mark the start and end of each user session with a unique ID for each session.

Comment déterminer la durée de chaque session utilisateur ?How would you find out how long each user session lasts?

Vous pouvez utiliser l’opérateur extend pour fournir un alias pour les deux horodatages, puis calculer la durée de la session :You can use extend to provide an alias for the two timestamps, and then compute the session duration:

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

Capture d’écran d’une table de résultats pour une extension de session utilisateur.

Il est recommandé d’utiliser project pour sélectionner uniquement les colonnes dont vous avez besoin avant d’effectuer la jointure.It's a good practice to use project to select only the columns you need before you perform the join. Dans les mêmes clauses, renommez la colonne timestamp.In the same clauses, rename the timestamp column.

Tracer une distributionPlot a distribution

En revenant au tableau StormEvents, combien y a-t-il de tempêtes de longueurs différentes ?Returning to the StormEvents table, how many storms are there of different lengths?

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

Capture d’écran des résultats de graphique temporel pour le nombre d’événements par durée.

Vous pouvez également utiliser l’opérateur | render columnchart :Or, you can use | render columnchart:

Capture d’écran d’un histogramme pour le graphique temporel du nombre d’événements par durée.

CentilesPercentiles

Quelles plages de durées trouvons-nous dans les différents pourcentages de tempêtes ?What ranges of durations do we find in different percentages of storms?

Pour obtenir ces informations, utilisez la requête précédente, mais remplacez render par :To get this information, use the preceding query, but replace render with:

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

Dans ce cas, comme nous n’avons pas utilisé de clause by, la sortie est une ligne unique :In this case, we didn't use a by clause, so the output is a single row:

Capture d’écran d’une table de résultats pour résumer les centiles par durée.

Nous pouvons voir dans la sortie que :We can see from the output that:

  • 5 % des tempêtes ont une durée inférieure à 5 minutes.5% of storms have a duration of less than 5 minutes.
  • 50 % des tempêtes ont duré moins d’une heure et 25 minutes.50% of storms lasted less than one hour and 25 minutes.
  • 95 % des tempêtes ont duré moins de deux heure et 50 minutes.95% of storms lasted less than two hours and 50 minutes.

Pour obtenir une répartition distincte pour chaque État, utilisez la colonne state séparément avec les deux opérateurs summarize :To get a separate breakdown for each state, use the state column separately with both summarize operators:

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

Table résumant les centiles de durée par État.

Attribuer un résultat à une variable : letAssign a result to a variable: let

Utilisez l’opérateur let pour séparer les parties de l’expression de requête dans l’exemple d’utilisation de l’opérateur join précédent.Use let to separate out the parts of the query expression in the preceding join example. Les résultats sont identiques :The results are unchanged:

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

Conseil

Dans Kusto Explorer, pour exécuter l’intégralité de la requête, n’ajoutez pas de lignes vides entre les différentes parties de la requête.In Kusto Explorer, to execute the entire query, don't add blank lines between parts of the query.

Combiner des données de plusieurs bases de données dans une requêteCombine data from several databases in a query

Dans la requête suivante, la table Logs doit se trouver dans votre base de données par défaut :In the following query, the Logs table must be in your default database:

Logs | where ...

Pour accéder à une table dans une base de données différente, utilisez la syntaxe suivante :To access a table in a different database, use the following syntax:

database("db").Table

Par exemple, si vous avez des bases de données nommées Diagnostics et Telemetry, et souhaitez mettre en corrélation certaines données dans les deux tables, vous pourriez utiliser la requête suivante (en supposant que Diagnostics est votre base de données par défaut) :For example, if you have databases named Diagnostics and Telemetry and you want to correlate some of the data in the two tables, you might use the following query (assuming Diagnostics is your default database):

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

Utilisez cette requête si votre base de données par défaut est Telemetry:Use this query if your default database is Telemetry:

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

Les deux requêtes précédentes supposent que les deux bases de données se trouvent dans le cluster auquel vous êtes actuellement connecté.The preceding two queries assume that both databases are in the cluster you're currently connected to. Si la base de données Telemetry se trouvait dans un cluster nommé TelemetryCluster.kusto.windows.net, pour y accéder, utilisez la requête suivante :If the Telemetry database was in a cluster named TelemetryCluster.kusto.windows.net, to access it, use this query:

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

Notes

Lorsque le cluster est spécifié, la base de données est obligatoire.When the cluster is specified, the database is mandatory.

Pour plus d’informations sur la combinaison de données de plusieurs bases de données dans une requête, consultez Requêtes de bases de données croisées.For more information about combining data from several databases in a query, see cross-database queries.

Étapes suivantesNext steps

La meilleure façon de se familiariser avec le langage de requête Kusto consiste à examiner certaines requêtes de base pour se faire une idée du langage.The best way to learn about the Kusto Query Language is to look at some basic queries to get a "feel" for the language. Ces requêtes sont similaires à celles utilisées dans le tutoriel Azure Data Explorer, mais elles utilisent à la place des données de tables communes dans un espace de travail Azure Log Analytics.These queries are similar to queries that are used in the Azure Data Explorer tutorial, but they instead use data from common tables in an Azure Log Analytics workspace.

Exécutez ces requêtes à l’aide de Log Analytics dans le portail Azure.Run these queries by using Log Analytics in the Azure portal. Log Analytics est un outil que vous pouvez utiliser pour écrire des requêtes de journal.Log Analytics is a tool you can use to write log queries. Utilisez les données de journal dans Azure Monitor, puis évaluez les résultats de requête de journal.Use log data in Azure Monitor, and then evaluate log query results. Si vous n’êtes pas familiarisé avec Log Analytics, suivez le Tutoriel Log Analytics.If you aren't familiar with Log Analytics, complete the Log Analytics tutorial.

Toutes les requêtes de ce tutoriel utilisent l’environnement de démonstration Log Analytics.All queries in this tutorial use the Log Analytics demo environment. Vous pouvez utiliser votre propre environnement, mais il se peut que vous ne disposiez pas de certaines des tables utilisées ici.You can use your own environment, but you might not have some of the tables that are used here. Étant donné que les données de l’environnement de démonstration ne sont pas statiques, les résultats de vos requêtes pourraient différer légèrement de ceux présentés ici.Because the data in the demo environment isn't static, the results of your queries might vary slightly from the results shown here.

Compter les lignesCount rows

La table InsightsMetrics contient des données de performances collectées par des insights telles qu’Azure Monitor pour machines virtuelles et Azure Monitor pour conteneurs.The InsightsMetrics table contains performance data that's collected by insights such as Azure Monitor for VMs and Azure Monitor for containers. Pour déterminer la taille de la table, nous allons canaliser son contenu vers un opérateur qui compte simplement les lignes.To find out how large the table is, we'll pipe its content into an operator that simply counts the rows.

une requête est une source de données (généralement un nom de table), éventuellement suivie d’une ou plusieurs paires de caractères de canalisation (barre verticale) et d’un opérateur tabulaire.A query is a data source (usually a table name), optionally followed by one or more pairs of the pipe character and some tabular operator. Dans ce cas, tous les enregistrements de la table InsightsMetrics sont retournés, puis envoyés à l’opérateur count.In this case, all records from the InsightsMetrics table are returned and then sent to the count operator. L’opérateur count affiche les résultats, car il est la dernière commande de la requête.The count operator displays the results because the operator is the last command in the query.

InsightsMetrics | count

Voici le format :Here's the output:

NombreCount
1 263 1911,263,191

Filtrer par expression booléenne : whereFilter by Boolean expression: where

La table AzureActivity contient des entrées du journal d’activité Azure qui fournit une insight de tous les événements au niveau de l’abonnement ou du groupe d’administration qui se sont produits dans Azure.The AzureActivity table has entries from the Azure activity log, which provides insight into any subscription-level or management group-level events that occurred in Azure. Voyons uniquement les entrées Critical durant une semaine spécifique.Let's see only Critical entries during a specific week.

L’opérateur where est courant dans le langage de requête Kusto.The where operator is common in the Kusto Query Language. L’opérateur where filtre une table sur des lignes correspondant à des critères spécifiques.where filters a table to rows that match specific criteria. L’exemple suivant utilise plusieurs commandes.The following example uses multiple commands. Tout d’abord, la requête récupère tous les enregistrements de la table.First, the query retrieves all records for the table. Ensuite, elle filtre les données uniquement pour les enregistrements qui se trouvent dans l’intervalle de temps.Then, it filters the data for only records that are in the time range. Enfin, elle filtre ces résultats uniquement pour les enregistrements qui ont un niveau Critical.Finally, it filters those results for only records that have a Critical level.

Notes

En plus de spécifier un filtre dans votre requête à l’aide de la colonne TimeGenerated, vous pouvez spécifier l’intervalle de temps dans Log Analytics.In addition to specifying a filter in your query by using the TimeGenerated column, you can specify the time range in Log Analytics. Pour plus d’informations, consultez Étendue de requête de journal et intervalle de temps dans la fonctionnalité Log Analytics d’Azure Monitor.For more information, see Log query scope and time range in Azure Monitor Log Analytics.

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur where.

Sélectionnez un sous-ensemble de colonnes : projetSelect a subset of columns: project

Utilisez l’opérateur project pour inclure uniquement les colonnes souhaitées.Use project to include only the columns you want. En nous basant sur l’exemple précédent, limitons la sortie à certaines colonnes :Building on the preceding example, let's limit the output to certain columns:

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur project.

Afficher n lignes : takeShow n rows: take

NetworkMonitoring contient des données de surveillance pour des réseaux virtuels Azure.NetworkMonitoring contains monitoring data for Azure virtual networks. Utilisons l’opérateur take pour examiner dix lignes aléatoires de cette table.Let's use the take operator to look at ten random sample rows in that table. L’opérateur take affiche un certain nombre de lignes d’une table sans ordre particulier :The take shows a certain number of rows from a table in no particular order:

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur take.

Ordonner les résultats : sort, topOrder results: sort, top

Au lieu d’enregistrements aléatoires, nous pouvons retourner les cinq derniers enregistrements en commençant par trier par heure :Instead of random records, we can return the latest five records by first sorting by time:

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

Vous pouvez obtenir ce comportement précis en utilisant à la place l’opérateur top :You can get this exact behavior by instead using the top operator:

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur top.

Calculer des colonnes dérivées : extendCompute derived columns: extend

L’opérateur extend est similaire à l’opérateur project, mais il ajoute des colonnes à l’ensemble de colonnes au lieu de les remplacer.The extend operator is similar to project, but it adds to the set of columns instead of replacing them. Vous pouvez utiliser les deux opérateurs pour créer une colonne basée sur un calcul effectué sur chaque ligne.You can use both operators to create a new column based on a computation on each row.

La table Perf contient des données de performances collectées à partir des machines virtuelles qui exécutent l’agent Log Analytics.The Perf table has performance data that's collected from virtual machines that run the Log Analytics agent.

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur extend.

Agréger des groupes de lignes : summarizeAggregate groups of rows: summarize

L’opérateur summarize regroupe les lignes qui ont les mêmes valeurs dans la clause by.The summarize operator groups together rows that have the same values in the by clause. Ensuite, il utilise une fonction d’agrégation comme count pour combiner chaque groupe dans une seule ligne.Then, it uses an aggregation function like count to combine each group in a single row. Une série de fonctions d’agrégation sont disponibles.A range of aggregation functions are available. Vous pouvez utiliser plusieurs fonctions d’agrégation dans un seul opérateur summarize pour produire plusieurs colonnes calculées.You can use several aggregation functions in one summarize operator to produce several computed columns.

La table SecurityEvent contient des événements de sécurité tels que les ouvertures de session et les processus qui ont démarré sur les machines surveillées.The SecurityEvent table contains security events like logons and processes that started on monitored computers. Vous pouvez compter le nombre d’événements de chaque niveau qui se sont produits sur chaque ordinateur.You can count how many events of each level occurred on each computer. Dans cet exemple, une ligne est produite pour chaque combinaison d’ordinateur et de niveau.In this example, a row is produced for each computer and level combination. Une colonne contient le nombre d’événements.A column contains the count of events.

SecurityEvent
| summarize count() by Computer, Level

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur summarize count.

Résumer en fonction de valeurs scalairesSummarize by scalar values

Vous pouvez agréger par valeurs scalaires telles que des nombres et des valeurs de temps, mais vous devez utiliser la fonction bin() pour regrouper les lignes dans des jeux de données distincts.You can aggregate by scalar values like numbers and time values, but you should use the bin() function to group rows into distinct sets of data. Par exemple, si vous agrégez par TimeGenerated, vous obtenez une ligne pour presque chaque valeur de temps.For example, if you aggregate by TimeGenerated, you'll get a row for almost every time value. Utilisez la fonction bin() pour consolider ces valeurs dans une heure ou un jour.Use bin() to consolidate those values into hour or day.

La table InsightsMetrics contient des données de performances collectées par des insights telles qu’Azure Monitor pour machines virtuelles et Azure Monitor pour conteneurs.The InsightsMetrics table contains performance data that's collected by insights such as Azure Monitor for VMs and Azure Monitor for containers. La requête suivante affiche l’utilisation moyenne horaire du processeur pour plusieurs ordinateurs :The following query shows the hourly average processor utilization for multiple computers:

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur avg.

Afficher un graphique ou une table : renderDisplay a chart or table: render

L’opérateur render spécifie le mode d’affichage de la sortie de la requête.The render operator specifies how the output of the query is rendered. Log Analytics affiche la sortie sous la forme d’une table par défaut.Log Analytics renders output as a table by default. Vous pouvez sélectionner différents types de graphiques après l’exécution de la requête.You can select different chart types after you run the query. L’opérateur render est utile à inclure dans des requêtes dans lesquelles un type de graphique spécifique est généralement préféré.The render operator is useful to include in queries in which a specific chart type usually is preferred.

L’exemple suivant montre l’utilisation moyenne horaire du processeur pour un ordinateur unique.The following example shows the hourly average processor utilization for a single computer. Il affiche la sortie sous la forme d’un graphique temporel.It renders the output as a timechart.

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur render.

Travailler avec plusieurs sériesWork with multiple series

Si vous utilisez plusieurs valeurs dans une clause summarize by, le graphique affiche une série distincte pour chaque jeu de valeurs :If you use multiple values in a summarize by clause, the chart displays a separate series for each set of values:

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur render avec plusieurs séries.

Joindre des données de deux tablesJoin data from two tables

Que se passe-t-il si vous avez besoin de récupérer des données de deux tables dans une seule requête ?What if you need to retrieve data from two tables in a single query? Vous pouvez utiliser l’opérateur join pour combiner des lignes de plusieurs tables dans un seul jeu de résultats.You can use the join operator to combine rows from multiple tables in a single result set. Chaque table doit avoir une colonne contenant une valeur correspondante afin que la jointure comprenne les lignes à faire correspondre.Each table must have a column that has a matching value so that the join understands which rows to match.

VMComputer est une table qu’Azure Monitor utilise pour les machines virtuelles, afin de stocker des détails sur les machines virtuelles qu’il surveille.VMComputer is a table that Azure Monitor uses for VMs to store details about virtual machines that it monitors. InsightsMetrics contient des données de performances collectées à partir de ces machines virtuelles.InsightsMetrics contains performance data that's collected from those virtual machines. Une valeur collectée dans InsightsMetrics est la mémoire disponible, mais pas le pourcentage de mémoire disponible.One value collected in InsightsMetrics is available memory, but not the percentage memory that's available. Pour calculer le pourcentage, nous avons besoin de la mémoire physique pour chaque machine virtuelle.To calculate the percentage, we need the physical memory for each virtual machine. Cette valeur est dans VMComputer.That value is in VMComputer.

L’exemple de requête suivant utilise une jointure pour effectuer ce calcul.The following example query uses a join to perform this calculation. L’opérateur distinct est utilisé avec la table VMComputer, car des détails sont régulièrement collectés à partir de chaque ordinateur.The distinct operator is used with VMComputer because details are regularly collected from each computer. Par conséquent, plusieurs lignes sont créées pour chaque ordinateur dans la table.As result, multiple rows are created for each computer in the table. Les deux tables sont jointes à l’aide de la colonne Computer.The two tables are joined by using the Computer column. Une ligne est créée dans le jeu de résultats qui contient des colonnes des deux tables pour chaque ligne dans InsightsMetrics, avec une valeur dans Computer qui correspond à la même valeur dans la colonne Computer dans VMComputer.A row is created in the result set that includes columns from both tables for each row in InsightsMetrics, with a value in Computer that matches the same value in the Computer column in VMComputer.

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur join.

Attribuer un résultat à une variable : letAssign a result to a variable: let

Utilisez l’opérateur let pour faciliter la lecture et la gestion des requêtes.Use let to make queries easier to read and manage. Vous pouvez vous servir de cet opérateur pour attribuer les résultats d’une requête à une variable que vous pourrez utiliser ultérieurement.You can use this operator to assign the results of a query to a variable that you can use later. À l’aide de l’instruction let, la requête de l’exemple précédent peut être réécrite comme suit :By using the let statement, the query in the preceding example can be rewritten as:

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

Capture d’écran montrant les résultats de l’exemple d’utilisation de l’opérateur let.

Étapes suivantesNext steps