Common Expression Language (CEL) adalah
bahasa non-Turing complete open source yang menerapkan semantik umum untuk
evaluasi ekspresi. Service Extensions menggunakan subset kondisi CEL untuk membuat keputusan evaluasi rantai berdasarkan data atribut. Secara umum, ekspresi kondisi terdiri dari satu atau beberapa pernyataan yang digabungkan dengan operator logis (&&, ||, atau !).
Atribut
Untuk setiap permintaan koneksi tertentu, proxy mengekstrak atribut,
yang merupakan kumpulan informasi kontekstual. Atribut memiliki jenis tetap (seperti
string atau int), dan mungkin ada atau tidak ada, bergantung pada konteksnya.
Atribut diekspos ke runtime CEL selama pemrosesan kondisi pencocokan. Untuk meneruskan atribut tertentu ke layanan atau plugin ekstensi Anda, gunakan kolom forwardAttributes. Untuk mengetahui informasi selengkapnya, lihat Atribut yang didukung.
Atribut permintaan
Anda dapat mengekstrak atribut berikut dari permintaan:
| Atribut | Jenis | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Deskripsi |
|---|---|---|---|---|---|---|---|
request.headers |
map | ✓ | ✓ | ✓ | ✓ | ✓ | Peta string-ke-string dari header permintaan HTTP, dengan semua kunci dalam huruf kecil. |
request.method |
string | ✓ | ✓ | ✓ | ✓ | ✓ | Metode permintaan HTTP (misalnya, GET, POST). |
request.host |
string | ✓ | ✓ | ✓ | ✓ | ✓ | Kemudahan yang setara dengan request.headers['host']. |
request.path |
string | ✓ | ✓ | ✓ | ✓ | ✓ | Jalur URL HTTP yang diminta. |
request.query |
string | ✓ | ✓ | ✓ | ✓ | ✓ | String kueri URL (name1=value&name2=value2). |
request.scheme |
string | ✓ | ✓ | ✓ | ✓ | ✓ | Skema URL (http atau https). |
request.backend_service_name |
string | — | ✓ | ✓ | — | — | Nama layanan backend. |
request.backend_service_project_number |
int | — | ✓ | ✓ | — | — | Nomor project layanan backend. |
Atribut koneksi
Anda dapat mengekstrak atribut berikut dari koneksi:
| Atribut | Jenis | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Deskripsi |
|---|---|---|---|---|---|---|---|
source.ip |
string | ✓ | ✓ | ✓ | ✓ | — | Alamat IP klien. |
source.port |
int | ✓ | ✓ | ✓ | ✓ | ✓ | Nomor port koneksi klien. |
source.client_region |
string | ✓ | — | ✓ | — | ✓ | Kode negara atau wilayah klien dua huruf. |
connection.sni |
string | ✓ | — | ✓ | ✓ | ✓ | Indikasi Nama Server TLS Downstream. |
connection.tls_version |
string | ✓ | — | ✓ | ✓ | ✓ | Versi TLS downstream (misalnya, TLSv1.2, TLSv1.3). |
connection.sha256_peer_certificate_digest |
string | ✓ | — | ✓ | ✓ | — | Ringkasan SHA-256 sertifikat peer. |
Operator
Ekstensi Layanan mendukung beberapa operator yang dapat Anda gunakan
untuk membangun kondisi pencocokan yang kompleks dari pernyataan ekspresi sederhana.
Service Extensions mendukung operator logika, seperti &&, ||, dan !, serta operator manipulasi string, seperti x.contains('y').
Operator manipulasi string mencocokkan string atau substring yang Anda tentukan. Misalnya, request.host.endsWith('.example.com') bernilai true jika permintaan HTTP dibuat ke domain yang diakhiri dengan example.com.
Operator logika memungkinkan Anda memverifikasi beberapa variabel dalam ekspresi
kondisional. Misalnya,
request.method == 'GET' && request.host.matches('.example.com') menggabungkan dua
pernyataan dan mengharuskan kedua pernyataan tersebut bernilai true untuk menghasilkan
hasil keseluruhan true.
Operator logika
Tabel berikut menjelaskan operator logika yang didukung oleh Service Extensions.
| Contoh ekspresi | Deskripsi |
|---|---|
x == "foo" |
Menampilkan true jika x sama dengan argumen literal string konstan. |
x == R"fo'o" |
Menampilkan true jika x sama dengan literal string mentah yang diberikan yang tidak menafsirkan urutan escape. Literal string raw berguna untuk mengekspresikan string yang harus digunakan kode untuk meng-escape karakter urutan. |
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. |
k in m |
Menampilkan true jika kunci k ada dalam peta dengan kunci string m. Jika tidak, menampilkan
false. |
Operator manipulasi string
Tabel berikut menjelaskan operator manipulasi string yang didukung oleh Service Extensions.
| Ekspresi | Deskripsi |
|---|---|
x.contains(y) |
Menampilkan true jika string x berisi substring y. |
x.startsWith(y) |
Menampilkan true jika string x diawali dengan
substring y. |
x.endsWith(y) |
Menampilkan true jika string x diakhiri dengan substring y. |
x.matches(y) |
Menampilkan Ekstensi Layanan menggunakan opsi RE2::Latin1 saat mengompilasi pola RE2, yang menonaktifkan fitur Unicode. Ekstensi Edge hanya memungkinkan Anda menggunakan satu ekspresi reguler per ekspresi CEL. |
x.lower() |
Menampilkan nilai huruf kecil dari string x. |
x.upper() |
Menampilkan nilai huruf besar dari string x. |
int(x) |
Mengonversi hasil string x menjadi jenis int. Anda dapat menggunakan string yang dikonversi untuk perbandingan bilangan bulat menggunakan
operator aritmetika standar, seperti lebih besar dari (>)
dan kurang dari atau sama dengan (≤).
Cara ini hanya berfungsi untuk nilai yang dapat berupa bilangan bulat. |
Contoh ekspresi
Cocokkan semua permintaan ke host example.com dengan layanan backend bs1 di 123
sebagai tujuan akhir:
request.host == "example.com" && request.backend_service_name == "bs1" && request.backend_service_project_number == 123
Cocokkan semua permintaan untuk jalur */inventory dengan header HTTP Hello. Perhatikan bahwa nama header tidak peka huruf besar/kecil untuk pencocokan CEL:
request.path.endsWith("/inventory") && "Hello" in request.headers
Batasan
Batasan berikut berlaku untuk ekspresi CEL saat ditentukan untuk Service Extensions:
- Ekspresi maksimum per ekstensi: 1 untuk ekstensi edge dan 5 untuk ekstensi lainnya
- Jumlah karakter maksimum per ekspresi reguler: 100
- Jumlah karakter maksimum per ekspresi CEL: 500