Topik ini menjawab beberapa pertanyaan umum terkait kueri dan analisis log JSON.
Contoh log
Contoh-contoh dalam topik ini didasarkan pada log sistem pemrosesan pesanan yang menggunakan format JSON berikut. 
request: Berisi informasi permintaan pesanan dalam format JSON. Permintaan dapat mencakup beberapa pesanan untuk satu pengguna, termasuk produk yang dibeli dan total pembayaran.
response: Menunjukkan hasil pemrosesan pesanan dalam suatu permintaan.
Jika permintaan berhasil, nilai bidang response adalah SUCCESS.
Jika permintaan gagal, nilai bidang response berisi informasi errcode dan msg dalam format JSON.
Anda dapat mengumpulkan log ke Layanan Log Sederhana menggunakan Logtail untuk kueri dan analisis. Untuk informasi lebih lanjut, lihat Kumpulkan log dalam mode JSON.
Bagaimana cara mengonfigurasi indeks?
Indeks adalah struktur penyimpanan yang digunakan untuk mengurutkan satu atau beberapa kolom data log. Anda hanya dapat melakukan kueri data log setelah mengonfigurasi indeks. Saat mengonfigurasi indeks untuk log JSON, perhatikan pertanyaan-pertanyaan berikut:
Bagaimana Cara Memilih Tipe Indeks?
Layanan Log Sederhana mendukung indeks teks penuh dan indeks bidang. Pilih tipe indeks berdasarkan skenario berikut. Untuk informasi lebih lanjut, lihat Buat Indeks.
Untuk menanyakan semua bidang dalam log, kami sarankan membuat indeks teks penuh. Untuk menanyakan bidang tertentu, buat indeks bidang untuk mengurangi biaya pengindeksan.
Untuk menganalisis bidang menggunakan Pernyataan SQL, Anda harus membuat indeks dan mengaktifkan Analytics untuk bidang tersebut.
Jika Anda mengonfigurasi indeks teks penuh dan indeks bidang, konfigurasi indeks bidang akan menjadi prioritas dalam operasi.
Sebagai contoh, jika ingin menganalisis bidang request dan response, Anda harus membuat indeks bidang dan mengaktifkan Analytics untuk bidang-bidang tersebut.
Bagaimana Cara Menentukan Tipe Data untuk Bidang Saat Mengonfigurasi Indeks?
Saat mengonfigurasi indeks untuk suatu bidang, Anda dapat menentukan tipe data berikut: text, long, double, dan JSON. Untuk informasi lebih lanjut, lihat Tipe Data.
Saat menentukan tipe data JSON untuk suatu bidang, perhatikan instruksi berikut:
Jika nilai bidang tidak dalam format JSON standar tetapi berisi data berformat JSON, tentukan tipe data text. Jika nilai bidang dalam format JSON standar, tentukan tipe data JSON.
CatatanUntuk log JSON yang sebagian valid, Layanan Log Sederhana hanya memproses bagian yang valid.
Jika Anda menentukan tipe data JSON untuk suatu bidang, bidang tersebut adalah objek JSON. Dalam hal ini, jika ingin menganalisis node daun dalam objek JSON, Anda dapat membuat indeks untuk node daun tersebut. Ini membantu mempercepat kueri dan analisis tetapi meningkatkan biaya pengindeksan.
Layanan Log Sederhana memungkinkan Anda membuat indeks untuk node daun dalam objek JSON, tetapi tidak untuk node anak yang berisi node daun.
Anda tidak dapat membuat indeks untuk bidang yang nilainya adalah array JSON atau untuk bidang dalam array JSON.
Sebagai contoh, Anda dapat membuat indeks berikut berdasarkan log JSON sampel yang disediakan dalam topik ini.
Bidang request
request: Nilainya dalam format JSON. Tentukan tipe data JSON dan aktifkan Analytics saat membuat indeks untuk bidang ini.
request.clientIp: Bidang ini sering dianalisis. Kami sarankan membuat indeks, menentukan tipe data text, dan mengaktifkan Analytics.
request.http.path: Bidang ini jarang dianalisis. Jika ingin menganalisisnya, gunakan fungsi JSON untuk mendapatkan nilainya.
request.param: Bidang ini adalah node anak yang berisi node daun. Anda tidak dapat membuat indeks untuk bidang ini.
request.param.userId: Bidang ini sering dianalisis. Kami sarankan membuat indeks, menentukan tipe data text, dan mengaktifkan Analytics.
request.param.orders: Nilainya adalah array JSON. Anda tidak dapat membuat indeks untuk bidang ini.
Bidang response
response: Nilainya mungkin tidak dalam format JSON. Kami sarankan menentukan tipe data text dan mengaktifkan Analytics saat membuat indeks untuk bidang ini.

Setelah membuat indeks, log yang baru dikumpulkan ditampilkan dalam format berikut. 
Bagaimana Cara Menentukan Alias?
Jika jalur node daun JSON panjang, Anda dapat menentukan alias untuk jalur tersebut. Untuk informasi lebih lanjut, lihat Alias Kolom. 
Saat mengonfigurasi indeks, Anda tidak dapat menentukan nama bidang atau alias yang sama untuk bidang yang berbeda.
Nama node daun dalam bidang JSON ditentukan berdasarkan jalur lengkap node daun. Sebagai contoh, jika Anda menentukan alias clientIp untuk bidang response, Layanan Log Sederhana tidak menganggap bahwa alias tersebut sama dengan node daun clientIp dalam bidang request karena jalur lengkap node daun adalah request.clientIp.
Bagaimana cara menanyakan dan menganalisis bidang JSON yang diindeks?
Pernyataan kueri dalam format Pernyataan pencarian|Pernyataan analitik. Dalam pernyataan analitik, apit nama bidang dalam tanda kutip ganda ("") dan string dalam tanda kutip tunggal (''). Tentukan bidang berdasarkan jalur lengkap dalam format Key1.Key2.Key3. Contoh: request.clientIp dan request.param.userId. Untuk informasi lebih lanjut, lihat Kueri dan Analisis Log JSON.
Sebagai contoh, jika ingin menghitung jumlah alamat IP klien untuk pengguna 186499, jalankan pernyataan berikut:
*
and request.param.userId: 186499 |
SELECT
distinct("request.clientIp")Gambar berikut menunjukkan hasil kueri dan analisis. 
Kapan saya perlu menggunakan fungsi JSON?
Saat menanyakan dan menganalisis log JSON, perhatikan kondisi berikut: Pertama, jika jumlah data besar atau struktur data kompleks tetapi relatif tetap, dan Anda memerlukan performa kueri dan analisis tinggi, kami sarankan membuat indeks bidang untuk node daun JSON sebelum menanyakan dan menganalisis log. Kedua, jika jumlah data kecil dan Anda ingin mengurangi biaya, gunakan fungsi JSON untuk menanyakan dan menganalisis log tanpa membuat indeks bidang untuk node daun JSON. Ketiga, Anda hanya dapat menggunakan fungsi JSON dalam skenario berikut:
Nilai bidang mungkin tidak dalam format JSON atau perlu diproses terlebih dahulu.
Sebagai contoh, nilai dari bidang response dalam format JSON dan mencakup bidang errcode hanya ketika permintaan gagal. Jika ingin menganalisis distribusi untuk nilai-nilai dari bidang errcode, gunakan pernyataan pencarian untuk mendapatkan log permintaan yang gagal dan ekstrak nilai-nilai dari bidang errcode secara dinamis menggunakan fungsi JSON dalam pernyataan analitik.
* not response :SUCCESS | SELECT json_extract_scalar(response, '$.errcode') AS errcodeGambar berikut menunjukkan hasil kueri dan analisis.

Anda tidak dapat membuat indeks untuk beberapa node JSON. Dalam hal ini, Anda hanya dapat menggunakan fungsi JSON untuk menganalisis data dalam node secara real-time. Sebagai contoh, Anda tidak dapat membuat indeks untuk bidang request.param atau bidang request.param.orders.
Bagaimana cara membedakan fungsi json_extract dari fungsi json_extract_scalar dan memilih fungsi yang sesuai?
Fungsi json_extract dan json_extract_scalar digunakan untuk mengekstrak konten dari objek JSON atau array JSON. Meskipun mirip dalam penggunaan, ada perbedaan antara kedua fungsi tersebut:
Nilai kembalian dari fungsi json_extract adalah tipe data JSON, sedangkan nilai kembalian dari fungsi json_extract_scalar adalah tipe data varchar.
CatatanTipe data JSON dan varchar mengikuti sintaksis SQL dan berbeda dari tipe data yang digunakan dalam indeks Layanan Log Sederhana. Untuk informasi lebih lanjut, lihat fungsi typeof.
Fungsi json_extract dapat mengurai sub-struktur apa pun dari objek JSON. Fungsi json_extract_scalar hanya mengurai node daun yang nilainya bertipe skalar dan mengembalikan string. Nilai skalar dapat berupa string, nilai Boolean, atau bilangan bulat.
Sebagai contoh, jika ingin mengekstrak nilai dari bidang clientIp dari bidang request, Anda dapat menggunakan salah satu fungsi tersebut.
Gunakan fungsi json_extract untuk mengekstrak data.
* | SELECT json_extract(request, '$.clientIp')Gambar berikut menunjukkan hasil kueri dan analisis.

Gunakan fungsi json_extract_scalar untuk mengekstrak data.
* | SELECT json_extract_scalar(request, '$.clientIp')Gambar berikut menunjukkan hasil kueri dan analisis.

Jika ingin mendapatkan bagian pertama dari nilai untuk bidang clientIp, gunakan fungsi json_extract_scalar untuk mengekstrak nilai dari bidang clientIp dan kemudian gunakan fungsi split_part untuk mengekstrak angka pertama dari alamat IP. Anda tidak dapat menggunakan fungsi json_extract dalam kasus ini karena fungsi split_part hanya mendukung parameter input bertipe data varchar.
* |
SELECT
split_part(
json_extract_scalar(request, '$.clientIp'),
'.',
1
) AS segmentGambar berikut menunjukkan hasil kueri dan analisis. 
Dalam banyak kasus, jika ingin mengekstrak nilai bidang dari objek JSON untuk analisis, kami sarankan menggunakan fungsi json_extract_scalar. Nilai kembalian dari fungsi json_extract_scalar adalah tipe data varchar, yang dapat langsung dirujuk oleh sebagian besar fungsi lainnya. Jika ingin menganalisis struktur JSON, gunakan fungsi json_extract. Sebagai contoh, Anda dapat menggunakan pernyataan kueri berikut untuk menghitung jumlah pesanan dalam suatu permintaan, yang ditunjukkan oleh jumlah elemen dalam array JSON dalam bidang request.param.orders:
* |
SELECT
json_array_length((json_extract(request, '$.param.orders')))Gambar berikut menunjukkan hasil kueri dan analisis. 
Nilai kembalian dari fungsi json_extract_scalar adalah tipe data varchar. Sebagai contoh, nilai 2 dalam hasil kueri dan analisis sebelumnya adalah tipe data varchar. Jika ingin menggunakan nilai tersebut untuk operasi seperti penambahan, gunakan fungsi cast untuk mengonversi nilai tersebut ke tipe data bigint. Untuk informasi lebih lanjut, lihat Fungsi Konversi Tipe Data.
Bagaimana cara mengonfigurasi json_path?
Jika ingin menggunakan fungsi seperti json_extract untuk mengekstrak nilai bidang dari log JSON, gunakan json_path untuk menentukan posisi dari mana Anda ingin mengekstrak nilai dalam objek JSON. Format json_path adalah $.a.b. Tanda dolar ($) menentukan node akar dari objek JSON saat ini. Gunakan titik (.) untuk menunjukkan node anak dari mana Anda ingin mengekstrak nilai.
Jika objek JSON berisi bidang dengan karakter khusus, gunakan tanda kurung [] untuk menggantikan titik (.) dan apit nama bidang dengan tanda kutip ganda (""). Contoh bidang: http.path, http path, dan http-path. Contoh pernyataan kueri: * |SELECT json_extract_scalar(request, '$["http.path"]').
Jika menggunakan SDK untuk kueri dan analisis, loloskan tanda kutip ganda (""). Contoh pernyataan kueri: * | select json_extract_scalar(request, '$[\"http.path\"]').
Saat mengekstrak elemen dari array JSON, gunakan tanda kurung []. Dalam tanda kurung [], angka digunakan untuk menunjukkan subscript, dimulai dari 0. Contoh:
Lihat pembayaran untuk pesanan pertama pengguna.
* | SELECT json_extract_scalar(request, '$.param.orders[0].payment')Gambar berikut menunjukkan hasil kueri dan analisis.

Lihat produk kedua yang dibeli pengguna dalam pesanan pertama.
* | SELECT json_extract_scalar(request, '$.param.orders[0].commodity[1]')Gambar berikut menunjukkan hasil kueri dan analisis.

Bagaimana cara menganalisis array JSON?
Jika log berisi array JSON, Anda dapat memperluas array tersebut menggunakan fungsi cast dan klausa UNNEST, lalu melakukan operasi agregat.
Contoh 1
Jika ingin menghitung total pembayaran dari semua permintaan yang berhasil, ikuti instruksi berikut:
Gunakan pernyataan pencarian untuk mendapatkan log permintaan yang berhasil, lalu gunakan fungsi json_extract dalam pernyataan analitik untuk mengekstrak nilai dari bidang orders.
* and response: SUCCESS | SELECT json_extract(request, '$.param.orders')Gambar berikut menunjukkan hasil kueri dan analisis.

Konversikan array JSON dalam hasil kueri sebelumnya ke tipe data array(json).
* and response: SUCCESS | SELECT cast( json_extract(request, '$.param.orders') AS array(json) )Gambar berikut menunjukkan hasil kueri dan analisis.

Gunakan klausa UNNEST untuk memperluas array.
* and response: SUCCESS | SELECT orderinfo FROM log, unnest( cast( json_extract(request, '$.param.orders') AS array(json) ) ) AS t(orderinfo)Gambar berikut menunjukkan hasil kueri dan analisis.

Gunakan fungsi json_extract_scalar untuk mengekstrak nilai dari bidang payment, konversikan nilai ke tipe data bigint menggunakan fungsi cast, lalu tambahkan nilai-nilai tersebut.
* and response: SUCCESS | SELECT sum( cast( json_extract_scalar(orderinfo, '$.payment') AS bigint ) ) FROM log, unnest( cast( json_extract(request, '$.param.orders') AS array(json) ) ) AS t(orderinfo)Gambar berikut menunjukkan hasil kueri dan analisis.

Contoh 2
Hitung jumlah setiap produk yang dibeli dalam semua permintaan yang berhasil. Ekstrak nilai dari bidang order, konversikan nilai ke tipe data array(json), lalu gunakan klausa UNNEST untuk memperluas nilai. Setiap baris dalam hasil yang diperluas mewakili pesanan. Gunakan fungsi json_extract untuk mengekstrak nilai dari bidang commodity, konversikan nilai ke tipe data array(json), lalu gunakan klausa UNNEST untuk memperluas nilai. Setiap baris dalam hasil yang diperluas mewakili produk. Kemudian, kelompokkan dan tambahkan nilai. Ikuti instruksi yang diberikan dalam Contoh 1.
*
and response: SUCCESS |
SELECT
item,
count(1) AS cnt
FROM (
SELECT
orderinfo
FROM log,
unnest(
cast(
json_extract(request, '$.param.orders') AS array(json)
)
) AS t(orderinfo)
),
unnest(
cast(
json_extract(orderinfo, '$.commodity') AS array(json)
)
) AS t(item)
GROUP BY
item
ORDER BY
cnt DESCGambar berikut menunjukkan hasil kueri dan analisis.
