Usa Common Expression Language

Common Expression Language (CEL) es un lenguaje de código abierto que no es Turing-complete y que se puede usar para evaluar expresiones. Cada inscripción en Eventarc Advanced incluye una expresión de condición escrita en CEL que se usa para evaluar y filtrar mensajes. También puedes transformar el contenido de tus datos de eventos escribiendo expresiones de transformación con CEL.

En general, una expresión de condición consta de una o más declaraciones que se unen mediante operadores lógicos (&&, || o !). Cada declaración expresa una regla basada en atributos que se aplica a los datos. Por lo general, los operadores se usan para comparar el valor que contiene una variable con un valor literal.

Por ejemplo, si el valor de message.type es google.cloud.dataflow.job.v1beta3.statusChanged, la expresión message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" se evalúa como True.

Para obtener más información, consulta lo siguiente:

Atributos disponibles

Se puede acceder a todos los atributos de contexto del evento como variables a través de un objeto message predefinido. Estas variables se propagan con valores basados en los atributos del contexto del evento en el tiempo de ejecución. Una inscripción puede usar una variable para expresar un atributo determinado. Por ejemplo, message.type devuelve el valor del atributo type.

Ten en cuenta lo siguiente:

  • Los eventos pueden incluir cualquier cantidad de atributos personalizados adicionales de CloudEvents con nombres distintos (también conocidos como atributos de extensión), y las inscripciones pueden usarlos. Sin embargo, se representan como tipos String en las expresiones CEL, independientemente de su formato real. Puedes usar una expresión en CEL para convertir sus valores a otros tipos.

  • No puedes evaluar las inscripciones según el contenido de la carga útil del evento. Tanto message.data como message.data_base64 son variables reservadas y no se pueden usar en expresiones. Sin embargo, CEL se admite cuando se transforman los datos de eventos, lo que te permite modificar el contenido de la carga útil del evento (por ejemplo, para satisfacer el contrato de API de un destino específico).

Se puede acceder a los siguientes atributos cuando se evalúan expresiones de condición para una inscripción:

Atributo Tipo de atributo Descripción
message.datacontenttype String Tipo de contenido del valor de data
message.dataschema URI Identifica el esquema al que se ajusta data.
message.id String Identifica el evento. Los productores deben asegurarse de que source + id sea único para cada evento distinto.
message.source URI-reference Identifica el contexto en el que ocurrió un evento
message.specversion String Es la versión de la especificación de CloudEvents que usa el evento.
message.subject String Describe el tema del evento en el contexto del productor del evento (identificado por source).
message.time Timestamp Marca de tiempo del momento en que ocurrió el evento. El productor de CloudEvents podría establecerla en otro momento (como la hora actual). Sin embargo, todos los productores del mismo source deben ser coherentes.
message.type String Describe el tipo de evento relacionado con el suceso original.

Operadores y funciones

Puedes usar operadores y funciones para compilar expresiones lógicas complejas.

Los operadores lógicos, como &&, ||, y !, te permiten verificar varias variables en una expresión condicional. Por ejemplo, message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" une dos declaraciones y requiere que ambas sean True para producir un resultado general de True.

Los operadores de manipulación de cadenas, como x.contains('y'), coinciden con las cadenas o subcadenas que defines y te permiten desarrollar reglas para que coincidan con los mensajes sin tener que enumerar todas las combinaciones posibles.

Eventarc Advanced también admite funciones de extensión, como merge y flatten, que se pueden usar para transformar datos y simplificar la modificación de eventos recibidos de un bus.

Consulta la lista de operadores y funciones predefinidos de CEL y las macros predefinidas de CEL.

Operadores lógicos

En la siguiente tabla, se describen los operadores lógicos que admite Eventarc Advanced.

Expresión Descripción
x == "my_string" Devuelve True si x es igual al argumento de literal de cadena constante.
x == R"my_string\n" Devuelve True si x es igual al literal de cadena sin procesar determinado que no interpreta secuencias de escape. Los literales de cadena sin procesar son convenientes para expresar cadenas que deben usar secuencias de escape, como expresiones regulares o texto de programa.
x == y Devuelve True si x es igual a y.
x != y Muestra True si x no es igual a y.
x && y Devuelve True si x y y son True.
x || y Devuelve True si x, y o ambos son True.
!x Devuelve True si el valor booleano x es False o devuelve False si el valor booleano x es True.
m['k'] Si la clave k está presente, devuelve el valor de la clave k en el mapa de cadena a cadena m. Si la clave k no está presente, devuelve un error que hace que no coincida la regla en evaluación.

Operadores de manipulación de cadenas

En la siguiente tabla, se describen los operadores de manipulación de cadenas que admite Eventarc Advanced.

Expresión Descripción
double(x) Convierte el resultado de la cadena de x en un tipo de double. La cadena convertida se puede usar para comparar números de punto flotante con operadores aritméticos estándar, como > y <=. Esto solo funciona para los valores que pueden ser números de punto flotante.
int(x) Convierte el resultado de la cadena de x en un tipo de int. La cadena convertida se puede usar para comparar números enteros con operadores aritméticos estándar, como > y <=. Esto solo funciona para valores que pueden ser números enteros.
x + y Devuelve la cadena concatenada xy.
x.contains(y) Devuelve True si la cadena x contiene la substring y.
x.endsWith(y) Devuelve True si la cadena x termina con la subcadena y.
x.join() Devuelve una cadena nueva en la que se concatenan los elementos de una lista de cadenas. Acepta un separador opcional que se coloca entre los elementos de la cadena resultante. Por ejemplo, la siguiente expresión devuelve 'hello world':

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

x.lowerAscii() Devuelve una nueva cadena en la que todos los caracteres ASCII están en minúsculas.
x.matches(y)

Devuelve True si la cadena x coincide con el patrón RE2 y especificado.

El patrón RE2 se compila con la opción RE2::Latin1 que inhabilita las funciones de Unicode.

x.replace(y,z) Devuelve una nueva cadena en la que los casos de la subcadena y se reemplazan por la subcadena z. Acepta un argumento opcional que limita la cantidad de reemplazos que se pueden realizar. Por ejemplo, la siguiente expresión devuelve 'wello hello':

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

x.split(y) Devuelve una lista de cadenas divididas de la entrada por el separador y. Acepta un argumento opcional que limita la cantidad de subcadenas que se pueden producir. Por ejemplo, la siguiente expresión devuelve ['hello', 'hello hello']:

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

x.startsWith(y) Devuelve True si la cadena x comienza con la subcadena y.
x.upperAscii() Devuelve una cadena nueva en la que todos los caracteres ASCII están en mayúsculas.

Funciones de expresión regular

En la siguiente tabla, se describen las funciones de expresiones regulares que admite Eventarc Advanced.

Expresión Descripción
re.capture(target,regex)

Usa regex para capturar el primer valor de grupo con nombre o sin nombre en la cadena target y devuelve una cadena. Por ejemplo, la siguiente expresión devuelve "o":

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

re.captureN(target,regex) Usa regex para capturar el nombre y la cadena del grupo (para grupos con nombre) y el índice y la cadena del grupo (para grupos sin nombre) de la cadena target, y devuelve un mapa de pares clave-valor. Por ejemplo, la siguiente expresión devuelve {"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 extraer los valores de los grupos coincidentes de la cadena target y devuelve una cadena de los valores extraídos con el formato basado en el argumento rewrite. Por ejemplo, la siguiente expresión devuelve "example.com":

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

x.matches(regex)

Devuelve True si la cadena x coincide con el patrón RE2 regex especificado.

El patrón RE2 se compila con la opción RE2::Latin1 que inhabilita las funciones de Unicode.

Las expresiones regulares siguen la sintaxis RE2. Ten en cuenta que el carácter R que precede a las expresiones regulares indica una cadena sin procesar que no requiere escape.

Funciones de extensión

Eventarc Advanced admite ciertas funciones de extensión que se pueden usar para transformar los datos de eventos recibidos a través de un bus. Para obtener más información y ejemplos, consulta Transforma los eventos recibidos.

¿Qué sigue?