Simple Log Service mendukung analisis multidimensi terhadap log akses Nginx. Topik ini mencakup analisis traffic website, diagnosis latensi, dan konfigurasi alert dengan contoh kueri.
Prasyarat
Log akses Nginx telah dikumpulkan. Kumpulkan log teks menggunakan mode konfigurasi Nginx.
Wizard impor data secara otomatis menghasilkan indeks berdasarkan field log. Untuk memodifikasi indeks, ikuti Buat indeks.
Ikhtisar
Log Nginx sangat penting untuk operasional website. Pendekatan tradisional seperti CNZZ memerlukan injeksi JavaScript di frontend, sedangkan komputasi stream atau offline membutuhkan infrastruktur kompleks dan mengorbankan performa real-time atau fleksibilitas analitis.
Simple Log Service mengumpulkan log Nginx melalui wizard impor data dan secara otomatis membuat indeks serta dasbor. Dasbor nginx_Nginx access log menampilkan distribusi IP sumber, status permintaan, user agent, tren PV/UV, statistik traffic, referrer teratas, dan URL yang paling sering diakses. Anda dapat menulis kueri kustom untuk menganalisis latensi dan mengonfigurasi alert untuk error atau anomali traffic.
Analisis traffic website
Masuk ke Konsol Simple Log Service.
Pada bagian Projects, klik proyek yang diinginkan.

-
Di panel navigasi sebelah kiri, pilih . Klik ikon > di sebelah kiri Logstore yang diinginkan.
-
Di bawah Dashboard, klik nginx_Nginx access log.
Dasbor nginx_Nginx access log mencakup grafik-grafik berikut:
-
Grafik Distribusi alamat IP sumber menunjukkan distribusi geografis IP permintaan selama satu hari terakhir. Kueri:
* | select count(1) as c, ip_to_province(remote_addr) as address group by address limit 100 -
Grafik Distribusi status permintaan menunjukkan persentase setiap kode status HTTP selama satu hari terakhir. Kueri:
* | select count(1) as pv, status group by status
-
Grafik Distribusi metode permintaan menunjukkan persentase setiap metode permintaan selama satu hari terakhir. Kueri:
* | select count(1) as pv ,request_method group by request_method
-
Grafik Distribusi user agent menunjukkan persentase browser yang berbeda selama satu hari terakhir. Kueri:
* | select count(1) as pv, case when http_user_agent like '%Chrome%' then 'Chrome' when http_user_agent like '%Firefox%' then 'Firefox' when http_user_agent like '%Safari%' then 'Safari' else 'unKnown' end as http_user_agent group by case when http_user_agent like '%Chrome%' then 'Chrome' when http_user_agent like '%Firefox%' then 'Firefox' when http_user_agent like '%Safari%' then 'Safari' else 'unKnown' end order by pv desc limit 10
-
Grafik 10 referrer teratas menunjukkan 10 halaman referrer teratas berdasarkan PV selama satu hari terakhir. Kueri:
* | select count(1) as pv , http_referer group by http_referer order by pv desc limit 10
-
Grafik Statistik traffic inbound dan outbound menunjukkan traffic inbound dan outbound selama satu hari terakhir. 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 10000
-
Grafik PV/UV statistics menampilkan jumlah PV dan UV dalam satu hari terakhir. Kueri:
*| select approx_distinct(remote_addr) as uv ,count(1) as pv , 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 1000
-
Grafik PV forecast memprediksi PV untuk empat jam ke depan. Kueri:
* | select ts_predicate_simple(stamp, value, 6, 1, 'sum') from (select __time__ - __time__ % 60 as stamp, COUNT(1) as value from log GROUP BY stamp order by stamp) LIMIT 1000
-
Grafik 10 URL yang paling sering diakses menunjukkan 10 URL dengan permintaan terbanyak berdasarkan PV selama satu hari terakhir. Kueri:
* | select count(1) as pv, split_part(request_uri,'?',1) as path group by path order by pv desc limit 10
-
Diagnosis dan optimalkan performa website
Pantau latensi permintaan untuk mengidentifikasi halaman yang lambat. Gunakan kueri kustom untuk menganalisis pola latensi. Untuk sintaks kueri, lihat Panduan cepat untuk pencarian dan analisis.
-
Hitung latensi permintaan rata-rata dan maksimum setiap 5 menit untuk memahami tren latensi secara keseluruhan.
* | select from_unixtime(__time__ -__time__% 300) as time, avg(request_time) as avg_latency , max(request_time) as max_latency group by __time__ -__time__% 300 -
Identifikasi halaman dengan latensi tertinggi untuk diprioritaskan dalam optimasi.
* | select from_unixtime(__time__ - __time__% 60) , max_by(request_uri,request_time) group by __time__ - __time__%60 -
Kelompokkan nilai latensi ke dalam 10 bin untuk menganalisis distribusinya.
* |select numeric_histogram(10,request_time) -
Ambil 10 nilai latensi tertinggi beserta permintaan yang sesuai.
* | select max(request_time,10) -
Optimalkan halaman dengan latensi tertinggi.
Misalnya, jika /url2 memiliki latensi tertinggi, optimalkan halaman /url2 dengan menghitung PV, UV, metode permintaan, kode status, browser, latensi rata-rata, dan latensi maksimum untuk /url2.
request_uri:"/url2" | select count(1) as pv, approx_distinct(remote_addr) as uv, histogram(method) as method_pv, histogram(status) as status_pv, histogram(user_agent) as user_agent_pv, avg(request_time) as avg_latency, max(request_time) as max_latency -
Bandingkan jumlah tampilan halaman (PV) hari ini dengan PV kemarin (Debug).
* | 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 ) ) -
Hitung perubahan jumlah tampilan halaman (PV) dari hari ke hari.
* | select t, diff [1] as today, diff [2] as yestoday, diff [3] as percentage from( select t, compare(pv, 86400) as diff from ( select count(1) as pv, date_format(from_unixtime(__time__), '%H:%i') as t from log group by t limit 10000 ) group by t order by t limit 10000 )
Atur alert
Konfigurasikan alert untuk lonjakan latensi, error server, dan anomali traffic. Untuk prosedur lengkapnya, lihat Atur alert.
-
Error alert
Pantau tanggapan 500 (server error). Kueri berikut menghitung jumlah error (c) per satuan waktu. Atur kondisi pemicu alert menjadi c > 0.
status:500 | select count(1) as cCatatanUntuk layanan dengan traffic tinggi di mana error 500 sesekali diharapkan, atur Notification Trigger Threshold menjadi 2. Ini akan memicu alert hanya ketika kondisi terpenuhi dalam dua pemeriksaan berturut-turut.
Pada dialog pembuatan alert, atur Alert Name menjadi
Error Alert. Untuk Add to Dashboard, pilih Create dan tentukan nama dasbor sebagaiNginx. Atur Chart Name menjadiError Alert, Query Interval menjadi 1 Day (On the Hour), dan Check Frequency menjadi Fixed Interval selama 15 Minutes. Terakhir, atur Notification Interval menjadi 5 Minutes. -
Performance alert
Buat alert latensi. Kueri berikut menghitung latensi rata-rata semua permintaan
Postke titik akhir/adduser. Atur kondisi pemicu menjadi l > 300000 untuk memberi alert ketika latensi rata-rata melebihi 300 ms.Method:Post and URL:"/adduser" | select avg(request_time) as lAlert berbasis rata-rata dapat menyembunyikan permintaan individual dengan latensi tinggi. Gunakan persentil (seperti P99) sebagai kondisi pemicu. Kueri berikut menghitung latensi persentil ke-99.
Method:Post and URL:"/adduser" | select approx_percentile(request_time, 0.99) as p99Untuk pemantauan, hitung latensi rata-rata, P50, dan P99 per menit dalam jendela satu hari (1.440 menit).
* | select avg(request_time) as l, approx_percentile(request_time, 0.5) as p50, approx_percentile(request_time, 0.99) as p99, date_trunc('minute', time) as t group by t order by t desc limit 1440
-
Alert lonjakan atau penurunan traffic
Penurunan atau lonjakan traffic yang tiba-tiba biasanya tidak normal. Deteksi anomali dengan membandingkan traffic saat ini terhadap salah satu garis dasar berikut:
-
Jendela waktu sebelumnya.
-
Jendela waktu yang sama pada hari sebelumnya.
-
Jendela waktu yang sama pada minggu sebelumnya.
Contoh berikut menggunakan metode pertama untuk menghitung laju perubahan dalam rentang kueri 5 menit.
-
Tentukan jendela perhitungan.
Tentukan jendela 1 menit untuk menghitung traffic per menit.
* | select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15Hasilnya berisi dua kolom:
window_timedaninflow. Kolominflowmenunjukkan nilai traffic untuk setiap jendela 1 menit. -
Hitung selisih dalam jendela.
-
Hitung rasio nilai maksimum atau minimum terhadap nilai rata-rata. Contoh ini menggunakan rasio maksimum (max_ratio).
Dalam contoh ini,
max_ratioadalah 1,02. Atur kondisi alert menjadi max_ratio > 1,5 (laju perubahan melebihi 50%) untuk memicu alert.* | select max(inflow)/avg(inflow) as max_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15) -
Hitung laju perubahan untuk nilai terbaru guna memeriksa apakah traffic berfluktuasi atau telah kembali normal.
Gunakan fungsi max_by untuk mendapatkan traffic maksimum dalam jendela. Nilai
latest_ratiosebesar 0,97 berarti traffic terbaru adalah 97% dari rata-rata.* | select max_by(inflow, window_time)/1.0/avg(inflow) as latest_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15)CatatanHasil fungsi max_by bertipe string dan harus dikonversi ke tipe numerik. Jika ingin menghitung laju perubahan relatif, Anda dapat menggunakan (1.0-max_by(inflow, window_time)/1.0/avg(inflow)) as latest_ratio.
-
Hitung volatilitas, yaitu perubahan antara nilai jendela saat ini dan jendela sebelumnya.
Gunakan fungsi jendela
laguntuk menghitung selisih antara traffic saat ini inflow dan periode sebelumnya inflow "lag(inflow, 1, inflow)over() ", dibagi dengan inflow saat ini. Penurunan signifikan (misalnya pada pukul 11:39) menunjukkan laju perubahan melebihi 40%.CatatanGunakan fungsi abs untuk menghitung laju perubahan absolut.
* | select (inflow- lag(inflow, 1, inflow)over() )*1.0/inflow as diff, from_unixtime(window_time) from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15)
-
-