使用一般運算語言

一般運算語言 (CEL) 是一種開放原始碼的非圖靈完備語言,可以評估運算式。Eventarc Advanced 的每項註冊作業都包含以 CEL 編寫的條件運算式,用於評估及篩選訊息。在 Eventarc Advanced 中,您也可以使用 CEL 執行下列操作:

  • 對事件內容屬性套用 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.data 和 message.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 說明與原始事件相關的事件類型;請參閱 Eventarc 支援的 Google 事件類型

運算子和函式

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

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

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

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

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

邏輯運算子

下表說明 Eventarc Advanced 支援的邏輯運算子。

運算式 說明
x == "my_string" 如果 x 等於常數字串常值引數,則傳回 True。
x == R"my_string\n" 如果 x 等於指定的原始字串常值 (不解譯逸出序列),則傳回 True。原始字串常值很適合用來表示本身必須使用逸出序列的字串,例如規則運算式或程式文字。
x == y 如果 x 等於 y,則傳回 True。
x != y 如果 x 不等於 y,則傳回 True。
x && y 如果 x 和 y 都是 True,則傳回 True。
x || y 如果 x 和/或 y 為 True,則傳回 True。
!x 如果布林值 x 為 False,則傳回 True;如果布林值 x 為 True,則傳回 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 Advanced 支援的規則運算式函式。

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

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

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

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

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

x.matches(regex)

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

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

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

擴充功能函式

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

後續步驟