Introducción a las consultas de registro en Azure Monitor
Nota
Si va a recopilar datos de al menos una máquina virtual, puede realizar este ejercicio en su propio entorno. En otros casos, use nuestro entorno de demostración, que incluye gran cantidad de datos de ejemplo.
Si ya sabe cómo realizar consultas en el Lenguaje de consulta Kusto (KQL), pero necesita crear rápidamente consultas útiles basadas en tipos de recursos, consulte el panel de consultas de ejemplo guardadas en Uso de consultas en Log Analytics de Azure Monitor.
En este tutorial, aprenderá a escribir consultas de registro en Azure Monitor. En este artículo se muestra cómo:
- Comprender la estructura de las consultas.
- Ordenar los resultados de la consulta.
- Filtrar los resultados de la consulta.
- Especificar un intervalo de tiempo.
- Seleccionar los campos que se deben incluir en los resultados.
- Definir y usar campos personalizados.
- Agregar y agrupar los resultados.
Para obtener un tutorial sobre el uso de Log Analytics en Azure Portal, consulte Introducción a Log Analytics de Azure Monitor.
Para obtener más información sobre las consultas de registro en Azure Monitor, vea Información general de las consultas de registro en Azure Monitor.
Aquí puede ver una versión en vídeo de este tutorial:
Escritura de una nueva consulta
Las consultas pueden comenzar por un nombre de tabla o el comando search
. Le recomendamos que empiece por un nombre de tabla, ya que define un ámbito claro para la consulta. Además, esto mejora el rendimiento de las consultas y la pertinencia de los resultados.
Nota
KQL, que usa Azure Monitor, distingue mayúsculas de minúsculas. Las palabras clave del lenguaje normalmente se escriben en minúsculas. Al usar nombres de tablas o columnas en una consulta, asegúrese de usar las mayúsculas y minúsculas correctas, tal como se muestra en el panel de esquema.
Consultas basadas en tablas
Azure Monitor organiza los datos de registro en tablas, compuestas de varias columnas. Todas las tablas y columnas se muestran en el panel de esquema en Log Analytics en el portal de Analytics. Identifique una tabla que le interese y observe algunos datos:
SecurityEvent
| take 10
La consulta anterior devuelve 10 resultados de la tabla SecurityEvent
, sin ningún orden específico. Esta forma habitual de echar un vistazo a una tabla ayuda a comprender su estructura y contenido. Vamos a examinar su estructura:
- La consulta comienza por el nombre de la tabla,
SecurityEvent
, que define el ámbito de la consulta. - El carácter de barra vertical (|) separa los comandos, de manera que la salida del primero es la entrada del siguiente. Puede agregar cualquier cantidad de elementos canalizados.
- Después de la canalización se encuentra el comando
take
, que devuelve un número concreto de registros arbitrarios de la tabla.
Se podría ejecutar la consulta incluso sin agregar | take 10
. El comando seguiría siendo válido, pero podría devolver hasta 10 000 resultados.
Consultas de búsqueda
Las consultas de búsqueda están menos estructuradas. Son más adecuadas para buscar registros con un valor específico en cualquiera de sus columnas:
search in (SecurityEvent) "Cryptographic"
| take 10
Esta consulta busca registros en la tabla SecurityEvent
que contengan la frase "Cryptographic". De esos registros, se devolverán y se mostrarán 10 registros. Si omite la parte in (SecurityEvent)
y solo ejecuta search "Cryptographic"
, la búsqueda recorrerá todas las tablas. Por ello, el proceso podría tardar más tiempo y ser menos eficiente.
Importante
Normalmente, las consultas de búsqueda son más lentas que las consultas basadas en tablas porque tienen que procesar más datos.
sort y top
Mientras que take
resulta útil para obtener algunos registros, los resultados no se seleccionan ni se muestran en un orden concreto. Para obtener una vista ordenada a partir de la columna preferida, use sort
:
SecurityEvent
| sort by TimeGenerated desc
Aun así, la consulta anterior podría devolver demasiados resultados y también tardar un tiempo. La consulta ordena la tabla SecurityEvent
a partir de la columna TimeGenerated
. A continuación, en el portal de Analytics se limita la visualización a solo 10 000 registros. Este enfoque no es óptimo.
La mejor manera de obtener solo los 10 registros más recientes es usar top
, que ordena toda la tabla en el servidor y devuelve los registros principales:
SecurityEvent
| top 10 by TimeGenerated
El criterio de ordenación descendente es el valor predeterminado, por lo que se suele omitir el argumento desc
. El resultado tendrá un aspecto similar al de este ejemplo.
Operador where: filtro con una condición
Los filtros, tal como indica su nombre, filtran los datos por una condición específica. Esta manera de filtrar es la forma más común de limitar los resultados de la consulta a la información pertinente.
Para agregar un filtro a una consulta, use el operador where
seguido por una o varias condiciones. Por ejemplo, la siguiente consulta solo devuelve registros SecurityEvent
, donde Level equals _8
:
SecurityEvent
| where Level == 8
Al escribir las condiciones de filtro, puede usar las siguientes expresiones:
Expression | Descripción | Ejemplo |
---|---|---|
== | Coincidencia con igualdad (distingue mayúsculas y minúsculas) |
Level == 8 |
=~ | Coincidencia con igualdad (no distingue mayúsculas y minúsculas) |
EventSourceName =~ "microsoft-windows-security-auditing" |
!=, <> | Coincidencia sin igualdad (ambas expresiones son idénticas) |
Level != 4 |
and , or |
Necesario entre condiciones | Level == 16 or CommandLine != "" |
Para aplicar el filtro con varias condiciones, puede usar cualquiera de los enfoques siguientes:
Use and
, tal y como se muestra aquí:
SecurityEvent
| where Level == 8 and EventID == 4672
Canalice varios elementos where
uno tras otro, tal y como se muestra aquí:
SecurityEvent
| where Level == 8
| where EventID == 4672
Nota
Los valores pueden ser de tipos distintos, por lo que quizá deba convertirlos para realizar las comparaciones con el tipo correcto. Por ejemplo, la columna SecurityEvent Level
es de tipo cadena, por lo que debe convertirla a un tipo numérico, como int
o long
, para usar operadores numéricos, tal y como se muestra aquí: SecurityEvent | where toint(Level) >= 10
.
Especificar un intervalo de tiempo
Puede especificar un intervalo de tiempo mediante el selector de hora o un filtro de hora.
Uso del selector de hora
El selector de hora se muestra junto al botón Ejecutar e indica que solo consulta registros de las últimas 24 horas. Este intervalo de tiempo predeterminado se aplica a todas las consultas. Para obtener solo los registros de la última hora, seleccione Última hora y vuelva a ejecutar la consulta.
Adición de un filtro de tiempo a la consulta
También puede definir su propio intervalo de tiempo mediante la incorporación de un filtro de tiempo a la consulta. Lo mejor es colocar el filtro de hora inmediatamente después del nombre de la tabla:
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
En el filtro de hora anterior, ago(30m)
significa "hace 30 minutos". Esta consulta devuelve registros de solo los últimos 30 minutos (expresados como 30m, por ejemplo). Otras unidades de tiempo incluyen días (por ejemplo, 2d) y segundos (por ejemplo, 10 segundos).
Uso de project y extend para seleccionar y calcular las columnas
Use project
para seleccionar columnas concretas que incluir en los resultados:
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
El ejemplo anterior genera la siguiente salida:
También puede usar project
para cambiar el nombre de las columnas y definir otras nuevas. En el ejemplo siguiente se utiliza project
para hacer lo siguiente:
- Seleccionar solo las columnas originales
Computer
yTimeGenerated
. - Mostrar la columna
Activity
comoEventDetails
. - Crear una nueva columna denominada
EventCode
. La funciónsubstring()
se usa para obtener solo los primeros cuatro caracteres del campoActivity
.
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
Puede usar extend
para mantener todas las columnas originales en el conjunto de resultados y definir otras. La consulta siguiente usa extend
para agregar la columna EventCode
. Es posible que esta columna no se muestre al final de los resultados de la tabla. Sería necesario expandir los detalles de un registro para verla.
SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)
Uso de summarize para agregar los grupos de filas
Use summarize
para identificar grupos de registros, según una o varias columnas, y aplicarles agregaciones. El uso más habitual de summarize
es con count
, lo que devuelve el número de resultados de cada grupo.
En la consulta siguiente se revisan todos los registros Perf
de la última hora, se agrupan por ObjectName
y se cuentan los registros de cada grupo:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
A veces tiene sentido definir los grupos según varias dimensiones. Cada combinación única de estos valores define un grupo independiente:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName
Otro uso común es para realizar cálculos matemáticos o estadísticos en cada grupo. En el ejemplo siguiente se calcula la media de CounterValue
para cada equipo:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer
Lamentablemente, los resultados de esta consulta no tienen sentido, ya que hemos mezclado diferentes contadores de rendimiento. Para que los resultados tengan más sentido, calcule la media por separado para cada combinación de CounterName
y Computer
:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName
Resumen por una columna de tiempo
La agrupación de resultados también puede basarse en una columna de tiempo o en cualquier otro valor continuo. Si solo se resume by TimeGenerated
, se crearían grupos para cada milisegundo del intervalo de tiempo, ya que estos valores son únicos.
Para crear grupos basados en valores continuos, es mejor dividir el intervalo en unidades manejables mediante bin
. En la siguiente consulta se analizan los registros Perf
que miden la memoria libre (Available MBytes
) en un equipo específico. Se calcula el valor medio de cada período de 1 hora durante los últimos 7 días:
Perf
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2"
| where CounterName == "Available MBytes"
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)
Para que la salida sea más clara, puede elegir representarla como un gráfico de tiempo que muestre la memoria disponible a lo largo del tiempo.
Pasos siguientes
- Para obtener más información sobre el uso de datos de cadena en una consulta de registro, consulte Trabajo con cadenas en las consultas de registro de Azure Monitor.
- Para obtener más información sobre la agregación de datos en una consulta de registro, consulte Agregaciones avanzadas en las consultas de registro de Azure Monitor.
- Para obtener información sobre cómo combinar datos de varias tablas, consulte Combinaciones en consultas de registros de Azure Monitor.
- Obtenga la documentación completa del Lenguaje de consulta de Kusto en Referencia del lenguaje KQL.