Analýza časových řad

Cloudové služby a zařízení IoT generují telemetrická data, která je možné použít k získání přehledů, jako je monitorování stavu služby, fyzické produkční procesy a trendy využití. Provedení analýzy časových řad je jedním ze způsobů, jak identifikovat odchylky ve vzorci těchto metrik v porovnání s jejich typickým vzorem směrného plánu.

dotazovací jazyk Kusto (KQL) obsahuje nativní podporu pro vytváření, manipulaci a analýzu více časových řad. V tomto článku se dozvíte, jak se KQL používá k vytváření a analýze tisíců časových řad v sekundách, což umožňuje monitorování a pracovní postupy téměř v reálném čase.

Vytvoření časové řady

V této části vytvoříme velkou sadu běžných časových řad jednoduše a intuitivně pomocí operátoru make-series a podle potřeby doplníme chybějící hodnoty. Prvním krokem v analýze časových řad je rozdělení původní tabulky telemetrie na sadu časových řad a její transformace. Tabulka obvykle obsahuje sloupec časového razítka, kontextové dimenze a volitelné metriky. Dimenze se používají k rozdělení dat. Cílem je vytvořit tisíce časových řad na oddíl v pravidelných časových intervalech.

Vstupní tabulka demo_make_series1 obsahuje 600 tisíc záznamů libovolného provozu webové služby. Pomocí následujícího příkazu můžete vzorkovat 10 záznamů:

demo_make_series1 | take 10 

Výsledná tabulka obsahuje sloupec časového razítka, tři sloupce kontextových dimenzí a žádné metriky:

Časové razítko Prohlížeč OsVer Země/oblast
2016-08-25 09:12:35.4020000 Chrome 51.0 Windows 7 Spojené království
2016-08-25 09:12:41.1120000 Chrome 52.0 Windows 10
2016-08-25 09:12:46.2300000 Chrome 52.0 Windows 7 Spojené království
2016-08-25 09:12:46.5100000 Chrome 52.0 Windows 10 Spojené království
2016-08-25 09:12:46.5570000 Chrome 52.0 Windows 10 Litevská republika
2016-08-25 09:12:47.0470000 Chrome 52.0 Windows 8.1 Indie
2016-08-25 09:12:51.3600000 Chrome 52.0 Windows 10 Spojené království
2016-08-25 09:12:51.6930000 Chrome 52.0 Windows 7 Nizozemsko
2016-08-25 09:12:56.4240000 Chrome 52.0 Windows 10 Spojené království
2016-08-25 09:13:08.7230000 Chrome 52.0 Windows 10 Indie

Vzhledem k tomu, že neexistují žádné metriky, můžeme vytvořit pouze sadu časových řad, které představují samotný počet přenosů, rozdělené podle operačního systému pomocí následujícího dotazu:

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 
  • Pomocí operátoru make-series vytvořte sadu tří časových řad, kde:
    • num=count(): časová řada přenosů
    • from min_t to max_t step 1h: Časová řada se vytváří v 1hodinovém intervalu v časovém rozsahu (nejstarší a nejnovější časová razítka záznamů tabulky).
    • default=0: Zadejte metodu vyplnění chybějících intervalů, aby se vytvořily pravidelné časové řady. Pro změny můžete také použít series_fill_const(), series_fill_forward()series_fill_backward() a series_fill_linear() .
    • by OsVer: dělení podle operačního systému
  • Skutečná datová struktura časových řad je číselné pole agregované hodnoty pro každý časový interval. Používáme render timechart pro vizualizaci.

Ve výše uvedené tabulce máme tři oddíly. Můžeme vytvořit samostatnou časovou řadu: Windows 10 (červená), 7 (modrá) a 8,1 (zelená) pro každou verzi operačního systému, jak je znázorněno v grafu:

Oddíl časové řady.

Funkce analýzy časových řad

V této části provedeme typické funkce zpracování řad. Po vytvoření sady časových řad podporuje KQL rostoucí seznam funkcí pro jejich zpracování a analýzu. Popíšeme si několik reprezentativních funkcí pro zpracování a analýzu časových řad.

Filtrování

Filtrování je běžnou praxí při zpracování signálu a je užitečné pro úlohy zpracování časových řad (například plynulý signál s hlučným signálem, detekce změn).

  • Existují dvě obecné funkce filtrování:
    • series_fir(): Použití filtru FIR. Slouží k jednoduchému výpočtu klouzavého průměru a rozlišení časové řady pro detekci změn.
    • series_iir(): Použití filtru IIR. Používá se pro exponenciální vyrovnání a kumulativní součet.
  • Extend časovou řadu nastavenou přidáním nové řady klouzavého průměru o velikosti 5 intervalů (s názvem ma_num) do dotazu:
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

Filtrování časových řad.

Regresní analýza

Azure Data Explorer podporuje analýzu segmentované lineární regrese pro odhad trendu časové řady.

  • Použijte series_fit_line() k přizpůsobení nejlepší přímky časové řadě pro obecnou detekci trendu.
  • Pomocí series_fit_2lines() můžete detekovat změny trendu vzhledem ke směrnému plánu, které jsou užitečné ve scénářích monitorování.

Příklad series_fit_line() funkcí a series_fit_2lines() v dotazu časové řady:

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

Regrese časové řady.

  • Modrá: původní časová řada
  • Zelená: fitovaná linka
  • Červená: dvě fitované linky

Poznámka

Funkce přesně zjistila bod skoku (změny úrovně).

Detekce sezónnosti

Řada metrik se řídí sezónními (pravidelnými) vzory. Uživatelský provoz cloudových služeb obvykle obsahuje denní a týdenní vzorce, které jsou nejvyšší v polovině pracovního dne a nejnižší v noci a přes víkend. Senzory IoT měří v pravidelných intervalech. Sezónní chování můžou vykazovat také fyzická měření, jako je teplota, tlak nebo vlhkost.

Následující příklad použije detekci sezónnosti u měsíčního provozu webové služby (intervaly 2 hodiny):

demo_series3
| render timechart 

Sezónnost časových řad.

Poznámka

Jedná se o anomálii, pokud neexistují konkrétní jedinečná období.

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
Období Skóre Dní
84 0.820622786055595 7
12 0.764601405803502 1

Funkce zjišťuje denní a týdenní sezónnost. Denní skóre je menší než týdenní, protože víkendové dny se liší od pracovních dnů.

Funkce z ředicích

Aritmetické a logické operace je možné provádět v časové řadě. Pomocí series_subtract() můžeme vypočítat zbytkovou časovou řadu, to znamená rozdíl mezi původní nezpracovanou metrikou a vyhlazenou metrikou, a hledat anomálie v reziduálním signálu:

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

Operace časových řad.

  • Modrá: původní časová řada
  • Červená: vyhlazená časová řada
  • Zelená: zbytkové časové řady

Pracovní postup časové řady ve velkém měřítku

Následující příklad ukazuje, jak můžou tyto funkce běžet ve velkém měřítku na tisících časových řadách v sekundách pro detekci anomálií. Pokud chcete zobrazit několik ukázkových záznamů telemetrie metriky počtu čtení služby DB za čtyři dny, spusťte následující dotaz:

demo_many_series1
| take 4 
ČASOVÉ RAZÍTKO Loc Op DB Čtení dat
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

A jednoduchá statistika:

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

Vytvoření časové řady v hodinových intervalech metriky pro čtení (celkem 4 dny × 24 hodin = 96 bodů) vede k normálnímu kolísání vzorce:

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) 

Časové řady ve velkém měřítku.

Výše uvedené chování je zavádějící, protože jedna normální časová řada je agregována z tisíců různých instancí, které mohou mít neobvyklé vzory. Proto vytvoříme časovou řadu pro každou instanci. Instance je definována loc (location), Op (operace) a DB (konkrétní počítač).

Kolik časových řad můžeme vytvořit?

demo_many_series1
| summarize by Loc, Op, DB
| count
Počet
18339

Teď vytvoříme sadu časových řad 18339 metriky počtu čtení. Do příkazu vytyčovací řady přidáme by klauzuli , použijeme lineární regresi a vybereme horní dvě časové řady s nejvýznamnějším klesajícím trendem:

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

Časová řada první dvě.

Zobrazení instancí:

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 Svahu
Loc 15 37 1151 -102743.910227889
Loc 13 37 1249 -86303.2334644601

Za méně než dvě minuty bylo analyzováno téměř 20 000 časových řad a byly zjištěny dvě neobvyklé časové řady, ve kterých se počet čtení náhle snížil.

Tyto pokročilé funkce v kombinaci s rychlým výkonem poskytují jedinečné a výkonné řešení pro analýzu časových řad.