Tijdreeksanalyse in Azure Data Explorer

Azure Data Explorer (ADX) voert een doordrijfde verzameling telemetriegegevens uit van cloudservices of IoT-apparaten. Deze gegevens kunnen worden geanalyseerd op verschillende inzichten, zoals het bewaken van de service health, fysieke productieprocessen en gebruikstrends. Analyse wordt uitgevoerd op tijdreeksen van geselecteerde metrische gegevens om een afwijking in het patroon te vinden in vergelijking met het typische basislijnpatroon. ADX bevat native ondersteuning voor het maken, bewerken en analyseren van meerdere tijdreeksen. In dit onderwerp leert u hoe Azure Data Explorer wordt gebruikt voor het maken en analyseren van duizenden tijdreeksen in seconden,waardoor bijna realtime bewakingsoplossingen en -werkstromen mogelijk zijn.

Tijdreeks maken

In deze sectie maken we eenvoudig en intuïtief een grote set reguliere tijdreeksen met behulp van de operator en vullen we ontbrekende waarden make-series in. De eerste stap in tijdreeksanalyse is het partitioneren en transformeren van de oorspronkelijke telemetrietabel naar een set tijdreeksen. De tabel bevat meestal een tijdstempelkolom, contextuele dimensies en optionele metrische gegevens. De dimensies worden gebruikt om de gegevens te partitioneren. Het doel is om met regelmatige tijdsintervallen duizenden tijdreeksen per partitie te maken.

De invoertabel demo_make_series1 600.000 records van willekeurig webserviceverkeer. Gebruik de onderstaande opdracht om 10 records te samplen:

[Klik om query uit te voeren]

demo_make_series1 | take 10 

De resulterende tabel bevat een tijdstempelkolom, drie contextuele dimensiekolommen en geen metrische gegevens:

Tijdstempel BrowserVer OsVer Land/regio
2016-08-25 09:12:35.4020000 Chrome 51.0 Windows 7 Verenigd Koninkrijk
2016-08-25 09:12:41.1120000 Chrome 52.0 Windows 10
2016-08-25 09:12:46.2300000 Chrome 52.0 Windows 7 Verenigd Koninkrijk
2016-08-25 09:12:46.5100000 Chrome 52.0 Windows 10 Verenigd Koninkrijk
2016-08-25 09:12:46.5570000 Chrome 52.0 Windows 10 Republiek Rusland
2016-08-25 09:12:47.0470000 Chrome 52.0 Windows 8.1 India
2016-08-25 09:12:51.3600000 Chrome 52.0 Windows 10 Verenigd Koninkrijk
2016-08-25 09:12:51.6930000 Chrome 52.0 Windows 7 Nederland
2016-08-25 09:12:56.4240000 Chrome 52.0 Windows 10 Verenigd Koninkrijk
2016-08-25 09:13:08.7230000 Chrome 52.0 Windows 10 India

Omdat er geen metrische gegevens zijn, kunnen we alleen een set tijdreeksen bouwen die het aantal verkeer zelf vertegenwoordigen, gepartities per besturingssysteem met behulp van de volgende query:

[Klik om query uit te voeren]

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 in range(min_t, max_t, 1h) by OsVer
| render timechart 
  • Gebruik de make-series operator om een set van drie tijdreeksen te maken, waarbij:
    • num=count(): tijdreeks van verkeer
    • range(min_t, max_t, 1h): tijdreeksen worden gemaakt in bins van 1 uur in het tijdsbereik (oudste en nieuwste tijdstempels van tabelrecords)
    • default=0: geef de opvulmethode op voor ontbrekende bins om een reguliere tijdreeks te maken. U kunt ook series_fill_const() , en gebruiken voor series_fill_forward()series_fill_backward()series_fill_linear() wijzigingen
    • byOsVer: partitioneren op besturingssysteem
  • De werkelijke tijdreeksgegevensstructuur is een numerieke matrix van de geaggregeerde waarde per tijdslocatie. We gebruiken render timechart voor visualisatie.

In de bovenstaande tabel hebben we drie partities. We kunnen een afzonderlijke tijdreeks maken: Windows 10 (rood), 7 (blauw) en 8.1 (groen) voor elke versie van het besturingssysteem, zoals weergegeven in de grafiek:

Tijdreekspartitie.

Functies voor tijdreeksanalyse

In deze sectie voeren we typische reeksverwerkingsfuncties uit. Zodra een reeks tijdreeksen is gemaakt, ondersteunt Azure Data Explorer een groeiende lijst met functies voor het verwerken en analyseren van deze functies. Deze vindt u in de documentatie voor tijdreeksen. We beschrijven enkele representatieve functies voor het verwerken en analyseren van tijdreeksen.

Filteren

Filteren is een veelgebruikte praktijk bij het verwerken van signalen en nuttig voor tijdreeksverwerkingstaken (bijvoorbeeld het vloeiend maken van een ruissignaal of wijzigingsdetectie).

  • Er zijn twee algemene filterfuncties:
    • series_fir(): fir-filter toepassen. Wordt gebruikt voor eenvoudige berekening van het bewegende gemiddelde en de differentiëring van de tijdreeks voor wijzigingsdetectie.
    • series_iir(): IIR-filter toepassen. Wordt gebruikt voor exponentieel vloeiend maken en cumulatieve som.
  • Extend de tijdreeks die is ingesteld door een nieuwe bewegende gemiddelde reeks van grootte 5 bins (met de naam Extend) toe te voegen aan de query:

[Klik om query uit te voeren]

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 in range(min_t, max_t, 1h) by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| render timechart

Tijdreeksfiltering.

Regressieanalyse

ADX ondersteunt gesegmenteerde lineaire regressieanalyse om de trend van de tijdreeks te schatten.

  • Gebruik series_fit_line() om de beste lijn aan te passen aan een tijdreeks voor algemene trenddetectie.
  • Gebruik series_fit_2lines() om trendwijzigingen ten opzichte van de basislijn te detecteren die nuttig zijn in bewakingsscenario's.

Voorbeeld van series_fit_line() functies en in een series_fit_2lines() tijdreeksquery:

[Klik om query uit te voeren]

demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)

Regressie van tijdreeksen.

  • Blauw: oorspronkelijke tijdreeks
  • Groen: passende lijn
  • Rood: twee passende lijnen

Notitie

De functie heeft het jump-punt (niveauwijziging) nauwkeurig gedetecteerd.

Seizoensgebondenheidsdetectie

Veel metrische gegevens volgen seizoensgebonden (periodieke) patronen. Gebruikersverkeer van cloudservices bevat meestal dagelijkse en wekelijkse patronen die het hoogst zijn rond het midden van de werkdag en het laagste 's nachts en in het weekend. IoT-sensoren meten periodiek. Fysieke metingen zoals temperatuur, druk of vochtigheid kunnen ook seizoensgebonden gedrag vertonen.

In het volgende voorbeeld wordt seizoensgebonden detectie toegepast op één maandverkeer van een webservice (bins van 2 uur):

[Klik om query uit te voeren]

demo_series3
| render timechart 

Tijdreeksseizoensgebondenheid.

  • Gebruik series_periods_detect() om de perioden in de tijdreeks automatisch te detecteren.
  • Gebruik series_periods_validate() als we weten dat een metrische gegevens specifieke afzonderlijke punt(en) moeten hebben en we willen controleren of deze bestaan.

Notitie

Het is een anomalie als er geen specifieke afzonderlijke perioden bestaan

[Klik om query uit te voeren]

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
Perioden Scores Dagen
84 0.820622786055595 7
12 0.764601405803502 1

De functie detecteert dagelijkse en wekelijkse seizoensgebondenheid. De dagelijkse scores zijn lager dan de wekelijkse omdat de dagen in het weekend verschillen van doordeweekse dagen.

Op elementen wijzende functies

Rekenkundige en logische bewerkingen kunnen worden uitgevoerd op een tijdreeks. Met series_subtract() kunnen we een resttijdreeks berekenen, dat wil zeggen, het verschil tussen de oorspronkelijke onbewerkte metrische gegevens en een vloeiende reeks, en naar afwijkingen in het residu-signaal zoeken:

[Klik om query uit te voeren]

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 in range(min_t, max_t, 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

Tijdreeksbewerkingen.

  • Blauw: oorspronkelijke tijdreeks
  • Rood: vloeiende tijdreeks
  • Groen: resttijdreeks

Tijdreekswerkstroom op schaal

In het onderstaande voorbeeld ziet u hoe deze functies op schaal kunnen worden uitgevoerd op duizenden tijdreeksen in seconden voor anomaliedetectie. Voer de volgende query uit om enkele voorbeeld-telemetrierecords te zien van de metrische gegevens voor het aantal leesgegevens van een DB-service gedurende vier dagen:

[Klik om query uit te voeren]

demo_many_series1
| take 4 
TIMESTAMP Loc anonOp DB 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

En eenvoudige statistieken:

[Klik om query uit te voeren]

demo_many_series1
| summarize num=count(), min_t=min(TIMESTAMP), max_t=max(TIMESTAMP) 
num min_t max_t
2177472 2016-09-08 00:00:00.0000000 2016-09-11 23:00:00.0000000

Het bouwen van een tijdreeks in bins van 1 uur van de leesmetrische gegevens (in totaal vier dagen * 24 uur = 96 punten), resulteert in normale patroon fluctuatie:

[Klik om query uit te voeren]

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 in range(min_t, max_t, 1h)
| render timechart with(ymin=0) 

Tijdreeksen op schaal.

Het bovenstaande gedrag is misleidend, omdat de enige normale tijdreeks wordt geaggregeerd uit duizenden verschillende exemplaren die abnormale patronen kunnen hebben. Daarom maken we per exemplaar een tijdreeks. Een exemplaar wordt gedefinieerd door Loc (locatie), anonOp (bewerking) en DB (specifieke machine).

Hoeveel tijdreeksen kunnen we maken?

[Klik om query uit te voeren]

demo_many_series1
| summarize by Loc, Op, DB
| count
Count
18339

Nu gaan we een set van 18339 tijdreeksen maken van de metrische gegevens voor het aantal lees lezen. We voegen de -component toe aan de make-series-instructie, passen lineaire regressie toe en selecteren de bovenste twee tijdreeksen met de belangrijkste by afnemende trend:

[Klik om query uit te voeren]

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 in range(min_t, max_t, 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)')

Beste twee tijdreeksen.

De exemplaren weergeven:

[Klik om query uit te voeren]

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 in range(min_t, max_t, 1h) by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| project Loc, Op, DB, slope 
Loc Op DB Helling
Loc 15 37 1151 -102743.910227889
Loc 13 37 1249 -86303.2334644601

In minder dan twee minuten Azure Data Explorer bijna 20.000 tijdreeksen geanalyseerd en twee abnormale tijdreeksen gedetecteerd waarin het aantal leesgegevens plotseling afzakt.

Deze geavanceerde mogelijkheden in combinatie met Azure Data Explorer snelle prestaties bieden een unieke en krachtige oplossing voor tijdreeksanalyse.

Volgende stappen