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.

Captura de pantalla en la que se muestran los 10 registros principales en orden descendente.

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.

Captura de pantalla en la que se muestra el selector de hora y su lista de comandos de intervalo de tiempo.

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:

Captura de pantalla en la que se muestra la lista de resultados de

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 y TimeGenerated.
  • Mostrar la columna Activity como EventDetails.
  • Crear una nueva columna denominada EventCode. La función substring() se usa para obtener solo los primeros cuatro caracteres del campo Activity.
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.

Captura de pantalla en la que se muestran los valores de una memoria de consultas a lo largo del tiempo.

Pasos siguientes