Tutorial: Uso de consultas Kusto

La mejor manera de conocer sobre el lenguaje de consulta Kusto es examinar algunas consultas básicas para empezar a familiarizarse con el lenguaje. Se recomienda utilizar una base de datos con algunos datos de ejemplo. Las consultas que se muestran en este tutorial deben ejecutarse en esa base de datos. En la tabla StormEvents de la base de datos de ejemplo se proporciona información sobre tormentas producidas en Estados Unidos.

Contar filas

La base de datos de ejemplo tiene una tabla denominada StormEvents. queremos averiguar el tamaño de la tabla. Por lo tanto, canalizaremos su contenido a un operador que cuenta las filas de la tabla.

Nota sobre la sintaxis: Una consulta es un origen de datos (normalmente un nombre de tabla), seguido opcionalmente de uno o más pares de caracteres de barra vertical y algún operador tabular.

StormEvents | count

Este es el resultado:

Count
59066

Para obtener más información, consulte el operador count.

Selección de un subconjunto de columnas: project

Use project para seleccionar solo las columnas que quiere. Vea el ejemplo siguiente, en el que se usan los operadores project y take.

Filtro por expresión booleana: where

Vamos a ver solo los eventos flood en California de febrero de 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

Este es el resultado:

StartTime EndTime State EventType EpisodeNarrative
2007-02-19 00:00:00.0000000 2007-02-19 08:00:00.0000000 CALIFORNIA Inundación Un sistema frontal que se desplaza por el sur del Valle de San Joaquín ha traído breves períodos de lluvia intensa al condado occidental de Kern en las primeras horas de la mañana del 19. Se informaron leves inundaciones en la autopista estatal 166 cerca de Taft.

Presentación de n filas: take

Veamos algunos datos. ¿Qué tiene una muestra aleatoria de cinco filas?

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

Este es el resultado:

StartTime EndTime EventType State EventNarrative
2007-09-18 20:00:00.0000000 2007-09-19 18:00:00.0000000 Lluvia intensa FLORIDA En un período de 24 horas han caído hasta 9 pulgadas de lluvia en partes del litoral del condado de Volusia.
2007-09-20 21:57:00.0000000 2007-09-20 22:05:00.0000000 Tornado FLORIDA Un tornado tocó tierra en la ciudad de Eustis, en el extremo septentrional del lago West Crooked. El tornado se intensificó rápidamente hasta el nivel EF1 al pasar al nornoroeste a través de Eustis. La trayectoria tenía apenas menos de dos millas de longitud y tenía un ancho máximo de 300 yardas. El tornado destruyó 7 casas. Fueron 27 las casas que sufrieron daños importantes, y 81 casas informaron daños menores. No hubo lesiones graves y los daños a la propiedad se valuaron en 6,2 millones de dólares.
2007-09-29 08:11:00.0000000 2007-09-29 08:11:00.0000000 Tromba de agua ATLÁNTICO SUR Se formó una tromba de agua en sudeste atlántico de Melbourne Beach y que se desplazó brevemente hacia tierra.
2007-12-20 07:50:00.0000000 2007-12-20 07:53:00.0000000 Viento de tormenta MISISIPÍ Hubo caída de muchos árboles grandes con cortes en algunas líneas de energía. Los daños se produjeron en el condado oriental de Adams.
2007-12-30 16:00:00.0000000 2007-12-30 16:05:00.0000000 Viento de tormenta GEORGIA El informe del condado indicó la caída de varios árboles en Quincey Batten Loop, cerca de la carretera estatal 206. Se calculó el costo de retirada de los árboles.

Pero take muestra las filas de la tabla sin ningún orden determinado, así que vamos a ordenarlas. (limit es un alias para take y tiene el mismo efecto).

Ordenación de resultados: sort, top

  • Nota sobre la sintaxis: Algunos operadores tienen parámetros que se introducen mediante palabras clave, como by.
  • En el ejemplo siguiente, desc clasifica los resultados en orden descendente, y asc clasifica los resultados en orden ascendente.

Para mostrar las primeras n filas, ordenadas por una columna específica:

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

Este es el resultado:

StartTime EndTime EventType State EventNarrative
2007-12-31 22:30:00.0000000 2007-12-31 23:59:00.0000000 Tormenta invernal MICHIGAN Este evento de mucha nieve continuó hasta las primeras horas de la mañana de Año Nuevo.
2007-12-31 22:30:00.0000000 2007-12-31 23:59:00.0000000 Tormenta invernal MICHIGAN Este evento de mucha nieve continuó hasta las primeras horas de la mañana de Año Nuevo.
2007-12-31 22:30:00.0000000 2007-12-31 23:59:00.0000000 Tormenta invernal MICHIGAN Este evento de mucha nieve continuó hasta las primeras horas de la mañana de Año Nuevo.
2007-12-31 23:53:00.0000000 2007-12-31 23:53:00.0000000 Viento fuerte CALIFORNIA Se comunicaron vientos del norte al noreste, con rachas de unas 58 mph, en las montañas del condado de Ventura.
2007-12-31 23:53:00.0000000 2007-12-31 23:53:00.0000000 Viento fuerte CALIFORNIA El sensor RAWS de Warm Springs informó de vientos del norte, con ráfagas de hasta 58 mph.

Puede lograr el mismo resultado con sort y luego take:

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

Columnas derivadas de procesos: extend

Cree una nueva columna calculando un valor en cada fila:

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

Este es el resultado:

StartTime EndTime Duration EventType State
2007-09-18 20:00:00.0000000 2007-09-19 18:00:00.0000000 22:00:00 Lluvia intensa 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 Tromba de agua ATLÁNTICO SUR
2007-12-20 07:50:00.0000000 2007-12-20 07:53:00.0000000 00:03:00 Viento de tormenta MISISIPÍ
2007-12-30 16:00:00.0000000 2007-12-30 16:05:00.0000000 00:05:00 Viento de tormenta GEORGIA

Es posible reutilizar un nombre de columna y asignar un resultado de cálculo a la misma columna.

Ejemplo:

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

Este es el resultado:

x y
3 1

Las expresiones escalares pueden incluir todos los operadores habituales (+, -, *, /, %), y hay disponible una amplia gama de funciones útiles.

Agregado de grupos de filas: summarize

Cuente el número de eventos que se producen en cada estado:

StormEvents
| summarize event_count = count() by State

summarize agrupa las filas que tienen los mismos valores en el cláusula by y, después, usa una función de agregación (por ejemplo, count) para combinar cada grupo en una sola fila. En este caso, hay una fila para cada estado y una columna para el recuento de filas de ese estado.

Hay disponible una gama de funciones de agregación. Puede usar varias funciones de agregación en un operador summarize para generar varias columnas calculadas. Por ejemplo, podríamos obtener el recuento de tormentas por estado y la suma de tipos únicos de tormentas por estado. Luego, podríamos usar top para obtener los estados más afectados por las tormentas:

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

Este es el resultado:

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

En los resultados de un operador summarize:

  • Cada columna se denomina by.
  • Cada expresión calculada tiene una columna.
  • Cada combinación de valores de by tiene una fila.

Resumen por valores escalares

Puede usar valores escalares (numéricos, de tiempo o de intervalo) en la cláusula by, pero querrá colocar los valores en rangos mediante la función bin():

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

La consulta reduce todas las marcas de tiempo a intervalos de un día:

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

La función bin() es la misma que la función floor() en muchos lenguajes. Simplemente reduce cada valor al múltiplo más cercano del módulo que se indica, por lo que summarize puede asignar las filas a grupos.

Muestra de un gráfico o tabla: render

Puede proyectar dos columnas y usarlas como eje X y eje Y de un gráfico:

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

Screenshot that shows a column chart of storm event counts by state.

Aunque se ha quitado mid en la operación project, todavía se necesita si se quiere que el gráfico muestre los estados en ese orden.

En realidad, render es una característica del cliente en lugar de ser parte del lenguaje de consulta. Aun así, está integrado en el lenguaje y es útil para prever los resultados.

Gráficos de tiempo

Volviendo a los rangos numéricos, vamos a mostrar una serie temporal:

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

Screenshot of a line chart of events binned by time.

Varias series

Use varios valores en una cláusula summarize by para crear una fila independiente para cada combinación de valores:

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 that shows a table count by source.

Simplemente agregue el término render al ejemplo anterior: | render timechart.

Screenshot that shows a line chart count by source.

Observe que render timechart usa la primera columna como eje X y, a continuación, muestra las otras columnas como líneas independientes.

Ciclo medio diario

¿Cómo varía la actividad a lo largo del día normal?

Cuente los eventos por el módulo de tiempo un día, discretizados en horas. Aquí se usa floor en lugar de bin:

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

Screenshot that shows a timechart count by hour.

Actualmente, render no etiqueta las duraciones correctamente, pero se podría usar | render columnchart en su lugar:

Screenshot that shows a column chart count by hour.

Comparación de varias series diarias

¿Cómo varía la actividad a lo largo de la hora del día en distintos estados?

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 of a timechart by hour and state.

Divida por 1h para convertir el eje X en un número de hora en lugar de una duración:

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 that shows a column chart by hour and state.

Combinación de tipos de datos

¿Cómo encontraría dos tipos de evento específicos y en qué estado se produjo cada uno de ellos?

Puede extraer eventos de tormenta con el primer EventType y el segundo EventType y, a continuación, combinar los dos conjuntos en State:

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

Screenshot that shows joining the events lightning and avalanche.

Ejemplo de sesión de usuario de join

En esta sección no se usa la tabla StormEvents.

Supongamos que tiene datos que incluyen eventos que marcan el inicio y el final de cada sesión de usuario con un identificador único.

¿Cómo se puede averiguar cuánto tiempo dura cada sesión de usuario?

Puede usar extend para proporcionar un alias para las dos marcas de tiempo y, a continuación, calcular la duración de las sesiones:

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 of a table of results for user session extend.

Se recomienda usar project para seleccionar solo las columnas pertinentes antes de realizar la combinación. En la misma cláusula, cambie el nombre de la timestamp columna.

Trazado de una distribución

Al volver a la tabla StormEvents, ¿cuántas tormentas hay de diferentes duraciones?

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 of timechart results for event count by duration.

O bien, puede usar | render columnchart:

Screenshot of a column chart for event count timechart by duration.

Percentiles

¿Qué rangos de duraciones se encuentran en diferentes porcentajes de tormentas?

Para obtener esta información, use la consulta anterior de Trazado de una distribución, pero reemplace por render :

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

En este caso, no se usa una cláusula by, por lo que la salida es una sola fila:

Screenshot of a table of results for summarize percentiles by duration.

En la salida, se puede apreciar que:

  • El 5 % de las tormentas tiene una duración de menos de 5 minutos.
  • El 50 % de las tormentas duró menos de 1 hora y 25 minutos.
  • El 95 % de las tormentas duró menos de 2 horas y 50 minutos.

Para obtener un desglose independiente para cada estado, use la columna state por separado con ambos operadores summarize:

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 summarize percentiles duration by state.

Porcentajes

Con la tabla StormEvents, podemos calcular el porcentaje de lesiones directas de todas las lesiones.

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

La consulta quita cero entradas de recuento:

StartTime LesionesDirect LesionesIndirect Porcentaje
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

Asignación de un resultado a una variable: let

Use let para separar las partes de la expresión de consulta del ejemplo join anterior. Los resultados no cambian:

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

Sugerencia

En Kusto Explorer, para ejecutar la consulta completa, no agregue líneas en blanco entre las partes de la consulta. Las instrucciones deben estar separadas por un punto y coma.

Combinación de datos de varias bases de datos en una consulta

En la consulta siguiente, la tabla Logs debe estar en la base de datos predeterminada:

Logs | where ...

Para acceder a una tabla de otra base de datos, use la siguiente sintaxis:

database("db").Table

Por ejemplo, si tiene bases de datos denominadas Diagnostics y Telemetry y quiere correlacionar algunos de los datos de las dos tablas, puede usar la siguiente consulta (suponiendo que Diagnostics sea la base de datos predeterminada):

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

Use esta consulta si la base de datos predeterminada es Telemetry:

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

Las dos consultas anteriores suponen que ambas bases de datos están en el clúster al que está conectado actualmente. Si la base de datos Telemetry se encontraba en un clúster denominado TelemetryCluster.kusto.windows.net, para acceder a ella, use esta consulta:

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

Nota

Cuando se especifica el clúster, la base de datos es obligatoria.

Para obtener más información sobre cómo combinar datos de varias bases de datos en una consulta, vea Consultas entre bases de datos.

Pasos siguientes

La mejor manera de obtener información sobre el lenguaje de consulta de Azure Data Explorer es examinar algunas consultas básicas para obtener una "sensación" para el lenguaje. Estas consultas son similares a las consultas del tutorial de Azure Data Explorer, pero usan datos de tablas comunes en un área de trabajo de Azure Log Analytics.

Ejecute estas consultas mediante Log Analytics en Azure Portal. Log Analytics es una herramienta que puede usar para escribir consultas de registro. Use los datos de registro en Azure Monitor y, a continuación, evalúe los resultados de la consulta de registro. Si no está familiarizado con Log Analytics, complete el tutorial de Log Analytics.

Todas las consultas de este tutorial usan el entorno de demo de Log Analytics. Puede usar su propio entorno, pero es posible que no tenga algunas de las tablas que se usan aquí. Dado que los datos del entorno de demo no son estáticos, los resultados de las consultas pueden variar ligeramente de los resultados que se muestran aquí.

Contar filas

La tabla InsightsMetrics contiene datos de rendimiento recopilados mediante conclusiones, como Azure Monitor para VM y Azure Monitor para contenedores. Para averiguar el tamaño de la tabla, canalizaremos su contenido a un operador que cuenta filas.

Una consulta es un origen de datos (normalmente un nombre de tabla), seguido opcionalmente de uno o varios pares del carácter de canalización y algún operador tabular. En este caso, se devuelven todos los registros de la tabla InsightsMetrics y, a continuación, se envían al operador count. El operador count muestra los resultados porque el operador es el último comando de la consulta.

InsightsMetrics | count

Este es el resultado:

Count
1 263 191

Filtro por expresión booleana: where

La tabla AzureActivity tiene entradas del registro de actividad de Azure, que proporciona información sobre los eventos de nivel de suscripción o de grupo de administración que se producen en Azure. Vamos a ver solo las entradas Critical durante una semana específica.

El operador where es común en el lenguaje de consulta Kusto. where filtra una tabla en filas que coinciden con criterios específicos. En el ejemplo siguiente se usan varios comandos. En primer lugar, la consulta recupera todos los registros de la tabla. A continuación, filtra los datos solo para los registros que se encuentran en el intervalo de tiempo. Por último, filtra los resultados solo para los registros que tienen un nivel Critical.

Nota

Además de especificar un filtro en la consulta mediante la columna TimeGenerated, puede especificar el intervalo de tiempo en Log Analytics. Para obtener más información, consulte Ámbito e intervalo de tiempo de una consulta de registro en Log Analytics de Azure Monitor.

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

Screenshot that shows the results of the where operator example.

Selección de un subconjunto de columnas: project

Use project para incluir solo las columnas que quiere. En función del ejemplo anterior, vamos a limitar la salida a algunas columnas:

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

Screenshot that shows the results of the project operator example.

Presentación de n filas: take

NetworkMonitoring contiene datos de supervisión para redes virtuales de Azure. Vamos a usar el operador take para ver 10 filas de ejemplo aleatorias en esa tabla. La toma muestra algunas filas de una tabla en ningún orden determinado:

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

Screenshot that shows the results of the take operator example.

Ordenación de resultados: sort, top

En lugar de registros aleatorios, se pueden devolver los cinco registros más recientes mediante la primera ordenación por tiempo:

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

Puede obtener este mismo comportamiento en lugar de usar el operador top:

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

Screenshot that shows the results of the top operator example.

Columnas derivadas de procesos: extend

El operador extend es similar a project, pero se agrega al conjunto de columnas en lugar de reemplazarlas. Puede usar ambos operadores para crear una nueva columna basada en un cálculo en cada fila.

La tabla Perf tiene datos de rendimiento recopilados de las máquinas virtuales que ejecutan el agente de Log Analytics.

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

Screenshot that shows the results of the extend operator example.

Agregado de grupos de filas: summarize

El operador summarize agrupa filas que tienen los mismos valores en la cláusula by. A continuación, usa una función de agregación, como count, para combinar cada grupo en una sola fila. Hay disponible una gama de funciones de agregación. Puede usar varias funciones de agregación en un operador summarize para generar varias columnas calculadas.

La tabla SecurityEvent contiene eventos de seguridad, como inicios de sesión y procesos que se iniciaron en los equipos supervisados. Puede contar el número de eventos de cada nivel que se han producido en cada equipo. En este ejemplo, se genera una fila para cada combinación de equipo y nivel. Columna que contiene el recuento de eventos.

SecurityEvent
| summarize count() by Computer, Level

Screenshot that shows the results of the summarize count operator example.

Resumen por valores escalares

Puede agregar por valores escalares, como números y valores de hora, pero debe usar la función bin() para agrupar filas en conjuntos de datos distintos. Por ejemplo, si agrega por TimeGenerated, obtendrá una fila para la mayoría de los valores de tiempo. Se usa bin() para consolidar valores por hora o día.

La tabla InsightsMetrics contiene datos de rendimiento organizados según la información de Azure Monitor para VM y Azure Monitor para contenedores. La siguiente consulta muestra el uso promedio de procesador por hora para varios equipos:

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

Screenshot that shows the results of the avg operator example.

Muestra de un gráfico o tabla: render

El operador render especifica cómo se representa la salida de la consulta. De manera predeterminada Log Analytics representa la salida como una tabla. Puede seleccionar distintos tipos de gráfico después de ejecutar la consulta. El operador render resulta útil para incluir en las consultas donde suele preferirse un tipo de gráfico específico.

En el siguiente ejemplo se muestra el uso promedio de procesador por hora para un único equipo. Representa la salida como un gráfico de tiempo.

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

Screenshot that shows the results of the render operator example.

Trabajo con varias series

Si usa varios valores en una cláusula summarize by, el gráfico muestra una serie independiente para cada conjunto de valores:

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

Screenshot that shows the results of the render operator with multiple series example.

Combinación de datos de dos tablas

¿Qué ocurre si necesita recuperar datos de dos tablas en una sola consulta? Puede usar el operador join para combinar filas de varias tablas en un único conjunto de resultados. Cada tabla debe tener una columna que tenga un valor coincidente para que la combinación comprenda qué filas asociar.

VMComputer es una tabla que Azure Monitor usa para que las VM almacenen detalles sobre las máquinas virtuales que supervisa. InsightsMetrics contiene los datos de rendimiento que se recopilan de esas máquinas virtuales. Un valor recopilado en InsightsMetrics es la memoria disponible, pero no el porcentaje de memoria disponible. Para calcular el porcentaje, se necesita la memoria física para cada máquina virtual. Ese valor está en VMComputer.

En la consulta de ejemplo siguiente se usa una combinación para realizar este cálculo. El operador distinct se usa con VMComputer porque los detalles se recopilan periódicamente de cada equipo. Como resultado, la tabla contiene varias filas para cada equipo. Las dos tablas se combinan mediante la Computer columna . Se crea una fila en el conjunto resultante que incluye columnas de ambas tablas para cada fila de InsightsMetrics, donde el valor de Computer tiene el mismo valor en la Computer columna de 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

Screenshot that shows the results of the join operator example.

Asignación de un resultado a una variable: let

Use let para facilitar la lectura y administración de las consultas. Puede usar este operador para asignar los resultados de una consulta a una variable que puede usar más adelante. Al usar la instrucción let, la consulta del ejemplo anterior se puede volver a escribir de la siguiente manera:

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 that shows the results of the let operator example.

Pasos siguientes