Optimización de consultas de alerta de registroOptimizing log alert queries

En este artículo se describe cómo escribir y convertir las consultas de alerta de registro para lograr un rendimiento óptimo.This article describes how to write and convert Log Alert queries to achieve optimal performance. Las consultas optimizadas reducen la latencia y la carga de alertas, que se ejecutan con frecuencia.Optimized queries reduce latency and load of alerts, which run frequently.

Cómo empezar a escribir una consulta de alerta de registroHow to start writing an alert log query

Las consultas de alerta comienzan a partir de la consulta de los datos de registro en Log Analytics que indican el problema.Alert queries start from querying the log data in Log Analytics that indicates the issue. Puede usar el tema de ejemplos de consultas de alertas para comprender qué puede detectar.You can use the alert query examples topic to understand what you can discover. También puede empezar a escribir su propia consulta.You may also get started on writing your own query.

Consultas que indican el problema y no la alertaQueries that indicate the issue and not the alert

El flujo de alerta se ha creado de forma que transforme los resultados que indican la emisión de una alerta.The alert flow was built to transform the results that indicate the issue to an alert. Por ejemplo, en un caso de una consulta como la siguiente:For example, in a case of a query like:

SecurityEvent
| where EventID == 4624

Si la intención del usuario es enviar una alerta, cuando se produce este tipo de evento la lógica de alerta anexa count a la consulta.If the intent of the user is to alert, when this event type happens, the alerting logic appends count to the query. La consulta que se ejecutará será la siguiente:The query that will run will be:

SecurityEvent
| where EventID == 4624
| count

No es necesario agregar lógica de alerta a la consulta y hacerlo puede incluso provocar problemas.There's no need to add alerting logic to the query and doing that may even cause issues. En el ejemplo anterior, si incluye count en la consulta, siempre dará como resultado el valor 1, ya que el servicio de alertas ejecutará el comando count sobre count.In the above example, if you include count in your query, it will always result in the value 1, since the alert service will do count of count.

Evitar los operadores limit y takeAvoid limit and take operators

El uso de limit y take en las consultas puede aumentar la latencia y la carga de alertas, ya que los resultados no son coherentes a lo largo del tiempo.Using limit and take in queries can increase latency and load of alerts as the results aren't consistent over time. Es preferible usarlos solo si es necesario.It's preferred you use it only if needed.

Restricciones de la consulta de registroLog query constraints

Las consultas de registro de Azure Monitor comienzan con una tabla o con un operador search o union.Log queries in Azure Monitor start with either a table, search, or union operator.

Las consultas para las reglas de alertas de registro siempre deben empezar con una tabla que defina un ámbito claro, que mejore el rendimiento de las consultas y la pertinencia de los resultados.Queries for log alert rules should always start with a table to define a clear scope, which improves both query performance and the relevance of the results. Las consultas de las reglas de alertas se ejecutan con frecuencia, por lo que el uso de search y union puede producir una sobrecarga excesiva que suma latencia a la alerta, ya que requiere el examen de varias tablas.Queries in alert rules run frequently, so using search and union can result in excessive overhead adding latency to the alert, as it requires scanning across multiple tables. Estos operadores también reducen la capacidad del servicio de alertas para optimizar la consulta.These operators also reduce the ability of the alerting service to optimize the query.

No se admite la creación o modificación de reglas de alertas de registro que utilicen operadores search o union, excepto en consultas entre recursos.We don't support creating or modifying log alert rules that use search or union operators, expect for cross-resource queries.

Por ejemplo, la siguiente consulta de alertas tiene como ámbito la tabla SecurityEvent y busca un identificador de evento específico.For example, the following alerting query is scoped to the SecurityEvent table and searches for specific event ID. Es la única tabla que debe procesar la consulta.It's the only table that the query must process.

SecurityEvent
| where EventID == 4624

A las reglas de alertas del registro que usan consultas entre recursos no les afecta este cambio, ya que usan un tipo de operador union que limita el ámbito de la consulta a recursos específicos.Log alert rules using cross-resource queries are not affected by this change since cross-resource queries use a type of union, which limits the query scope to specific resources. El ejemplo siguiente sería una consulta de alerta de registro válida:The following example would be valid log alert query:

union
app('Contoso-app1').requests,
app('Contoso-app2').requests,
workspace('Contoso-workspace1').Perf 

Nota

Las consultas entre recursos se admiten en la nueva versión scheduledQueryRules API.Cross-resource queries are supported in the new scheduledQueryRules API. Si sigue usando la versión Alert API de Log Analytics heredada para crear alertas de registro, puede obtener información sobre el cambio aquí.If you still use the legacy Log Analytics Alert API for creating log alerts, you can learn about switching here.

EjemplosExamples

Los siguientes ejemplos incluyen consultas de registro que usan search y union, y proporcionan los pasos que puede seguir para modificar estas consultas para su uso en las reglas de alertas.The following examples include log queries that use search and union and provide steps you can use to modify these queries for use in alert rules.

Ejemplo 1Example 1

Desea crear una regla de alertas de registro mediante la siguiente consulta que recupera información de rendimiento mediante search:You want to create a log alert rule using the following query that retrieves performance information using search:

search *
| where Type == 'Perf' and CounterName == '% Free Space'
| where CounterValue < 30

Para modificar esta consulta, empiece por usar la consulta siguiente para identificar la tabla a la que pertenecen las propiedades:To modify this query, start by using the following query to identify the table that the properties belong to:

search *
| where CounterName == '% Free Space'
| summarize by $table

El resultado de esta consulta muestra que la propiedad CounterName procede de la tabla Perf.The result of this query would show that the CounterName property came from the Perf table.

Puede utilizar este resultado para crear la siguiente consulta, que podría usar para la regla de alertas:You can use this result to create the following query that you would use for the alert rule:

Perf
| where CounterName == '% Free Space'
| where CounterValue < 30

Ejemplo 2Example 2

Desea crear una regla de alertas de registro mediante la siguiente consulta que recupera información de rendimiento mediante search:You want to create a log alert rule using the following query that retrieves performance information using search:

search ObjectName =="Memory" and CounterName=="% Committed Bytes In Use"
| summarize Avg_Memory_Usage =avg(CounterValue) by Computer
| where Avg_Memory_Usage between(90 .. 95)  

Para modificar esta consulta, empiece por usar la consulta siguiente para identificar la tabla a la que pertenecen las propiedades:To modify this query, start by using the following query to identify the table that the properties belong to:

search ObjectName=="Memory" and CounterName=="% Committed Bytes In Use"
| summarize by $table

El resultado de esta consulta muestra que la propiedad ObjectName y CounterName procede de la tabla Perf.The result of this query would show that the ObjectName and CounterName property came from the Perf table.

Puede utilizar este resultado para crear la siguiente consulta, que podría usar para la regla de alertas:You can use this result to create the following query that you would use for the alert rule:

Perf
| where ObjectName =="Memory" and CounterName=="% Committed Bytes In Use"
| summarize Avg_Memory_Usage=avg(CounterValue) by Computer
| where Avg_Memory_Usage between(90 .. 95)

Ejemplo 3Example 3

Desea crear una regla de alertas de registro mediante la siguiente consulta que usa search y union para recuperar información de rendimiento:You want to create a log alert rule using the following query that uses both search and union to retrieve performance information:

search (ObjectName == "Processor" and CounterName == "% Idle Time" and InstanceName == "_Total")
| where Computer !in (
    union *
    | where CounterName == "% Processor Utility"
    | summarize by Computer)
| summarize Avg_Idle_Time = avg(CounterValue) by Computer

Para modificar esta consulta, empiece por usar la consulta siguiente para identificar la tabla a la que pertenecen las propiedades de la primera parte de la consulta:To modify this query, start by using the following query to identify the table that the properties in the first part of the query belong to:

search (ObjectName == "Processor" and CounterName == "% Idle Time" and InstanceName == "_Total")
| summarize by $table

El resultado de esta consulta muestra que todas estas propiedades proceden de la tabla Perf.The result of this query would show that all these properties came from the Perf table.

Ahora use union con el comando withsource para identificar qué tabla de origen ha contribuido a cada fila.Now use union with withsource command to identify which source table has contributed each row.

union withsource=table *
| where CounterName == "% Processor Utility"
| summarize by table

El resultado de esta consulta muestra que estas propiedades también proceden de la tabla Perf.The result of this query would show that these properties also came from the Perf table.

Puede utilizar estos resultados para crear la siguiente consulta, que podría usar para la regla de alertas:You can use these results to create the following query that you would use for the alert rule:

Perf
| where ObjectName == "Processor" and CounterName == "% Idle Time" and InstanceName == "_Total"
| where Computer !in (
    (Perf
    | where CounterName == "% Processor Utility"
    | summarize by Computer))
| summarize Avg_Idle_Time = avg(CounterValue) by Computer

Ejemplo 4Example 4

Desea crear una regla de alertas de registro mediante la siguiente consulta que combina los resultados de dos consultas search:You want to create a log alert rule using the following query that joins the results of two search queries:

search Type == 'SecurityEvent' and EventID == '4625'
| summarize by Computer, Hour = bin(TimeGenerated, 1h)
| join kind = leftouter (
    search in (Heartbeat) OSType == 'Windows'
    | summarize arg_max(TimeGenerated, Computer) by Computer , Hour = bin(TimeGenerated, 1h)
    | project Hour , Computer
) on Hour

Para modificar la consulta, empiece por usar la consulta siguiente para identificar la tabla que contiene las propiedades del lado izquierdo de la combinación:To modify the query, start by using the following query to identify the table that contains the properties in the left side of the join:

search Type == 'SecurityEvent' and EventID == '4625'
| summarize by $table

El resultado indica que las propiedades del lado izquierdo de la combinación pertenecen a la tabla SecurityEvent.The result indicates that the properties in the left side of the join belong to SecurityEvent table.

Ahora, use la consulta siguiente para identificar la tabla que contiene las propiedades del lado derecho de la combinación:Now use the following query to identify the table that contains the properties in the right side of the join:

search in (Heartbeat) OSType == 'Windows'
| summarize by $table

El resultado indica que las propiedades del lado derecho de la combinación pertenecen a la tabla Heartbeat.The result indicates that the properties in the right side of the join belong to Heartbeat table.

Puede utilizar estos resultados para crear la siguiente consulta, que podría usar para la regla de alertas:You can use these results to create the following query that you would use for the alert rule:

SecurityEvent
| where EventID == '4625'
| summarize by Computer, Hour = bin(TimeGenerated, 1h)
| join kind = leftouter (
    Heartbeat
    | where OSType == 'Windows'
    | summarize arg_max(TimeGenerated, Computer) by Computer , Hour = bin(TimeGenerated, 1h)
    | project Hour , Computer
) on Hour

Pasos siguientesNext steps