Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ 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). На диаграмме показан отдельный временный ряд для каждой версии ОС:
Функции анализа временных рядов
В этом разделе мы будем выполнять типичные функции обработки рядов. После создания набора временных рядов 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 временных рядов и обнаруживает два с внезапным падением количества операций чтения.
Эти возможности и производительность платформы предоставляют мощное решение для анализа временных рядов.
Связанный контент
- Обнаружение аномалий и прогнозирование с помощью KQL.
- Возможности машинного обучения с помощью KQL.