Referensi: Menyortir dan memfilter

Dokumen ini menjelaskan cara Anda dapat mengurutkan dan memfilter hasil perintah Cloud Monitoring API yang berlaku. Pengurutan memungkinkan Anda menentukan urutan elemen dalam daftar hasil. Pemfilteran memungkinkan Anda menentukan properti elemen yang disertakan dalam daftar hasil. Anda menggunakan kolom orderBy dan filter untuk mengurutkan dan memfilter respons API.

Tabel berikut mencantumkan metode Cloud Monitoring API yang mendukung pengurutan atau pemfilteran:

Metode Mendukung pengurutan Mendukung pemfilteran
projects.alertPolicies.list Ya Ya
projects.notificationChannels.list Ya Ya
projects.snoozes.list Tidak Ya
projects.uptimeCheckConfig.list Tidak Ya

Dasar-dasar pengurutan dan pemfilteran

Keberadaan kolom string orderBy dan filter di isi permintaan daftar menunjukkan dukungan untuk pengurutan dan pemfilteran dalam operasi list. Lihat dokumentasi referensi API untuk menentukan apakah isi permintaan menyertakan kolom ini.

Sintaksis urutan penyortiran

Kolom orderBy terdiri dari daftar jalur kolom yang dipisahkan koma yang secara opsional diberi awalan tanda minus untuk membalikkan urutan.

Misalnya, user_label.team,display_name mengurutkan menurut nama tim dalam urutan menaik, lalu -- untuk entri dengan tim yang sama -- mengurutkan menurut nama tampilan, juga dalam urutan menaik. Jika Anda menambahkan tanda minus di depan salah satu kolom yang dipisahkan koma, kolom tersebut akan diurutkan dalam urutan menurun; misalnya, jika Anda mencoba mengurangi panjang judul, Anda dapat menggunakan -display_name.size untuk mengurutkan berdasarkan panjang judul, dengan objek diurutkan dari judul yang paling panjang hingga judul yang paling singkat.

Untuk memberikan contoh yang lebih realistis, user_label.team,display_name mengelompokkan hasil terlebih dahulu menurut tim (dalam urutan leksikografis), lalu, dalam setiap pengelompokan tim, mengelola hasil menurut judul (juga dalam urutan leksikografis).

Secara formal, sintaksis dapat dijelaskan sebagai:

   ORDER_BY_SPEC :=
      # Comma-separated list of fields.
      ORDERED_FIELD_LIST

   ORDERED_FIELD_LIST :=
      # Single field on which to sort.
      ORDERED_FIELD

      # Sort by the first field and then by the remaining fields.
      | ORDERED_FIELD "," ORDERED_FIELD_LIST

   ORDERED_FIELD :=
      # Sort by the field in ascending order.
      FIELD_REFERENCE

      # Sort by the field in descending order.
      | "-" FIELD_REFERENCE

   FIELD_REFERENCE :=
      # Simple field reference
      FIELD_NAME

      # Map value or list index lookup. For string-valued keys, the
      # supplied key in this notation must be quoted.
      | FIELD_NAME "[" LITERAL "]"

   FIELD_NAME :=
      # Immediate element
      IDENTIFIER

      # Subfield dereference or map element dereference. Note that,
      # in the case of maps, the IDENTIFIER on the left can also
      # be the singular form of the name of the map. That is, it is
      # permitted to use `user_label.mykey` and not just
      # `user_labels.mykey`. This is done for consistency with the
      # metric filters which permit `resource.label.` and `metric.label.`
      # which are in the singular form even though the map is `labels`.
      | IDENTIFIER "." FIELD_NAME

   LITERAL :=
       # Whole or real number.
       [0-9]+(.[0.9]+)?

       # String literal using single quotes. Note that strings must
       # always be quoted. This is to avoid ambiguity with attempting
       # to refer to the value of a field.
       |  '[^']*'

       # String literal using double quotes. Note that strings must
       # always be quoted. This is to avoid ambiguity with attempting
       # to refer to the value of a field.
       |  "[^"]*"

       # Literal boolean true.
       |  true

       # Literal boolean false.
       |  false

   IDENTIFIER :=
       # Non-digit followed by any number of letters or digits.
       [a-zA-Z_]+[a-zA-Z0-9_]*

Filter sintaksis

Sintaksis filter terdiri dari bahasa ekspresi untuk membuat predikat dari satu atau beberapa kolom objek yang difilter. Negasi, konjungsi, dan disjungsi ditulis menggunakan kata kunci NOT, AND, dan OR. Kolom dapat dibandingkan dengan nilai literal menggunakan operator : (berisi), = (kesetaraan), > (lebih besar), < (kurang dari), >= (lebih besar dari atau sama dengan), <= (kurang dari atau sama dengan), dan != (ketidaksetaraan). Fungsi bawaan starts_with, ends_with, monitoring.regex.full_match (sintaksis RE2) serta properti bawaan empty dan size memberikan dukungan untuk perbandingan yang lebih canggih.

Contoh

Untuk menampilkan semua entri dengan nama tampilan atau deskripsi yang tidak kosong jika kolom user_labels memiliki setelan kunci active (dengan nilai apa pun):

(NOT display_name.empty OR NOT description.empty) AND user_labels='active'

Untuk menampilkan semua entri yang deskripsinya berisi 'cloud':

description:'cloud'

Untuk menampilkan semua entri yang judulnya cocok dengan "Temp XYZ":

display_name=monitoring.regex.full_match('Temp \\d{3}')

Spesifikasi formal

Sintaksis ekspresi filter dapat diringkas sebagai berikut:

   FILTER_EXPRESSION :=
         # Negation
         "NOT" FILTER_EXPRESSION

         # Short-circuiting AND
         | FILTER_EXPRESSION "AND" FILTER_EXPRESSION

         # Short-circuiting OR
         | FILTER_EXPRESSION "OR" FILTER_EXPRESSION

         # Implicit short-circuiting AND
         | FILTER_EXPRESSION FILTER_EXPRESSION

         # Parenthesized sub-expression
         | "(" FILTER_EXPRESSION ")"

         # Basic expression
         | SIMPLE_EXPRESSION

   SIMPLE_EXPRESSION :=
         # Field implicitly converted to boolean
         FIELD_REFERENCE

         # Field binary comparison. Note that the right-hand side must
         # be compatible with the type on the left-hand side; one cannot
         # compare a number with a string. Sensible implicit conversions
         # are permitted, however; comparing an integer and double will
         # succeed with appropriate conversion/widening taking place.
         | FIELD_REFERENCE OP LITERAL

         # Function invocation
         | FIELD_REFERENCE "=" FUNCTION_EXPRESSION


   FIELD_REFERENCE :=
         # Simple field reference
         FIELD_NAME

         # Map value or list index lookup. For string-valued keys, the
         # supplied key in this notation must be quoted.
         | FIELD_NAME "[" LITERAL "]"

   FIELD_NAME :=
         # Immediate element
         IDENTIFIER

         # Subfield dereference or map element dereference. Note that,
         # in the case of maps, the IDENTIFIER on the left can also
         # be the singular form of the name of the map. That is, it is
         # permitted to use `user_label.mykey` and not just
         # `user_labels.mykey`. This is done for consistency with the
         # metric filters which permit `resource.label.` and `metric.label.`
         # which are in the singular form even though the map is `labels`.
         | IDENTIFIER "." FIELD_NAME

   OP :=
         # Equality comparison. Should be avoided for double-valued fields.
         "="

         # Less than.
         | "<"

         # Greater than.
         | ">"

         # Less than or equal.
         | "<="

         # Greater than or equal.
         | ">="

         # Containment. This is equivalent to '=' for numeric types.
         | ":"

         # Not equal.
         | "!="

   LITERAL :=
       # Whole or real number.
       [0-9]+(.[0.9]+)?

       # String literal using single quotes. Note that strings must
       # always be quoted. This is to avoid ambiguity with attempting
       # to refer to the value of a field.
       |  '[^']*'

       # String literal using double quotes. Note that strings must
       # always be quoted. This is to avoid ambiguity with attempting
       # to refer to the value of a field.
       |  "[^"]*"

       # Literal boolean true.
       |  true

       # Literal boolean false.
       |  false

       # Date and Time formatted as per RFC-3339 standards using
       # double quotes.
       |  "YYYY-MM-DDT00:00:00-00:00"

   FUNCTION_EXPRESSION :=
       # Starts with.
       "starts_with" "(" LITERAL ")"

       # Ends with.
       |  "ends_with" "(" LITERAL ")"

       # Has substring. Takes an optional second argument that indicates whether
       # the substring matching is case-sensitive (true) or not (false).
       # The default is false, providing case-insensitive matches.
       |  "has_substring" "(" LITERAL [, [true|false]] ")"

       # Regular expression match.
       |  "monitoring.regex.full_match" "(" LITERAL ")"

   IDENTIFIER :=
       # Non-digit followed by any number of letters or digits.
       [a-zA-Z_]+[a-zA-Z0-9_]*

Kolom yang didukung

Kolom yang dapat dirujuk di kolom filter atau orderBy bergantung pada jenis objek yang dicantumkan.

AlertPolicy

Kolom berikut dapat dirujuk di filter dan orderBy saat mencantumkan objek AlertPolicy:

  • nama
  • display_name
  • documentation.content
  • documentation.mime_type
  • user_labels
  • conditions.size
  • penggabung
  • diaktifkan
  • notification_channels

NotificationChannel

Kolom berikut dapat dirujuk di filter dan orderBy saat mencantumkan objek NotificationChannel:

  • nama
  • jenis
  • display_name
  • deskripsi
  • labels
  • user_labels

UptimeCheckConfig

Kolom berikut dapat direferensikan di filter saat menghitung objek UptimeCheckConfig:

  • display_name
  • user_labels
  • selected_regions
  • http_check.path
  • http_check.headers
  • http_check.port
  • tcp_check.port
  • monitored_resource.type
  • monitored_resource.labels

Snoozes

Kolom berikut dapat direferensikan di filter saat menghitung objek Snoozes:

  • interval.start_time
  • interval.end_time

Topik lanjutan

Bagian ini memberikan informasi selengkapnya tentang pengurutan dan pemfilteran hasil API.

Casing kolom

Nama kolom dapat dinyatakan dalam bentuk lower_case_with_underscores dan dalam bentuk camelCase. Artinya, display_name dan displayName didukung.

String

Properti bawaan

Kolom bernilai string otomatis memiliki properti size yang dihasilkan yang menghitung jumlah karakter Unicode dalam string. Hal ini memungkinkan, misalnya, filter seperti display_name.size > 3 AND display_name.size < 10. Selain size, string juga memiliki properti bool empty.

Urutan pengurutan

Saat mencantumkan string dalam orderBy, string dibandingkan menggunakan urutan leksikografis byte demi byte dalam representasi UTF-8 string; string tidak diurutkan menurut urutan kolasi Unicode.

Konversi bool implisit

String dapat dikonversi secara implisit menjadi bool dalam filter seperti pada user_label.enabled. Perhatikan bahwa konversi ini tidak identik dengan pengujian bahwa string tidak kosong; dalam konversi ini, konten string diuraikan ke bool dan string yang secara jelas diuraikan ke boolean mengambil nilai boolean tersebut; jika string tidak jelas bernilai boolean, maka string yang tidak kosong ditafsirkan sebagai benar dan string kosong ditafsirkan sebagai salah.

String yang cocok dengan "false", "f", "no", "n", atau "0" tanpa membedakan huruf besar/kecil dianggap sebagai salah secara jelas; string yang cocok dengan "true", "t", "yes", "y", atau "1" tanpa membedakan huruf besar/kecil dianggap sebagai benar secara jelas.

Daftar

Properti bawaan

Kolom bernilai daftar otomatis memiliki properti size yang dihasilkan yang menghitung jumlah elemen dalam daftar tersebut. Misalnya, Anda dapat menggunakan notification_channels.size di orderBy untuk mengurutkan kebijakan pemberitahuan berdasarkan jumlah saluran yang diberi tahu.

Penggunaan dalam perbandingan biner

Saat membandingkan kolom bernilai daftar dengan literal menggunakan salah satu dari berbagai operator biner, perbandingan ditafsirkan sebagai penerapan perbandingan per elemen, lalu menghitung OR dari hasilnya. Misalnya, filter notification_channels:"123" akan dievaluasi sebagai benar jika salah satu channel notifikasi memiliki "123" sebagai substring. Khusus untuk operator !=, perbandingan per elemen di-AND-kan, bukan di-OR-kan; dengan kata lain, untuk !=, tidak ada elemen yang diizinkan untuk cocok. Atau, dengan kata lain, x!=y secara logis setara dengan pseudo-code x[0]!=y AND x[1]!=y AND ... AND x[x.size-1]!=y, sedangkan x=y secara logis setara dengan pseudo-code x[0]=y OR x[1]=y OR ... OR x[x.size-1]=y. Ketidakkonsistenan ini dirancang untuk menangani kemungkinan maksud x!=y dan mencegah kebingungan dengan ekspresi yang menampilkan hasil yang berisi nilai yang difilter.

Selain membatasi daftar secara keseluruhan, Anda juga dapat merujuk ke entri daftar tertentu menggunakan operator pengindeksan ([]). Misalnya, Anda dapat menggunakan notification_channels[0]:"123" untuk menguji elemen pertama saja. Nilai default (kosong, nol, dll.) dibuat jika indeks berada di luar batas.

Konversi implisit ke bool

Jika ditentukan dalam filter tanpa perbandingan biner, daftar akan dikonversi secara implisit menjadi boolean. Konversi ini berbeda dengan pengujian bahwa daftar tidak kosong; a_list dan NOT a_list.empty menampilkan hasil yang berbeda untuk {false, false, false} atau daftar tidak kosong lainnya yang semua nilainya adalah atau secara implisit dikonversi menjadi nilai boolean false.

Maps

Properti bawaan

Kolom bernilai peta secara otomatis memiliki properti size yang dihasilkan yang menghitung jumlah elemen dalam peta tersebut. Misalnya, Anda dapat menggunakan user_labels.size di orderBy untuk mengurutkan menurut jumlah label pengguna yang ditentukan. Demikian pula, properti empty bernilai boolean juga dibuat secara otomatis.

Menguji keberadaan kunci

Peta dapat dibandingkan dengan nilai literal menggunakan berbagai operator biner yang didukung. Interpretasi ini secara logis setara dengan memproyeksikan peta ke dalam daftar dengan mengekstrak kunci peta, lalu menjalankan perbandingan. Misalnya, Anda dapat menggunakan user_labels="phase" untuk menentukan apakah peta user_labels berisi kunci yang nilainya sama dengan "phase".

Mereferensikan nilai menurut kunci

Entri peta dapat dirujuk menggunakan salah satu dari dua notasi: notasi titik (.) dan notasi indeks ([]). Misalnya, Anda dapat menggunakan user_labels.team atau user_labels['team'] untuk merujuk ke nilai yang sesuai dengan kunci "team" di kolom user_labels. Agar konsisten dengan Metrics API yang menggunakan awalan metric.label. dan resource.label., bukan metric.labels. dan resource.labels., kolom peta juga dapat dirujuk menggunakan bentuk tunggal nama (misalnya, user_label.team juga diizinkan). Perhatikan bahwa untuk kunci yang bernama size atau empty, Anda harus menggunakan notasi indeks; menggunakan notasi titik akan merujuk ke properti peta bawaan.

Konversi implisit ke bool

Dalam konversi implisit ke bool, peta dianggap benar jika tidak kosong dan setidaknya satu *nilai peta - dikonversi secara implisit menjadi benar. Hal ini tidak sama dengan menguji bahwa peta tidak kosong.

Mengurutkan menurut jenis gabungan

Semua kolom yang dapat dirujuk dalam filter juga dapat dirujuk dalam order_by. Hal ini juga berlaku untuk jenis kompleks dan gabungan. Urutan pengurutan untuk jenis ini stabil dan terdefinisi dengan baik, meskipun tidak selalu intuitif; oleh karena itu, penggunaan ini tidak disarankan, tetapi diizinkan.

Daftar

Daftar dibandingkan menggunakan perbandingan leksikografis per elemen, dengan daftar yang lebih kecil muncul terlebih dahulu jika elemen umumnya sama. Sebagai contoh, {0, 1} kurang dari {0, 2}, tetapi lebih besar dari {0}.

Maps

Peta dibandingkan dengan melakukan perbandingan per elemen dari nilai peta yang sesuai dengan gabungan kuncinya. Untuk kunci yang ditentukan dalam satu peta, tetapi tidak dalam peta lainnya, nilai default (kosong, nol, dll.) digunakan untuk perbandingan. Sebagai contoh, {"x":0, "y":0} kurang dari {"x":1, "y":1}, tetapi lebih besar dari {"a":-1} dan sama dengan {}.