使用一般運算語言

一般運算語言 (CEL) 是一種開放原始碼的非圖靈完備語言,可以評估運算式。Eventarc Advanced 的每項註冊作業都包含以 CEL 編寫的條件運算式,用於評估及篩選訊息。您也可以使用 CEL 編寫轉換運算式,轉換事件資料內容。

一般來說,條件運算式是由一或多個陳述式組成,並以邏輯運算子 (&&||!) 連結。每個陳述式都會表示套用至資料的屬性規則。運算子最常用於比較變數中包含的值與常值。

舉例來說,如果 message.type 的值為 google.cloud.dataflow.job.v1beta3.statusChanged,則運算式 message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" 的評估結果為 True

如要瞭解詳情,請參考下列資源:

可用的屬性

所有事件內容屬性都可以透過預先定義的 message 物件做為變數存取。這些變數會在執行階段根據事件內容屬性填入值。註冊程序可以使用變數表示指定屬性。舉例來說,message.type 會傳回 type 屬性的值。

注意事項:

  • 事件可能包含任意數量的其他自訂 CloudEvents 屬性,且這些屬性可供註冊使用,並具有不同的名稱 (也稱為擴充屬性)。不過,無論實際格式為何,這些值在 CEL 運算式中都會表示為 String 類型。您可以使用 CEL 運算式,將這些值轉換為其他型別。

  • 您無法根據活動酬載內容評估註冊人數。message.datamessage.data_base64 都是保留變數,不得用於運算式。不過,CEL 支援 轉換事件資料,可修改事件酬載內容 (例如,滿足特定目的地的 API 合約)。

評估註冊的條件運算式時,可以存取下列屬性:

屬性 屬性類型 說明
message.datacontenttype String data值的內容類型
message.dataschema URI 指出 data 遵循的結構定義
message.id String 識別事件。製作者必須確保每個不同的活動都有專屬的 source + id
message.source URI-reference 指出事件發生的情境
message.specversion String 事件使用的 CloudEvents 規格版本
message.subject String 說明活動主辦單位 (由 source 識別) 的活動主題
message.time Timestamp 事件發生時間的時間戳記;CloudEvents 產生者可能會將此屬性設為其他時間 (例如目前時間),但同一 source 的所有產生者必須保持一致
message.type String 說明與原始事件相關的事件類型

運算子和函式

您可以使用運算子和函式建構複雜的邏輯運算式。

邏輯運算子 (例如 &&||,!) 可讓您在條件運算式中驗證多個變數。舉例來說,message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" 會聯結兩個陳述式,且需要兩個陳述式都為 True,才能產生 True 的整體結果。

字串操控運算子 (例如 x.contains('y')) 會比對您定義的字串或子字串,並讓您開發規則來比對訊息,而不必列出所有可能的組合。

Eventarc Advanced 也支援擴充功能,例如 mergeflatten,可用於轉換資料,並簡化從匯流排接收事件的修改作業。

請參閱 CEL 預先定義的運算子和函式,以及 CEL 預先定義的巨集

邏輯運算子

下表說明 Eventarc 進階版支援的邏輯運算子。

運算式 說明
x == "my_string" 如果 x 等於常數字串常值引數,則傳回 True
x == R"my_string\n" 如果 x 等於指定的不會解譯逸出序列的原始字串文字,則傳回 True。原始字串常值很適合用來表示本身必須使用逸出序列的字串,例如規則運算式或程式文字。
x == y 如果 x 等於 y,則傳回 True
x != y 如果 x 不等於 y,則傳回 True
x && y 如果 xy 都是 True,則傳回 True
x || y 如果 xy 或兩者皆為 True,則傳回 True
!x 如果布林值 xFalse,則傳回 True;如果布林值 xTrue,則傳回 False
m['k'] 如果存在索引鍵 k,則傳回字串對字串對應 m 中索引鍵 k 的值。如果沒有索引鍵 k,系統會傳回錯誤,導致評估中的規則不符。

字串操控運算子

下表說明 Eventarc Advanced 支援的字串操控運算子。

運算式 說明
double(x) x 的字串結果轉換為 double 類型。轉換後的字串可用於比較浮點數,並搭配使用標準算術運算子,例如 ><=。這項功能僅適用於可為浮點數的值。
int(x) x 的字串結果轉換為 int 型別。轉換後的字串可用於比較整數與標準算術運算子,例如 ><=。這項功能僅適用於可為整數的值。
x + y 傳回串連的字串 xy
x.contains(y) 如果字串 x 包含子字串 y,就會傳回 True
x.endsWith(y) 如果字串 x 以子字串 y 結尾,則傳回 True
x.join() 傳回新的字串,其中包含串聯的字串清單元素。接受選用的分隔符號,該符號會放在結果字串中的元素之間。舉例來說, 下列運算式會傳回 'hello world'

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

x.lowerAscii() 傳回所有 ASCII 字元都是小寫的新字串。
x.matches(y)

如果字串 x 符合指定的 RE2 模式 y,則傳回 True

RE2 模式是以 RE2::Latin1 選項編譯,該選項會停用萬國碼 (Unicode) 功能。

x.replace(y,z) 傳回新字串,其中子字串 y 的出現次數會由子字串 z 取代。接受選用引數,限制要進行的替換次數。舉例來說,下列運算式會傳回 'wello hello'

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

x.split(y) 傳回依分隔符號 y 從輸入內容分割的字串清單。接受選用引數,限制要產生的子字串數量。舉例來說,下列運算式會傳回 ['hello', 'hello hello']

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

x.startsWith(y) 如果字串 x 以子字串 y 開頭,則傳回 True
x.upperAscii() 傳回所有 ASCII 字元都是大寫的新字串。

規則運算式函式

下表說明 Eventarc 進階版支援的正規運算式函式。

運算式 說明
re.capture(target,regex)

使用 regex 擷取 target 字串中第一個未命名或已命名的群組值,並傳回字串。舉例來說, 下列運算式會傳回 "o"

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

re.captureN(target,regex) 使用 regextarget 字串擷取群組名稱和字串 (適用於具名群組),以及群組索引和字串 (適用於未命名群組),並傳回鍵和值組合的地圖。舉例來說,下列運算式會傳回 {"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) 使用 regextarget 字串中擷取相符的群組值,並傳回根據 rewrite 引數格式化的擷取值字串。舉例來說, 下列運算式會傳回 "example.com"

re.extract("[email protected]", "(^.*@)(.*)", "\\2")

x.matches(regex)

如果字串 x 符合指定的 RE2 模式 regex,則傳回 True

RE2 模式是以 RE2::Latin1 選項編譯,該選項會停用萬國碼 (Unicode) 功能。

規則運算式遵循 RE2 語法。請注意,規則運算式前的 R 表示原始字串,不需要逸出。

擴充功能函式

Eventarc Advanced 支援特定擴充功能函式,可用於轉換透過匯流排接收的事件資料。如需更多資訊和範例,請參閱「轉換收到的事件」。

後續步驟