Обнаружение аномалий и прогнозирование

Облачные службы и устройства Интернета вещей создают данные телеметрии, которые можно использовать для получения аналитических сведений, таких как мониторинг работоспособности служб, физические производственные процессы и тенденции использования. Анализ временных рядов — это один из способов выявления отклонений в шаблоне этих метрик по сравнению с типичной базовой моделью.

язык запросов Kusto (KQL) содержит встроенную поддержку для создания, обработки и анализа нескольких временных рядов. С помощью KQL можно создавать и анализировать тысячи временных рядов в секундах, обеспечивая решения и рабочие процессы мониторинга практически в реальном времени.

В этой статье подробно описаны возможности обнаружения аномалий временных рядов и прогнозирования KQL. Применимые функции временных рядов основаны на надежной, хорошо известной модели декомпозиции, где каждый исходный временной ряд разбивается на сезонные, остаточные компоненты, а также компоненты, связанные с тенденциями. Аномалии обнаруживаются выбросами по остаточному компоненту, в то время как прогнозирование осуществляется путем экстраполяции сезонного компонента и компонента, связанного с тенденциями. Реализация KQL значительно расширяет базовую модель декомпозиции за счет автоматического обнаружения сезонности, надежного анализа выбросов и векторизированной реализации для обработки тысяч временных рядов в секундах.

Предварительные требования

  • Учетная запись Майкрософт или удостоверение пользователя Microsoft Entra. Подписка Azure не обязательна.
  • Общие сведения о возможностях временных рядов см. в статье Анализ временных рядов.

Модель декомпозиции временного ряда

Собственная реализация KQL для прогнозирования временных рядов и обнаружения аномалий использует хорошо известную модель декомпозиции. Эта модель применяется к временным рядам метрик, которые должны проявлять периодическое и тенденциозное поведение (например, трафик службы, пульсы компонентов и периодические измерения IoT) для прогнозирования будущих значений метрик и обнаружения аномальных. Предполагается, что этот процесс регрессии отличается не только уже известным сезонным и тенденциозным поведением, но и тем, что временные ряды распределяются случайным образом. Следовательно, вы сможете прогнозировать будущие значения метрик на основе сезонных и тенденциозных компонентов, совокупно именуемых базовыми показателями, и игнорировать остаточную часть. Аномальные значения также можно обнаруживать на основе анализа выбросов, используя только остаточную часть. Для создания модели декомпозиции можно использовать функцию series_decompose(). Функция series_decompose() принимает набор временных рядов и автоматически разделяет каждый из них на компоненты базовых показателей, сезонные и остаточные компоненты, а также компоненты, связанные с тенденциями.

Например, вы можете разделить трафик внутренней веб-службы, используя следующий запрос:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend (baseline, seasonal, trend, residual) = series_decompose(num, -1, 'linefit')  //  decomposition of a set of time series to seasonal, trend, residual, and baseline (seasonal+trend)
| render timechart with(title='Web app. traffic of a month, decomposition', ysplit=panels)

Декомпозиция временного ряда.

  • Исходный временной ряд имеет метку num (красного цвета).
  • Процесс начинается с автоматического определения сезонности с помощью функции series_periods_detect() и извлекает сезонный шаблон (сиреневого цвета).
  • Сезонный шаблон вычитается из исходного временного ряда, а линейная регрессия выполняется с помощью функции series_fit_line() для поиска компонента, связанного с тенденцией (светло-голубого цвета).
  • Функция вычитает тенденцию, а остальные данные будут считаться остаточным компонентом (зеленого цвета).
  • Наконец, функция добавляет сезонный компонент и компонент, связанный с тенденцией, для создания базовых показателей (синего цвета).

Обнаружение аномалий во временных рядах

Функция series_decompose_anomalies() находит аномальные точки в наборе временных рядов. Эта функция вызывает series_decompose() для создания модели декомпозиции, а затем выполняет в остаточном компоненте запрос series_outliers(). series_outliers() вычисляет оценки аномалий для каждой точки остаточного компонента с помощью теста на ограждения Тьюки. Оценки аномалий свыше 1,5 или ниже –1,5 указывают на умеренное повышение или снижение аномалии соответственно. Оценки аномалий свыше 3,0 или ниже –3,0 указывают на серьезную аномалию.

Следующий запрос позволяет обнаруживать аномалии в трафике внутренней веб-службы:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend (anomalies, score, baseline) = series_decompose_anomalies(num, 1.5, -1, 'linefit')
| render anomalychart with(anomalycolumns=anomalies, title='Web app. traffic of a month, anomalies') //use "| render anomalychart with anomalycolumns=anomalies" to render the anomalies as bold points on the series charts.

Обнаружение аномалий временного ряда.

  • Исходный временной ряд (красного цвета).
  • Компонент (сезонный + связанный с тенденцией) базовых показателей (синего цвета).
  • Аномальные точки (сиреневого цвета) вверху исходного временного ряда. Аномальные точки значительно отличаются от ожидаемых значений базовых показателей.

Прогнозирование временных рядов

Функция series_decompose_forecast() предсказывает будущие значения набора временных рядов. Эта функция вызывает series_decompose() для построения модели декомпозиции, а затем выполняет для каждого временного ряда экстраполяцию компонента базовых показателей на будущее.

Следующий запрос позволяет спрогнозировать трафик веб-службы на следующую неделю:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
let horizon=7d;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t+horizon step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend forecast = series_decompose_forecast(num, toint(horizon/dt))
| render timechart with(title='Web app. traffic of a month, forecasting the next week by Time Series Decomposition')

Прогнозирование временного ряда.

  • Исходная метрика (красного цвета). Будущие значения отсутствуют, и по умолчанию для них задано значение 0.
  • Экстраполяция компонента базовых показателей (синего цвета) для прогнозирования значений за следующую неделю.

Масштабируемость

язык запросов Kusto синтаксис позволяет одному вызову обрабатывать несколько временных рядов. Его уникальная оптимизированная реализация обеспечивает высокую производительность, что критично для эффективного обнаружения и прогнозирования аномалий при мониторинге тысяч счетчиков в сценариях практически в режиме реального времени.

Следующий запрос показывает одновременную обработку трех временных рядов:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
let horizon=7d;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t+horizon step dt by sid
| extend offset=case(sid=='TS3', 4000000, sid=='TS2', 2000000, 0)   //  add artificial offset for easy visualization of multiple time series
| extend num=series_add(num, offset)
| extend forecast = series_decompose_forecast(num, toint(horizon/dt))
| render timechart with(title='Web app. traffic of a month, forecasting the next week for 3 time series')

Масштабируемость временного ряда.

Сводка

В этом документе подробно описаны собственные функции KQL для обнаружения и прогнозирования аномалий временных рядов. Каждый исходный временной ряд разбивается на сезонный и остаточный компоненты, а также компонент, связанный с тенденцией, для обнаружения аномалий и (или) прогнозирования. Эти функции можно использовать для сценариев мониторинга практически в режиме реального времени, таких как обнаружение сбоев, прогнозное обслуживание, прогнозирование спроса и нагрузки.