Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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-seriesvytvoř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žijteseries_fill_const(),series_fill_forward()series_fill_backward()aseries_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 timechartpro 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:
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
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)
- 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
- 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
- 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)
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)')
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.
Související obsah
- Seznamte se s detekcí a prognózami anomálií pomocí KQL.
- Seznamte se s možnostmi strojového učení pomocí KQL.