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. En Eventarc Advanced, también puedes usar CEL para hacer lo siguiente:
Controlar el acceso de publicación aplicando una expresión de condición CEL a un atributo de contexto de evento
Transformar el contenido de los datos de eventos escribiendo expresiones de transformación con CEL
En general, una expresión de condición consiste en una o más declaraciones que se
unen a través de 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:
- Crea una inscripción para recibir eventos
- Controla el acceso de publicación
- Transforma los eventos recibidos
- Definición del lenguaje CEL
Atributos disponibles
Se puede acceder a todos los atributos de contexto de eventos como variables a través de un objeto message predefinido. Estas variables se propagan con valores basados en atributos de contexto de eventos en el entorno de ejecución. Una inscripción puede usar una variable para expresar un atributo determinado. Por ejemplo, message.type muestra el valor del type
atributo.
Ten en cuenta lo siguiente:
Los eventos pueden incluir y las inscripciones pueden usar cualquier cantidad de atributos adicionales de CloudEvents personalizados con nombres distintos (también conocidos como atributos de extensión). Sin embargo, se representan como tipos
Stringen expresiones CEL, independientemente de su formato real. Puedes usar una expresión CEL para convertir sus valores a otros tipos.No puedes evaluar las inscripciones ni controlar el acceso de publicación en función del contenido de la carga útil del evento.
message.dataymessage.data_base64son variables reservadas y no se pueden usar en expresiones. Sin embargo, CEL es compatible 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 las expresiones de condición:
| Atributo | Tipo de atributo | Descripción |
|---|---|---|
message.datacontenttype |
String |
El tipo de contenido del valor data |
message.dataschema |
URI |
Identifica el esquema al que se adhiere 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 |
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 de cuándo ocurrió el evento; el productor de CloudEvents puede establecerla en otro
momento (como la hora actual); sin embargo, todos los productores de la misma source deben ser coherentes |
message.type |
String |
Describe el tipo de evento relacionado con la ocurrencia de origen; consulta los tipos de eventos de Google compatibles con Eventarc |
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'), hacen coincidir las cadenas o
substrings que defines y te permiten desarrollar reglas para hacer coincidir mensajes sin
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 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" |
El resultado es True si x es igual al argumento literal de cadena constante. |
x == R"my_string\n" |
El resultado es True si x es igual al literal de cadena sin procesar determinado
que no interpreta las 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 |
El resultado es True si x es igual a
y. |
x != y |
El resultado es True si x no es igual a
y. |
x && y |
El resultado es True si x y y
son True. |
x || y |
El resultado es True si x, y o ambos
son True. |
!x |
El resultado es True si el valor booleano x es
False, o False si el valor booleano
x es True. |
m['k'] |
Si la clave k está presente, muestra el valor de la clave
k en el mapa de cadena a cadena m. Si la clave
k no está presente, muestra un error que
hace que la regla en evaluación no coincida. |
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 cadena de x a un tipo double. El valor convertido se puede usar para comparar números de punto flotante
con operadores aritméticos estándar, como > y
<=. Esto funciona solo para valores que pueden ser
números de punto flotante. |
int(x) |
Convierte el resultado de cadena de x a un int
tipo. El valor convertido se puede usar para comparar números enteros con
operadores aritméticos estándar, como > y
<=. Esto funciona solo para valores que pueden ser números enteros. |
x + y |
El resultado es la cadena concatenada xy. |
x.contains(y) |
El resultado es True si la cadena x contiene la substring y. |
x.endsWith(y) |
El resultado es True si la cadena x termina con la
substring y. |
x.join() |
Muestra 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 muestra 'hello world':
|
x.lowerAscii() |
Muestra una cadena nueva en la que todos los caracteres ASCII están en minúscula. |
x.matches(y) |
El resultado es El patrón RE2 se compila con la opción RE2::Latin1 que inhabilita las funciones de Unicode. |
x.replace(y,z) |
Muestra una cadena nueva en la que las ocurrencias de la substring y se
reemplazan por la substring z. Acepta un argumento opcional que
limita la cantidad de reemplazos que se deben realizar. Por ejemplo, la siguiente
expresión muestra 'wello hello':
|
x.split(y) |
Muestra una lista de cadenas divididas de la entrada por el separador
y. Acepta un argumento opcional que limita la cantidad de
substrings que se deben producir. Por ejemplo, la siguiente expresión muestra
['hello', 'hello hello']:
|
x.startsWith(y) |
El resultado es True si la cadena x comienza con la substring y. |
x.upperAscii() |
Muestra una cadena nueva en la que todos los caracteres ASCII están en mayúscula. |
Funciones de expresión regular
En la siguiente tabla, se describen las funciones de expresión regular que admite Eventarc Advanced.
| Expresión | Descripción |
|---|---|
re.capture(target,regex) |
Usa
|
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 muestra un mapa de pares clave-valor. Por
ejemplo, la siguiente expresión muestra
{"1": "user", "Username": "testuser", "Domain": "testdomain"}:
|
re.extract(target,regex,rewrite) |
Usa regex para extraer los valores de grupo coincidentes de la
target cadena y muestra una cadena de los valores extraídos
con el formato basado en el rewrite argumento. Por ejemplo,
la siguiente expresión muestra "example.com":
|
x.matches(regex) |
El resultado es 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 la 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.