Аналитика временных рядов

Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

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

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

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

Создайте большой набор регулярных временных рядов с помощью make-series оператора и при необходимости заполните отсутствующие значения. Секционирование и преобразование таблицы телеметрии в набор временных рядов. Таблица обычно содержит столбец метки времени, контекстные измерения и необязательные метрики. Измерения используются для секционирования данных. Цель состоит в создании тысяч временных рядов на раздел с регулярными временными интервалами.

Входная таблица demo_make_series1 содержит 600K записей произвольного трафика веб-службы. Используйте следующую команду для примера 10 записей:

demo_make_series1 | take 10 

Результирующая таблица содержит столбец метки времени, три столбца контекстного измерения и не содержит метрик:

Метка времени BrowserVer OsVer (версия ОС) Страна или регион
2016-08-25 09:12:35.4020000 Chrome 51.0 Windows 7 Соединенное Королевство
2016-08-25 09:12:41.1120000 Chrome 52.0 Windows 10
2016-08-25 09:12:46.2300000 Chrome 52.0 Windows 7 Соединенное Королевство
2016-08-25 09:12:46.5100000 Chrome 52.0 Windows 10 Соединенное Королевство
2016-08-25 09:12:46.5570000 Chrome 52.0 Windows 10 Литовская Республика
2016-08-25 09:12:47.0470000 Chrome 52.0 Windows 8.1 Индия
2016-08-25 09:12:51.3600000 Chrome 52.0 Windows 10 Соединенное Королевство
2016-08-25 09:12:51.6930000 Chrome 52.0 Windows 7 Нидерланды
2016-08-25 09:12:56.4240000 Chrome 52.0 Windows 10 Соединенное Королевство
2016-08-25 09:13:08.7230000 Chrome 52.0 Windows 10 Индия

Так как нет метрик, постройте временные ряды по количеству трафика, разделенные по ОС.

let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| render timechart 
  • make-series Используйте оператор для создания трех временных рядов, где:
    • num=count(): количество трафика.
    • from min_t to max_t step 1h: создает временные ряды с интервалами в один час, от старейшей к новейшей метке времени в таблице.
    • default=0: указывает метод заполнения пропущенных интервалов для создания регулярных временных рядов. Кроме того, используйте series_fill_const(), series_fill_forward(), series_fill_backward(), и series_fill_linear() для различного поведения заливки.
    • by OsVer: секции по ОС.
  • Структура данных временных рядов — это числовой массив агрегированных значений для каждой ячейки времени. Используется render timechart для визуализации.

В таблице выше три раздела (Windows 10, Windows 7 и Windows 8.1). На диаграмме показан отдельный временный ряд для каждой версии ОС:

Снимок экрана: диаграмма временных рядов с отдельными строками для Windows 10, Windows 7 и Windows 8.1.

Функции анализа временных рядов

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

Фильтрация

Фильтрация — это распространенная практика обработки сигналов и полезна для задач обработки временных рядов (например, сгладить шумный сигнал, обнаружение изменений).

  • Существует два универсальных функции фильтрации:
    • series_fir(): применение фильтра FIR. Используется для простого вычисления скользящей средней и дифференцировки временных рядов для обнаружения изменений.
    • series_iir(): применение фильтра IIR. Используется для экспоненциального сглаживания и кумулятивной суммы.
  • Extend Набор временных рядов путем добавления нового скользящего среднего ряда размером 5 ячеек (с именем ma_num) в запрос:
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| render timechart

Фильтрация временных рядов.

Анализ регрессии

Для оценки тренда временных рядов можно использовать сегментный анализ линейной регрессии.

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

Пример функций series_fit_line() и series_fit_2lines() в запросе временных рядов:

demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)

Регрессия временных рядов.

  • Синий: исходный временный ряд
  • Зеленый: подогнанная линия
  • Красный: две встроенные линии

Замечание

Функция точно обнаружила точку перехода (изменения уровня).

Обнаружение сезонности

Многие метрики следуют сезонным (периодическим) шаблонам. Трафик пользователей облачных служб обычно содержит ежедневные и еженедельные шаблоны, самые высокие в середине рабочего дня и самые низкие в ночное время и в выходные дни. Датчики Интернета вещей измеряют с периодическими интервалами. Физические измерения, такие как температура, давление или влажность, также могут показать сезонное поведение.

В следующем примере используется обнаружение сезонности на один месяц веб-трафика (интервалы в 2 часа):

demo_series3
| render timechart 

Сезонность временных рядов.

  • Используйте series_periods_detect() для автоматического обнаружения периодов в временных рядах, где:
    • num: временный ряд для анализа
    • 0.: минимальная длина периода в днях (0 означает отсутствие минимального значения)
    • 14d/2h: максимальная длина периода в днях составляет 14, разделённых на 2-часовые отрезки
    • 2: количество периодов для обнаружения
  • Используйте series_periods_validate(), если мы знаем, что метрика должна иметь определенные отдельные периоды, и мы хотим убедиться, что они существуют.

Замечание

Это аномалия, если определенные отдельные периоды не существуют

demo_series3
| project (periods, scores) = series_periods_detect(num, 0., 14d/2h, 2) //to detect the periods in the time series
| mv-expand periods, scores
| extend days=2h*todouble(periods)/1d
Периоды оценки Дни
84 0.820622786055595 7
12 0.764601405803502 1

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

Функции поэлементные

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

let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| extend residual_num=series_subtract(num, ma_num) //to calculate residual time series
| where OsVer == "Windows 10"   // filter on Win 10 to visualize a cleaner chart 
| render timechart

Операции временных рядов.

  • Синий: исходный временный ряд
  • Красный: сглаженный временной ряд
  • Зеленый: остаточные временные ряды

Рабочий процесс временных рядов на большом масштабе

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

demo_many_series1
| take 4 
TIMESTAMP Местоположение Оп База данных DataRead
2016-09-11 21:00:00.0000000 Loc 9 5117853934049630089 262 0
2016-09-11 21:00:00.0000000 Loc 9 5117853934049630089 241 0
2016-09-11 21:00:00.0000000 Loc 9 -865998331941149874 262 279862
2016-09-11 21:00:00.0000000 Loc 9 371921734563783410 255 0

Просмотр простой статистики:

demo_many_series1
| summarize num=count(), min_t=min(TIMESTAMP), max_t=max(TIMESTAMP) 
число min_t max_t
2177472 2016-09-08 00:00:00.0000000 2016-09-11 23:00:00.0000000

Временные ряды в 1-часовых ячейках метрики чтения (четыре дня × 24 часа = 96 очков) показывают обычное почасовое колебания:

let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));  
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));  
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h
| render timechart with(ymin=0) 

Снимок экрана: диаграмма временных рядов, показывающая среднее число операций чтения в течение четырех дней с обычными почасовыми колебаниями.

Это поведение вводит в заблуждение, так как один обычный временный ряд агрегируется из тысяч экземпляров, которые могут иметь ненормальные шаблоны. Создайте временные ряды для каждого экземпляра, определенного Loc (расположение), Op (операция) и DB (конкретная машина).

Сколько временных рядов можно создать?

demo_many_series1
| summarize by Loc, Op, DB
| count
Численность
18 339

Создайте 18339 временных рядов для метрики счетчика чтения. Добавьте условие в инструкцию make-series, примените линейную регрессию и выберите два верхних временных ряда с самой значимой тенденцией уменьшения.

let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));  
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));  
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc 
| render timechart with(title='Service Traffic Outage for 2 instances (out of 18339)')

Снимок экрана: два временных ряда с резким снижением количества операций чтения по сравнению с обычным трафиком.

Показать экземпляры:

let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));  
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));  
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| project Loc, Op, DB, slope 
Местоположение Оп База данных наклон
Loc 15 37 1151 -104,498.46510358342
Loc 13 37 1249 -86,614.02919932814

В течение двух минут запрос анализирует почти 20 000 временных рядов и обнаруживает два с внезапным падением количества операций чтения.

Эти возможности и производительность платформы предоставляют мощное решение для анализа временных рядов.