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, yasc
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
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
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
Simplemente agregue el término render
al ejemplo anterior: | render timechart
.
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
Actualmente, render
no etiqueta las duraciones correctamente, pero se podría usar | render columnchart
en su lugar:
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
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
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
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
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
O bien, puede usar | render columnchart
:
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:
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
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
- Vea ejemplos de código para el lenguaje de consulta Kusto.
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'
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
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
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
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
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
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)
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
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
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
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
Pasos siguientes
- Vea ejemplos de código para el lenguaje de consulta Kusto.