Sdílet prostřednictvím


Analýza časových řad

Platí pro: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Cloudové služby a zařízení IoT generují telemetrická data, která se dají použít k získání přehledů, jako je monitorování stavu služby, fyzických produkčních procesů a trendů využití. Provádění analýzy časových řad je jedním ze způsobů, jak identifikovat odchylky ve vzoru těchto metrik ve srovnání s jejich typickým směrným vzorem.

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 řešení a pracovní postupy monitorování 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 vyplníme chybějící hodnoty. Prvním krokem při analýze časových řad je rozdělení a transformace původní tabulky telemetrie na sadu časových řad. 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 pro každý 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. K výběru 10 záznamů použijte následující příkaz:

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 BrowserVer 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 představujících samotný počet přenosů rozdělený operačním systémem 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 dopravy
    • from min_t to max_t step 1h: Časové řady se vytvářejí v 1hodinových intervalech v časovém rozsahu (nejstarší a nejnovější časová razítka záznamů tabulky).
    • default=0: Určete metodu výplně pro chybějící segmenty pro vytvoření pravidelné časové řady. Alternativně použijte series_fill_const(), series_fill_forward()series_fill_backward() a series_fill_linear() pro změny
    • by OsVer: dělení podle operačního systému
  • Datová struktura skutečné časové řady je numerické pole agregované hodnoty pro každý časový interval. Používáme render timechart pro vizualizaci.

V tabulce výše máme tři oddíly. Pro každou verzi operačního systému 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 vidět v grafu:

Rozdělení časové řady.

Analytické funkce č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 zpracování a analýzu. Pro zpracování a analýzu časových řad popíšeme několik reprezentativních funkcí.

Filtrování

Filtrování je běžný postup při zpracování signálu a užitečný pro úlohy zpracování časových řad (například hladký signál, detekce změn).

  • Existují dvě obecné funkce filtrování:
    • series_fir(): Použití filtru FIR. Používá se pro jednoduchý výpočet klouzavého průměru a rozlišení časových řad pro detekci změn.
    • series_iir(): Použití filtru IIR. Používá se pro exponenciální vyhlazování a kumulativní součet.
  • Extend časové řady určené přidáním nové řady klouzavého průměru velikosti 5 binů (pojmenovaných 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

Segmentovaná lineární regresní analýza se dá použít k odhadu trendu časové řady.

  • Použijte series_fit_line() k přizpůsobení nejlepší čáry na časovou řadu pro obecnou detekci trendu.
  • Pomocí series_fit_2lines() můžete detekovat změny trendu vzhledem ke základní linii, které jsou užitečné pro monitorovací scénáře.

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

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

Regrese časových řad.

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

Poznámka:

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

Detekce sezónnosti

Mnoho metrik sleduje sezónní (periodické) vzory. Uživatelský provoz cloudových služeb obvykle obsahuje denní a týdenní vzory, které jsou nejvyšší uprostřed pracovního dne a nejnižší v noci a o víkendu. Senzory IoT měří v pravidelných intervalech. Fyzická měření, jako je teplota, tlak nebo vlhkost, můžou také ukazovat sezónní chování.

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

demo_series3
| render timechart 

Sezónnost časových řad.

  • Pomocí series_periods_detect() můžete automaticky zjišťovat období v časové řadě, kde:
    • num: časová řada k analýze
    • 0.: minimální délka období ve dnech (0 znamená bez minimální délky)
    • 14d/2h: maximální délka období ve dnech, což je 14 dnů rozdělených do dvouhodinových intervalů
    • 2: počet časových intervalů, které se mají zjistit
  • Pokud víme, že metrika by měla mít konkrétní jedinečná období a chceme ověřit, že existují, použijte series_periods_validate( ).

Poznámka:

Je to anomálie, 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í výsledky Dny
84 0.820622786055595 7
12 0.764601405803502 1

Funkce detekuje 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 po prvcích

Aritmetické a logické operace je možné provádět v časových řadách. Pomocí series_subtract() můžeme vypočítat reziduální časovou řadu, tedy rozdíl mezi původní nezpracovanou metrikou a vyhlazením 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 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á: reziduální časová řada

Pracovní postup časových řad ve velkém měřítku

Následující příklad ukazuje, jak se tyto funkce můžou spouštět ve velkém měřítku na tisících časových řad 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Á ZNAČKA Místo Op Databáze Č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 maximální_čas
2177472 2016-09-08 00:00:00.0000000 2016-09-11 23:00:00.0000000

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

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á řada 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. Instanci definuje Loc (location), Op (operation) 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 18 339 časových řad metriky počtu čtení. Do příkazu make-series přidáme by klauzuli, použijeme lineární regresi a vybereme horní dvě časové řady, které měly nejvýznamnější klesající 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 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é řady: top dva.

Zobrazte instance:

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 
Místo Op Databáze svah
Loc 15 37 1151 -102743.910227889
Loc 13 37 1249 -86303.2334644601

Za méně než dvě minuty byly analyzovány téměř 20 000 časových řad a 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.