Time Series-analys
Molntjänster och IoT-enheter genererar telemetridata som kan användas för att få insikter som övervakning av tjänstens hälsa, fysiska produktionsprocesser och användningstrender. Att utföra tidsserieanalys är ett sätt att identifiera avvikelser i mönstret för dessa mått jämfört med deras typiska baslinjemönster.
Kusto-frågespråk (KQL) innehåller inbyggt stöd för skapande, manipulering och analys av flera tidsserier. I den här artikeln får du lära dig hur KQL används för att skapa och analysera tusentals tidsserier på några 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 vanliga tidsserier enkelt och intuitivt med operatorn make-series
och fyller i saknade värden efter behov.
Det första steget i tidsserieanalys är att partitioneras 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 partitionering av data. Målet är att skapa tusentals tidsserier per partition med jämna mellanrum.
Indatatabellen demo_make_series1 innehåller 600 000 poster med godtycklig webbtjänsttrafik. Använd följande kommando för att exempel på 10 poster:
demo_make_series1 | take 10
Den resulterande tabellen innehåller en tidsstämpelkolumn, tre kontextuella dimensionskolumner 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 Litauen |
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 trafikantalet, partitionerat av operativsystemet med hjälp av följande fråga:
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 from min_t to max_t step 1h by OsVer
| render timechart
- Använd operatorn
make-series
för att skapa en uppsättning med tre tidsserier, där:num=count()
: tidsserie för trafikfrom min_t to max_t step 1h
: tidsserier skapas i intervall på 1 timme i tidsintervallet (äldsta och senaste tidsstämplar för tabellposter)default=0
: ange fyllningsmetod för saknade intervall för att skapa vanliga tidsserier. Du kan också användaseries_fill_const()
,series_fill_backward()
series_fill_forward()
ochseries_fill_linear()
för ändringarby OsVer
: partition efter operativsystem
- Datastrukturen för faktiska tidsserier är en numerisk matris med det aggregerade värdet per tidsintervall. 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:
Tidsserieanalysfunktioner
I det här avsnittet ska vi utföra typiska seriebearbetningsfunktioner. När en uppsättning tidsserier har skapats har KQL stöd för en växande lista över funktioner för att bearbeta och analysera dem. Vi beskriver några representativa funktioner för bearbetning och analys av tidsserier.
Filtrering
Filtrering är en vanlig metod för signalbearbetning och användbart för tidsseriebearbetningsuppgifter (till exempel jämna ut en bullrig signal, ändringsidentifiering).
- Det finns två allmänna filtreringsfunktioner:
series_fir()
: Tillämpar FIR-filter. Används för enkel beräkning av glidande medelvärde och differentiering av tidsserien för ändringsidentifiering.series_iir()
: Tillämpa IIR-filter. Används för exponentiell utjämning och kumulativ summa.
Extend
tidsserier som angetts genom att lägga till en ny glidande genomsnittlig serie med storlek 5 intervall (med namnet ma_num) i 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 from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| render timechart
Regressionsanalys
Azure Data Explorer stöder segmenterad linjär regressionsanalys för att uppskatta trenden för tidsserien.
- Använd series_fit_line() för att passa den bästa raden 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()
och series_fit_2lines()
funktioner i en tidsseriefråga:
demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)
- Blå: ursprunglig tidsserie
- Grön: monterad linje
- Röd: två monterade linjer
Anteckning
Funktionen har identifierat hopppunkten (nivåändringen).
Identifiering av säsongsvariationer
Många mått följer säsongsmönster (periodiska). Användartrafiken för molntjänster innehåller vanligtvis dagliga och veckovisa mönster som är högst mitt på arbetsdagen och lägst på natten och under helgen. IoT-sensorer mäter med jämna mellanrum. Fysiska mätningar som temperatur, tryck eller luftfuktighet kan också visa säsongsbeteende.
I följande exempel tillämpas säsongsidentifiering på en månads trafik för en webbtjänst (2-timmars intervall):
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 perioder och vi vill kontrollera att de finns.
Anteckning
Det är en avvikelse om specifika distinkta perioder inte finns
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äsongsvariationer. 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 hjälp av series_subtract() kan vi beräkna en residualtidsserie, dvs. skillnaden mellan det ursprungliga råmåttet och ett utjämnat mått, och leta efter avvikelser i residualsignalen:
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 from min_t to max_t step 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å: ursprunglig tidsserie
- Röd: utjämnad tidsserie
- Grön: residualtidsserie
Tidsseriearbetsflöde i stor skala
Exemplet nedan visar hur dessa funktioner kan köras i stor skala i tusentals tidsserier i sekunder för avvikelseidentifiering. Om du vill se några exempel på telemetriposter för en DB-tjänsts mått för antal läsningar under fyra dagar kör du följande fråga:
demo_many_series1
| take 4
TIMESTAMP | Loc | Op | DB | DataRead |
---|---|---|---|---|
2016-09-11 21:00:00.0000000 | Hitta 9 | 5117853934049630089 | 262 | 0 |
2016-09-11 21:00:00.0000000 | Hitta 9 | 5117853934049630089 | 241 | 0 |
2016-09-11 21:00:00.0000000 | Hitta 9 | -865998331941149874 | 262 | 279862 |
2016-09-11 21:00:00.0000000 | Hitta 9 | 371921734563783410 | 255 | 0 |
Och enkel statistik:
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 |
Om du skapar en tidsserie i intervall på 1 timme för läsmåttet (totalt fyra dagar * 24 timmar = 96 poäng), resulterar det i normala mönstervariationer:
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 from min_t to max_t step 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 (location), Op (operation) och DB (specifik dator).
Hur många tidsserier kan vi skapa?
demo_many_series1
| summarize by Loc, Op, DB
| count
Antal |
---|
18339 |
Nu ska vi skapa en uppsättning med 18339-tidsserier för måttet för 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 mest betydande nedåtgående trenden:
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 from min_t to max_t step 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:
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 from min_t to max_t step 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 |
Hitta 13 | 37 | 1249 | -86303.2334644601 |
På mindre än två minuter analyserades nära 20 000 tidsserier och två onormala tidsserier där antalet läsningar plötsligt sjönk upptäcktes.
Dessa avancerade funktioner i kombination med snabba prestanda ger en unik och kraftfull lösning för analys av tidsserier.
Relaterat innehåll
- Läs mer om avvikelseidentifiering och prognostisering med KQL.
- Lär dig mer om maskininlärningsfunktioner med KQL.
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för