Usar a linguagem de expressão comum

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 gravada 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 do 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 momento da execução. Uma inscrição pode usar uma variável para expressar um atributo específico. 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 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, independentemente 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 e message.data_base64 são variáveis reservadas e não podem ser usadas em expressões. No entanto, o CEL é compatível com a transformação de dados de eventos, o que permite modificar o conteúdo do payload do evento (por exemplo, para atender ao contrato da 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 ao qual data adere
message.id String Identifica o evento. Os produtores precisam garantir que source + id seja exclusivo para cada evento distinto.
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 do evento (identificado por source)
message.time Timestamp Carimbo de data/hora em que a ocorrência aconteceu. Pode ser definido para outro horário (como o atual) pelo produtor do 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 que você define e permitem que você desenvolva 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 as 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. Os literais de string bruta são convenientes para expressar strings que precisam usar sequências de escape, como expressões regulares ou texto do 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 False se o valor booleano x for True.
m['k'] Se a chave k estiver presente, vai retornar o valor na chave k no mapa string a string m. Se a chave k não estiver presente, um erro será retornado, fazendo com que a regra em avaliação não corresponda.

Operadores de manipulação de string

A tabela a seguir descreve os operadores de manipulação de strings aceitos pelo 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 colocado entre os elementos na string resultante. Por exemplo, a expressão a seguir retorna 'hello world':

['hello', 'world'].join(' ')

x.lowerAscii() Retorna uma nova string em que todos os caracteres ASCII são em letras minúsculas.
x.matches(y)

Retorna True se a string x corresponder ao padrão RE2 especificado y.

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':

'hello hello'.replace('he', 'we', 1)

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']:

'hello hello hello'.split(' ', 2)

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 são maiúsculos.

Funções de expressão regular

A tabela a seguir descreve as funções de expressão regular que são compatíveis com o Eventarc Advanced.

Expressão Descrição
re.capture(target,regex)

Usa regex para capturar o primeiro valor de grupo não nomeado ou nomeado na string target e retorna uma string. Por exemplo, a expressão a seguir retorna "o":

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

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 sem nome) 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.captureN("The user testuser belongs to testdomain", R"The (user|domain) (?P.*) belongs to (?P.*)")

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":

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

x.matches(regex)

Retorna True se a string x corresponder ao padrão RE2 especificado regex.

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 que precede as expressões regulares indica uma string bruta que não exige escape.

Funções de extensão

O Eventarc Advanced oferece suporte a 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.

A seguir