Диагностика аномалий для анализа первопричин

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

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

  • Получение и объединение дополнительных данных из разных источников за один и тот же интервал времени
  • Поиск изменений в распределении значений по нескольким измерениям.
  • Создание диаграммы с дополнительными переменными
  • Другие методы на основе знаний в предметной области и интуиции

Так как эти сценарии диагностики являются общими, доступны подключаемые модули машинного обучения, которые упрощают этап диагностики и сокращают длительность RCA.

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

Кластеризация одного набора записей

Распространенный сценарий включает набор данных, выбранный по определенным критериям, например:

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

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

let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));  
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));  
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m
| render timechart with(title="Service exceptions over a week, 10 minutes resolution")

Временная диаграмма исключений службы.

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

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

let min_t=datetime(2016-08-23 11:00);
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to min_t+8h step 1m
| render timechart with(title="Zoom on the 2nd spike, 1 minute resolution")

Сосредоточьтесь на диаграмме скачков.

Вы увидите узкий двухминутный всплеск с 15:00 до 15:02. В следующем запросе подсчитайте исключения в этом 2-минутном окне:

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| count
Счетчик
972

В следующем запросе выберите 20 исключений из 972:

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| take 20
PreciseTimeStamp Регион ScaleUnit DeploymentId Точка трассировки ServiceHost
2016-08-23 15:00:08.7302460 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 100005 00000000-0000-0000-0000-000000000000
2016-08-23 15:00:09.9496584 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 8d257da1-7a1c-44f5-9acd-f9e02ff507fd
2016-08-23 15:00:10.5911748 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 100005 00000000-0000-0000-0000-000000000000
2016-08-23 15:00:12.2957912 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007007 f855fcef-ebfe-405d-aaf8-9c5e2e43d862
2016-08-23 15:00:18.5955357 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 9d390e07-417d-42eb-bebd-793965189a28
2016-08-23 15:00:20.7444854 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 6e54c1c8-42d3-4e4e-8b79-9bb076ca71f1
2016-08-23 15:00:23.8694999 eus2 su2 89e2f62a73bb4efd8f545aeae40d7e51 36109 19422243-19b9-4d85-9ca6-bc961861d287
2016-08-23 15:00:26.4271786 ncus su1 e24ef436e02b4823ac5d5b1465a9401e 36109 3271bae4-1c5b-4f73-98ef-cc117e9be914
2016-08-23 15:00:27.8958124 scus su3 90d3d2fc7ecc430c9621ece335651a01 904498 8cf38575-fca9-48ca-bd7c-21196f6d6765
2016-08-23 15:00:32.9884969 scus su3 90d3d2fc7ecc430c9621ece335651a01 10007007 d5c7c825-9d46-4ab7-a0c1-8e2ac1d83ddb
2016-08-23 15:00:34.5061623 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 1002110 55a71811-5ec4-497a-a058-140fb0d611ad
2016-08-23 15:00:37.4490273 scus su3 90d3d2fc7ecc430c9621ece335651a01 10007006 f2ee8254-173c-477d-a1de-4902150ea50d
2016-08-23 15:00:41.2431223 scus su3 90d3d2fc7ecc430c9621ece335651a01 103200 8cf38575-fca9-48ca-bd7c-21196f6d6765
2016-08-23 15:00:47.2983975 ncus su1 e24ef436e02b4823ac5d5b1465a9401e 423690590 00000000-0000-0000-0000-000000000000
2016-08-23 15:00:50.5932834 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 2a41b552-aa19-4987-8cdd-410a3af016ac
2016-08-23 15:00:50.8259021 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 1002110 0d56b8e3-470d-4213-91da-97405f8d005e
2016-08-23 15:00:53.2490731 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 36109 55a71811-5ec4-497a-a058-140fb0d611ad
2016-08-23 15:00:57.0000946 eus2 su2 89e2f62a73bb4efd8f545aeae40d7e51 64038 cb55739e-4afe-46a3-970f-1b49d8ee7564
2016-08-23 15:00:58.2222707 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007007 8215dcf6-2de0-42bd-9c90-181c70486c9c
2016-08-23 15:00:59.9382620 scus su3 90d3d2fc7ecc430c9621ece335651a01 10007006 451e3c4c-0808-4566-a64d-84d85cf30978

Кластеризация одного набора записей с помощью метода autocluster()

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

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate autocluster()
Идентификатор сегмента Count Процент Регион ScaleUnit DeploymentId ServiceHost
0 639 65.7407407407407 eau su7 b5d1d4df547d4a04ac15885617edba57 e7f60c5d-4944-42b3-922a-92e98a8e7dec
1 94 9.67078189300411 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6
2 82 8.43621399176955 ncus su1 e24ef436e02b4823ac5d5b1465a9401e
3 68 6.99588477366255 scus su3 90d3d2fc7ecc430c9621ece335651a01
4 55 5.65843621399177 weu su4 be1d6d7ac9574cbc9a22cb8ee20f16fc

Из приведенных выше результатов видно, что наиболее доминирующий сегмент содержит 65,74 % от общего числа записей исключений и разделяет четыре измерения. Следующий сегмент распространен намного меньше. Он содержит только 9,67 % записей и использует три измерения. Другие сегменты распространены еще меньше.

Метод autocluster() использует собственный алгоритм для интеллектуального анализа нескольких измерений и извлечения сегментов, представляющих интерес. Сегменты, представляющие интерес, охватывают значительное количество как наборов записей, так и наборов функций. Сегменты также расходятся, т. е. отличаются от друг от друга. Один или несколько из этих сегментов могут иметь отношение к процессу RCA. Чтобы свести проверку и оценку сегментов к минимуму, метод autocluster() извлекает только небольшой список сегментов.

Кластеризация одиночных наборов записей с помощью метода basket()

Вы также можете использовать подключаемый модуль basket(), как показано в следующем запросе.

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate basket()
Идентификатор сегмента Count Процент Регион ScaleUnit DeploymentId Точка трассировки ServiceHost
0 639 65.7407407407407 eau su7 b5d1d4df547d4a04ac15885617edba57 e7f60c5d-4944-42b3-922a-92e98a8e7dec
1 642 66.0493827160494 eau su7 b5d1d4df547d4a04ac15885617edba57
2 324 33.3333333333333 eau su7 b5d1d4df547d4a04ac15885617edba57 0 e7f60c5d-4944-42b3-922a-92e98a8e7dec
3 315 32.4074074074074 eau su7 b5d1d4df547d4a04ac15885617edba57 16108 e7f60c5d-4944-42b3-922a-92e98a8e7dec
4 328 33.7448559670782 0
5 94 9.67078189300411 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6
6 82 8.43621399176955 ncus su1 e24ef436e02b4823ac5d5b1465a9401e
7 68 6.99588477366255 scus su3 90d3d2fc7ecc430c9621ece335651a01
8 167 17.1810699588477 scus
9 55 5.65843621399177 weu su4 be1d6d7ac9574cbc9a22cb8ee20f16fc
10 92 9.46502057613169 10007007
11 90 9.25925925925926 10007006
12 57 5.8641975308642 00000000-0000-0000-0000-000000000000

В методе basket() реализован "априорный" алгоритм для интеллектуального анализа набора элементов. Он извлекает все сегменты, для которых уровень охвата наборов записей превышает порог (по умолчанию — 5 %). Как видите, другие сегменты извлечены с похожими, например сегменты 0, 1 или 2, 3.

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

Кластеризация различий между двумя наборами записей

Подключаемый модуль diffpatterns() преодолевает ограничение autocluster и basket. Diffpatterns принимает два набора записей и извлекает основные отличающиеся сегменты. Один набор обычно содержит аномальный набор записей, для которых проводится анализ. Для анализа, как правило, используются методы autocluster и basket. Другой набор содержит набор записей ссылок, базовый план.

В следующем запросе diffpatterns находит интересные кластеры в течение двух минут, которые отличаются от кластеров в базовом плане. Окно базового плана определяется как 8-минутный интервал до 15:00, когда начался скачок. Вы выполняете расширение по двоичному столбцу (AB) и указываете, принадлежит ли определенная запись к базовому плану или аномальному набору. Diffpatterns реализует контролируемый алгоритм обучения, в котором две метки классов созданы аномальным и базовым флагами (AB).

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
let min_baseline_t=datetime(2016-08-23 14:50);
let max_baseline_t=datetime(2016-08-23 14:58); // Leave a gap between the baseline and the spike to avoid the transition zone.
let splitime=(max_baseline_t+min_peak_t)/2.0;
demo_clustering1
| where (PreciseTimeStamp between(min_baseline_t..max_baseline_t)) or
        (PreciseTimeStamp between(min_peak_t..max_peak_t))
| extend AB=iff(PreciseTimeStamp > splitime, 'Anomaly', 'Baseline')
| evaluate diffpatterns(AB, 'Anomaly', 'Baseline')
Идентификатор сегмента Число A Число B Процент A Процент B PercentDiffAB Регион ScaleUnit DeploymentId Точка трассировки
0 639 21 65.74 1.7 64.04 eau su7 b5d1d4df547d4a04ac15885617edba57
1 167 544 17.18 44.16 26.97 scus
2 92 356 9.47 28,9 19.43 10007007
3 90 336 9,26 27.27 18.01 10007006
4 82 318 8.44 25.81 17.38 ncus su1 e24ef436e02b4823ac5d5b1465a9401e
5 55 252 5.66 20.45 14,8 weu su4 be1d6d7ac9574cbc9a22cb8ee20f16fc
6 57 204 5.86 16.56 10.69

Преобладающим является сегмент, извлеченный autocluster. Его охват в течение 2-минутного окна аномалий также составляет 65,74 %. Однако его охват в течение 8-минутного окна базового плана составляет всего 1,7 %. Разница составляет 64,04 %. Похоже, что она связана с аномальными скачками. Чтобы проверить это предположение, следующий запрос разделяет исходную диаграмму на записи, принадлежащие к этому проблемном сегменту, и записи из других сегментов.

let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));  
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));  
demo_clustering1
| extend seg = iff(Region == "eau" and ScaleUnit == "su7" and DeploymentId == "b5d1d4df547d4a04ac15885617edba57"
and ServiceHost == "e7f60c5d-4944-42b3-922a-92e98a8e7dec", "Problem", "Normal")
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m by seg
| render timechart

Проверка временной диаграммы сегмента diffpattern.

Эта диаграмма позволяет увидеть, что скачок во вторник связан с исключениями из этого конкретного сегмента, которые удалось обнаружить с помощью подключаемого модуля diffpatterns.

Сводка

Подключаемые модули машинного обучения полезны для многих сценариев. autocluster и basket реализуют неконтролируемый алгоритм обучения и просты в использовании. Diffpatterns реализует контролируемый алгоритм обучения и, несмотря на свою сложность, предоставляет более широкие возможности извлечения дифференцировочных сегментов для RCA.

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