Megosztás a következőn keresztül:


Idősorozat-elemzések

A következőkre vonatkozik: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

A felhőszolgáltatások és az IoT-eszközök telemetriai adatokat hoznak létre, amelyek olyan elemzések készítésére használhatók, mint a szolgáltatás állapotának monitorozása, a fizikai termelési folyamatok és a használati trendek. Az idősorelemzés egyik módja ezeknek a metrikáknak a mintájában lévő eltérések azonosítására a tipikus alapkonfigurációs mintához képest.

A Kusto Query Language (KQL) natív támogatást nyújt több idősor létrehozásához, kezeléséhez és elemzéséhez. Ebből a cikkből megtudhatja, hogyan használható a KQL több ezer idősor másodpercek alatt történő létrehozására és elemzésére, így közel valós idejű monitorozási megoldásokat és munkafolyamatokat tesz lehetővé.

Idősor létrehozása

Ebben a szakaszban a normál idősorok nagy készletét fogjuk létrehozni egyszerűen és intuitív módon az make-series operátor használatával, és szükség szerint kitöltjük a hiányzó értékeket. Az idősor-elemzés első lépése az eredeti telemetriai tábla particionálása és átalakítása idősorok készletére. A táblázat általában tartalmaz időbélyegoszlopot, környezetfüggő dimenziókat és választható metrikákat. A dimenziók az adatok particionálására szolgálnak. A cél partíciónként több ezer idősor létrehozása rendszeres időközönként.

A bemeneti tábla demo_make_series1 600 ezer rekordot tartalmaz tetszőleges webszolgáltatás-forgalomról. A következő paranccsal 10 rekordot mintázhat:

demo_make_series1 | take 10 

Az eredményként kapott táblázat egy időbélyeg oszlopot, három kontextuális dimenzió oszlopot, és nem tartalmaz metrikákat.

Időbélyeg BrowserVer OsVer Ország/régió
2016-08-25 09:12:35.4020000 Chrome 51.0 Windows 7 Egyesült Királyság
2016-08-25 09:12:41.1120000 Chrome 52.0 Windows 10
2016-08-25 09:12:46.2300000 Chrome 52.0 Windows 7 Egyesült Királyság
2016-08-25 09:12:46.5100000 Chrome 52.0 Windows 10 Egyesült Királyság
2016-08-25 09:12:46.5570000 Chrome 52.0 Windows 10 Litván Köztársaság
2016-08-25 09:12:47.0470000 Chrome 52.0 Windows 8.1 India
2016-08-25 09:12:51.3600000 Chrome 52.0 Windows 10 Egyesült Királyság
2016-08-25 09:12:51.6930000 Chrome 52.0 Windows 7 Hollandia
2016-08-25 09:12:56.4240000 Chrome 52.0 Windows 10 Egyesült Királyság
2016-08-25 09:13:08.7230000 Chrome 52.0 Windows 10 India

Mivel nincsenek metrikák, csak a forgalomszámot képviselő idősorokat hozhatunk létre, amelyeket az operációs rendszer a következő lekérdezéssel particionált:

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 
  • make-series Az operátorral három idősort hozhat létre, ahol:
    • num=count(): forgalom idősorozata
    • from min_t to max_t step 1h: az idősorok 1 órás tárolókban jönnek létre az időtartományban (a táblarekordok legrégebbi és legújabb időbélyegei)
    • default=0: adja meg a hiányzó tárolók kitöltési módszerét a rendszeres idősorok létrehozásához. Alternatívaként használja a series_fill_const(), series_fill_forward(), series_fill_backward() és series_fill_linear() elemeket módosításokhoz.
    • by OsVer: partíció operációs rendszer szerint
  • A tényleges idősor-adatstruktúra az egyes időhelyek összesített értékének numerikus tömbje. Vizualizációhoz használjuk render timechart .

A fenti táblázatban három partíció található. Létrehozhatunk egy külön idősort: Windows 10 (piros), 7 (kék) és 8.1 (zöld) minden operációsrendszer-verzióhoz a grafikonon látható módon:

Idősorpartíció.

Idősorozat-elemzési függvények

Ebben a szakaszban tipikus adatsor-feldolgozási függvényeket fogunk végrehajtani. Az idősorok létrehozása után a KQL támogatja a függvények egyre bővülő listáját a feldolgozásukhoz és elemzésükhöz. Bemutatunk néhány jellemző függvényt az idősorok feldolgozásához és elemzéséhez.

Szűrés

A szűrés gyakori gyakorlat a jelfeldolgozásban, és hasznos az idősorozat-feldolgozási feladatokhoz (például zajos jel simításához, változásészleléshez).

  • Két általános szűrési függvény létezik:
    • series_fir(): FIR-szűrő alkalmazása. A változásészleléshez használt idősor mozgóátlagának és különbségének egyszerű kiszámítására szolgál.
    • series_iir(): IIR-szűrő alkalmazása. Exponenciális simításhoz és összegző összeghez használatos.
  • Extend az idősor úgy van beállítva, hogy egy új, 5-ös méretű ( ma_num nevű) mozgó átlagos adatsort ad hozzá a lekérdezéshez:
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

Idősorszűrés.

Regresszióelemzés

Szegmentált lineáris regressziós elemzéssel megbecsülhető az idősor trendje.

  • A series_fit_line() használatával a legjobb vonalat illesztheti egy idősorhoz az általános trendészleléshez.
  • A series_fit_2lines() segítségével észleli az alapkonfigurációhoz viszonyított trendváltozásokat, amelyek a monitorozási forgatókönyvekben hasznosak.

Példa series_fit_line() és series_fit_2lines() függvények egy idősoros lekérdezésben:

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

Idősor regressziója.

  • Kék: eredeti idősor
  • Zöld: illesztett vonal
  • Piros: két illesztett vonal

Megjegyzés:

A függvény pontosan észlelte az ugrási (szintváltozási) pontot.

Szezonalitás észlelése

Számos metrika szezonális (időszakos) mintákat követ. A felhőszolgáltatások felhasználói forgalma általában napi és heti mintákat tartalmaz, amelyek a munkanap közepe körül a legmagasabbak, éjszaka és hétvégén pedig a legalacsonyabbak. Az IoT-érzékelők rendszeres időközönként mérnek. A fizikai mérések, például a hőmérséklet, a nyomás vagy a páratartalom szezonális viselkedést is mutathatnak.

Az alábbi példa szezonalitás-észlelést alkalmaz egy webszolgáltatás egy hónapos forgalmára (2 órás tárolók):

demo_series3
| render timechart 

Idősor szezonalitása.

  • A series_periods_detect() használatával automatikusan észleli az idősorok időszakait, ahol:
    • num: az elemezni kívánt idősor
    • 0.: a minimális időszak hossza napokban (0 azt jelenti, hogy nincs minimum)
    • 14d/2h: az időszak maximális hossza napokban, ami 14 nap, 2 órás idősávokra osztva
    • 2: az észlelni kívánt időszakok száma
  • Használjon series_periods_validate() ha tudjuk, hogy egy metrikának meghatározott, eltérő időszak(ok) kell, hogy legyenek, és ellenőrizni szeretnénk, hogy léteznek-e.

Megjegyzés:

Anomália, ha nem léteznek meghatározott különböző időszakok

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
Időszakok Pontszámok Napok
84 0.820622786055595 7
12 0.764601405803502 1

A függvény napi és heti szezonalitást észlel. A napi pontszámok kisebbek, mint a heti, mert a hétvégi napok eltérnek a hétköznapoktól.

Elemalapú függvények

Az aritmetikai és logikai műveletek idősorokon is elvégezhetők. A series_subtract() használatával kiszámíthatjuk a reziduális idősorokat, vagyis az eredeti nyers metrika és a simított metrika közötti különbséget, és megkereshetjük a reziduális jel rendellenességeit:

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

Idősorozat-műveletek.

  • Kék: eredeti idősor
  • Piros: simított idősor
  • Zöld: reziduális idősor

Idősorozat munkafolyamata nagy léptékben

Az alábbi példa bemutatja, hogyan futtathatók ezek a függvények több ezer idősoron másodpercek alatt az anomáliadetektáláshoz. A DB-szolgáltatás olvasási számának négy napon keresztüli metrikájával kapcsolatos néhány minta telemetriai rekord megtekintéséhez futtassa a következő lekérdezést:

demo_many_series1
| take 4 
IDŐBÉLYEG Loc Operátor Adatbázis 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

És egyszerű statisztikák:

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

Egy idősor összeállítása az olvasási metrika 1 órás tárolóiban (összesen négy nap * 24 óra = 96 pont) normál mintaingadozást eredményez:

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) 

Nagy léptékű idősor.

A fenti viselkedés félrevezető, mivel az egyetlen normál idősor több ezer különböző olyan példányból van összesítve, amelyek rendellenes mintákkal rendelkezhetnek. Ezért példányonként létrehozunk egy idősort. A példányt a Loc (hely), az Op (művelet) és a DB (adott gép) határozza meg.

Hány idősort hozhatunk létre?

demo_many_series1
| summarize by Loc, Op, DB
| count
Számlál
18339

Most létrehozunk egy 18339-es idősort az olvasási szám metrikáiból. Hozzáadjuk a záradékot a by make-series utasításhoz, lineáris regressziót alkalmazunk, és kiválasztjuk az első két idősort, amely a legjelentősebb csökkenő trendet tartalmazta:

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

Az idősor első két helyezettje.

A példányok megjelenítése:

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 
Helyszín Operátor Adatbázis lejtő
Loc 15 37 1151 -102743.910227889
Loc 13 37 1249 -86303.2334644601

Kevesebb mint két perc alatt közel 20 000 idősort elemeztünk, és két rendellenes idősort észleltünk, amelyekben az olvasási szám hirtelen csökkent.

Ezek a fejlett képességek a gyors teljesítménnyel kombinálva egyedi és hatékony megoldást biztosítanak az idősorozat-elemzéshez.