Analisis deret waktu
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 dasar khasnya.
Bahasa Kueri Kusto (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 dan alur kerja pemantauan hampir real-time.
Pembuatan rangkaian waktu
Di bagian ini, kita akan membuat serangkaian rangkaian waktu reguler yang besar 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 arbitrer. 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:
TimeStamp | 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-series
Gunakan operator untuk membuat satu set tiga rangkaian waktu, di mana:num=count()
: rangkaian waktu lalu lintasfrom min_t to max_t step 1h
: rangkaian waktu dibuat dalam bin 1 jam dalam rentang waktu (tanda waktu terlama dan terbaru dari rekaman tabel)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 perubahanby OsVer
: partisi oleh OS
- Struktur data rangkaian waktu aktual adalah array numerik dari nilai agregat per setiap bin waktu. Kami menggunakan
render timechart
untuk 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 terus berkembang untuk memproses dan menganalisisnya. Kami akan menjelaskan beberapa fungsi perwakilan untuk memproses dan menganalisis rangkaian waktu.
Pemfilteran
Pemfilteran adalah praktik umum dalam pemrosesan sinyal dan berguna untuk tugas pemrosesan rangkaian waktu (misalnya, menghaluskan sinyal bising, mengubah deteksi).
- 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 penghalusan eksponensial dan jumlah kumulatif.
Extend
rangkaian 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
Azure Data Explorer mendukung analisis regresi linier tersegmentasi untuk memperkirakan tren rangkaian waktu.
- Gunakan series_fit_line() agar sesuai dengan garis terbaik dengan rangkaian waktu untuk deteksi tren umum.
- Gunakan series_fit_2lines() untuk mendeteksi perubahan tren, relatif terhadap garis besar, yang berguna dalam skenario pemantauan.
series_fit_line()
Contoh fungsi dan series_fit_2lines()
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 yang pas
- Merah: dua garis yang pas
Catatan
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 tengah hari kerja dan terendah di malam hari dan selama akhir pekan. Pengukuran sensor IoT 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.
- Gunakan series_periods_validate() jika kita tahu bahwa metrik harus memiliki periode yang berbeda dan kami ingin memverifikasi bahwa metrik tersebut ada.
Catatan
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 | Partitur | 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 bijaksana
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 sisa:
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
- 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 | Loc | 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 rangkaian waktu dalam bin 1 jam metrik baca (total empat hari * 24 jam = 96 titik), 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 rangkaian waktu per instans. 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 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 instans:
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 | Lereng |
---|---|---|---|
Loc 15 | 37 | 1151 | -102743.910227889 |
Loc 13 | 37 | 1249 | -86303.2334644601 |
Dalam waktu kurang dari dua menit, hampir 20.000 rangkaian waktu dianalisis dan dua rangkaian waktu abnormal di mana jumlah baca tiba-tiba 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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk