Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Layanan cloud dan perangkat IoT menghasilkan data telemetri yang dapat digunakan untuk mendapatkan wawasan seperti memantau kesehatan layanan, proses produksi fisik, dan tren penggunaan. Melakukan analisis rangkaian waktu adalah salah satu cara untuk mengidentifikasi penyimpangan dalam pola metrik ini dibandingkan dengan pola garis besar khasnya.
Kusto Query Language (KQL) berisi dukungan asli untuk pembuatan, manipulasi, dan analisis beberapa rangkaian waktu. Dalam artikel ini, pelajari bagaimana KQL digunakan untuk membuat dan menganalisis ribuan rangkaian waktu dalam hitungan detik, memungkinkan solusi pemantauan dan alur kerja yang hampir real-time.
Pembuatan rangkaian waktu
Di bagian ini, kita akan membuat serangkaian rangkaian waktu reguler secara sederhana dan intuitif menggunakan make-series operator, dan mengisi nilai yang hilang sesuai kebutuhan.
Langkah pertama dalam analisis rangkaian waktu adalah mempartisi dan mengubah tabel telemetri asli menjadi serangkaian rangkaian waktu. Tabel biasanya berisi kolom tanda waktu, dimensi kontekstual, dan metrik opsional. Dimensi digunakan untuk mempartisi data. Tujuannya adalah untuk membuat ribuan rangkaian waktu per partisi secara berkala.
Tabel input demo_make_series1 berisi 600K rekaman lalu lintas layanan web sembarang. Gunakan perintah berikut untuk mengambil sampel 10 rekaman:
demo_make_series1 | take 10
Tabel yang dihasilkan berisi kolom tanda waktu, tiga kolom dimensi kontekstual, dan tanpa metrik:
| Penanda Waktu | BrowserVer | OsVer | Negara/Wilayah |
|---|---|---|---|
| 2016-08-25 09:12:35.4020000 | Chrome 51.0 | Windows 7 | Inggris Raya |
| 2016-08-25 09:12:41.1120000 | Chrome 52.0 | Windows 10 | |
| 2016-08-25 09:12:46.2300000 | Chrome 52.0 | Windows 7 | Inggris Raya |
| 2016-08-25 09:12:46.5100000 | Chrome 52.0 | Windows 10 | Inggris Raya |
| 2016-08-25 09:12:46.5570000 | Chrome 52.0 | Windows 10 | Republik Lituania |
| 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 | Inggris Raya |
| 2016-08-25 09:12:51.6930000 | Chrome 52.0 | Windows 7 | Belanda |
| 2016-08-25 09:12:56.4240000 | Chrome 52.0 | Windows 10 | Inggris Raya |
| 2016-08-25 09:13:08.7230000 | Chrome 52.0 | Windows 10 | India |
Karena tidak ada metrik, kita hanya dapat membuat serangkaian rangkaian waktu yang mewakili jumlah lalu lintas itu sendiri, yang dipartisi oleh OS menggunakan kueri berikut:
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-seriesGunakan operator untuk membuat serangkaian tiga rangkaian waktu, di mana:-
num=count(): rangkaian waktu lalu lintas -
from min_t to max_t step 1h: rangkaian waktu dibuat dalam bin 1 jam dalam rentang waktu (tanda waktu rekaman tabel terlama dan terbaru) -
default=0: tentukan metode pengisian untuk bin yang hilang untuk membuat rangkaian waktu reguler. Atau gunakanseries_fill_const(),series_fill_forward(),series_fill_backward()danseries_fill_linear()untuk perubahan -
by OsVer: partisi menurut OS
-
- Struktur data deret waktu yang sebenarnya adalah array numerik dari nilai teragregasi untuk setiap bin waktu. Kami menggunakan
render timechartuntuk visualisasi.
Dalam tabel di atas, kami memiliki tiga partisi. Kita dapat membuat rangkaian waktu terpisah: Windows 10 (merah), 7 (biru) dan 8.1 (hijau) untuk setiap versi OS seperti yang terlihat dalam grafik:
Fungsi analisis rangkaian waktu
Di bagian ini, kita akan melakukan fungsi pemrosesan seri yang khas. Setelah serangkaian rangkaian waktu dibuat, KQL mendukung daftar fungsi yang berkembang untuk memproses dan menganalisisnya. Kami akan menjelaskan beberapa fungsi perwakilan untuk memproses dan menganalisis rangkaian waktu.
Penyaringan
Pemfilteran adalah praktik umum dalam pemrosesan sinyal dan berguna untuk tugas pemrosesan rangkaian waktu (misalnya, menghaluskan sinyal bising, deteksi perubahan).
- Ada dua fungsi pemfilteran generik:
-
series_fir(): Menerapkan filter FIR. Digunakan untuk perhitungan sederhana rata-rata bergerak dan diferensiasi rangkaian waktu untuk deteksi perubahan. -
series_iir(): Menerapkan filter IIR. Digunakan untuk perataan eksponensial dan jumlah kumulatif.
-
-
Extendrangkaian waktu yang ditetapkan dengan menambahkan seri rata-rata bergerak baru dengan ukuran 5 bin (bernama ma_num) ke kueri:
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
Analisis regresi
Analisis regresi linier tersegmentasi dapat digunakan untuk memperkirakan tren rangkaian waktu.
- Gunakan series_fit_line() untuk mendapat garis terbaik yang sesuai dengan deret waktu guna mendeteksi tren umum.
- Gunakan series_fit_2lines() untuk mendeteksi perubahan tren, relatif terhadap garis besar, yang berguna dalam skenario pemantauan.
Contoh series_fit_line() dan series_fit_2lines() fungsi dalam kueri rangkaian waktu:
demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)
- Biru: rangkaian waktu asli
- Hijau: garis lurus
- Merah: dua garis terpasang
Nota
Fungsi ini secara akurat mendeteksi titik lompat (perubahan tingkat).
Deteksi musiman
Banyak metrik mengikuti pola musiman (berkala). Lalu lintas pengguna layanan cloud biasanya berisi pola harian dan mingguan yang tertinggi di sekitar pertengahan hari kerja dan terendah di malam hari dan selama akhir pekan. Sensor IoT mengukur dalam interval berkala. Pengukuran fisik seperti suhu, tekanan, atau kelembaban juga dapat menunjukkan perilaku musiman.
Contoh berikut menerapkan deteksi musiman pada lalu lintas satu bulan layanan web (bin 2 jam):
demo_series3
| render timechart
- Gunakan series_periods_detect() untuk mendeteksi periode dalam rangkaian waktu secara otomatis, di mana:
-
num: rangkaian waktu yang akan dianalisis -
0.: panjang periode minimum dalam hari (0 berarti tidak minimum) -
14d/2h: periode maksimum dalam hitungan hari, yaitu 14 hari terbagi dalam bin 2 jam -
2: jumlah periode yang akan dideteksi
-
- Gunakan series_periods_validate() jika kita tahu bahwa metrik harus memiliki periode tertentu yang berbeda dan kami ingin memverifikasi bahwa metrik tersebut ada.
Nota
Ini adalah anomali jika periode tertentu yang berbeda tidak ada
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
| Periode | Skor | Hari |
|---|---|---|
| 84 | 0.820622786055595 | 7 |
| 12 | 0.764601405803502 | 1 |
Fungsi ini mendeteksi musiman harian dan mingguan. Skor harian kurang dari mingguan karena hari akhir pekan berbeda dari hari kerja.
Fungsi elemen-sebaris
Operasi aritmatika dan logis dapat dilakukan pada rangkaian waktu. Menggunakan series_subtract() kita dapat menghitung rangkaian waktu residual, yaitu perbedaan antara metrik mentah asli dan yang dihaluskan, dan mencari anomali dalam sinyal residu:
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
- Biru: rangkaian waktu asli
- Merah: rangkaian waktu yang dihaluskan
- Hijau: sisa rangkaian waktu
Alur kerja rangkaian waktu dalam skala besar
Contoh di bawah ini menunjukkan bagaimana fungsi-fungsi ini dapat berjalan dalam skala besar pada ribuan rangkaian waktu dalam hitungan detik untuk deteksi anomali. Untuk melihat beberapa sampel rekaman telemetri metrik jumlah baca layanan DB selama empat hari, jalankan kueri berikut:
demo_many_series1
| take 4
| TIMESTAMP | Lokasi | Op | DB | 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 |
Dan statistik sederhana:
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 |
Membangun deret waktu dalam bin 1 jam dari metrik baca (empat hari * 24 jam totalnya 96 poin) menghasilkan fluktuasi pola normal.
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)
Perilaku di atas menyesatkan, karena rangkaian waktu normal tunggal dikumpulkan dari ribuan instans berbeda yang mungkin memiliki pola abnormal. Oleh karena itu, kami membuat deret waktu per contoh. Instans didefinisikan oleh Loc (lokasi), Op (operasi), dan DB (komputer tertentu).
Berapa banyak rangkaian waktu yang dapat kita buat?
demo_many_series1
| summarize by Loc, Op, DB
| count
| Jumlah |
|---|
| 18339 |
Sekarang, kita akan membuat serangkaian rangkaian waktu 18339 dari metrik jumlah baca. Kami menambahkan by klausul ke pernyataan make-series, menerapkan regresi linier, dan memilih dua rangkaian waktu teratas yang memiliki tren penurunan paling signifikan:
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)')
Tampilkan contoh:
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
| Lokasi | Op | DB | lereng |
|---|---|---|---|
| Loc 15 | 37 | 1151 | -102743.910227889 |
| Loc 13 | 37 | 1249 | -86303.2334644601 |
Dalam waktu kurang dari dua menit, hampir 20.000 seri data waktu dianalisis, dan dua seri data waktu abnormal di mana jumlah baca tiba-tiba menurun terdeteksi.
Kemampuan canggih ini dikombinasikan dengan performa cepat menyediakan solusi yang unik dan kuat untuk analisis rangkaian waktu.
Konten terkait
- Pelajari tentang Deteksi anomali dan prakiraan dengan KQL.
- Pelajari tentang kemampuan pembelajaran mesin dengan KQL.