使用一般運算語言

一般運算語言 (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 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 如果 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 Advanced 支援的規則運算式函式。

運算式 說明
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("alex@example.com", "(^.*@)(.*)", "\\2")

x.matches(regex)

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

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

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

擴充功能函式

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

後續步驟