Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 aseries_fill_const()
,series_fill_forward()
,series_fill_backward()
ésseries_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ő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
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)
- 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
- 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
- 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)
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)')
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.
Kapcsolódó tartalom
- Ismerje meg az anomáliadetektálást és az előrejelzést a KQL-vel.
- Ismerje meg a gépi tanulási képességeket a KQL használatával.