Analys av tidsserier i Azure Data Explorer
Azure Data Explorer (ADX) utför en samling telemetridata från molntjänster eller IoT-enheter. Dessa data kan analyseras för olika insikter, till exempel övervakning av tjänstens hälsotillstånd, fysiska produktionsprocesser och användningstrender. Analysen görs i tidsserier med valda mått för att hitta en avvikelse i mönstret jämfört med dess typiska baslinjemönster. ADX innehåller inbyggt stöd för skapande, manipulering och analys av flera tidsserier. I det här avsnittet får du lära Azure Data Explorer används för att skapa och analysera tusentals tidsserier i sekunder,vilket möjliggör övervakningslösningar och arbetsflöden i nära realtid.
Skapa tidsserier
I det här avsnittet skapar vi en stor uppsättning regelbundna tidsserier enkelt och intuitivt med operatorn och fyller i saknade make-series värden efter behov.
Det första steget i tidsserieanalys är att partitionera och transformera den ursprungliga telemetritabellen till en uppsättning tidsserier. Tabellen innehåller vanligtvis en tidsstämpelkolumn, kontextuella dimensioner och valfria mått. Dimensionerna används för att partitionera data. Målet är att skapa tusentals tidsserier per partition med jämna mellanrum.
Indatatabellen innehåller demo_make_series1 600 000 poster med godtycklig webbtjänsttrafik. Använd kommandot nedan för att prova 10 poster:
[ Klickaför att köra frågan]
demo_make_series1 | take 10
Den resulterande tabellen innehåller en tidsstämpelkolumn, tre kolumner med kontextuella dimensioner och inga mått:
| TimeStamp | BrowserVer | OsVer | Land/region |
|---|---|---|---|
| 2016-08-25 09:12:35.4020000 | Chrome 51.0 | Windows 7 | Storbritannien |
| 2016-08-25 09:12:41.1120000 | Chrome 52.0 | Windows 10 | |
| 2016-08-25 09:12:46.2300000 | Chrome 52.0 | Windows 7 | Storbritannien |
| 2016-08-25 09:12:46.5100000 | Chrome 52.0 | Windows 10 | Storbritannien |
| 2016-08-25 09:12:46.5570000 | Chrome 52.0 | Windows 10 | Republiken Kina |
| 2016-08-25 09:12:47.0470000 | Chrome 52.0 | Windows 8,1 | Indien |
| 2016-08-25 09:12:51.3600000 | Chrome 52.0 | Windows 10 | Storbritannien |
| 2016-08-25 09:12:51.6930000 | Chrome 52.0 | Windows 7 | Nederländerna |
| 2016-08-25 09:12:56.4240000 | Chrome 52.0 | Windows 10 | Storbritannien |
| 2016-08-25 09:13:08.7230000 | Chrome 52.0 | Windows 10 | Indien |
Eftersom det inte finns några mått kan vi bara skapa en uppsättning tidsserier som representerar själva trafikräkningen, partitionerade med operativsystemet med hjälp av följande fråga:
[ Klickaför att köra frågan]
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
- Använd
make-seriesoperatorn för att skapa en uppsättning med tre tidsserier, där:num=count(): tidsserie för trafikrange(min_t, max_t, 1h): tidsserier skapas i intervall på 1 timme i tidsperioden (äldsta och senaste tidsstämplar för tabellposter)default=0: ange fyllningsmetod för saknade lagerplatser för att skapa regelbundna tidsserier. Du kan ocksåseries_fill_const()använda , och förseries_fill_forward()series_fill_backward()series_fill_linear()ändringarbyOsVer: partition efter operativsystem
- Den faktiska datastrukturen för tidsserier är en numerisk matris med det aggregerade värdet per varje tidslager. Vi använder
render timechartför visualisering.
I tabellen ovan har vi tre partitioner. Vi kan skapa en separat tidsserie: Windows 10 (röd), 7 (blå) och 8.1 (grön) för varje OS-version enligt diagrammet:

Analysfunktioner för tidsserier
I det här avsnittet ska vi utföra vanliga funktioner för seriebearbetning. När en uppsättning tidsserier har skapats Azure Data Explorer en växande lista med funktioner för att bearbeta och analysera dem som finns i time series-dokumentationen. Vi beskriver några representativa funktioner för bearbetning och analys av tidsserier.
Filtrering
Filtrering är en vanlig metod för signalbearbetning och användbar för tidsseriebearbetningsuppgifter (till exempel att jämna ut en brussignal eller ändringsidentifiering).
- Det finns två allmänna filtreringsfunktioner:
series_fir(): Använda FIR-filter. Används för enkel beräkning av glidande medelvärde och differentiering av tidsserierna för ändringsidentifiering.series_iir(): Använda IIR-filter. Används för exponentiell utjämning och kumulativ summa.
Extendtidsserieuppsättningen genom att lägga till en ny glidande genomsnittsserie med storleken 5Extend) i frågan:
[ Klickaför att köra frågan]
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

Regressionsanalys
ADX stöder segmenterad linjär regressionsanalys för att uppskatta trenden för tidsserien.
- Använd series_fit_line() för att anpassa den bästa linjen till en tidsserie för allmän trendidentifiering.
- Använd series_fit_2lines() för att identifiera trendändringar i förhållande till baslinjen som är användbara i övervakningsscenarier.
Exempel på series_fit_line() - series_fit_2lines() och -funktioner i en tidsseriefråga:
[ Klickaför att köra frågan]
demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)

- Blå: ursprungliga tidsserier
- Grön: anpassad linje
- Röd: två anpassade linjer
Anteckning
Funktionen identifierade hopppunkten (nivåändringspunkten) korrekt.
Identifiering av säsongsberoenden
Många mått följer säsongsbaserade (periodiska) mönster. Användartrafiken för molntjänster innehåller vanligtvis dagliga och veckovisa mönster som är högst runt mitten av arbetsdagen och lägst på natten och under helgerna. IoT-sensorer mäts i periodiska intervall. Fysiska mått som temperatur, tryck eller luftfuktighet kan också visa säsongsbeteende.
I följande exempel används identifiering av säsongsberoenden för en månads trafik för en webbtjänst (tvåtimmarsfack):
[ Klickaför att köra frågan]
demo_series3
| render timechart

- Använd series_periods_detect() för att automatiskt identifiera perioderna i tidsserien.
- Använd series_periods_validate() om vi vet att ett mått ska ha specifika distinkta tidsperioder och vi vill kontrollera att de finns.
Anteckning
Det är en avvikelse om det inte finns några specifika perioder
[ Klickaför att köra frågan]
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
| Perioder | Noter | Dagar |
|---|---|---|
| 84 | 0.820622786055595 | 7 |
| 12 | 0.764601405803502 | 1 |
Funktionen identifierar dagliga och veckovisa säsongsberoenden. De dagliga poängen är mindre än varje vecka eftersom helgdagar skiljer sig från vardagar.
Elementvisa funktioner
Aritmetiska och logiska åtgärder kan utföras i en tidsserie. Med series_subtract() kan vi beräkna en residualtidsserie, det vill säga skillnaden mellan det ursprungliga rådatamåttet och ett utjämnat mått, och leta efter avvikelser i residualsignalen:
[ Klickaför att köra frågan]
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

- Blå: ursprungliga tidsserier
- Röd: utjämnad tidsserie
- Grön: residualtidsserie
Arbetsflöde för tidsserier i stor skala
Exemplet nedan visar hur dessa funktioner kan köras i stor skala på tusentals tidsserier i sekunder för avvikelseidentifiering. Om du vill se några exempel på telemetriposter för en DB-tjänsts mätvärde för antal läsningar under fyra dagar kör du följande fråga:
[ Klickaför att köra frågan]
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 |
Och enkel statistik:
[ Klickaför att köra frågan]
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 |
Att skapa en tidsserie på en timma för läsmåttet (totalt fyra dagar * 24 timmar = 96 punkter), resulterar i normala mönstervariationer:
[ Klickaför att köra frågan]
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)

Ovanstående beteende är missvisande, eftersom den enskilda normala tidsserien aggregeras från tusentals olika instanser som kan ha onormala mönster. Därför skapar vi en tidsserie per instans. En instans definieras av Loc (plats), anonOp (åtgärd) och DB (specifik dator).
Hur många tidsserier kan vi skapa?
[ Klickaför att köra frågan]
demo_many_series1
| summarize by Loc, Op, DB
| count
| Antal |
|---|
| 18339 |
Nu ska vi skapa en uppsättning 18339-tidsserier för måttet antal läsningar. Vi lägger till by -satsen i make-series-instruktionen, tillämpar linjär regression och väljer de två främsta tidsserierna som hade den viktigaste fallande trenden:
[ Klickaför att köra frågan]
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)')

Visa instanserna:
[ Klickaför att köra frågan]
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 | Sluttningen |
|---|---|---|---|
| Loc 15 | 37 | 1151 | -102743.910227889 |
| Loc 13 | 37 | 1249 | -86303.2334644601 |
På mindre än två minuter Azure Data Explorer analyserade nära 20 000 tidsserier och identifierade två onormala tidsserier där antalet läsningar plötsligt minskade.
Dessa avancerade funktioner i kombination med Azure Data Explorer snabba prestanda ger en unik och kraftfull lösning för tidsserieanalys.
Nästa steg
- Lär dig mer om avvikelseidentifiering och prognostiserade tidsserier i Azure Data Explorer.
- Lär dig mer om maskininlärningsfunktioner i Azure Data Explorer.