Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Язык запросов Kusto (KQL) включает операторы машинного обучения, функции и подключаемые модули для анализа временных рядов, обнаружения аномалий, прогнозирования и анализа первопричин. Используйте эти возможности KQL для выполнения расширенного анализа данных в Azure Monitor без дополнительных затрат на экспорт данных во внешние средства машинного обучения.
Azure Monitor журналы — это служба, в которой хранятся данные журнала. Log Analytics — это средство на портале Azure для запроса данных с помощью KQL. Справочные статьи о функциях KQL, связанные в этом руководстве, являются общими документацией Kusto.
В этом руководстве описано следующее:
- Создание временных рядов
- Определение аномалий в временных рядах
- Настройка параметров обнаружения аномалий для уточнения результатов
- Анализ первопричин аномалий
Примечание.
В этом руководстве содержатся ссылки на демонстрационную среду Log Analytics, в которой выполняются примеры запросов KQL. Данные в демонстрационной среде являются динамическими, поэтому результаты запроса не совпадают с результатами запроса, показанным в этой статье. Выполните те же запросы и принципы KQL в собственной среде и во всех Azure Monitor средствах, использующих KQL.
Предварительные условия
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Рабочая область с логами.
Требуемые разрешения
У вас должны быть разрешения Microsoft.OperationalInsights/workspaces/query/*/read на рабочие области Log Analytics, которые вы запрашиваете, например, предоставляемые встроенной ролью Log Analytics Reader.
Создание временных рядов с помощью make-series
Используйте оператор KQL make-series для создания временных рядов.
Создайте временные ряды на основе журналов в таблице "Использование", в которой содержатся сведения о том, сколько данных каждой таблицы в рабочей области выполняется каждый час, включая оплачиваемые и неплатежественные данные.
Этот запрос использует make-series для построения диаграммы, показывающей общий объем оплачиваемых данных, обрабатываемых каждой таблицей в рабочей области каждый день за последние 21 день.
Запустите этот запрос в демонстрационной среде
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
На результирующей диаграмме показаны некоторые аномалии, например в AzureDiagnostics типах данных и SecurityEvent типах данных:
Анимированный GIF-файл с диаграммой общих данных, поступивших в каждую таблицу в рабочей области ежедневно в течение 21 дня. Курсор перемещается, чтобы выделить три аномалии использования на диаграмме.
Чтобы перечислить все аномалии в временных рядах, используйте series_decompose_anomalies() функцию, описанную в разделе "Поиск аномалий в временных рядах с series_decompose_anomalies()".
Примечание.
Дополнительные сведения о синтаксисе и использовании make-series, см. оператор make-series.
Поиск аномалий в временных рядах с series_decompose_anomalies()
Функция series_decompose_anomalies() принимает ряд значений в качестве входных данных и извлекает аномалии.
Предоставьте результирующий набор запроса make-series в разделе "Создание временных рядов" в качестве входных данных функции series_decompose_anomalies() :
Запустите этот запрос в демонстрационной среде
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
Этот запрос возвращает все аномалии использования для всех таблиц за последние три недели:
Результаты запроса показывают, что функция:
- Вычисляет ожидаемое ежедневное использование для каждой таблицы.
- Сравнивает фактическое ежедневное использование с ожидаемым использованием.
- Назначает оценку аномалий каждой точке данных, указывающую степень отклонения фактического использования от ожидаемого использования.
- Определяет положительные (
1) и отрицательные (-1) аномалии в каждой таблице.
Примечание.
Дополнительные сведения о синтаксисе и использовании см. в series_decompose_anomalies() разделе series_decompose_anomalies().
Настройка параметров обнаружения аномалий для уточнения результатов
Рекомендуется просмотреть начальные результаты запроса и при необходимости внести настройки в запрос. Выбросы во входных данных могут сказаться на обучении функции, поэтому может потребоваться отрегулировать настройки обнаружения аномалий у функции, чтобы получить более точные результаты.
Отфильтруйте результаты series_decompose_anomalies() запроса на аномалии в типе AzureDiagnostics данных:
Даты и оценки результатов изменяются по мере перемещения окна запроса на 21 день. Сравните текущие результаты с диаграммой из запроса make-series в создании временных рядов и обратите внимание, что функция указывает на аномалии:
Разница в результатах возникает, так как series_decompose_anomalies() функция оценивает аномалии относительно ожидаемого значения использования, которое функция вычисляет на основе полного диапазона значений входного ряда.
Чтобы оценить последние точки на основе базовых показателей, извлеченных из предыдущих точек, исключите одну или несколько точек в конце ряда из процесса обучения функции.
Синтаксис series_decompose_anomalies() функции:
series_decompose_anomalies(Series [, Threshold, Seasonality, Trend, Test_points, AD_method, Seasonality_threshold])
Функция принимает следующие аргументы:
| Parameter | Описание | По умолчанию |
|---|---|---|
Series |
Входной ряд значений для анализа. | Обязательный |
Threshold |
Порог обнаружения аномалий. Более низкие значения повышают чувствительность. | 1.5 |
Seasonality |
Управляет сезонным анализом.
-1 autodetects сезонность, отключает его, 0 а положительное целое число задает период. |
-1 |
Trend |
Метод анализа трендов, например avg или linefit. |
avg |
Test_points |
Количество точек в конце ряда, которые следует исключить из процесса обучения (регрессии). | 0 |
AD_method |
Метод обнаружения аномалий. | ctukey |
Seasonality_threshold |
Пороговое значение для оценки сезонности при автоматическом определении. | 0.6 |
Чтобы исключить последнюю точку данных из процесса обучения, задайте значение Test_points1. Этот параметр всегда содержит окончательную точку в текущей серии. Она не относится к фиксированной дате календаря:
Запустите этот запрос в демонстрационной среде
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
Отфильтруйте результаты для AzureDiagnostics типа данных:
Сравните измененные результаты с исходными результатами. В зависимости от текущих данных, удержание конечной точки может изменить ожидаемое значение, оценку аномалий или классификацию. Увеличьте только Test_points в том случае, если планируется оценить или прогнозировать, что многие точки в конце серии.
Анализ первопричин аномалий с помощью подключаемого модуля diffpatterns()
Сравнение ожидаемых значений с аномальными значениями помогает понять причину различий между двумя наборами.
Подключаемый модуль KQL diffpatterns() сравнивает два набора данных одной структуры и находит шаблоны, характеризующие различия между двумя наборами данных.
Следующий запрос выбирает самую AzureDiagnostics сильную аномалию использования в текущем 21-дневном окне. Затем он сравнивает записи из этой даты с записями из других дат. Откройте демонстрационную среду Log Analytics и запустите запрос.
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
Запрос определяет каждую запись в таблице как возникающую в AnomalyDate или OtherDates. Затем diffpatterns() подключаемый модуль разделяет эти наборы данных (A is OtherDates, а B — AnomalyDate) и возвращает шаблоны, которые способствуют различиям между наборами. Если запрос не обнаруживает аномалию, увеличьте диапазон времени или измените порог аномалии перед выполнением этого анализа.
Просмотрите возвращаемые шаблоны, чтобы найти ресурсы, количество записей или процент которых больше всего отличается от anomalyDate и OtherDates. Значения зависят от выбранной аномалии и текущего содержимого демонстрационной рабочей области.
В столбце PercentDiffAB отображается абсолютное процентное различие между A и B (|PercentA — PercentB|), которая является основной мерой разницы между двумя наборами. По умолчанию подключаемый diffpatterns() модуль возвращает различия более 5% между двумя наборами данных. Настройте аргумент порога, чтобы изменить это поведение:
| Argument | Описание | По умолчанию |
|---|---|---|
| Порог | Минимальное процентное различие между двумя наборами данных для возвращаемого шаблона. Принимает значение между 0.015 и 1. |
0.05 |
Например, чтобы вернуть только различия в 20% или более между двумя наборами данных, задайте | evaluate diffpatterns(AnomalyDate, "OtherDates", "AnomalyDate", "~", 0.20) в приведенном выше запросе. Запрос возвращает только шаблоны с абсолютной разницей в процентах от 20% или более. Количество результатов зависит от выбранной аномалии и текущих демонстрационных данных. На следующем рисунке показан пример результата:
Примечание.
Дополнительные сведения о синтаксисе и использовании см. в diffpatterns()подключаемых модулях diffpatterns.
Следующие шаги
Дополнительные сведения: