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 lintas
    • from 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 gunakan series_fill_const(), series_fill_forward(), series_fill_backward() dan series_fill_linear() untuk perubahan
    • by 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:

Partisi rangkaian waktu.

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

Pemfilteran rangkaian waktu.

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)

Regresi rangkaian waktu.

  • 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 

Musiman rangkaian waktu.

  • 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

Operasi rangkaian waktu.

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

Rangkaian waktu dalam skala besar.

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

Deret waktu dua teratas.

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.