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, obtendrá información sobre cómo 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:

Permisos necesarios

Debe tener los permisos de Microsoft.OperationalInsights/workspaces/query/*/read para las áreas de trabajo de Log Analytics que consulte, tal y como los proporciona el Rol integrado de lector de Log Analytics, por ejemplo.

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 es el take operador .

    Se podría ejecutar la consulta incluso sin agregar | take 10. El comando seguiría siendo válido, pero podría devolver hasta 30 000 resultados.

Take

Use el take operador para ver una pequeña muestra de registros devolviendo hasta el número especificado de registros. Los resultados seleccionados son arbitrarios y se muestran en ningún orden determinado. Si necesita devolver resultados en un orden determinado, use los sort operadores y top .

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 en la tabla SecurityEvent registros que contengan la frase "Criptográfico". De esos registros, se devuelven y muestran 10 registros. Si omite la parte in (SecurityEvent) y ejecuta solo search "Cryptographic", la búsqueda recorre 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

En esta sección se describen los sort operadores y top y sus desc argumentos y asc . Aunque take resulta útil para obtener algunos registros, no puede seleccionar ni ordenar los resultados en ningún orden determinado. Para obtener una vista ordenada, use sort y top.

Desc y asc

Desc

Use el desc argumento para ordenar los registros en orden descendente. Descendente es el criterio de ordenación predeterminado para sort y top, por lo que normalmente puede omitir el desc argumento .

Por ejemplo, los datos devueltos por las dos consultas siguientes se ordenan por la columna TimeGenerated, en orden descendente:

  • SecurityEvent	
    | sort by TimeGenerated desc
    
  • SecurityEvent	
    | sort by TimeGenerated
    

Asc

Para ordenar en orden ascendente, especifique asc.

Sort

Puede usar el sort operador . sort ordena los resultados de la consulta por la columna que especifique. Sin embargo, sort no limita el número de registros devueltos por la consulta.

Por ejemplo, la consulta siguiente devuelve todos los registros disponibles para la SecurityEvent tabla, que es hasta un máximo de 30 000 registros, y los ordena por la columna TimeGenerated.

SecurityEvent	
| sort by TimeGenerated

La consulta anterior podría devolver demasiados resultados. Además, también puede tardar algún tiempo en devolver los resultados. La consulta ordena la tabla SecurityEvent a partir de la columna TimeGenerated. En dicho caso, el portal de Analytics limita la visualización a solo 30 000 registros. Este enfoque no es óptimo. La mejor manera de obtener solo los registros más recientes es usar el top operador .

TOP

Use el top operador para ordenar toda la tabla en el servidor y, a continuación, devolver solo los registros principales.

Por ejemplo, la consulta siguiente devuelve los 10 registros más recientes:

SecurityEvent
| top 10 by TimeGenerated

El resultado tendrá un aspecto similar al de este ejemplo.

Screenshot that shows the top 10 records sorted in descending order.

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 where operador seguido de 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.

Screenshot that shows the time picker and its list of time-range commands.

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. Al agregar un filtro de tiempo, se invalida el intervalo de tiempo seleccionado en el selector de tiempo.

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:

Screenshot that shows the query 'project' results list.

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.

Screenshot that shows the values of a query memory over time.

Preguntas más frecuentes

Esta sección proporciona respuestas a preguntas comunes.

¿Por qué veo registros duplicados en los registros de Azure Monitor?

Ocasionalmente, podría observar registros duplicados en los registros de Azure Monitor. Normalmente, esta duplicación se debe a una de las dos condiciones siguientes:

  • Los componentes de la canalización hacen reintentos para garantizar una entrega confiable en el destino. A veces, esta capacidad podría dar lugar a duplicados en un pequeño porcentaje de los elementos de telemetría.
  • Si los registros duplicados proceden de una máquina virtual, puede que tenga instalados tanto el agente de Log Analytics como el agente de Azure Monitor. Si necesita que el agente de Log Analytics esté instalado, configure el área de trabajo de Log Analytics para que deje de recopilar los datos que también recopila la regla utilizada por el agente de Azure Monitor.

Pasos siguientes