A Common Expression Language (CEL) é uma linguagem de código aberto sem completude de Turing que pode ser usada para avaliar expressões. Cada inscrição no Eventarc Advanced inclui uma expressão de condição escrita em CEL que é usada para avaliar e filtrar mensagens. Também é possível transformar o conteúdo dos dados de eventos escrevendo expressões de transformação usando a CEL.
Em geral, uma expressão condicional consiste em uma ou mais instruções unidas por operadores lógicos (&&
, ||
ou !
). Cada instrução expressa uma regra baseada em atributo que é aplicada aos dados. Geralmente, os operadores são usados para comparar o valor contido em uma variável com um valor literal.
Por exemplo, se o valor de message.type
for
google.cloud.dataflow.job.v1beta3.statusChanged
, a expressão
message.type == "google.cloud.dataflow.job.v1beta3.statusChanged"
será avaliada como
True
.
Para ver mais informações, consulte os seguintes tópicos:
Atributos disponíveis
Todos os atributos de contexto de evento podem ser acessados como variáveis usando um objeto message
predefinido. Essas variáveis são preenchidas com valores com base nos atributos de contexto do evento no tempo de execução. Uma inscrição pode usar uma variável para expressar um determinado atributo. Por exemplo, message.type
retorna o valor do atributo type
.
Observe o seguinte:
Os eventos podem incluir, e as inscrições podem usar, qualquer número de atributos personalizados adicionais de CloudEvents com nomes distintos (também conhecidos como atributos de extensão). No entanto, eles são representados como tipos
String
em expressões CEL, independente do formato real. É possível usar uma expressão CEL para converter os valores em outros tipos.Não é possível avaliar as inscrições com base no conteúdo do payload do evento.
message.data
emessage.data_base64
são variáveis reservadas e não podem ser usadas em expressões. No entanto, a CEL é compatível ao transformar dados de eventos, o que permite modificar o conteúdo do payload de eventos (por exemplo, para atender ao contrato de API de um destino específico).
Os seguintes atributos podem ser acessados ao avaliar expressões de condição para uma inscrição:
Atributo | Tipo de atributo | Descrição |
---|---|---|
message.datacontenttype |
String |
O tipo de conteúdo do valor data . |
message.dataschema |
URI |
Identifica o esquema a que data obedece. |
message.id |
String |
Identifica o evento. Os produtores precisam garantir que source +
id seja exclusivo para cada evento diferente. |
message.source |
URI-reference |
Identifica o contexto em que um evento ocorreu. |
message.specversion |
String |
A versão da especificação do CloudEvents usada pelo evento. |
message.subject |
String |
Descreve o assunto do evento no contexto do produtor de eventos
(identificado por source ) |
message.time |
Timestamp |
Carimbo de data/hora de quando a ocorrência aconteceu. Pode ser definido como outro horário (como o horário atual) pelo produtor de CloudEvents. No entanto, todos os produtores do mesmo source precisam ser consistentes. |
message.type |
String |
Descreve o tipo de evento relacionado à ocorrência de origem. |
Operadores e funções
É possível usar operadores e funções para criar expressões lógicas complexas.
Os operadores lógicos, como &&
, ||,
e !
, permitem verificar várias variáveis em uma expressão condicional. Por exemplo, message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged"
une duas instruções e exige que ambas sejam True
para produzir um resultado geral de True
.
Os operadores de manipulação de strings, como x.contains('y')
, correspondem a strings ou substrings definidas por você e permitem desenvolver regras para corresponder a mensagens sem listar todas as combinações possíveis.
O Eventarc Advanced também oferece suporte a funções de extensão, como
merge
e flatten
, que podem ser usadas para transformar dados e simplificar a
modificação de eventos recebidos de um barramento.
Consulte a lista de operadores e funções predefinidos da CEL e macros predefinidas da CEL.
Operadores lógicos
A tabela a seguir descreve os operadores lógicos compatíveis com o Eventarc Advanced.
Expressão | Descrição |
---|---|
x == "my_string" |
Retorna True se x for igual ao argumento literal de string constante. |
x == R"my_string\n" |
Retorna True se x for igual à literal de string bruta fornecida que não interpreta sequências de escape. As literais de string
bruta são convenientes para expressar strings que precisam usar
sequências de escape, como expressões regulares ou texto de programa. |
x == y |
Retorna True se x for igual a
y . |
x != y |
Retorna True se x não for igual a
y . |
x && y |
Retorna True se x e y
forem True . |
x || y |
Retorna True se x , y ou ambos forem True . |
!x |
Retorna True se o valor booleano x for
False ou retorna False se o valor booleano
x for True . |
m['k'] |
Se a chave k estiver presente, retorna o valor na chave
k no mapa string a string m . Se a chave k não estiver presente, vai retornar um erro que fará com que a regra em avaliação não corresponda. |
Operadores de manipulação de strings
A tabela a seguir descreve os operadores de manipulação de strings compatíveis com o Eventarc Advanced.
Expressão | Descrição |
---|---|
double(x) |
Converte o resultado da string de x em um tipo double . A string convertida pode ser usada para comparar números de ponto flutuante com operadores aritméticos padrão, como > e <= . Isso funciona apenas para valores que podem ser números de ponto flutuante. |
int(x) |
Converte o resultado da string de x em um tipo int . A string convertida pode ser usada para comparar números inteiros com operadores aritméticos padrão, como > e <= . Isso funciona apenas para valores que podem ser números inteiros. |
x + y |
Retorna a string concatenada xy . |
x.contains(y) |
Retorna True se a string x contiver a
substring y . |
x.endsWith(y) |
Retorna True se a string x terminar com a
substring y . |
x.join() |
Retorna uma nova string em que os elementos de uma lista de strings são
concatenados. Aceita um separador opcional que é colocado entre os elementos na string resultante. Por exemplo, a expressão a seguir retorna 'hello world' :
|
x.lowerAscii() |
Retorna uma nova string em que todos os caracteres ASCII são minúsculos. |
x.matches(y) |
Retorna O padrão RE2 é compilado usando a opção RE2::Latin1, que desativa os recursos Unicode. |
x.replace(y,z) |
Retorna uma nova string em que as ocorrências da substring y são substituídas pela substring z . Aceita um argumento opcional que limita o número de substituições a serem feitas. Por exemplo, a expressão a seguir retorna 'wello hello' :
|
x.split(y) |
Retorna uma lista de strings divididas da entrada pelo separador
y . Aceita um argumento opcional que limita quantas
substrings serão produzidas. Por exemplo, a expressão a seguir retorna ['hello', 'hello hello'] :
|
x.startsWith(y) |
Retorna True se a string x começar com a
substring y . |
x.upperAscii() |
Retorna uma nova string em que todos os caracteres ASCII estão em maiúsculas. |
Funções de expressão regular
A tabela a seguir descreve as funções de expressão regular compatíveis com o Eventarc Advanced.
Expressão | Descrição |
---|---|
re.capture(target,regex) |
Usa
|
re.captureN(target,regex) |
Usa regex para capturar o nome e a string do grupo (para grupos nomeados) e o índice e a string do grupo (para grupos não nomeados) da string target e retorna um mapa de pares de chave e valor. Por exemplo, a expressão a seguir retorna {"1": "user", "Username": "testuser", "Domain": "testdomain"} :
|
re.extract(target,regex,rewrite) |
Usa regex para extrair valores de grupo correspondentes da
string target e retorna uma string dos valores extraídos
formatada com base no argumento rewrite . Por exemplo, a expressão a seguir retorna "example.com" :
|
x.matches(regex) |
Retorna O padrão RE2 é compilado usando a opção RE2::Latin1, que desativa os recursos Unicode. |
As expressões regulares seguem a sintaxe RE2. O R
antes das expressões regulares indica uma string bruta que não exige escape.
Funções de extensão
O Eventarc Advanced é compatível com determinadas funções de extensão que podem ser usadas para transformar os dados de eventos recebidos por um barramento. Para mais informações e exemplos, consulte Transformar eventos recebidos.