Contoh kueri MQL

Dokumen ini memperkenalkan Bahasa Kueri Monitoring (MQL) melalui contoh. Namun, fitur ini tidak mencoba mencakup semua aspek bahasa. MQL didokumentasikan secara komprehensif dalam referensi Bahasa Kueri Monitoring.

Untuk mengetahui informasi tentang kebijakan pemberitahuan berbasis MQL, lihat Kebijakan pemberitahuan dengan MQL.

Anda dapat menulis kueri tertentu dalam berbagai bentuk; bahasanya fleksibel, dan ada banyak pintasan yang dapat digunakan setelah Anda memahami sintaksisnya. Untuk informasi selengkapnya, lihat Kueri bentuk ketat.

Sebelum memulai

Untuk mengakses editor kode saat menggunakan Metrics Explorer, lakukan hal berikut:

  1. Di panel navigasi Konsol Google Cloud, pilih Monitoring, lalu pilih  Metrics Explorer:

    Buka Metrics Explorer

  2. Di toolbar panel pembuat kueri, pilih tombol dengan nama  MQL atau  PromQL.
  3. Pastikan MQL dipilih di tombol Language. Tombol bahasa berada di toolbar yang sama yang memungkinkan Anda memformat kueri.

Untuk menjalankan kueri, tempel kueri ke editor dan klik Jalankan Kueri. Untuk pengantar editor ini, lihat Menggunakan editor kode untuk MQL.

Pemahaman tentang konsep Cloud Monitoring, termasuk jenis metrik, jenis resource yang dipantau, dan deret waktu juga sangat membantu. Untuk pengantar konsep-konsep ini, lihat Metrik, deret waktu, dan resource.

Model data

Kueri MQL mengambil dan memanipulasi data dalam database deret waktu Cloud Monitoring. Bagian ini memperkenalkan beberapa konsep dan terminologi yang terkait dengan {i>database<i} tersebut. Untuk informasi selengkapnya, lihat topik referensi Model data.

Setiap deret waktu berasal dari satu jenis resource yang dipantau, dan setiap deret waktu mengumpulkan data dari satu jenis metrik. Deskriptor resource yang dimonitor menentukan jenis resource yang dimonitor. Demikian pula, deskriptor metrik mendefinisikan jenis metrik. Misalnya, jenis resource dapat berupa gce_instance, virtual machine (VM) Compute Engine, dan jenis metriknya mungkin adalah compute.googleapis.com/instance/cpu/utilization, penggunaan CPU VM Compute Engine.

Deskripsi ini juga menentukan sekumpulan label yang digunakan untuk mengumpulkan informasi tentang atribut lain dari jenis metrik atau resource. Misalnya, resource biasanya memiliki label zone yang digunakan untuk mencatat lokasi geografis resource.

Satu deret waktu dibuat untuk setiap kombinasi nilai untuk label dari pasangan deskripsi metrik dan deskripsi resource yang dimonitor.

Anda dapat menemukan label yang tersedia untuk jenis resource di Daftar resource yang dimonitor, misalnya gce_instance. Untuk menemukan label jenis metrik, lihat Daftar metrik; misalnya, lihat metrik dari Compute Engine.

Database Cloud Monitoring menyimpan deret waktu dari metrik dan jenis resource tertentu dalam satu tabel. Metrik dan jenis resource berfungsi sebagai ID untuk tabel. Kueri MQL ini mengambil tabel deret waktu yang merekam pemakaian CPU untuk instance Compute Engine:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization

Ada satu deret waktu dalam tabel untuk setiap kombinasi unik nilai metrik dan label resource.

Kueri MQL mengambil data deret waktu dari tabel ini dan mengubahnya menjadi tabel output. Tabel output ini dapat diteruskan ke operasi lain. Misalnya, Anda dapat mengisolasi deret waktu yang ditulis oleh resource di zona atau kumpulan zona tertentu dengan meneruskan tabel yang diambil sebagai input ke operasi filter:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| filter zone =~ 'us-central.*'

Kueri sebelumnya menghasilkan tabel yang hanya berisi seri waktu dari resource di zona yang dimulai dengan us-central.

Kueri MQL disusun untuk meneruskan output dari satu operasi sebagai input ke operasi berikutnya. Pendekatan berbasis tabel ini memungkinkan Anda menautkan operasi untuk memanipulasi data ini dengan memfilter, memilih, dan operasi database lain yang familier, seperti gabungan dalam dan luar. Anda juga dapat menjalankan berbagai fungsi pada data dalam deret waktu karena data diteruskan dari satu operasi ke operasi lainnya.

Operasi dan fungsi yang tersedia di MQL didokumentasikan sepenuhnya di referensi Bahasa Kueri Monitoring.

Struktur kueri

Kueri terdiri dari satu atau beberapa operations. Operasi ditautkan, atau di-pipe, bersama-sama sehingga output dari satu operasi adalah input ke operasi berikutnya. Oleh karena itu, hasil kueri bergantung pada urutan operasi. Beberapa hal yang dapat Anda lakukan antara lain:

  • Mulai kueri dengan fetch atau operasi pemilihan lainnya.
  • Membangun kueri dengan beberapa operasi yang disalurkan bersama-sama.
  • Pilih subkumpulan informasi dengan operasi filter.
  • Menggabungkan informasi terkait dengan operasi group_by.
  • Lihat pencilan dengan operasi top dan bottom.
  • Gabungkan beberapa kueri dengan operasi { ; } dan join.
  • Gunakan operasi dan fungsi value untuk menghitung rasio dan nilai lainnya.

Tidak semua kueri menggunakan semua opsi ini.

Contoh-contoh ini hanya memperkenalkan beberapa operasi dan fungsi yang tersedia. Untuk informasi selengkapnya tentang struktur kueri MQL, baca topik referensi Struktur Kueri.

Contoh ini tidak menentukan dua hal yang mungkin akan Anda lihat: rentang waktu dan penyelarasan. Bagian berikut akan menjelaskan alasannya.

Rentang waktu

Saat Anda menggunakan editor kode, setelan diagram akan menentukan rentang waktu untuk kueri. Secara default, rentang waktu diagram ditetapkan ke satu jam.

Untuk mengubah rentang waktu diagram, gunakan pemilih rentang waktu. Misalnya, jika ingin melihat data selama seminggu terakhir, pilih 1 minggu terakhir dari pemilih rentang waktu. Anda juga dapat menentukan waktu mulai dan berakhir, atau menentukan waktu untuk melihat-lihat.

Untuk mengetahui informasi selengkapnya tentang rentang waktu di editor kode, lihat Rentang waktu, diagram, dan editor kode.

Perataan

Banyak operasi yang digunakan dalam contoh ini, seperti operasi join dan group_by, bergantung pada semua titik deret waktu dalam tabel yang terjadi pada interval teratur. Tindakan membuat semua titik sejajar pada stempel waktu reguler disebut alignment. Biasanya, penyelarasan dilakukan secara implisit, dan tidak ada contoh di sini yang menunjukkannya.

MQL akan otomatis menyelaraskan tabel untuk operasi join dan group_by jika diperlukan, tetapi MQL juga memungkinkan Anda melakukan penyelarasan secara eksplisit.

  • Untuk informasi umum tentang konsep perataan, lihat Perataan: agregasi dalam deret.

  • Untuk mengetahui informasi tentang penyelarasan di MQL, lihat topik referensi Alignment. Penyelarasan dapat dikontrol secara eksplisit menggunakan operasi align dan every.

Mengambil dan memfilter data

Kueri MQL dimulai dengan pengambilan dan pemilihan atau pemfilteran data. Bagian ini mengilustrasikan beberapa pengambilan dan pemfilteran dasar dengan MQL.

Mengambil data deret waktu

Kueri selalu dimulai dengan operasi fetch, yang mengambil deret waktu dari Cloud Monitoring.

Kueri yang paling sederhana terdiri dari satu operasi fetch dan argumen yang mengidentifikasi deret waktu yang akan diambil, seperti berikut:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization

Argumen ini terdiri dari jenis resource yang dimonitor, gce_instance, sepasang karakter titik dua, ::, dan jenis metrik, compute.googleapis.com/instance/cpu/utilization.

Kueri ini mengambil deret waktu yang ditulis oleh instance Compute Engine untuk jenis metrik compute.googleapis.com/instance/cpu/utilization, yang mencatat penggunaan CPU instance tersebut.

Jika menjalankan kueri dari editor kode di Metrics Explorer, Anda akan mendapatkan diagram yang menampilkan setiap deret waktu yang diminta:

Diagram menunjukkan data penggunaan CPU untuk instance Compute Engine.

Setiap deret waktu yang diminta ditampilkan sebagai garis pada diagram. Setiap deret waktu menyertakan daftar nilai yang diberi stempel waktu dari metrik penggunaan CPU untuk satu instance VM dalam project ini.

Di penyimpanan backend yang digunakan oleh Cloud Monitoring, deret waktu disimpan dalam tabel. Operasi fetch mengatur deret waktu untuk jenis resource dan metrik yang dimonitor dan ditentukan ke dalam tabel, kemudian menampilkan tabel. Data yang ditampilkan akan ditampilkan dalam diagram.

Operasi fetch dijelaskan, beserta argumennya, pada halaman referensi fetch. Untuk mengetahui informasi selengkapnya tentang data yang dihasilkan oleh operasi, baca halaman referensi untuk Deret waktu dan tabel.

Filter operasi

Kueri biasanya terdiri dari kombinasi beberapa operasi. Kombinasi yang paling sederhana adalah menyalurkan output dari satu operasi ke input operasi berikutnya menggunakan operator pipa, |. Contoh berikut mengilustrasikan penggunaan pipa untuk memasukkan tabel ke operasi filter:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| filter instance_name =~ 'gke.*'

Kueri ini menyalurkan tabel, yang ditampilkan oleh operasi fetch yang ditunjukkan di contoh sebelumnya, ke operasi filter yang mengambil sebagai ekspresi yang dievaluasi ke nilai boolean. Dalam contoh ini, ekspresinya berarti "instance_name diawali dengan gke".

Operasi filter mengambil tabel input, menghapus deret waktu yang filternya salah, dan menghasilkan tabel yang dihasilkan. Screenshot berikut menunjukkan diagram yang dihasilkan:

Diagram menunjukkan hasil yang difilter untuk
`gke`.

Jika Anda tidak memiliki nama instance yang diawali dengan gke, ubah filter sebelum mencoba kueri ini. Misalnya, jika Anda memiliki instance VM dengan apache di awal namanya, gunakan filter berikut:

 | filter instance_name =~ 'apache.*'

Ekspresi filter dievaluasi sekali untuk setiap deret waktu input. Jika ekspresi bernilai true, deret waktu tersebut akan disertakan dalam output. Dalam contoh ini, ekspresi filter melakukan pencocokan ekspresi reguler, =~, pada label instance_name di setiap deret waktu. Jika nilai label cocok dengan ekspresi reguler 'gke.*', deret waktu akan disertakan dalam output. Jika tidak, deret waktu akan dihapus dari output.

Untuk mengetahui informasi selengkapnya tentang pemfilteran, lihat halaman referensi filter. Predikat filter dapat berupa ekspresi arbitrer apa pun yang menampilkan nilai boolean; untuk informasi selengkapnya, lihat Ekspresi.

Mengelompokkan dan Agregat

Pengelompokan memungkinkan Anda mengelompokkan deret waktu di sepanjang dimensi tertentu. Agregasi menggabungkan semua deret waktu dalam grup menjadi satu deret waktu output.

Kueri berikut memfilter output operasi fetch awal untuk hanya mempertahankan deret waktu tersebut dari resource di zona yang dimulai dengan us-central. Kemudian, kode ini mengelompokkan deret waktu berdasarkan zona dan menggabungkannya menggunakan agregasi mean.

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| filter zone =~ 'us-central.*'
| group_by [zone], mean(val())

Tabel yang dihasilkan dari operasi group_by memiliki satu deret waktu per zona. Screenshot berikut menunjukkan diagram yang dihasilkan:

Diagram menunjukkan pengambilan yang difilter yang dikelompokkan berdasarkan zona.

Operasi group_by menggunakan dua argumen, yang dipisahkan oleh koma, ,. Argumen ini menentukan perilaku pengelompokan yang tepat. Dalam contoh ini, group_by [zone], mean(val()), argumen berfungsi sebagai berikut:

  • Argumen pertama, [zone], adalah ekspresi peta yang menentukan pengelompokan deret waktu. Dalam contoh ini, contoh ini menentukan label yang akan digunakan untuk pengelompokan. Langkah pengelompokan mengumpulkan semua deret waktu input yang memiliki nilai zone output yang sama ke dalam satu grup. Dalam contoh ini, ekspresi mengumpulkan deret waktu dari VM Compute Engine dalam satu zona.

    Deret waktu output hanya memiliki label zone, dengan nilai yang disalin dari deret waktu input dalam grup. Label lain pada deret waktu input akan dihapus dari deret waktu output.

    Ekspresi peta dapat melakukan lebih banyak hal daripada label daftar; untuk mengetahui informasi selengkapnya, lihat halaman referensi map.

  • Argumen kedua, mean(val()), menentukan cara deret waktu di setiap grup digabungkan, atau aggregated, menjadi satu deret waktu output. Setiap titik dalam deret waktu output untuk suatu grup adalah hasil dari penggabungan titik dengan stempel waktu yang sama dari semua deret waktu input dalam grup.

    Fungsi agregasi, mean dalam contoh ini, menentukan nilai gabungan. Fungsi val() menampilkan titik yang akan digabungkan, fungsi agregasi diterapkan ke titik tersebut. Dalam contoh ini, Anda mendapatkan rata-rata penggunaan CPU mesin virtual di zona pada setiap titik waktu output.

    Ekspresi mean(val()) adalah contoh ekspresi agregasi.

Operasi group_by selalu menggabungkan pengelompokan dan agregasi. Jika Anda menentukan pengelompokan, tetapi menghilangkan argumen agregasi, group_by akan menggunakan agregasi default, aggregate(val()), yang akan memilih fungsi yang sesuai untuk jenis data tersebut. Lihat aggregate untuk mengetahui daftar fungsi agregasi default.

Menggunakan group_by dengan metrik berbasis log

Misalkan Anda telah membuat metrik berbasis log distribusi untuk mengekstrak jumlah titik data yang diproses dari sekumpulan entri panjang termasuk string seperti berikut:

... entry ID 1 ... Processed data points 1000 ...
... entry ID 2 ... Processed data points 1500 ...
... entry ID 3 ... Processed data points 1000 ...
... entry ID 4 ... Processed data points 500 ...

Untuk membuat deret waktu yang menampilkan jumlah semua titik data yang diproses, gunakan MQL seperti berikut:

fetch global
| metric 'logging.googleapis.com/user/METRIC_NAME'
| group_by [], sum(sum_from(value))

Untuk membuat metrik distribusi berbasis log, lihat artikel mengonfigurasi metrik distribusi.

Kecualikan kolom dari grup

Anda dapat menggunakan pengubah drop dalam pemetaan untuk mengecualikan kolom dari grup. Misalnya, metrik core_usage_time Kubernetes memiliki enam kolom:

fetch k8s_container :: kubernetes.io/container/cpu/core_usage_time
| group_by [project_id, location, cluster_name, namespace_name, container_name]

Jika tidak perlu mengelompokkan pod_name, Anda dapat mengecualikannya dengan drop:

fetch k8s_container :: kubernetes.io/container/cpu/core_usage_time
| group_by drop [pod_name]

Pilih deret waktu

Contoh di bagian ini menggambarkan cara untuk memilih deret waktu tertentu dari tabel input.

Pilih deret waktu atas atau bawah

Guna melihat data deret waktu untuk tiga instance Compute Engine dengan pemakaian CPU tertinggi dalam project Anda, masukkan kueri berikut:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top 3

Screenshot berikut menampilkan hasil dari satu project:

Diagram menunjukkan 3 deret waktu dengan pemanfaatan tertinggi.

Anda dapat mengambil deret waktu yang memiliki penggunaan CPU terendah dengan mengganti top dengan bottom.

Operasi top menghasilkan tabel dengan jumlah deret waktu tertentu yang dipilih dari tabel inputnya. Deret waktu yang disertakan dalam output memiliki nilai terbesar untuk beberapa aspek deret waktu.

Karena ini tidak menentukan cara untuk mengurutkan deret waktu, kueri ini menampilkan deret waktu dengan nilai terbesar untuk titik terbaru. Untuk menentukan cara menentukan deret waktu yang memiliki nilai terbesar, Anda dapat memberikan argumen ke operasi top. Misalnya, kueri sebelumnya setara dengan kueri berikut:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top 3, val()

Ekspresi val() memilih nilai titik terbaru di setiap deret waktu yang diterapkan. Oleh karena itu, kueri akan menampilkan deret waktu dengan nilai terbesar untuk titik terbaru.

Anda dapat memberikan ekspresi yang melakukan agregasi pada beberapa atau semua titik dalam deret waktu untuk memberikan nilai pengurutan. Berikut ini adalah rata-rata semua poin dalam 10 menit terakhir:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top 3, mean(val()).within(10m)

Jika fungsi within tidak digunakan, fungsi mean akan diterapkan ke nilai semua titik yang ditampilkan dalam deret waktu.

Cara kerja bottom juga serupa. Kueri berikut menemukan nilai titik terbesar di setiap deret waktu dengan max(val()), lalu memilih tiga deret waktu dengan nilai terkecil:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| bottom 3, max(val())

Screenshot berikut menampilkan diagram yang menampilkan aliran data dengan lonjakan terkecil:

Diagram menunjukkan 3 deret waktu dengan pemanfaatan tertinggi.

Mengecualikan hasil n bagian atas atau bawah dalam deret waktu

Pertimbangkan skenario di mana Anda memiliki banyak instance VM Compute Engine. Beberapa instance ini mengonsumsi lebih banyak memori daripada sebagian besar instance, dan pencilan ini menyulitkan untuk melihat pola penggunaan dalam kelompok yang lebih besar. Diagram pemakaian CPU Anda akan terlihat seperti berikut:

Diagram menunjukkan banyak garis pemakaian CPU, dengan beberapa pencilan.

Sebaiknya kecualikan tiga pencilan dari diagram agar dapat melihat pola pada kelompok yang lebih besar dengan lebih jelas.

Untuk mengecualikan tiga deret waktu teratas dalam kueri yang mengambil deret waktu untuk penggunaan CPU Compute Engine, gunakan operasi tabel top untuk mengidentifikasi deret waktu dan operasi tabel outer_join untuk mengecualikan deret waktu yang diidentifikasi dari hasil. Anda dapat menggunakan kueri berikut:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| {
    top 3 | value [is_default_value: false()]
  ;
    ident
  }
| outer_join true(), _
| filter is_default_value
| value drop [is_default_value]

Operasi fetch menampilkan tabel deret waktu untuk pemakaian CPU dari semua instance. Tabel ini kemudian diproses menjadi dua tabel yang dihasilkan:

  • Operasi tabel top n menghasilkan tabel yang berisi deret waktu n dengan nilai tertinggi. Dalam hal ini, n = 3. Tabel yang dihasilkan berisi tiga deret kali yang akan dikecualikan.

    Tabel yang berisi tiga deret waktu teratas kemudian diteruskan ke operasi tabel value. Operasi ini menambahkan kolom lain ke setiap deret waktu dalam tiga tabel teratas. Kolom ini, is_default_value, diberi nilai boolean false untuk semua deret waktu dalam tabel tiga teratas.

  • Operasi ident menampilkan tabel yang sama yang dimasukkan ke dalamnya: tabel asli deret waktu penggunaan CPU. Tidak satu pun deret waktu dalam tabel ini yang memiliki kolom is_default_value.

Tabel tiga teratas dan tabel asli kemudian dipindahkan ke operasi tabel outer_join. Tabel tiga teratas adalah tabel kiri dalam {i>join<i}, tabel yang diambil adalah tabel kanan dalam {i>join<i}. Outer join disiapkan untuk memberikan nilai true sebagai nilai untuk kolom apa pun yang tidak ada di baris yang digabungkan. Hasil outer join adalah tabel gabungan, dengan baris dari tabel tiga teratas menyimpan kolom is_default_value dengan nilai false, dan semua baris dari tabel asli yang tidak juga berada di tabel tiga teratas mendapatkan kolom is_default_value dengan nilai true.

Tabel yang dihasilkan dari gabungan kemudian diteruskan ke operasi tabel filter, yang memfilter baris yang memiliki nilai false di kolom is_default_value. Tabel yang dihasilkan berisi baris dari tabel yang pertama kali diambil tanpa baris dari tiga tabel teratas. Tabel ini berisi kumpulan deret waktu yang diinginkan, dengan tambahan is_default_column.

Langkah terakhir adalah menghapus kolom is_default_column yang ditambahkan oleh join, sehingga tabel output memiliki kolom yang sama dengan tabel awal yang diambil.

Screenshot berikut menampilkan diagram untuk kueri sebelumnya:

Diagram menunjukkan banyak garis pemakaian CPU, dengan pencilan yang dikecualikan.

Anda dapat membuat kueri untuk mengecualikan deret waktu yang memiliki penggunaan CPU terendah dengan mengganti top n dengan bottom n.

Kemampuan untuk mengecualikan pencilan dapat berguna jika Anda ingin menetapkan pemberitahuan, tetapi tidak ingin pencilan tersebut terus memicu pemberitahuan. Kueri pemberitahuan berikut menggunakan logika pengecualian yang sama dengan kueri sebelumnya untuk memantau pemakaian batas CPU oleh sekumpulan pod Kubernetes setelah mengecualikan dua pod teratas:

fetch k8s_container
| metric 'kubernetes.io/container/cpu/limit_utilization'
| filter (resource.cluster_name == 'CLUSTER_NAME' &&
          resource.namespace_name == 'NAMESPACE_NAME' &&
          resource.pod_name =~ 'POD_NAME')
| group_by 1m, [value_limit_utilization_max: max(value.limit_utilization)]
| {
    top 2 | value [is_default_value: false()]
  ;
    ident
  }
| outer_join true(), _
| filter is_default_value
| value drop [is_default_value]
| every 1m
| condition val(0) > 0.73 '1'

Pilih grup atas atau bawah

Operasi tabel top dan bottom memilih deret waktu dari seluruh tabel input. Operasi top_by dan bottom_by mengelompokkan deret waktu dalam tabel, lalu memilih sejumlah Deret waktu dari setiap grup.

Kueri berikut memilih deret waktu di setiap zona dengan nilai puncak terbesar:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top_by [zone], 1, max(val())

Diagram menunjukkan puncak terbesar berdasarkan zona.

Ekspresi [zone] menunjukkan bahwa sebuah grup terdiri dari deret waktu dengan nilai kolom zone yang sama. 1 di top_by menunjukkan jumlah deret waktu yang akan dipilih dari setiap grup zona. Ekspresi max(val()) mencari nilai terbesar dalam rentang waktu diagram di setiap deret waktu.

Anda dapat menggunakan fungsi agregasi sebagai pengganti max. Misalnya, kode berikut menggunakan agregator mean dan menggunakan within untuk menentukan rentang pengurutan 20 menit. Fitur ini memilih 2 deret waktu teratas di setiap zona:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top_by [zone], 2, mean(val()).within(20m)

Diagram menunjukkan 2 rata-rata puncak berdasarkan zona dalam waktu 20 menit.

Pada contoh sebelumnya, hanya ada satu instance di zona us-central-c, sehingga hanya ada satu deret waktu yang ditampilkan; tidak ada "2 teratas" dalam grup.

Gabungkan pilihan dengan union

Anda dapat menggabungkan operasi pemilihan seperti top dan bottom untuk membuat diagram yang menampilkan keduanya. Misalnya, kueri berikut menampilkan deret waktu tunggal dengan nilai maksimum dan satu deret waktu dengan nilai minimum:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| {
    top 1, max(val())
  ;
    bottom 1, min(val())
  }
| union

Diagram yang dihasilkan menunjukkan dua baris, satu baris berisi nilai tertinggi dan satu lagi berisi nilai terendah:

Diagram menampilkan deret waktu dengan nilai tertinggi dan terendah.

Anda dapat menggunakan tanda kurung kurawal, { }, untuk menentukan urutan operasi, yang masing-masing menghasilkan satu tabel deret waktu sebagai output. Setiap operasi tersebut dipisahkan dengan titik koma, ;.

Dalam contoh ini, operasi fetch menampilkan satu tabel, yang disalurkan ke kedua operasi secara berurutan, yaitu operasi top dan operasi bottom. Tiap operasi ini menghasilkan tabel {i>output<i} berdasarkan tabel input yang sama. Operasi union kemudian menggabungkan kedua tabel tersebut menjadi satu, yang ditampilkan di diagram.

Lihat selengkapnya tentang operasi pengurutan menggunakan { } dalam topik referensi Struktur Kueri.

Menggabungkan deret waktu dengan nilai yang berbeda untuk satu label

Misalkan Anda memiliki beberapa deret waktu untuk jenis metrik yang sama dan ingin menggabungkannya. Jika ingin memilihnya berdasarkan nilai satu label, Anda tidak dapat membuat kueri menggunakan antarmuka pembuat kueri di Metrics Explorer. Anda perlu memfilter dua atau beberapa nilai yang berbeda dari label yang sama, tetapi antarmuka pembuat kueri mengharuskan deret waktu cocok dengan semua filter yang akan dipilih: pencocokan label adalah pengujian AND. Tidak ada deret waktu yang dapat memiliki dua nilai berbeda untuk label yang sama, tetapi Anda tidak dapat membuat pengujian OR untuk filter di builder kueri.

Kueri berikut mengambil deret waktu untuk metrik instance/disk/max_read_ops_count Compute Engine untuk dua instance Compute Engine tertentu dan menyelaraskan outputnya selama interval 1 menit:

fetch gce_instance
| metric 'compute.googleapis.com/instance/disk/max_read_ops_count'
| filter (resource.instance_id == '1854776029354445619' ||
          resource.instance_id == '3124475757702255230')
| every 1m

Diagram berikut menunjukkan hasil kueri ini:

Diagram menampilkan dua deret waktu yang dipilih oleh nilai dari label yang sama.

Jika ingin mencari jumlah nilai max_read_ops_count maksimum untuk kedua VM ini dan menjumlahkannya, Anda dapat melakukan hal berikut:

  • Temukan nilai maksimum untuk setiap deret waktu menggunakan operator tabel group_by, yang menentukan periode perataan 1 menit yang sama dan menggabungkan periode dengan agregator max untuk membuat kolom bernama max_val_of_read_ops_count_max di tabel output.
  • Temukan jumlah deret waktu menggunakan operator tabel group_by dan agregator sum di kolom max_val_of_read_ops_count_max.

Kode berikut menampilkan kueri:

fetch gce_instance
| metric 'compute.googleapis.com/instance/disk/max_read_ops_count'
| filter (resource.instance_id == '1854776029354445619' ||
          resource.instance_id == '3124475757702255230')
| group_by 1m, [max_val_of_read_ops_count_max: max(value.max_read_ops_count)]
| every 1m
| group_by [], [summed_value: sum(max_val_of_read_ops_count_max)]

Diagram berikut menunjukkan hasil kueri ini:

Diagram menampilkan jumlah dua deret waktu yang dipilih oleh nilai label yang sama.

Menghitung statistik persentil sepanjang waktu dan di berbagai stream

Untuk menghitung nilai aliran persentil selama jendela geser secara terpisah untuk setiap aliran data, gunakan operasi group_by sementara. Misalnya, kueri berikut menghitung nilai persentil ke-99 dari streaming selama periode geser 1 jam:

fetch gce_instance :: compute.googleapis.com/instance/cpu/utilization
| group_by 1h, percentile(val(), 99)
| every 1m

Untuk menghitung statistik persentil yang sama pada satu waktu di seluruh stream, bukan di seluruh waktu dalam satu stream, gunakan operasi group_by spasial:

fetch gce_instance :: compute.googleapis.com/instance/cpu/utilization
| group_by [], percentile(val(), 99)

Rasio komputasi

Misalkan Anda telah membuat layanan web terdistribusi yang berjalan di instance VM Compute Engine dan menggunakan Cloud Load Balancing.

Anda ingin melihat diagram yang menampilkan rasio permintaan yang menampilkan respons 500 HTTP (error internal) terhadap jumlah total permintaan; yaitu, rasio kegagalan permintaan. Bagian ini menggambarkan beberapa cara untuk menghitung rasio kegagalan permintaan.

Cloud Load Balancing menggunakan jenis resource yang dimonitor http_lb_rule. Jenis resource yang dimonitor http_lb_rule memiliki label matched_url_path_rule yang mencatat awalan URL yang ditentukan dalam aturan; nilai defaultnya adalah UNMATCHED.

Jenis metrik loadbalancing.googleapis.com/https/request_count memiliki label response_code_class. Label ini menangkap kelas kode respons.

Menggunakan outer_join dan div

Kueri berikut menentukan respons 500 untuk setiap nilai label matched_url_path_rule di setiap resource yang dimonitor http_lb_rule dalam project Anda. Kemudian, tabel jumlah kegagalan ini digabungkan dengan tabel asli, yang berisi semua jumlah respons dan membagi nilai untuk menunjukkan rasio respons kegagalan terhadap total respons:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| {
    filter response_code_class = 500
  ;
    ident
  }
| group_by [matched_url_path_rule]
| outer_join 0
| div

Diagram berikut menunjukkan hasil dari satu project:

Diagram menunjukkan rasio kegagalan terhadap total permintaan dengan cara bergabung.

Area berarsir di sekitar garis pada diagram adalah pita min/maks; untuk mengetahui informasi selengkapnya, lihat Pita min/maks.

Operasi fetch menghasilkan tabel deret waktu yang berisi jumlah permintaan untuk semua kueri dengan load balancing. Tabel ini diproses dengan dua cara oleh dua urutan operasi dalam tanda kurung kurawal:

  • filter response_code_class = 500 hanya menghasilkan deret waktu yang memiliki label response_code_class dengan nilai 500. Deret waktu yang dihasilkan akan menghitung permintaan dengan kode respons HTTP 5xx (error).

    Tabel ini adalah pembilang dari rasio.

  • Operasi ident, atau identity, menghasilkan inputnya, sehingga operasi ini menampilkan tabel yang pertama kali diambil. Yaitu tabel yang berisi deret waktu dengan jumlah untuk setiap kode respons.

    Tabel ini adalah penyebut rasio.

Tabel pembilang dan penyebut, yang dihasilkan masing-masing operasi filter dan ident, diproses secara terpisah oleh operasi group_by. Operasi group_by mengelompokkan deret waktu di setiap tabel berdasarkan nilai label matched_url_path_rule dan menjumlahkan jumlah untuk setiap nilai label. Operasi group_by ini tidak secara eksplisit menyatakan fungsi agregator, sehingga default, sum, digunakan.

  • Untuk tabel yang difilter, hasil group_by adalah jumlah permintaan yang menampilkan respons 500 untuk setiap nilai matched_url_path_rule.

  • Untuk tabel identitas, hasil group_by adalah jumlah total permintaan untuk setiap nilai matched_url_path_rule.

Tabel ini diteruskan ke operasi outer_join, yang menyambungkan deret waktu dengan nilai label yang cocok, satu dari masing-masing dari kedua tabel input. Deret waktu yang dipasangkan akan di-zip dengan mencocokkan stempel waktu setiap titik dalam satu deret waktu dengan stempel waktu suatu titik dalam deret waktu lainnya. Untuk setiap pasangan titik yang cocok, outer_join menghasilkan satu titik output dengan dua nilai, satu dari setiap tabel input. Deret waktu yang di-zip adalah output gabungan yang menggunakan label yang sama dengan dua deret waktu input.

Dengan outer join, jika titik dari tabel kedua tidak memiliki titik yang cocok di tabel pertama, nilai pengganti harus diberikan. Dalam contoh ini, titik dengan nilai 0—argumen ke operasi outer_join—digunakan.

Terakhir, operasi div mengambil setiap titik dengan dua nilai dan membagi nilai tersebut untuk menghasilkan satu titik output: rasio 500 respons terhadap semua respons untuk setiap peta URL.

String div di sini sebenarnya adalah nama fungsi div, yang membagi dua nilai numerik. Tapi angka itu digunakan di sini sebagai operasi. Saat digunakan sebagai operasi, fungsi seperti div mengharapkan dua nilai di setiap titik input (yang dijamin oleh join ini) dan menghasilkan satu nilai untuk titik output yang sesuai.

Bagian | div kueri adalah pintasan untuk | value val(0) / val(1). Operasi value memungkinkan ekspresi arbitrer pada kolom nilai tabel input untuk menghasilkan kolom nilai tabel output. Untuk mengetahui informasi selengkapnya, lihat halaman referensi untuk operasi value dan untuk ekspresi.

Gunakan ratio

Fungsi div dapat diganti dengan fungsi apa pun pada dua nilai, tetapi karena rasio sangat sering digunakan, MQL menyediakan operasi tabel ratio yang menghitung rasio secara langsung.

Kueri berikut setara dengan versi sebelumnya, menggunakan outer_join dan div:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| {
    filter response_code_class = 500
  ;
    ident
  }
| group_by [matched_url_path_rule]
| ratio

Pada versi ini, operasi ratio menggantikan operasi outer_join 0 | div pada versi sebelumnya dan memberikan hasil yang sama.

Perhatikan bahwa ratio hanya menggunakan outer_join untuk menyediakan 0 untuk pembilang jika input pembilang dan penyebut memiliki label yang sama yang mengidentifikasi setiap deret waktu, yang diperlukan oleh MQL outer_join. Jika input pembilang memiliki label tambahan, maka tidak akan ada output untuk titik yang hilang pada penyebut.

Menggunakan group_by dan /

Ada cara lain untuk menghitung rasio respons error terhadap semua respons. Dalam hal ini, karena pembilang dan penyebut rasio berasal dari deret waktu yang sama, Anda juga dapat menghitung rasio dengan mengelompokkan saja. Kueri berikut menunjukkan pendekatan ini:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| group_by [matched_url_path_rule],
    sum(if(response_code_class = 500, val(), 0)) / sum(val())

Kueri ini menggunakan ekspresi agregasi yang dibuat berdasarkan rasio dua jumlah:

  • sum pertama menggunakan fungsi if untuk menghitung 500 label bernilai dan 0 untuk label lainnya. Fungsi sum menghitung jumlah permintaan yang menampilkan 500.

  • sum kedua menjumlahkan jumlah untuk semua permintaan, val().

Kedua jumlah tersebut kemudian dibagi, sehingga dihasilkan rasio 500 respons untuk semua respons. Kueri ini memberikan hasil yang sama dengan kueri di Menggunakan outer_join dan div serta Menggunakan ratio.

Gunakan filter_ratio_by

Karena rasio sering dihitung dengan membagi dua jumlah yang berasal dari tabel yang sama, MQL menyediakan operasi filter_ratio_by untuk tujuan ini. Kueri berikut melakukan hal yang sama seperti versi sebelumnya, yang secara eksplisit membagi jumlah:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| filter_ratio_by [matched_url_path_rule], response_code_class = 500

Operand pertama dari operasi filter_ratio_by, di sini [matched_url_path_rule], menunjukkan cara mengelompokkan respons. Operasi kedua, di sini response_code_class = 500, bertindak sebagai ekspresi pemfilteran untuk pembilang.

  • Tabel penyebut adalah hasil pengelompokan tabel yang diambil menurut matched_url_path_rule dan digabungkan menggunakan sum.
  • Tabel pembilang adalah tabel yang diambil, difilter untuk deret waktu dengan kode respons HTTP 5xx, lalu dikelompokkan menurut matched_url_path_rule dan digabungkan menggunakan sum.

Rasio dan metrik kuota

Untuk menyiapkan kueri dan pemberitahuan tentang metrik kuota serviceruntime dan metrik kuota khusus resource untuk memantau pemakaian kuota, Anda dapat menggunakan MQL. Untuk mengetahui informasi selengkapnya, termasuk contoh, lihat Menggunakan metrik kuota.

Komputasi aritmetika

Terkadang, Anda mungkin ingin melakukan operasi aritmatika pada data sebelum membuat diagramnya. Misalnya, Anda mungkin ingin menskalakan deret waktu, mengonversi data ke skala log, atau membuat diagram jumlah dari dua deret waktu. Untuk daftar fungsi aritmetika yang tersedia di MQL, lihat Arithmetic.

Untuk menskalakan deret waktu, gunakan fungsi mul. Misalnya, kueri berikut mengambil deret waktu, lalu mengalikan setiap nilai dengan 10:

  fetch gce_instance
  | metric 'compute.googleapis.com/instance/disk/read_bytes_count'
  | mul(10)

Untuk menjumlahkan dua deret waktu, konfigurasikan kueri Anda untuk mengambil dua tabel deret waktu, gabung dengan hasil tersebut, lalu panggil fungsi add. Contoh berikut mengilustrasikan kueri yang menghitung jumlah byte yang dibaca dan ditulis ke, instance Compute Engine:

  fetch gce_instance
  | { metric 'compute.googleapis.com/instance/disk/read_bytes_count'
    ; metric 'compute.googleapis.com/instance/disk/write_bytes_count' }
  | outer_join 0
  | add

Untuk mengurangi jumlah byte tertulis dari jumlah byte baca, ganti add dengan sub di ekspresi sebelumnya.

MQL menggunakan label di kumpulan tabel yang ditampilkan dari pengambilan pertama dan kedua untuk menentukan cara menggabungkan tabel:

  • Jika tabel pertama berisi label yang tidak ditemukan dalam tabel kedua, MQL tidak dapat melakukan operasi outer_join di tabel sehingga MQL akan melaporkan error. Misalnya, kueri berikut menyebabkan error karena label metric.throttle_reason ada di tabel pertama, tetapi tidak ada di tabel kedua:

     fetch gce_instance
      | { metric 'compute.googleapis.com/instance/disk/throttled_read_bytes_count'
        ; metric 'compute.googleapis.com/instance/disk/write_bytes_count' }
      | outer_join 0
      | add
    

    Salah satu cara untuk mengatasi jenis error ini adalah dengan menerapkan klausa pengelompokan untuk memastikan kedua tabel memiliki label yang sama. Misalnya, Anda dapat mengelompokkan semua label deret waktu:

     fetch gce_instance
      | { metric 'compute.googleapis.com/instance/disk/throttled_read_bytes_count'
          | group_by []
        ; metric 'compute.googleapis.com/instance/disk/write_bytes_count'
          | group_by [] }
      | outer_join 0
      | add
    
  • Jika label dari kedua tabel tersebut cocok, atau jika tabel kedua berisi label yang tidak ditemukan dalam tabel pertama, maka outer join diizinkan. Misalnya, kueri berikut tidak menyebabkan error meskipun label metric.throttle_reason ada di tabel kedua, tetapi bukan yang pertama:

     fetch gce_instance
      | { metric 'compute.googleapis.com/instance/disk/write_bytes_count'
        ; metric 'compute.googleapis.com/instance/disk/throttled_read_bytes_count' }
      | outer_join 0
      | sub
    

    Deret waktu yang ditemukan dalam tabel pertama mungkin memiliki nilai label yang cocok dengan beberapa deret waktu dalam tabel kedua, sehingga MQL melakukan operasi pengurangan untuk setiap pasangan.

Pergeseran waktu

Terkadang, Anda ingin membandingkan apa yang terjadi saat ini dengan apa yang terjadi di masa lalu. Agar Anda dapat membandingkan data sebelumnya dengan data saat ini, MQL menyediakan operasi tabel time_shift untuk memindahkan data dari masa lalu ke jangka waktu saat ini.

Rasio over-time

Kueri berikut menggunakan time_shift, join, dan div untuk menghitung rasio penggunaan rata-rata di setiap zona antara sekarang dan satu minggu yang lalu.

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| group_by [zone], mean(val())
| {
    ident
  ;
    time_shift 1w
  }
| join | div

Diagram berikut menunjukkan kemungkinan hasil kueri ini:

Diagram menunjukkan rasio data saat ini dan data yang bergeser
waktu.

Dua operasi pertama mengambil deret waktu, lalu mengelompokkannya, berdasarkan zona, yang menghitung nilai rata-rata untuk setiap operasi. Tabel yang dihasilkan kemudian diteruskan ke dua operasi. Operasi pertama, ident, akan meneruskan tabel tanpa perubahan.

Operasi kedua, time_shift, menambahkan periode (1 minggu) ke stempel waktu untuk nilai dalam tabel, yang mengalihkan data dari minggu lalu. Perubahan ini membuat stempel waktu untuk data lama di tabel kedua sejajar dengan stempel waktu untuk data saat ini pada tabel pertama.

Tabel yang tidak diubah dan tabel perubahan waktu kemudian digabungkan menggunakan join bagian dalam. join menghasilkan tabel deret waktu dengan setiap titik memiliki dua nilai: pemanfaatan saat ini dan penggunaan minggu lalu. Kueri kemudian menggunakan operasi div untuk menghitung rasio nilai saat ini terhadap nilai lama seminggu.

Data masa lalu dan sekarang

Dengan menggabungkan time_shift dan union, Anda dapat membuat diagram yang menampilkan data sebelumnya dan saat ini secara bersamaan. Misalnya, kueri berikut menampilkan penggunaan rata-rata keseluruhan sekarang dan dari seminggu yang lalu. Dengan union, Anda dapat menampilkan kedua hasil ini pada diagram yang sama.

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| group_by []
| {
     add [when: "now"]
  ;
     add [when: "then"] | time_shift 1w
  }
| union

Diagram berikut menunjukkan kemungkinan hasil kueri ini:

Diagram menunjukkan pemanfaatan rata-rata
saat ini dan sebelumnya.

Kueri ini mengambil deret waktu, lalu menggunakan group_by [] untuk menggabungkannya menjadi satu deret waktu tanpa label, sehingga titik data penggunaan CPU akan ditinggalkan. Hasil ini diteruskan ke dua operasi. Yang pertama menambahkan kolom untuk label baru yang disebut when dengan nilai now. Fungsi kedua menambahkan label yang disebut when dengan nilai then dan meneruskan hasilnya ke operasi time_shift untuk mengubah nilai tersebut per minggu. Kueri ini menggunakan pengubah peta add; lihat Maps untuk mengetahui informasi selengkapnya.

Kedua tabel tersebut, yang masing-masing berisi data untuk satu deret waktu, diteruskan ke union, yang menghasilkan satu tabel yang berisi deret waktu dari kedua tabel input.

Langkah selanjutnya

Untuk ringkasan struktur bahasa MQL, lihat Tentang bahasa MQL.

Untuk deskripsi lengkap tentang MQL, lihat Referensi Bahasa Kueri Monitoring.

Untuk informasi tentang berinteraksi dengan diagram, lihat Bekerja dengan diagram.