Simple Log Service memungkinkan Anda menganalisis data hasil pencarian menggunakan pernyataan SQL. Bagian ini menjelaskan sintaksis dasar dari pernyataan analitik SQL.
Sintaksis dasar
Setiap pernyataan kueri terdiri dari pernyataan pencarian dan pernyataan analitik. Keduanya dipisahkan oleh batang vertikal (|). Format:
Pernyataan pencarian|Pernyataan analitikPernyataan pencarian dapat dijalankan secara independen, sedangkan pernyataan analitik harus dijalankan bersama dengan pernyataan pencarian. Fitur analisis log digunakan untuk menganalisis data dalam hasil pencarian atau seluruh data dalam Logstore.
Disarankan untuk menentukan hingga 30 kondisi pencarian dalam pernyataan pencarian.
Jika klausa FROM atau WHERE tidak ditentukan dalam pernyataan analitik, semua data Logstore saat ini akan dianalisis secara otomatis. Pernyataan analitik tidak mendukung offset dan tidak peka huruf besar/kecil. Tidak perlu menambahkan titik koma (;) di akhir pernyataan analitik.
Pernyataan | Deskripsi |
Pernyataan pencarian | Pernyataan pencarian menentukan satu atau lebih kondisi pencarian. Pernyataan pencarian dapat berupa kata kunci, nilai numerik, rentang nilai numerik, spasi, atau tanda bintang (*). Jika Anda menentukan spasi atau tanda bintang (*) sebagai pernyataan pencarian, tidak ada kondisi yang digunakan untuk pencarian dan semua log dikembalikan. |
Pernyataan analitik | Pernyataan analitik digunakan untuk mengumpulkan atau menganalisis data dalam hasil pencarian atau semua data dalam Logstore. Untuk informasi lebih lanjut tentang fungsi dan sintaksis yang didukung oleh Simple Log Service untuk menganalisis log, lihat topik-topik berikut: |
Contoh pernyataan analitik SQL:
* | SELECT status, count(*) AS PV GROUP BY statusFungsi SQL dan klausa SQL
Secara umum, fungsi SQL digunakan untuk menghitung, mengonversi, dan memformat data. Untuk informasi lebih lanjut, lihat fungsi SQL. Sebagai contoh, Anda dapat menggunakan fungsi SQL untuk menghitung jumlah dan rata-rata nilai, melakukan operasi pada string, serta memproses tanggal. Biasanya, fungsi SQL disematkan dalam klausa SQL.
Klausa SQL digunakan untuk membuat pernyataan pencarian SQL lengkap atau pernyataan pemrosesan data untuk mengidentifikasi sumber, kondisi, kelompok, dan urutan data. Untuk informasi lebih lanjut, lihat klausa SQL.
Contoh 1. Kueri log hari sebelumnya
Fungsi current_date mengembalikan tanggal saat ini. Fungsi date_add mengurangi interval tertentu dari tanggal saat ini. Hasilnya ditampilkan dalam tabel, yang memungkinkan Anda melihat data secara intuitif. (Demo)
Pernyataan Kueri
* | SELECT * FROM log WHERE __time__ < to_unixtime(current_date) AND __time__ > to_unixtime(date_add('day', -1, current_date))Hasil

Contoh 2. Kueri distribusi alamat IP sumber untuk log
Fungsi ip_to_province mengembalikan provinsi berdasarkan alamat IP. Klausa GROUP BY mengumpulkan provinsi. Kemudian, fungsi count menghitung jumlah permintaan dari setiap provinsi. Hasilnya ditampilkan dalam diagram lingkaran. (Demo)
Pernyataan Kueri
* | select count(1) as c, ip_to_province(remote_addr) as address group by address limit 100
Contoh 3. Kueri lalu lintas masuk dan keluar NGINX
Fungsi date_trunc memotong nilai bidang __time__ per jam. Bidang __time__ adalah bidang sistem yang menentukan waktu pengumpulan log. Nilai default dari bidang __time__ adalah timestamp yang akurat hingga detik. Fungsi date_format memformat nilai waktu yang dipotong. Klausa GROUP BY mengumpulkan nilai waktu. Fungsi sum menghitung total volume lalu lintas per jam. Hasilnya ditampilkan dalam diagram garis, di mana sumbu x diatur ke time dan sumbu y di sebelah kiri diatur ke net_out dan net_in. (Demo)
Pernyataan Kueri
* | select sum(body_bytes_sent) as net_out, sum(request_length) as net_in, date_format(date_trunc('hour', __time__), '%m-%d %H:%i') as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i') order by time limit 10000Hasil

Contoh 4. Kueri 10 URL yang paling sering diakses di NGINX
Fungsi split_part membagi bidang request_uri menjadi arrays menggunakan tanda tanya (?) dan mendapatkan jalur permintaan dari string pertama array. Klausa GROUP BY mengumpulkan jalur permintaan. Fungsi count menghitung jumlah kali setiap jalur diakses. Klausa ORDER BY mengurutkan jalur berdasarkan jumlah akses dalam urutan menurun. Hasilnya ditampilkan dalam diagram kolom. (Demo)
Pernyataan Kueri
* | select count(1) as pv, split_part(request_uri, '?', 1) as path group by path order by pv desc limit 10Hasil

Contoh 5. Kueri kategori dan tren PV metode permintaan
Fungsi date_trunc memotong nilai waktu per menit. Klausa GROUP BY mengumpulkan dan mengelompokkan nilai waktu yang dipotong untuk menghitung jumlah page views (PV) berdasarkan request_method. Klausa ORDER BY mengurutkan nilai waktu dalam urutan menaik. Hasilnya ditampilkan dalam bagan alir. Dalam bagan tersebut, sumbu x menunjukkan nilai waktu dan sumbu y menunjukkan jumlah PV. Kolom agregat adalah request_method. (Demo)
Pernyataan Kueri
* | select date_format(date_trunc('minute', __time__), '%m-%d %H:%i') as t, request_method, count(*) as pv group by t, request_method order by t asc limit 10000Hasil

Contoh 6. Kueri jumlah PV untuk hari saat ini dan perbandingan harian antara hari saat ini dan hari sebelumnya
Fungsi count menghitung jumlah PV untuk hari saat ini. Fungsi compare mengembalikan perbandingan harian antara jumlah PV hari saat ini dan hari sebelumnya. (Demo)
Pernyataan Kueri
* | select diff [1] as today, round((diff [3] -1.0) * 100, 2) as growth FROM ( SELECT compare(pv, 86400) as diff FROM ( SELECT COUNT(1) as pv FROM log ) )Hasil

Contoh 7. Peramalan jumlah PV berdasarkan log akses NGINX
Ekspresi time - time % 60 mengurangi sisa pembagian nilai waktu dengan 60 dari nilai waktu untuk mendapatkan timestamps yang akurat hingga menit. Klausa GROUP BY mengumpulkan timestamps. Fungsi count menghitung jumlah PV per menit dan hasilnya digunakan sebagai subquery dalam kueri baru. Fungsi ts_predicate_simple meramalkan jumlah PV dalam 6 menit ke depan. Hasilnya ditampilkan dalam diagram deret waktu. (Demo)
Pernyataan Kueri
* | select ts_predicate_simple(stamp, value, 6) from ( select __time__ - __time__ % 60 as stamp, COUNT(1) as value from log GROUP BY stamp order by stamp ) LIMIT 1000Hasil

Contoh 8. Kumpulkan data berdasarkan bidang http_user_agent, dan urutkan dan tampilkan data berdasarkan jumlah PV
Data dikelompokkan dan dijumlahkan berdasarkan bidang http_user_agent. Jumlah permintaan dari setiap agen dan ukuran respons total yang dikembalikan ke klien dihitung. Satuan ukuran respons total adalah bytes. Fungsi round mengonversi ukuran dalam bytes ke ukuran dalam MB dan membulatkan ukuran ke dua tempat desimal. Ekspresi CASE WHEN mengategorikan string status ke dalam lapisan, termasuk 2xx, 3xx, 4xx, dan 5xx, serta menghitung persentase setiap lapisan. Hasilnya ditampilkan dalam tabel, yang memungkinkan Anda melihat data dan arti data secara intuitif. (Demo)
Pernyataan Kueri
* | select http_user_agent as "User agent", count(*) as pv, round(sum(request_length) / 1024.0 / 1024, 2) as "Request traffic (MB)", round(sum(body_bytes_sent) / 1024.0 / 1024, 2) as "Response traffic (MB)", round( sum( case when status >= 200 and status < 300 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Persentase kode status 2xx (%)", round( sum( case when status >= 300 and status < 400 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Persentase kode status 3xx (%)", round( sum( case when status >= 400 and status < 500 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Persentase kode status 4xx (%)", round( sum( case when status >= 500 and status < 600 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Persentase kode status 5xx (%)" group by "User agent" order by pv desc limit 100
Contoh 9. Kueri persentase jumlah permintaan error dalam log NGINX
Jumlah permintaan error dengan kode status melebihi 400 dan jumlah total permintaan diperoleh berdasarkan pernyataan SQL. Kemudian, persentase jumlah permintaan error dihitung. Hasilnya ditampilkan dalam diagram statistik. (Demo)
Pernyataan Kueri
* | select round((errorCount * 100.0 / totalCount), 2) as errorRatio from ( select sum( case when status >= 400 then 1 else 0 end ) as errorCount, count(1) as totalCount from log )Hasil
