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:
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:
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-seriesoperator om een set van drie tijdreeksen te maken, waarbij:num=count(): tijdreeks van verkeerrange(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 ookseries_fill_const(), en gebruiken voorseries_fill_forward()series_fill_backward()series_fill_linear()wijzigingenbyOsVer: partitioneren op besturingssysteem
- De werkelijke tijdreeksgegevensstructuur is een numerieke matrix van de geaggregeerde waarde per tijdslocatie. We gebruiken
render timechartvoor 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:

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.
Extendde tijdreeks die is ingesteld door een nieuwe bewegende gemiddelde reeks van grootte 5 bins (met de naamExtend) toe te voegen aan de query:
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

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:
demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)

- 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):
demo_series3
| render timechart

- 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
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:
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

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

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?
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:
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)')

De exemplaren weergeven:
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
- Meer informatie over anomaliedetectie en prognoses voor tijdreeksen in Azure Data Explorer.
- Meer informatie over machine learning-mogelijkheden in Azure Data Explorer.