Analisis data deret waktu

Beralih layanan menggunakan menu tarik-turun Versi. Pelajari selengkapnya tentang navigasi.
Berlaku untuk: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

Layanan cloud dan perangkat IoT menghasilkan telemetri yang dapat Anda gunakan untuk mendapatkan wawasan tentang kesehatan layanan, proses produksi, dan tren penggunaan. Analisis rangkaian waktu membantu Anda mengidentifikasi penyimpangan dari pola garis besar yang khas.

Kusto Query Language (KQL) memiliki dukungan asli untuk membuat, memanipulasi, dan menganalisis beberapa rangkaian waktu. Artikel ini memperlihatkan cara menggunakan KQL untuk membuat dan menganalisis ribuan rangkaian waktu dalam hitungan detik untuk mengaktifkan solusi pemantauan dan alur kerja yang mendekati real-time.

Pembuatan rangkaian waktu

Buat rangkaian waktu reguler yang besar menggunakan operator make-series dan isi nilai yang hilang sesuai kebutuhan. Partisi dan ubah tabel telemetri 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, bangun rangkaian waktu yang mewakili jumlah lalu lintas, yang dipartisi berdasarkan OS.

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 tiga rangkaian waktu, di mana:
    • num=count(): jumlah lalu lintas.
    • from min_t to max_t step 1h: membuat rangkaian waktu dalam bin satu jam dari tanda waktu terlama hingga terbaru pada tabel.
    • default=0: menentukan 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 perilaku pengisian yang berbeda.
    • by OsVer: partisi menurut OS.
  • Struktur data rangkaian waktu adalah array numerik dari nilai agregat untuk setiap bin waktu. Gunakan render timechart untuk visualisasi.

Tabel di atas memiliki tiga partisi (Windows 10, Windows 7, dan Windows 8.1). Bagan menunjukkan rangkaian waktu terpisah untuk setiap versi OS:

Cuplikan layar bagan rangkaian waktu dengan garis terpisah untuk Windows 10, Windows 7, dan Windows 8.1.

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

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)

Regresi rangkaian waktu.

  • 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 

Musiman rangkaian waktu.

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

Operasi rangkaian waktu.

  • Biru: rangkaian waktu asli
  • Merah: rangkaian waktu yang dihaluskan
  • Hijau: sisa rangkaian waktu

Alur kerja rangkaian waktu dalam skala besar

Contoh ini menunjukkan deteksi anomali yang berjalan dalam skala besar pada ribuan rangkaian waktu dalam hitungan detik. Untuk melihat sampel rekaman telemetri untuk 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

Lihat 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

Rangkaian waktu dalam bin 1 jam metrik baca (empat hari × 24 jam = 96 poin) menunjukkan fluktuasi per jam 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) 

Cuplikan layar bagan rangkaian waktu memperlihatkan bacaan rata-rata selama empat hari dengan fluktuasi per jam normal.

Perilaku ini menyesatkan karena rangkaian waktu normal tunggal dikumpulkan dari ribuan instans yang dapat memiliki pola abnormal. Buat rangkaian waktu per instans yang ditentukan oleh Loc (lokasi), Op (operasi), dan DB (komputer tertentu).

Berapa banyak rangkaian waktu yang dapat Anda buat?

demo_many_series1
| summarize by Loc, Op, DB
| count
Jumlah
18339

Buat 18.339 rangkaian waktu untuk metrik jumlah baca. by Tambahkan klausul ke pernyataan make-series, terapkan regresi linier, dan pilih dua rangkaian waktu teratas dengan 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)')

Tangkapan layar dari dua rangkaian waktu dengan jumlah pembacaan yang menurun tajam dibandingkan dengan lalu lintas yang normal.

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 -104,498.46510358342
Loc 13 37 1249 -86,614.02919932814

Dalam waktu kurang dari dua menit, kueri menganalisis hampir 20.000 rangkaian waktu dan mendeteksi dua dengan penurunan jumlah baca tiba-tiba.

Kemampuan dan performa platform ini memberikan solusi yang kuat untuk analisis rangkaian waktu.