Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Lenguaje de consulta Kusto (KQL) incluye operadores de aprendizaje automático, funciones y complementos para el análisis de series temporales, detección de anomalías, previsión y análisis de causa principal. Use estas funcionalidades de KQL para realizar análisis avanzados de datos en Azure Monitor sin la sobrecarga de exportar datos a herramientas de aprendizaje automático externas.
Azure Monitor Registros es el servicio que almacena los datos de registro. Log Analytics es la herramienta del portal de Azure para consultar esos datos mediante KQL. Los artículos de referencia de la función KQL vinculados en este tutorial son documentación compartida de Kusto.
En este tutorial, aprenderá a:
- Creación de una serie temporal
- Identificación de anomalías en una serie temporal
- Ajuste de la configuración de detección de anomalías para refinar los resultados
- Análisis de la causa principal de anomalías
Nota
En este tutorial se proporcionan vínculos a un entorno de demostración de Log Analytics en el que se ejecutan los ejemplos de consultas KQL. Los datos del entorno de demostración son dinámicos, por lo que los resultados de la consulta no son los mismos que los que se muestran en este artículo. Ejecute las mismas consultas y principios de KQL en su propio entorno y en todas las herramientas de Azure Monitor que usan KQL.
Requisitos previos
- Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
- Un área de trabajo con datos de registro.
Permisos necesarios
Debes 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.
Creación de una serie temporal con series make
Use el operador make-series de KQL para crear una serie temporal.
Cree una serie temporal basada en los registros de la tabla Uso, que contiene información sobre la cantidad de datos que ingiere cada tabla de un área de trabajo cada hora, incluidos los datos facturables y no facturables.
Esta consulta usa make-series para trazar la cantidad total de datos facturables ingeridos por cada tabla del área de trabajo todos los días, en los últimos 21 días:
Ejecución de esta consulta en el entorno de demostración
let starttime = 21d; // The start date of the time series, counting back from the current date
let endtime = 0d; // The end date of the time series, counting back from the current date
let timeframe = 1d; // How often to sample data
Usage // The table we're analyzing
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Time range for the query, beginning at 12:00 AM of the first day and ending at 12:00 AM of the last day in the time range
| where IsBillable == "true" // Include only billable data in the result set
| make-series ActualUsage=sum(Quantity) default = 0 on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step timeframe by DataType // Creates the time series, listed by data type
| render timechart // Renders results in a timechart
El gráfico resultante muestra algunas anomalías, por ejemplo, en los AzureDiagnostics tipos de datos y SecurityEvent :
Para enumerar todas las anomalías de una serie temporal, use la series_decompose_anomalies() función , que se describe en Búsqueda de anomalías en una serie temporal con series_decompose_anomalies().
Nota
Para más información sobre la sintaxis y el uso de make-series, consulte Operador make-series.
Búsqueda de anomalías en una serie temporal con series_decompose_anomalies()
La función series_decompose_anomalies() toma una serie de valores como entrada y extrae anomalías.
Proporcione el conjunto de resultados de la consulta make-series en Creación de una serie temporal como entrada para la series_decompose_anomalies() función:
Ejecución de esta consulta en el entorno de demostración
let starttime = 21d; // Start date for the time series, counting back from the current date
let endtime = 0d; // End date for the time series, counting back from the current date
let timeframe = 1d; // How often to sample data
Usage // The table we're analyzing
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Time range for the query, beginning at 12:00 AM of the first day and ending at 12:00 AM of the last day in the time range
| where IsBillable == "true" // Includes only billable data in the result set
| make-series ActualUsage=sum(Quantity) default = 0 on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step timeframe by DataType // Creates the time series, listed by data type
| extend(Anomalies, AnomalyScore, ExpectedUsage) = series_decompose_anomalies(ActualUsage) // Scores and extracts anomalies based on the output of make-series
| mv-expand ActualUsage to typeof(double), TimeGenerated to typeof(datetime), Anomalies to typeof(double),AnomalyScore to typeof(double), ExpectedUsage to typeof(long) // Expands the array created by series_decompose_anomalies()
| where Anomalies != 0 // Returns all positive and negative deviations from expected usage
| project TimeGenerated,ActualUsage,ExpectedUsage,AnomalyScore,Anomalies,DataType // Defines which columns to return
| sort by abs(AnomalyScore) desc // Sorts results by anomaly score in descending ordering
Esta consulta devuelve todas las anomalías de uso de todas las tablas de las últimas tres semanas:
Los resultados de la consulta muestran que la función :
- Calcula un uso diario esperado para cada tabla.
- Compara el uso diario real con el uso esperado.
- Asigna una puntuación de anomalías a cada punto de datos, lo que indica la extensión de la desviación del uso real del uso esperado.
- Identifica anomalías positivas (
1) y negativas (-1) en cada tabla.
Nota
Para más información sobre la sintaxis y el uso de series_decompose_anomalies(), consulte series_decompose_anomalies().
Ajuste de la configuración de detección de anomalías para refinar los resultados
Es recomendable revisar los resultados iniciales de la consulta y realizar ajustes en esta, si es necesario. Los valores atípicos de los datos de entrada pueden afectar al aprendizaje de la función y es posible que tenga que ajustar la configuración de detección de anomalías de la función para obtener resultados más precisos.
Filtre los resultados de la consulta series_decompose_anomalies() para detectar anomalías en el tipo de datos AzureDiagnostics:
Las fechas y puntuaciones de los resultados cambian a medida que se mueve la ventana de consulta de 21 días. Compare los resultados actuales con el gráfico de la consulta make-series en Creación de una serie temporal y observe qué señala la función identifica como anomalías:
La diferencia en los resultados se produce porque la función series_decompose_anomalies() puntúa anomalías en relación con el valor de uso esperado, que la función calcula en función del intervalo completo de valores de la serie de entrada.
Para evaluar los puntos recientes con respecto a una línea base aprendida de puntos anteriores, excluya uno o varios puntos al final de la serie del proceso de aprendizaje de la función.
La sintaxis de la función series_decompose_anomalies() es:
series_decompose_anomalies(Series [, Threshold, Seasonality, Trend, Test_points, AD_method, Seasonality_threshold])
La función toma estos argumentos:
| Parámetro | Descripción | Predeterminado |
|---|---|---|
Series |
Serie de valores de entrada que se van a analizar. | Obligatorio |
Threshold |
Umbral de detección de anomalías. Los valores inferiores aumentan la sensibilidad. | 1.5 |
Seasonality |
Controla el análisis estacional.
-1 detecta automáticamente la estacionalidad, 0 la deshabilita y un entero positivo establece el período. |
-1 |
Trend |
Método de análisis de tendencias, como avg o linefit. |
avg |
Test_points |
Número de puntos al final de la serie que se van a excluir del proceso de aprendizaje (regresión). | 0 |
AD_method |
Método de detección de anomalías. | ctukey |
Seasonality_threshold |
Umbral para puntuar la estacionalidad al detectar automáticamente. | 0.6 |
Para excluir el último punto de datos del proceso de aprendizaje, establezca en Test_points1. Esta configuración siempre mantiene el punto final de la serie actual. No hace referencia a una fecha de calendario fija:
Ejecución de esta consulta en el entorno de demostración
let starttime = 21d; // Start date for the time series, counting back from the current date
let endtime = 0d; // End date for the time series, counting back from the current date
let timeframe = 1d; // How often to sample data
Usage // The table we're analyzing
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Time range for the query, beginning at 12:00 AM of the first day and ending at 12:00 AM of the last day in the time range
| where IsBillable == "true" // Includes only billable data in the result set
| make-series ActualUsage=sum(Quantity) default = 0 on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step timeframe by DataType // Creates the time series, listed by data type
| extend(Anomalies, AnomalyScore, ExpectedUsage) = series_decompose_anomalies(ActualUsage, 1.5, -1, 'avg', 1) // Excludes the final series value from learning. Other input values are the function defaults
| mv-expand ActualUsage to typeof(double), TimeGenerated to typeof(datetime), Anomalies to typeof(double),AnomalyScore to typeof(double), ExpectedUsage to typeof(long) // Expands the array created by series_decompose_anomalies()
| where Anomalies != 0 // Returns all positive and negative deviations from expected usage
| project TimeGenerated,ActualUsage,ExpectedUsage,AnomalyScore,Anomalies,DataType // Defines which columns to return
| sort by abs(AnomalyScore) desc // Sorts results by anomaly score in descending ordering
Filtre los resultados del tipo de datos AzureDiagnostics:
Compare los resultados modificados con los resultados originales. Dependiendo de los datos actuales, mantener el punto final puede cambiar su valor esperado, puntuación de anomalías o clasificación. Aumente Test_points solo cuando se pretende evaluar o predecir que muchos puntos al final de la serie.
Analizar la causa principal de anomalías con el complemento diffpatterns()
Comparar los valores esperados con valores anómalos le ayuda a comprender la causa de las diferencias entre los dos conjuntos.
El complemento diffpatterns() de KQL compara dos conjuntos de datos de la misma estructura y busca patrones que caracterizan las diferencias entre los dos conjuntos de datos.
La consulta siguiente selecciona la anomalía de uso más fuerte AzureDiagnostics en la ventana actual de 21 días. A continuación, compara los registros de esa fecha con registros de las otras fechas. Abra el entorno de demostración de Log Analytics y ejecute la consulta.
let starttime = 21d; // Start date for the time series, counting back from the current date
let endtime = 0d; // End date for the time series, counting back from the current date
let anomalyDate = toscalar(
Usage
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime)))
| where IsBillable == "true" and DataType == "AzureDiagnostics"
| make-series ActualUsage=sum(Quantity) default = 0 on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step 1d
| extend (Anomalies, AnomalyScore, ExpectedUsage) = series_decompose_anomalies(ActualUsage)
| mv-expand TimeGenerated to typeof(datetime), Anomalies to typeof(double), AnomalyScore to typeof(double)
| where Anomalies != 0
| top 1 by abs(AnomalyScore) desc
| project TimeGenerated
);
AzureDiagnostics
| extend AnomalyDate = iff(startofday(TimeGenerated) == anomalyDate, "AnomalyDate", "OtherDates") // Splits the result set into the selected anomaly date and all other dates
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Defines the time range for the query
| project AnomalyDate, Resource // Defines which columns to return
| evaluate diffpatterns(AnomalyDate, "OtherDates", "AnomalyDate") // Compares usage on the anomaly date with the regular usage pattern
La consulta identifica cada entrada de la tabla como se produce en AnomalyDate u OtherDates. A continuación, el diffpatterns() complemento divide estos conjuntos de datos (A es OtherDates y B es AnomalyDate) y devuelve patrones que contribuyen a las diferencias entre los conjuntos. Si la consulta no detecta una anomalía, aumente el intervalo de tiempo o ajuste el umbral de anomalías antes de ejecutar este análisis.
Revise los patrones devueltos para buscar recursos cuyo recuento de registros o porcentaje difiere más entre AnomalyDate y OtherDates. Los valores varían con la anomalía seleccionada y el contenido actual del área de trabajo de demostración.
La columna PercentDiffAB muestra la diferencia de punto porcentual absoluta entre A y B (PercentA - PercentB|), que es la medida principal de la diferencia entre los dos conjuntos. De forma predeterminada, el diffpatterns() complemento devuelve diferencias de más de 5% entre los dos conjuntos de datos. Ajuste el argumento threshold para cambiar este comportamiento:
| Argument | Descripción | Predeterminado |
|---|---|---|
| Umbral | Diferencia mínima de punto porcentual entre los dos conjuntos de datos para que se devuelva un patrón. Acepta un valor entre 0.015 y 1. |
0.05 |
Por ejemplo, para devolver solo las diferencias de 20% o más entre los dos conjuntos de datos, establezca | evaluate diffpatterns(AnomalyDate, "OtherDates", "AnomalyDate", "~", 0.20) en la consulta anterior. La consulta solo devuelve patrones con una diferencia absoluta de punto porcentual de 20% o más. El número de resultados depende de la anomalía seleccionada y de los datos de demostración actuales. En la imagen siguiente se muestra un resultado de ejemplo:
Nota
Para obtener más información sobre la diffpatterns() sintaxis y el uso, consulte complemento diffpatterns.
Pasos siguientes
Más información sobre: