Diagnostyka anomalii na potrzeby analizy głównej przyczyny

język zapytań Kusto (KQL) ma wbudowane funkcje wykrywania anomalii i prognozowania w celu sprawdzania nietypowego zachowania. Po wykryciu takiego wzorca można uruchomić analizę głównej przyczyny w celu ograniczenia lub rozwiązania anomalii.

Proces diagnostyki jest złożony i długotrwały i wykonywany przez ekspertów z dziedziny. Proces obejmuje:

  • Pobieranie i dołączanie większej ilości danych z różnych źródeł dla tego samego przedziału czasu
  • Wyszukiwanie zmian w rozkładzie wartości w wielu wymiarach
  • Wykresowanie większej liczby zmiennych
  • Inne techniki oparte na wiedzy i intuicji domeny

Ponieważ te scenariusze diagnostyki są typowe, wtyczki uczenia maszynowego są dostępne, aby ułatwić fazę diagnostyki i skrócić czas trwania analizy głównej przyczyny.

Wszystkie trzy z następujących wtyczek usługi Machine Learning implementują algorytmy klastrowania: autocluster, basketi diffpatterns. Wtyczki autocluster i basket klastruje pojedynczy zestaw rekordów, a diffpatterns wtyczki klastry różnice między dwoma zestawami rekordów.

Klastrowanie pojedynczego zestawu rekordów

Typowy scenariusz obejmuje zestaw danych wybrany przez określone kryteria, takie jak:

  • Przedział czasu pokazujący nietypowe zachowanie
  • Odczyty urządzeń o wysokiej temperaturze
  • Polecenia o długim czasie trwania
  • Najwięcej użytkowników wydatków Potrzebujesz szybkiego i łatwego sposobu znajdowania typowych wzorców (segmentów) w danych. Wzorce to podzbiór zestawu danych, którego rekordy współdzielą te same wartości w wielu wymiarach (kolumny podzielone na kategorie).

Następujące zapytanie kompiluje i przedstawia szereg czasowy wyjątków usługi w ciągu tygodnia w przedziałach dziesięciominutowych:

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")

Schemat czasu wyjątków usług.

Liczba wyjątków usługi jest skorelowana z ogólnym ruchem usługi. Można wyraźnie zobaczyć dzienny wzorzec dni roboczych, od poniedziałku do piątku. Istnieje wzrost liczby wyjątków usługi w połowie dnia i spadki liczby w nocy. Płaskie niskie liczby są widoczne w weekend. Skoki wyjątków można wykryć przy użyciu wykrywania anomalii szeregów czasowych.

Drugi skok danych występuje we wtorek po południu. Poniższe zapytanie służy do dalszej diagnostyki i sprawdzania, czy jest to gwałtowny wzrost. Zapytanie ponownie rysuje wykres wokół skoku w wyższej rozdzielczości 8 godzin w pojemnikach na minutę. Następnie możesz zbadać swoje granice.

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")

Skoncentruj się na schematach czasowych skoków.

Zobaczysz wąski dwuminutowy skok od 15:00 do 15:02. W poniższym zapytaniu zlicz wyjątki w tym dwuminutowym oknie:

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
Liczba
972

W poniższym zapytaniu przykładowe 20 wyjątków z 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 Region (Region) ScaleUnit Identyfikator wdrożenia Punkt śledzenia 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 1942243-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

Używanie funkcji autocluster() dla klastrowania z pojedynczym zestawem rekordów

Mimo że istnieje mniej niż tysiąc wyjątków, nadal trudno jest znaleźć typowe segmenty, ponieważ w każdej kolumnie istnieje wiele wartości. Możesz użyć autocluster() wtyczki, aby natychmiast wyodrębnić krótką listę typowych segmentów i znaleźć interesujące klastry w ciągu dwóch minut, jak pokazano w poniższym zapytaniu:

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()
Identyfikator segmentu Liczba Procent Region (Region) ScaleUnit Identyfikator wdrożenia 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 Uze su4 be1d6d7ac9574cbc9a22cb8eee20f16fc

Na podstawie powyższych wyników widać, że najbardziej dominujący segment zawiera 65,74% wszystkich rekordów wyjątków i udostępnia cztery wymiary. Następny segment jest znacznie mniej powszechny. Zawiera tylko 9,67% rekordów i udostępnia trzy wymiary. Inne segmenty są jeszcze mniej powszechne.

Funkcja Autoklastrowania używa zastrzeżonego algorytmu do wyszukiwania wielu wymiarów i wyodrębniania interesujących segmentów. "Interesujące" oznacza, że każdy segment ma znaczne pokrycie zarówno zestawu rekordów, jak i zestawu funkcji. Segmenty są również rozbieżne, co oznacza, że każdy z nich różni się od innych. Co najmniej jeden z tych segmentów może być istotny dla procesu analizy głównej przyczyny. Aby zminimalizować przegląd i ocenę segmentów, funkcja automatycznego klastra wyodrębnia tylko małą listę segmentów.

Używanie koszyka() dla klastrowania z pojedynczym zestawem rekordów

Możesz również użyć basket() wtyczki, jak pokazano w poniższym zapytaniu:

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()
Identyfikator segmentu Liczba Procent Region (Region) ScaleUnit Identyfikator wdrożenia Punkt śledzenia 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 Uze su4 be1d6d7ac9574cbc9a22cb8eee20f16fc
10 92 9.46502057613169 10007007
11 90 9.25925925925926 10007006
12 57 5.8641975308642 00000000-0000-0000-0000-000000000000

Koszyk implementuje algorytm "Apriori" dla wyszukiwania zestawów elementów. Wyodrębnia wszystkie segmenty, których pokrycie zestawu rekordów przekracza próg (wartość domyślna 5%). Widać, że więcej segmentów zostało wyodrębnionych z podobnymi, takimi jak segmenty 0, 1 lub 2, 3.

Obie wtyczki są wydajne i łatwe w użyciu. Ich ograniczenie polega na tym, że klasteruje pojedynczy zestaw rekordów w sposób nienadzorowany bez etykiet. Nie jest jasne, czy wyodrębnione wzorce scharakteryzują wybrany zestaw rekordów, nietypowe rekordy lub globalny zestaw rekordów.

Klastrowanie różnicy między dwoma zestawami rekordów

Wtyczka diffpatterns() przezwycięży ograniczenie autocluster i basket. Diffpatterns przyjmuje dwa zestawy rekordów i wyodrębnia główne segmenty, które są różne. Jeden zestaw zwykle zawiera nietypowy zestaw rekordów badany. Jeden jest analizowany przez autocluster i basket. Drugi zestaw zawiera zestaw rekordów referencyjnych, punkt odniesienia.

W poniższym zapytaniu diffpatterns znajduje interesujące klastry w ciągu dwóch minut, które różnią się od klastrów w ramach punktu odniesienia. Okno punktu odniesienia jest definiowane jako osiem minut przed godziną 15:00 po rozpoczęciu skoku. Rozszerzysz kolumnę binarną (AB) i określ, czy określony rekord należy do punktu odniesienia, czy do nietypowego zestawu. Diffpatterns implementuje algorytm uczenia nadzorowanego, w którym dwie etykiety klas zostały wygenerowane przez nietypową a flagę punktu odniesienia (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')
Identyfikator segmentu CountA LiczbaB PercentA PercentB PercentDiffAB Region (Region) ScaleUnit Identyfikator wdrożenia Punkt śledzenia
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 Uze su4 be1d6d7ac9574cbc9a22cb8eee20f16fc
6 57 204 5.86 16.56 10.69

Najbardziej dominującym segmentem jest ten sam segment, który został wyodrębniony przez autoclusterelement . Jego pokrycie w dwuminutowym nietypowym oknie wynosi również 65,74%. Jednak jego pokrycie w ośmiominutowym oknie odniesienia wynosi tylko 1,7%. Różnica wynosi 64,04%. Ta różnica wydaje się być związana z nietypowym wzrostem. Aby zweryfikować to założenie, następujące zapytanie dzieli oryginalny wykres na rekordy należące do tego problematycznego segmentu i rekordy z innych segmentów.

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

Sprawdzanie poprawności schematu czasowego segmentu różnic.

Ten wykres pozwala nam zobaczyć, że wzrost we wtorek po południu był spowodowany wyjątkami od tego konkretnego segmentu diffpatterns , wykrytego przy użyciu wtyczki.

Podsumowanie

W przypadku wielu scenariuszy pomocne są wtyczki usługi Machine Learning. Algorytm autocluster uczenia nienadzorowanego i basket jest łatwy w użyciu. Diffpatterns implementuje algorytm uczenia nadzorowanego i, choć bardziej złożony, jest bardziej zaawansowany do wyodrębniania segmentów różnicowych dla analizy głównej przyczyny.

Te wtyczki są używane interaktywnie w scenariuszach ad hoc i w automatycznych usługach monitorowania niemal w czasie rzeczywistym. Po wykryciu anomalii szeregów czasowych następuje proces diagnostyki. Proces jest wysoce zoptymalizowany pod kątem spełnienia niezbędnych standardów wydajności.