一般運算語言 (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 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' :
|
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 Advanced 支援的規則運算式函式。
運算式 | 說明 |
---|---|
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 支援特定的擴充功能函式,可用於轉換透過匯流排接收的事件資料。如需詳細資訊和範例,請參閱「轉換已接收的事件」。