Menggunakan Common Expression Language

Common Expression Language (CEL) adalah bahasa non-Turing-complete open source yang dapat digunakan untuk mengevaluasi ekspresi. Setiap pendaftaran di Eventarc Advanced mencakup ekspresi kondisi yang ditulis dalam CEL yang digunakan untuk mengevaluasi dan memfilter pesan. Anda juga dapat mengubah konten data peristiwa dengan menulis ekspresi transformasi menggunakan CEL.

Secara umum, ekspresi kondisi terdiri dari satu atau beberapa pernyataan yang digabungkan oleh operator logis (&&, ||, atau !). Setiap pernyataan menyatakan aturan berbasis atribut yang diterapkan pada data. Biasanya, operator digunakan untuk membandingkan nilai yang terdapat dalam variabel dengan nilai literal.

Misalnya, jika nilai message.type adalah google.cloud.dataflow.job.v1beta3.statusChanged, maka ekspresi message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" akan bernilai True.

Untuk informasi selengkapnya, lihat referensi berikut:

Atribut yang tersedia

Semua atribut konteks peristiwa dapat diakses sebagai variabel melalui objek message yang telah ditentukan sebelumnya. Variabel ini diisi dengan nilai berdasarkan atribut konteks peristiwa saat runtime. Pendaftaran dapat menggunakan variabel untuk menyatakan atribut tertentu. Misalnya, message.type menampilkan nilai atribut type.

Perhatikan hal berikut:

  • Peristiwa dapat mencakup, dan pendaftaran dapat menggunakan, sejumlah atribut CloudEvents kustom tambahan dengan nama yang berbeda (juga dikenal sebagai atribut ekstensi). Namun, nilai tersebut direpresentasikan sebagai jenis String dalam ekspresi CEL, terlepas dari format sebenarnya. Anda dapat menggunakan ekspresi CEL untuk mentransmisikan nilainya ke jenis lain.

  • Anda tidak dapat mengevaluasi pendaftaran berdasarkan konten payload peristiwa. message.data dan message.data_base64 adalah variabel yang dicadangkan dan tidak dapat digunakan dalam ekspresi. Namun, CEL didukung saat mentransformasi data peristiwa yang memungkinkan Anda mengubah konten payload peristiwa (misalnya, untuk memenuhi kontrak API untuk tujuan tertentu).

Atribut berikut dapat diakses saat mengevaluasi ekspresi kondisi untuk pendaftaran:

Atribut Jenis atribut Deskripsi
message.datacontenttype String Jenis konten nilai data
message.dataschema URI Mengidentifikasi skema yang dipatuhi data
message.id String Mengidentifikasi peristiwa. Produsen harus memastikan bahwa source + id bersifat unik untuk setiap acara yang berbeda.
message.source URI-reference Mengidentifikasi konteks terjadinya peristiwa
message.specversion String Versi spesifikasi CloudEvents yang digunakan peristiwa
message.subject String Mendeskripsikan subjek acara dalam konteks produser acara (diidentifikasi oleh source)
message.time Timestamp Stempel waktu saat kejadian terjadi; dapat disetel ke waktu lain (seperti waktu saat ini) oleh produsen CloudEvents; namun, semua produsen untuk source yang sama harus konsisten
message.type String Menjelaskan jenis peristiwa yang terkait dengan kemunculan awal

Operator dan fungsi

Anda dapat menggunakan operator dan fungsi untuk membuat ekspresi logika yang kompleks.

Operator logika, seperti &&, ||,, dan !, memungkinkan Anda memverifikasi beberapa variabel dalam ekspresi bersyarat. Misalnya, message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" menggabungkan dua pernyataan, dan mengharuskan kedua pernyataan tersebut bernilai True untuk menghasilkan hasil keseluruhan True.

Operator manipulasi string, seperti x.contains('y'), mencocokkan string atau substring yang Anda tentukan, dan memungkinkan Anda mengembangkan aturan untuk mencocokkan pesan tanpa mencantumkan setiap kemungkinan kombinasi.

Eventarc Advanced juga mendukung fungsi ekstensi, seperti merge dan flatten, yang dapat digunakan untuk mentransformasi data dan menyederhanakan modifikasi peristiwa yang diterima dari bus.

Lihat daftar operator dan fungsi standar CEL dan makro standar CEL.

Operator logika

Tabel berikut menjelaskan operator logika yang didukung Eventarc Advanced.

Ekspresi Deskripsi
x == "my_string" Menampilkan True jika x sama dengan argumen string literal konstanta.
x == R"my_string\n" Menampilkan True jika x sama dengan literal string mentah yang diberikan yang tidak menafsirkan urutan escape. Literal string raw berguna untuk mengekspresikan string yang sendiri harus menggunakan urutan escape, seperti ekspresi reguler atau teks program.
x == y Menampilkan True jika x sama dengan y.
x != y Menampilkan True jika x tidak sama dengan y.
x && y Menampilkan True jika x dan y adalah True.
x || y Menampilkan True jika x, y, atau keduanya adalah True.
!x Menampilkan True jika nilai boolean x adalah False, atau menampilkan False jika nilai boolean x adalah True.
m['k'] Jika kunci k ada, menampilkan nilai pada kunci k dalam peta string-ke-string m. Jika kunci k tidak ada, menampilkan error yang menyebabkan aturan yang sedang dievaluasi tidak cocok.

Operator manipulasi string

Tabel berikut menjelaskan operator manipulasi string yang didukung Eventarc Advanced.

Ekspresi Deskripsi
double(x) Mengonversi hasil string dari x menjadi jenis double. String yang dikonversi dapat digunakan untuk membandingkan angka floating point dengan operator aritmetika standar seperti > dan <=. Hal ini hanya berfungsi untuk nilai yang dapat berupa angka floating point.
int(x) Mengonversi hasil string x menjadi jenis int. String yang dikonversi dapat digunakan untuk membandingkan bilangan bulat dengan operator aritmetika standar seperti > dan <=. Tindakan ini hanya berfungsi untuk nilai yang dapat berupa bilangan bulat.
x + y Menampilkan string gabungan xy.
x.contains(y) Menampilkan True jika string x berisi substring y.
x.endsWith(y) Menampilkan True jika string x diakhiri dengan substring y.
x.join() Menampilkan string baru tempat elemen daftar string digabungkan. Menerima pemisah opsional yang ditempatkan di antara elemen dalam string yang dihasilkan. Misalnya, ekspresi berikut menampilkan 'hello world':

['hello', 'world'].join(' ')

x.lowerAscii() Menampilkan string baru dengan semua karakter ASCII dalam huruf kecil.
x.matches(y)

Menampilkan True jika string x cocok dengan pola RE2 yang ditentukan y.

Pola RE2 dikompilasi menggunakan opsi RE2::Latin1 yang menonaktifkan fitur Unicode.

x.replace(y,z) Menampilkan string baru dengan kemunculan substring y diganti dengan substring z. Menerima argumen opsional yang membatasi jumlah penggantian yang akan dilakukan. Misalnya, ekspresi berikut menampilkan 'wello hello':

'hello hello'.replace('he', 'we', 1)

x.split(y) Menampilkan daftar string yang dipisahkan dari input oleh pemisah y. Menerima argumen opsional yang membatasi jumlah substring yang akan dihasilkan. Misalnya, ekspresi berikut menampilkan ['hello', 'hello hello']:

'hello hello hello'.split(' ', 2)

x.startsWith(y) Menampilkan True jika string x dimulai dengan substring y.
x.upperAscii() Menampilkan string baru dengan semua karakter ASCII dalam huruf besar.

Fungsi ekspresi reguler

Tabel berikut menjelaskan fungsi ekspresi reguler yang didukung Eventarc Advanced.

Ekspresi Deskripsi
re.capture(target,regex)

Menggunakan regex untuk mengambil nilai grup bernama atau tidak bernama pertama dalam string target, dan menampilkan string. Misalnya, ekspresi berikut menampilkan "o":

re.capture("hello", R"hell(o)")

re.captureN(target,regex) Menggunakan regex untuk mengambil nama dan string grup (untuk grup bernama) serta indeks dan string grup (untuk grup tanpa nama) dari string target, dan menampilkan peta pasangan kunci dan nilai. Misalnya, ekspresi berikut menampilkan {"1": "user", "Username": "testuser", "Domain": "testdomain"}:

re.captureN("The user testuser belongs to testdomain", R"The (user|domain) (?P.*) belongs to (?P.*)")

re.extract(target,regex,rewrite) Menggunakan regex untuk mengekstrak nilai grup yang cocok dari string target, dan menampilkan string nilai yang diekstrak yang diformat berdasarkan argumen rewrite. Misalnya, ekspresi berikut menampilkan "example.com":

re.extract("alex@example.com", "(^.*@)(.*)", "\\2")

x.matches(regex)

Menampilkan True jika string x cocok dengan pola RE2 yang ditentukan regex.

Pola RE2 dikompilasi menggunakan opsi RE2::Latin1 yang menonaktifkan fitur Unicode.

Ekspresi reguler mengikuti sintaksis RE2. Perhatikan bahwa R yang mendahului ekspresi reguler menunjukkan string mentah yang tidak memerlukan escape.

Fungsi ekstensi

Eventarc Advanced mendukung fungsi ekstensi tertentu yang dapat digunakan untuk mengubah data peristiwa yang diterima melalui bus. Untuk mengetahui informasi dan contoh selengkapnya, lihat Mengubah peristiwa yang diterima.

Langkah berikutnya