Anda dapat mengubah data peristiwa dengan menulis ekspresi transformasi menggunakan CEL. Misalnya, Anda dapat mengubah payload peristiwa untuk memenuhi kontrak API tertentu tujuan.
Perhatikan bahwa peristiwa selalu dikirimkan dalam format CloudEvents menggunakan permintaan HTTP dalam mode konten biner kecuali jika Anda menentukan binding pesan.
Menetapkan format data input dan output
Selain menulis ekspresi transformasi di CEL, Anda dapat secara opsional menentukan format data dari data peristiwa yang masuk. Dengan demikian, Eventarc Advanced akan mengetahui cara mem-parsing payload peristiwa. Anda juga dapat mengonversi data dari satu format ke format lainnya.
Format berikut didukung: Avro, JSON, dan Protobuf. Untuk mengetahui informasi selengkapnya, lihat Memformat peristiwa yang diterima.
Ekspresi transformasi
Saat mentransformasi peristiwa, semua atribut peristiwa dapat diakses dalam ekspresi CEL sebagai variabel melalui objek message
yang telah ditentukan sebelumnya. Variabel ini diisi dengan nilai berdasarkan data peristiwa saat runtime. Contoh:
message.id
menampilkan atributid
peristiwamessage.data
menampilkan representasi nilai CEL dari payload peristiwamessage.data.some-key
menampilkan konten kolom bernamasome-key
dari payload peristiwa
Kolom di message.data
selalu ditampilkan sebagai jenis String
dan nilai dipetakan dari peristiwa asli menggunakan skema yang ditentukan saat menetapkan format data input.
Ekspresi transformasi harus menyatakan peristiwa lengkap yang mencakup atribut konteks peristiwa dan payload data peristiwa. Ekspresi ditulis dalam JSON, tetapi fungsi, makro, dan operator CEL yang telah ditentukan sebelumnya, serta ekspresi reguler menggunakan RE2 didukung. Eventarc Advanced juga mendukung fungsi ekstensi tertentu yang dapat digunakan untuk mentransformasi data peristiwa.
Berikut adalah dua contoh penggunaan ekspresi CEL untuk mengubah data peristiwa Anda. Untuk kasus penggunaan dan contoh lainnya, lihat Contoh transformasi.
Contoh: Memformat nilai atribut
Contoh berikut memformat nilai atribut phone_number
menggunakan fungsi ekspresi reguler. (Atribut lainnya telah dihilangkan.)
// Input: // { // "data": // { // "email_address": "charlie@altostrat.com", // "phone_number": "8005550100", // } // } // Output: // { // "data": // { // "email_domain": "altostrat.com", // "phone_number": "(800) 555-0100", // "area_code": "800", // "local_number": "5550100", // } // } { "data": { "email_domain": re.capture( message.data.email_address, "\\S+@(\\S+)"), "phone_number": re.extract( message.data.phone_number, "^(\\d{3})(\\d{3})(\\d{4})", "(\\1) \\2-\\3" ), }.merge ( re.captureN(message.data.phone_number, "^(?P\d{3})[\w\-)(]*(?P ) ) }\d{7})"
Berikut adalah fungsi ekspresi reguler yang digunakan dalam contoh sebelumnya:
re.capture
: mengambil nilai grup bernama atau tidak bernama pertama. Argumennya adalah sebagai berikut:target
: string yang harus diuraikanregex
: ekspresi reguler yang digunakan untuk mengambil nilai
Menampilkan string nilai grup yang diambil pertama.
re.captureN
: mencocokkan string dan ekspresi reguler yang diberikan secara keseluruhan. Argumennya adalah sebagai berikut:target
: string yang harus diuraikanregex
: ekspresi reguler yang digunakan untuk mengambil nilai
Menampilkan peta dengan pasangan kunci dan nilai untuk grup bernama (nama grup, string yang diambil) atau grup tanpa nama (indeks grup, string yang diambil).
re.extract
: mencocokkan nilai grup dari string target yang diberikan dan menulis ulang string. Argumennya adalah sebagai berikut:target
: string yang harus diuraikanregex
: ekspresi reguler yang digunakan untuk mengekstrak nilairewrite
: ekspresi reguler untuk cara memformat hasil
Menampilkan string nilai yang diekstrak yang diformat berdasarkan argumen
rewrite
.
Contoh: Memetakan array ke array objek
Contoh berikut memetakan array bilangan bulat ke dalam array objek. (Atribut lainnya telah dihilangkan.)
// Input: // { // "data": // { // "product_ids": [1, 2, 3] // } // } // Output: // { // "data": // { // "products": [ // { // "name": "apple", // "price": 70 // }, // { // "name": "orange", // "price": 80 // }, // { // "name": "Product(3)", // "price": 0 // }, // { // "name": "apple", // "price": 70 // } // ] // } // } { "data": { "products": message.data.product_ids.map(product_id, product_id == 1? { "name": "apple", "price": 70 } : product_id == 2? { "name": "orange", "price": 80 } : // Default: { "name": "Product(" + string(product_id) + ")", "price": 0 } ) } }
Mengonfigurasi pipeline untuk mengubah peristiwa
Anda dapat mengonfigurasi pipeline untuk mengubah data peristiwa di konsol Google Cloud atau menggunakan gcloud CLI.
Perhatikan bahwa hanya satu mediasi per pipeline yang didukung.
Konsol
Di konsol Google Cloud , buka halaman Eventarc > Pipelines.
Anda dapat membuat pipeline atau, jika Anda mengupdate pipeline, klik nama pipeline.
Perhatikan bahwa mengupdate pipeline mungkin memerlukan waktu lebih dari 10 menit.
Di halaman Pipeline details, klik
Edit.Di panel Event mediation, lakukan hal berikut:
- Centang kotak Terapkan transformasi.
Dalam daftar Format masuk, pilih format yang sesuai.
Untuk mengetahui informasi selengkapnya, lihat Memformat peristiwa yang diterima.
Di kolom CEL expression, tulis ekspresi transformasi dalam JSON. Fungsi, makro, dan operator CEL yang telah ditentukan sebelumnya, serta ekspresi reguler didukung. Contoh:
{ "id": message.id, "datacontenttype": "application/json", "data": "{ \"scrubbed\": \"true\" }" }
Contoh sebelumnya melakukan hal berikut:
- Menghapus semua atribut dari acara asli, kecuali
id
- Menetapkan atribut
datacontenttype
keapplication/json
- Mengganti payload peristiwa dengan string JSON statis
- Menghapus semua atribut dari acara asli, kecuali
Klik Lanjutkan.
Di panel Tujuan, lakukan hal berikut:
Jika berlaku, pilih format dalam daftar Format keluar.
Untuk mengetahui informasi selengkapnya, lihat Memformat peristiwa yang diterima.
Secara opsional, terapkan Pengikatan pesan. Untuk mengetahui informasi selengkapnya, lihat bagian Tentukan pengikatan pesan dalam dokumen ini.
Klik Simpan.
gcloud
Buka terminal.
Anda dapat membuat pipeline atau memperbarui pipeline menggunakan perintah
gcloud beta eventarc pipelines update
:Perhatikan bahwa mengupdate pipeline mungkin memerlukan waktu lebih dari 10 menit.
gcloud beta eventarc pipelines update PIPELINE_NAME \ --location=REGION \ --mediations=transformation_template= \ { TRANSFORMATION_EXPRESSION }
Ganti kode berikut:
PIPELINE_NAME
: ID pipeline atau nama yang sepenuhnya memenuhi syaratREGION
: a lokasi Eventarc Advanced yang didukungAtau, Anda dapat menetapkan properti lokasi gcloud CLI:
gcloud config set eventarc/location REGION
TRANSFORMATION_EXPRESSION
: ekspresi yang ditulis dalam JSON. Fungsi, makro, dan operator CEL yang telah ditentukan sebelumnya, serta ekspresi reguler didukung. Flagmediations
digunakan untuk menerapkan kuncitransformation_template
.
Contoh:
gcloud beta eventarc pipelines update my-pipeline \ --location=us-central1 \ --mediations=transformation_template= \ { "id": message.id, "datacontenttype": "application/json", "data": "{ \"scrubbed\": \"true\" }" }
Contoh sebelumnya melakukan hal berikut:
- Menghapus semua atribut dari acara asli, kecuali
id
- Menetapkan atribut
datacontenttype
keapplication/json
- Mengganti payload peristiwa dengan string JSON statis
Fungsi ekstensi
Eventarc Advanced mendukung fungsi ekstensi berikut yang dapat digunakan untuk mengubah data peristiwa yang diterima melalui bus.
Fungsi | Deskripsi |
---|---|
denormalize |
Mendenormalisasi peta atau daftar dengan menambahkan data yang berlebihan untuk meningkatkan performa baca. Nama kolom dalam peta yang dihasilkan dibatasi menggunakan titik
( Perhatikan bahwa karena Anda tidak dapat menggunakan titik ( Misalnya: |
merge |
Menggabungkan dua kolom dan menampilkan kolom gabungan. Kolom dengan nama duplikat digabungkan. Contoh:
|
removeFields |
Menghapus kolom tertentu dari peristiwa. Nama kolom diselesaikan sebagai
jalur. Karakter titik ( Perhatikan bahwa JSON mentah diharapkan. Jika Anda melakukan marshal JSON, transformasi mungkin diterapkan ke string JSON dan menyebabkan error. Contoh: |
setField |
Menambahkan atau mengganti kolom peristiwa dengan kunci tertentu. Nama
kolom diselesaikan sebagai jalur. Karakter titik ( Contoh: |
Contoh: Menambahkan atribut ke payload peristiwa tanpa mengubah data lain
// Input: // { // "data": // { // "credit_card_number": "XXXX-XXXX-XXXX-XXXX" // } // } // Output: // { // "data": // { // "credit_card_number": "XXXX-XXXX-XXXX-XXXX", // "card_type": "credit" // } // } { "data": message.data.merge( { "card_type": "credit" } ) }
Contoh: Denormalisasi daftar item dari payload peristiwa
// Input: //{ //"data": // { // "products": [ // { // "number": 021774, // "type": "perishable", // "price": 2.00 // }, // { // "number": 95602, // "type": "diy", // "price": 120.00 // }, // { // "number": 568302, // "type": "toys", // "price": 12.00 // } // ] // } //} // // Output: //{ //"data": // { // "products": { // "0.number": 021774, // "0.type": "perishable", // "0.price": 2.00, // "1.number": 95602, // "1.type": "diy", // "1.price": 120.00, // "2.number": 568302, // "2.type": "toys", // "2.price": 12.00 // } // } //} // // message.setField("data.products", message.data.products.denormalize())
Contoh: Menghapus kolom dari payload peristiwa
// Input: // { // "data": // { // "payment": { // "card_number": "XXXX-XXXX-XXXX-XXXX", // "card_type": "credit", // } // } // } // Output: // { // "data": // { // "payment": { // "card_type": "credit" // } // } // } message.removeFields(["data.payment.card_number"])
Menentukan binding pesan
Secara default, peristiwa selalu dikirim ke tujuan dalam format CloudEvents menggunakan permintaan HTTP dalam mode konten biner. Jika perlu, Anda dapat mengganti perilaku ini dengan menentukan binding pesan dan membuat permintaan HTTP baru.
Header HTTP apa pun yang diperkenalkan oleh kebijakan atau kontrol lain (misalnya, token OAuth atau OIDC) akan dipertahankan dan digabungkan dengan header yang dihasilkan dari ekspresi binding.
Anda dapat menentukan binding pesan saat mengonfigurasi pipeline di konsolGoogle Cloud atau menggunakan gcloud CLI.
Konsol
Di konsol Google Cloud , buka halaman Eventarc > Pipelines.
Anda dapat membuat pipeline atau, jika Anda mengupdate pipeline, klik nama pipeline.
Perhatikan bahwa mengupdate pipeline mungkin memerlukan waktu lebih dari 10 menit.
Di halaman Pipeline details, klik
Edit.Di panel Tujuan, terapkan Pengikatan pesan yang merupakan ekspresi CEL yang ditulis dalam JSON. Hal ini menghasilkan permintaan HTTP yang baru dibuat yang kemudian dikirim ke tujuan pipeline.
Untuk mengetahui informasi selengkapnya, lihat bagian Mengakses pesan masuk dan Membuat permintaan HTTP dalam dokumen ini.
Klik Simpan.
gcloud
Buka terminal.
Anda dapat membuat pipeline atau memperbarui pipeline menggunakan perintah
gcloud beta eventarc pipelines update
:gcloud beta eventarc pipelines update PIPELINE_NAME \ --location=REGION \ --destinations=http_endpoint_message_binding_template='MESSAGE_BINDING'
Ganti kode berikut:
PIPELINE_NAME
: ID pipeline atau nama yang sepenuhnya memenuhi syaratREGION
: a lokasi Eventarc Advanced yang didukungAtau, Anda dapat menetapkan properti lokasi gcloud CLI:
gcloud config set eventarc/location REGION
MESSAGE_BINDING
: ekspresi CEL yang ditulis dalam JSON yang menghasilkan permintaan HTTP yang baru dibuat, yang kemudian dikirim ke tujuan pipeline.Untuk mengetahui informasi selengkapnya, lihat bagian Mengakses pesan masuk dan Membuat permintaan HTTP dalam dokumen ini.
Contoh:
gcloud beta eventarc pipelines create my-pipeline \ --location=us-central1 \ --destinations=http_endpoint_uri='https://example-endpoint.com',network_attachment=my-network-attachment, \ http_endpoint_message_binding_template='{"headers":{"new-header-key": "new-header-value"}}'
Perhatikan bahwa jika Anda menggunakan kunci
http_endpoint_message_binding_template
, Anda juga harus menetapkan kuncihttp_endpoint_uri
dannetwork_attachment
.
Mengakses pesan masuk
Anda dapat menggunakan ekspresi CEL untuk mengakses pesan CloudEvents masuk sebagai berikut:
- Gunakan nilai
message.data
untuk mengakses kolomdata
dari pesan masuk. - Gunakan nilai
message.key
(dengankey
adalah nama atribut) untuk mengakses atribut pesan masuk. Gunakan variabel
headers
untuk mengakses header apa pun yang ditambahkan ke permintaan HTTP oleh mediasi sebelumnya dalam rantai pemrosesan. Variabel ini menentukan peta pasangan nilai kunci yang sesuai dengan header HTTP tambahan, bukan header asli permintaan masuk awal.Misalnya, ekspresi CEL berikut dapat digunakan untuk membuat permintaan HTTP khusus header dengan menambahkan header tambahan ke header yang ditambahkan dalam mediasi pipeline sebelumnya:
{"headers": headers.merge({"new-header-key": "new-header-value"})}
Membuat permintaan HTTP
Hasil ekspresi CEL harus berupa peta pasangan nilai kunci yang kolom
headers
dan body
-nya digunakan untuk membuat permintaan HTTP sebagai berikut.
Untuk headers
kolom:
- Jika peta
headers
ada sebagai hasil ekspresi CEL, pasangan nilai kuncinya dipetakan langsung ke header permintaan HTTP, dan nilainya dibuat menggunakan encoding string kanonis dari jenis data yang sesuai. - Jika kolom
headers
tidak ada, permintaan HTTP yang dihasilkan tidak akan berisi header apa pun.
Untuk body
kolom:
- Jika kolom
body
ada sebagai hasil ekspresi CEL, nilainya akan dipetakan langsung ke isi permintaan HTTP. - Jika nilai kolom
body
berjenisbytes
ataustring
, nilai tersebut akan digunakan sebagai isi permintaan HTTP apa adanya; jika tidak, nilai tersebut akan dikonversi menjadi string JSON. - Jika kolom
body
tidak ada, isi permintaan HTTP yang dihasilkan adalah isi binding pesan HTTP CloudEvents akhir dalam mode konten biner.
Kolom lainnya sebagai hasil ekspresi CEL akan diabaikan.
Fungsi ekstensi
Eventarc Advanced mendukung fungsi ekstensi berikut yang dapat digunakan untuk mengubah data peristiwa saat menentukan binding pesan.
Fungsi | Deskripsi |
---|---|
merge |
Menggabungkan peta CEL yang diteruskan ke peta CEL tempat fungsi
diterapkan. Jika kunci yang sama ada di kedua peta, atau jika nilai kunci berjenis
Contoh: |
toBase64 |
Mengonversi nilai CEL ke string berenkode URL base64. Contoh: |
toCloudEventJsonWithPayloadFormat |
Mengonversi pesan menjadi peta CEL yang sesuai dengan representasi JSON pesan CloudEvents, dan menerapkan Contoh: |
toDestinationPayloadFormat |
Mengonversi Contoh: |
toJsonString |
Mengonversi nilai CEL menjadi string JSON. Contoh:
|
toMap |
Mengonversi daftar peta CEL menjadi satu peta CEL. Contoh: |
Contoh: Pertahankan header, tambahkan header baru, tetapkan isi ke format tujuan
gcloud beta eventarc pipelines create my-pipeline \ --location=us-central1 \ --input-payload-format-json='{}' \ --destinations=http_endpoint_uri='https://example-endpoint.com',network_attachment=my-network-attachment,http_endpoint_message_binding_template='{"headers": headers.merge({"content-type":"application/avro"}), "body": message.data.toDestinationPayloadFormat()"}',output_payload_format_avro_schema_definition='{"schema_definition": "{"type":"record","name":"myrecord","fields":[{"name":"name","type":"string"},{"name":"account_late","type":"boolean"}]}"}'