一般運算語言 (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.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 | 說明與原始事件相關的事件類型 | 
運算子和函式
您可以使用運算子和函式建構複雜的邏輯運算式。
邏輯運算子 (例如 &&、||, 和 !) 可讓您在條件運算式中驗證多個變數。舉例來說,message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" 會聯結兩個陳述式,且需要兩個陳述式都為 True,才能產生 True 的整體結果。
字串操控運算子 (例如 x.contains('y')) 會比對您定義的字串或子字串,並讓您開發規則來比對訊息,而不必列出所有可能的組合。
Eventarc Advanced 也支援擴充功能,例如 merge 和 flatten,可用於轉換資料,並簡化從匯流排接收事件的修改作業。
請參閱 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 | 如果 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':
 | 
| x.lowerAscii() | 傳回所有 ASCII 字元都是小寫的新字串。 | 
| x.matches(y) | 如果字串  RE2 模式是以 RE2::Latin1 選項編譯,該選項會停用萬國碼 (Unicode) 功能。 | 
| x.replace(y,z) | 傳回新字串,其中子字串 y的出現次數會由子字串z取代。接受選用引數,限制要進行的替換次數。舉例來說,下列運算式會傳回'wello hello':
 | 
| x.split(y) | 傳回依分隔符號 y從輸入內容分割的字串清單。接受選用引數,限制要產生的子字串數量。舉例來說,下列運算式會傳回['hello', 'hello hello']:
 | 
| x.startsWith(y) | 如果字串 x以子字串y開頭,則傳回True。 | 
| x.upperAscii() | 傳回所有 ASCII 字元都是大寫的新字串。 | 
規則運算式函式
下表說明 Eventarc 進階版支援的正規運算式函式。
| 運算式 | 說明 | 
|---|---|
| re.capture(target,regex) | 使用  
 | 
| re.captureN(target,regex) | 使用 regex從target字串擷取群組名稱和字串 (適用於具名群組),以及群組索引和字串 (適用於未命名群組),並傳回鍵和值組合的地圖。舉例來說,下列運算式會傳回{"1": "user", "Username": "testuser", "Domain": "testdomain"}:
 | 
| re.extract(target,regex,rewrite) | 使用 regex從target字串中擷取相符的群組值,並傳回根據rewrite引數格式化的擷取值字串。舉例來說,
      下列運算式會傳回"example.com":
 | 
| x.matches(regex) | 如果字串  RE2 模式是以 RE2::Latin1 選項編譯,該選項會停用萬國碼 (Unicode) 功能。 | 
規則運算式遵循 RE2 語法。請注意,規則運算式前的 R 表示原始字串,不需要逸出。
擴充功能函式
Eventarc Advanced 支援特定擴充功能函式,可用於轉換透過匯流排接收的事件資料。如需更多資訊和範例,請參閱轉換收到的事件。