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-series operatorn för att skapa en uppsättning med tre tidsserier, där:
    • num=count(): tidsserie för trafik
    • range(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ör series_fill_forward()series_fill_backward()series_fill_linear() ändringar
    • byOsVer: 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 timechart fö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:

Tidsseriepartition.

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.
  • Extend tidsserieuppsättningen genom att lägga till en ny glidande genomsnittsserie med storleken 5 Extend) 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

Filtrering av tidsserier.

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)

Tidsserieression.

  • 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 

Säsongsberoende tidsserier.

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

Tidsserieåtgärder.

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

Tidsserier i stor skala.

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

Tidsserie två översta.

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