Anomaliediagnose für die Ursachenanalyse

Kusto-Abfragesprache (KQL) verfügt über integrierte Funktionen zur Erkennung und Vorhersage von Anomalien, um auf anomales Verhalten zu überprüfen. Sobald ein solches Muster erkannt wurde, kann eine Fehlerursachenanalyse (Root Cause Analysis, RCA) ausgeführt werden, um die Anomalie zu entschärfen oder zu beheben.

Der komplexe und langwierige Diagnoseprozess wird von Domänenexperten durchgeführt. Der Prozess umfasst:

  • Abrufen und Verknüpfen weiterer Daten aus verschiedenen Quellen für den gleichen Zeitrahmen
  • Suchen nach Änderungen bei der Verteilung von Werten in mehreren Dimensionen
  • Diagrammerstellung für weitere Variablen
  • Andere Methoden, die auf Domänenkenntnissen und Intuition basieren

Da diese Diagnoseszenarien üblich sind, stehen Machine Learning-Plug-Ins zur Verfügung, um die Diagnosephase zu vereinfachen und die Dauer der RCA zu verkürzen.

Alle drei der folgenden Machine Learning-Plug-Ins implementieren Clusteringalgorithmen: autocluster, basketund diffpatterns. Die Plug-Ins autocluster und basket gruppieren eine einzelne Datensatzgruppe, und das Plug-In diffpatterns gruppiert die Unterschiede zwischen zwei Datensatzgruppen.

Gruppieren einer einzelnen Datensatzgruppe

Ein häufiges Szenario umfasst ein Dataset, das anhand eines bestimmten Kriteriums ausgewählt wird, z. B.:

  • Zeitfenster, in dem anomales Verhalten auftritt
  • Gerätemesswerte mit hoher Temperatur
  • Befehle mit langer Ausführungsdauer
  • Benutzer mit den höchsten Ausgaben Sie suchen eine einfache und schnelle Möglichkeit, um allgemeine Muster (Segmente) in den Daten zu finden. Muster sind eine Teilmenge des Datasets, dessen Datensätze dieselben Werte über mehrere Dimensionen (kategorische Spalten) aufweisen.

Die folgende Abfrage erstellt und zeigt eine Zeitreihe von Dienstausnahmen über den Zeitraum einer Woche in Zehn-Minuten-Intervallen:

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

Zeitdiagramm für Dienstausnahmen

Die Anzahl der Dienstausnahmen korreliert mit dem gesamten Dienstdatenverkehr. Das tägliche Muster für die Geschäftstage Montag bis Freitag lässt sich eindeutig sehen. Es gibt eine Zunahme bei der Anzahl der Dienstausnahmen zur Mittagszeit und sinkende Anzahlen während der Nacht. Am Wochenende ist die Anzahl gering. Ausnahmespitzen können mithilfe der Erkennung von Zeitreihenanomalien erkannt werden.

Die zweite Spitze in den Daten tritt Dienstagnachmittag auf. Mit der folgenden Abfrage wird eine weitere Diagnose ausgeführt und überprüft, ob es sich um eine scharfe Spitze handelt. Die Abfrage zeichnet das Diagramm um die Spitze herum in einer höheren Auflösung von acht Stunden in einminütigen Intervallen neu. Anschließend können Sie deren Grenzen untersuchen.

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

Zeitdiagramm mit Konzentration auf die Spitze

Von 15:00 bis 15:02 Uhr wird eine schmale Zwei-Minuten-Spitze angezeigt. In der folgenden Abfrage werden die Ausnahmen in diesem Fenster von zwei Minuten gezählt:

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

In der folgenden Abfrage werden 20 Ausnahmen aus 972 als Stichprobe entnommen:

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 ScaleUnit DeploymentId Ablaufverfolgungspunkt 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

Verwenden von „autocluster()“ zum Gruppieren einer einzelnen Datensatzgruppe

Auch wenn weniger als eintausend Ausnahmen vorhanden sind, ist es weiterhin schwierig, allgemeine Segmente zu finden, da in jeder Spalte mehrere Werte vorhanden sind. Sie können mit dem autocluster()-Plug-In sofort eine kurze Liste allgemeiner Segmente extrahieren und die interessanten Cluster innerhalb der zwei Minuten der Spitze suchen, wie in der folgenden Abfrage gezeigt:

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()
SegmentId Anzahl Percent Region 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

Sie können in den obigen Ergebnissen erkennen, dass das dominanteste Segment 65,74% der gesamten Ausnahmedatensätze enthält und vier Dimensionen verwendet. Das nächste Segment tritt deutlich seltener auf. Es enthält nur 9,67 % der Datensätze und verwendet drei Dimensionen. Die anderen Segmente treten sogar noch seltener auf.

Autocluster verwendet einen proprietären Algorithmus zum Mining mehrerer Dimensionen und Extrahieren interessanter Segmente. „Interessant“ bedeutet, dass jedes Segment sowohl die Datensatzgruppe als auch die Featuregruppe signifikant abdeckt. Die Segmente sind auch abweichend, was bedeutet, dass sie sich voneinander unterscheiden. Eines oder mehrere dieser Segmente können für den RCA-Prozess relevant sein. Um Segmentprüfung und -bewertung zu minimieren, extrahiert Autocluster nur eine kleine Segmentliste.

Verwenden von „basket()“ zum Gruppieren einer einzelnen Datensatzgruppe

Sie können auch das basket()-Plug-In wie in der folgenden Abfrage gezeigt verwenden:

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()
SegmentId Anzahl Percent Region ScaleUnit DeploymentId Ablaufverfolgungspunkt 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 implementiert den „Apriori“ -Algorithmus zum Mining der Elementgruppe. Die Funktion extrahiert alle Segmente, deren Abdeckung der Datensatzgruppe einen Schwellenwert (Standardwert 5 %) überschreitet. Sie können sehen, dass mehr Segmente mit ähnlichen Prozentwerten (z. B. die Segmente 0, 1 oder 2, 3) extrahiert wurden.

Beide Plug-Ins sind leistungsstark und bedienfreundlich. Ihre Einschränkung besteht jedoch darin, dass sie eine einzelne Datensatzgruppe in einer nicht überwachten Weise (ohne Bezeichnungen) gruppieren. Es ist unklar, ob die extrahierten Muster die ausgewählte Datensatzgruppe, anomale Datensätze oder die globale Datensatzgruppe charakterisieren.

Clustering des Unterschieds zwischen zwei Datensatzgruppen

Das diffpatterns()-Plug-In überwindet die Einschränkung von autocluster und basket. Diffpatterns nimmt zwei Datensatzgruppen und extrahiert die wichtigsten Segmente, die unterschiedlich sind. Eine Gruppe enthält in der Regel die anomale Datensatzgruppe, die untersucht wird. Eine wird von autocluster analysiert, die andere von basket. Die andere Gruppe enthält die Referenz-Datensatzgruppe, die Baseline.

In der folgenden Abfrage diffpatterns finden Sie innerhalb von zwei Minuten interessante Cluster, die sich von den Clustern innerhalb der Baseline unterscheiden. Das Baselinefenster ist als die acht Minuten vor 15:00 Uhr (dem Beginn der Spitze) definiert. Sie erweitern um eine binäre Spalte (AB) und geben an, ob ein bestimmter Datensatz zur Baseline oder der anomalen Gruppe gehört. Diffpatterns implementiert einen überwachten Lernalgorithmus, in dem die zwei Klassenbezeichnungen durch das anomale im Vergleich zum Baselineflag (AB) generiert wurden.

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')
SegmentId CountA CountB PercentA PercentB PercentDiffAB Region ScaleUnit DeploymentId Ablaufverfolgungspunkt
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

Das dominanteste Segment ist dasselbe Segment, das von autocluster extrahiert wurde. Seine Abdeckung im anomalen Fenster von 2 Minuten beträgt ebenfalls 65,74 %. Aber seine Abdeckung im Acht-Minuten-Baselinefenster beträgt nur 1,7 %. Der Unterschied beträgt 64,04%. Dieser Unterschied scheint mit der anomalen Spitze in Zusammenhang zu stehen. Um diese Annahme zu überprüfen, teilt die folgende Abfrage das ursprüngliche Diagramm in die Datensätze auf, die zu diesem problematischen Segment gehören, und Datensätze aus den anderen Segmenten.

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

Überprüfen mit „diffpattern“: Segmentzeitdiagramm

In diesem Diagramm können wir sehen, dass die Spitze am Dienstagnachmittag aufgrund von Ausnahmen in diesem bestimmten Segment auftraten, das mithilfe des diffpatterns-Plug-Ins ermittelt wurde.

Zusammenfassung

Die Machine Learning-Plug-Ins sind für viele Szenarien hilfreich. autocluster und basket implementieren einen nicht überwachten Lernalgorithmus und sind bedienfreundlich. Diffpatterns implementiert einen überwachten Lernalgorithmus und ist zwar komplexer, aber leistungsfähiger beim Extrahieren von Differenzierungssegmenten für die RCA.

Diese Plug-Ins werden interaktiv in Ad-hoc-Szenarien und in automatischen, nahezu in Echtzeit ablaufenden Überwachungsdiensten verwendet. Auf die Erkennung von Zeitreihenanomalie folgt ein Diagnoseprozess. Der Prozess ist stark optimiert, um notwendige Leistungsstandards zu erfüllen.