Idősorozat-elemzések

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

Kusto lekérdezésnyelv (KQL) natív támogatást tartalmaz több idősor létrehozásához, módosításához é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, közel valós idejű monitorozási megoldások és munkafolyamatok engedélyezéséhez.

Idősor létrehozása

Ebben a szakaszban egyszerű és intuitív módon hozunk létre egy nagy rendszeres idősort az operátor használatával, és szükség szerint kitöltjük a make-series 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 halmazává. 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 az, hogy partíciónként több ezer idősort hozzon létre rendszeres időközönként.

A bemeneti tábla demo_make_series1 600 000 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ábla egy időbélyegoszlopot, három környezeti dimenzióoszlopot tartalmaz, és nincsenek metrikák:

TimeStamp 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 forgalom számát képviselő idősorokat hozhatunk létre, amelyeket az operációs rendszer particionált az alábbi lekérdezéssel:

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ősorból álló készletet hozhat létre, ahol:
    • num=count(): forgalom idősorozata
    • from min_t to max_t step 1h: az idősorok 1 órás intervallumokban 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ódját a rendszeres idősorok létrehozásához. Másik lehetőségként a , series_fill_forward(), series_fill_backward() és series_fill_linear() a módosításokat is használhatja series_fill_const()
    • 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) az operációs rendszer minden verziójához a grafikonon látható módon:

Idősorpartíció.

Idősor-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ősorok feldolgozási feladataihoz (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ési 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 hozzáad egy új, 5-ös méretű ( ma_num nevű) mozgó átlagos adatsort 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ősorok szűrése.

Regresszióelemzés

Az Azure Data Explorer támogatja a szegmentált lineáris regresszióelemzést az idősor trendjének becsléséhez.

  • A series_fit_line() használatával a legjobb vonalat illesztheti egy idősorhoz az általános trendészleléshez.
  • A series_fit_2lines() használatával észlelheti a monitorozási forgatókönyvekben hasznos trendváltozásokat az alapkonfigurációhoz képest.

series_fit_line() Példa é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: beszerelt vonal
  • Piros: két szerelt 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özepén 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 is szezonális viselkedést mutathatnak.

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

demo_series3
| render timechart 

Idősor szezonalitása.

  • A series_periods_detect() használatával automatikusan észlelheti az idősorok időszakait.
  • Használjon series_periods_validate() akkor, ha tudjuk, hogy egy metrika adott különböző időszak(ok)ból áll, é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 nap
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 végezhetők el. A series_subtract() használatával kiszámíthatjuk a reziduális idősort, azaz az eredeti nyers é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 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

Idősorműveletek.

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

Idősoros munkafolyamat 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. Ha egy DB-szolgáltatás olvasási számmetrikáinak négy napon keresztüli minta telemetriai rekordjait szeretné megtekinteni, futtassa a következő lekérdezést:

demo_many_series1
| take 4 
IDŐBÉLYEGZŐ Loc Op DB DataRead
2016-09-11 21:00:00.0000000 9. hely 5117853934049630089 262 0
2016-09-11 21:00:00.0000000 9. hely 5117853934049630089 241 0
2016-09-11 21:00:00.0000000 9. hely -865998331941149874 262 279862
2016-09-11 21:00:00.0000000 9. hely 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 rekeszeibe (ö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) 

Idősor nagy léptékben.

A fenti viselkedés félrevezető, mivel az egyetlen normál idősor több ezer különböző, rendellenes mintával rendelkező példányból van összesítve. Ezért példányonként létrehozunk egy idősort. A példányokat 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
Darabszám
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)')

Idősor első kettő.

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 
Loc Op DB Lejtőn
Loc 15 37 1151 -102743.910227889
Loc 13 37 1249 -86303.2334644601

Kevesebb mint két perc alatt közel 20 000 idősort elemeztek, és két rendellenes idősort észleltek, 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ősorok elemzéséhez.