Anomaliediagnose voor analyse van hoofdoorzaak

Kusto-querytaal (KQL) heeft ingebouwde functies voor anomaliedetectie en -voorspelling om te controleren op afwijkend gedrag. Zodra een dergelijk patroon is gedetecteerd, kan een hoofdoorzaakanalyse (RCA) worden uitgevoerd om de anomalie te verhelpen of op te lossen.

Het diagnoseproces is complex en lang en wordt uitgevoerd door domeinexperts. Het proces omvat:

  • Meer gegevens uit verschillende bronnen ophalen en samenvoegen voor hetzelfde tijdsbestek
  • Zoeken naar wijzigingen in de verdeling van waarden op meerdere dimensies
  • Meer variabelen in kaart brengen
  • Andere technieken gebaseerd op domeinkennis en intuïtie

Omdat deze diagnosescenario's gebruikelijk zijn, zijn er machine learning-invoegtoepassingen beschikbaar om de diagnosefase gemakkelijker te maken en de duur van de RCA te verkorten.

Alle drie de volgende Machine Learning-invoegtoepassingen implementeren clusteralgoritmen: autocluster, basketen diffpatterns. De autocluster invoegtoepassingen en basket clusteren één recordset en de diffpatterns invoegtoepassing clustert de verschillen tussen twee recordsets.

Eén recordset clusteren

Een veelvoorkomend scenario omvat een gegevensset die is geselecteerd op basis van specifieke criteria, zoals:

  • Tijdvenster met afwijkend gedrag
  • Apparaatwaarden bij hoge temperatuur
  • Opdrachten voor lange duur
  • Beste bestedingsgebruikers U wilt een snelle en eenvoudige manier om algemene patronen (segmenten) in de gegevens te vinden. Patronen zijn een subset van de gegevensset waarvan de records dezelfde waarden delen over meerdere dimensies (categorische kolommen).

De volgende query bouwt en toont een tijdreeks van service-uitzonderingen gedurende de periode van een week, in opslaglocaties van tien minuten:

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

Tijddiagram voor service-uitzonderingen.

Het aantal serviceuitzonderingen correleert met het totale serviceverkeer. U kunt het dagelijkse patroon voor werkdagen, maandag tot en met vrijdag, duidelijk zien. Er is een toename van het aantal serviceuitzonderingen halverwege de dag en een daling in aantallen tijdens de nacht. Vlakke lage aantallen zijn zichtbaar in het weekend. Uitzonderingspieken kunnen worden gedetecteerd met behulp van anomaliedetectie van tijdreeksen.

De tweede piek in de gegevens vindt plaats op dinsdagmiddag. De volgende query wordt gebruikt om verder te diagnosticeren en te controleren of het een scherpe piek is. De query hertekent de grafiek rond de piek in een hogere resolutie van acht uur in bins van één minuut. Vervolgens kunt u de randen ervan bestuderen.

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

Focus op piektijddiagram.

U ziet een smalle piek van twee minuten van 15:00 tot 15:02. Tel in de volgende query de uitzonderingen in dit venster van twee minuten:

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

In de volgende query ziet u een voorbeeld van 20 uitzonderingen van 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 ScaleUnit DeploymentId Tracepoint 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() gebruiken voor clustering van één recordset

Hoewel er minder dan duizend uitzonderingen zijn, is het nog steeds moeilijk om gemeenschappelijke segmenten te vinden, omdat elke kolom meerdere waarden bevat. U kunt de autocluster() invoegtoepassing gebruiken om direct een korte lijst met algemene segmenten te extraheren en de interessante clusters binnen de twee minuten van de piek te vinden, zoals te zien is in de volgende query:

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 Count Percentage Region ScaleUnit DeploymentId ServiceHost
0 639 65.7407407407407 eau su7 b5d1d4df547d4a04ac15885617edba57 e7f60c5d-4944-42b3-9222a-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

U kunt uit de bovenstaande resultaten zien dat het meest dominante segment 65,74% van de totale uitzonderingsrecords bevat en vier dimensies deelt. Het volgende segment komt veel minder vaak voor. Het bevat slechts 9,67% van de records en deelt drie dimensies. De andere segmenten komen nog minder vaak voor.

Autocluster maakt gebruik van een eigen algoritme voor het analyseren van meerdere dimensies en het extraheren van interessante segmenten. 'Interessant' betekent dat elk segment een aanzienlijke dekking heeft van zowel de recordset als de functieset. De segmenten zijn ook verschillend, wat betekent dat elk segment verschilt van de andere. Een of meer van deze segmenten zijn mogelijk relevant voor het RCA-proces. Als u segmentcontrole en -evaluatie wilt minimaliseren, extraheert autocluster alleen een kleine segmentlijst.

Basket() gebruiken voor clustering met één recordset

U kunt ook de basket() invoegtoepassing gebruiken zoals te zien is in de volgende query:

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 Count Percentage Region ScaleUnit DeploymentId Traceringspunt 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 implementeert het algoritme 'Apriori' voor het analyseren van itemssets. Het extraheert alle segmenten waarvan de dekking van de recordset boven een drempelwaarde ligt (standaard 5%). U kunt zien dat er meer segmenten zijn geëxtraheerd met vergelijkbare segmenten, zoals segmenten 0, 1 of 2, 3.

Beide plug-ins zijn krachtig en gemakkelijk te gebruiken. Hun beperking is dat ze één recordset zonder supervisie clusteren zonder labels. Het is onduidelijk of de geëxtraheerde patronen de geselecteerde recordset, afwijkende records of de globale recordset karakteriseren.

Het verschil tussen twee recordsets clusteren

De diffpatterns() invoegtoepassing overwint de beperking van autocluster en basket. Diffpatterns neemt twee recordsets en extraheert de belangrijkste segmenten die verschillend zijn. Eén set bevat meestal de afwijkende recordset die wordt onderzocht. De ene wordt geanalyseerd door autocluster en basket. De andere set bevat de referentierecordset, de basislijn.

In de volgende query diffpatterns vindt u interessante clusters binnen de twee minuten van de piek, die afwijken van de clusters binnen de basislijn. Het basislijnvenster wordt gedefinieerd als de acht minuten vóór 15:00 uur, toen de piek begon. U breidt uit met een binaire kolom (AB) en geeft op of een specifieke record tot de basislijn of tot de afwijkende set behoort. Diffpatterns implementeert een algoritme voor leren onder supervisie, waarbij de twee klasselabels zijn gegenereerd door de afwijkende versus de basislijnvlag (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')
SegmentId CountA Aantal B ProcentA Percentage B PercentDiffAB Region ScaleUnit DeploymentId Traceringspunt
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

Het meest dominante segment is hetzelfde segment dat is geëxtraheerd door autocluster. De dekking in het afwijkende venster van twee minuten is ook 65,74%. De dekking op het basislijnvenster van acht minuten is echter slechts 1,7%. Het verschil is 64,04%. Dit verschil lijkt te zijn gerelateerd aan de afwijkende piek. Om deze veronderstelling te controleren, splitst de volgende query de oorspronkelijke grafiek in de records die tot dit problematische segment behoren en records uit de andere 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

De tijdgrafiek van het diffpatternsegment valideren.

In deze grafiek kunnen we zien dat de piek op dinsdagmiddag werd veroorzaakt door uitzonderingen in dit specifieke segment, gedetecteerd met behulp van de diffpatterns invoegtoepassing.

Samenvatting

De invoegtoepassingen voor Machine Learning zijn handig voor veel scenario's. De autocluster en basket implementeren een leeralgoritmen zonder supervisie en zijn eenvoudig te gebruiken. Diffpatterns implementeert een algoritme voor leren onder supervisie en, hoewel complexer, is het krachtiger voor het extraheren van differentiatiesegmenten voor RCA.

Deze invoegtoepassingen worden interactief gebruikt in ad-hoc scenario's en in automatische bijna realtime bewakingsservices. Anomaliedetectie van tijdreeksen wordt gevolgd door een diagnoseproces. Het proces is sterk geoptimaliseerd om te voldoen aan de vereiste prestatiestandaarden.