Referencia del lenguaje del comparador de CEL

Common Expression Language (CEL) es un lenguaje de código abierto que no es Turing-complete y que implementa semánticas comunes para la evaluación de expresiones. Service Extensions usa un subconjunto de condiciones de CEL para tomar decisiones de evaluación en cadena basadas en datos de atributos. 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 !).

Atributos

Para cualquier solicitud de conexión determinada, el proxy extrae atributos, que son un conjunto de información contextual. Los atributos tienen un tipo fijo (como string o int) y pueden estar ausentes o presentes, según el contexto. Los atributos se exponen al entorno de ejecución de CEL durante el procesamiento de la condición de coincidencia. Los atributos no están disponibles para enviarse a un servicio de extensión.

Atributos de solicitud

Los siguientes atributos se pueden extraer de las solicitudes:

Atributo Tipo de atributo Descripción
request.headers map{string,string} Es un mapa de cadena a cadena de los encabezados de solicitud HTTP. Si un encabezado contiene varios valores, el valor de este mapa es una cadena separada por comas de todos los valores del encabezado. Las claves en este mapa están en minúsculas.
request.method string Es el método de solicitud HTTP, como GET o POST.
request.host string Equivalente de conveniencia a request.headers['host'].
request.path string La ruta de URL HTTP solicitada.
request.query string

Es la consulta de URL HTTP en el formato de name1=value&name2=value2, como aparece en la primera línea de la solicitud HTTP.

No se realiza ninguna decodificación.

request.scheme string El esquema de URL HTTP, como HTTP o HTTPS. Los valores de este atributo están en minúsculas.
request.backend_service_name string

El servicio de backend al que se reenvía la solicitud.

No se aplica a las extensiones de Edge.

request.backend_service_project_number int

Cuando se usa la VPC compartida, el número de proyecto del servicio de backend al que se reenvía la solicitud.

No se aplica a las extensiones de Edge.

Atributos de conexión

Los siguientes atributos se pueden extraer de las conexiones:

Atributo Tipo de atributo Descripción
source.ip string Es la dirección IP de origen de la solicitud.
source.port int Es el puerto de conexión del cliente downstream.
connection.sni string Es el nombre del servidor solicitado de la conexión TLS downstream.
connection.tls_version string Es la versión TLS de la conexión TLS downstream. Los valores válidos son: TLSv1, TLSv1.1, TLSv1.2 y TLSv1.3.
connection.sha256_peer_certificate_digest string Es el hash SHA256 con codificación hexadecimal del certificado con intercambio de tráfico en la conexión TLS downstream, si está presente.

Operadores

Las extensiones de servicio admiten varios operadores que puedes usar para compilar condiciones de coincidencia complejas a partir de declaraciones de expresiones simples. Las extensiones de servicio admiten operadores lógicos, como &&, ||, y !, y operadores de manipulación de cadenas, como x.contains('y').

Los operadores de manipulación de cadenas coinciden con las cadenas o substrings que defines. Por ejemplo, request.host.endsWith('.example.com') se evalúa como true si la solicitud HTTP se realizó a una terminación de dominio que termina con example.com.

Los operadores lógicos te permiten verificar varias variables en una expresión condicional. Por ejemplo, request.method == 'GET' && request.host.matches('.example.com') une dos declaraciones y requiere que ambas sean true para producir un resultado general de true.

Operadores lógicos

En la siguiente tabla, se describen los operadores lógicos que admiten las extensiones de servicio.

Expresión de ejemplo Descripción
x == "foo" El resultado es true si x es igual al argumento literal de cadena constante.
x == R"fo'o" 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 el código debe usar para escapar de los caracteres de secuencia.
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. En cambio, el resultado es 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.
k in m El resultado es true si la clave k está presente en el mapa con clave de cadena m. De lo contrario, muestra false.

Operadores de manipulación de cadenas

En la siguiente tabla, se describen los operadores de manipulación de cadenas que admiten las Service Extensions.

Expresión Descripción
x.contains(y) El resultado es true si la cadena x contiene la substring y.
x.startsWith(y) El resultado es true si la cadena x comienza con la substring y.
x.endsWith(y) El resultado es true si la cadena x termina con la substring y.
x.matches(y)

El resultado es true si la cadena x coincide con el patrón RE2 y especificado.

Las extensiones de servicio usan la opción RE2::Latin1 cuando compilan el patrón RE2, que inhabilita las funciones de Unicode.

Las extensiones de Edge te permiten usar solo una expresión regular por CEL expression.

x.lower() Devuelve el valor de la cadena x en minúsculas.
x.upper() Devuelve el valor de la cadena x en mayúsculas.
int(x) Convierte el resultado de la cadena de x en un tipo de int. Puedes usar la cadena convertida para la comparación de números enteros con operadores aritméticos estándar, como mayor que (>) y menor o igual que (). Esto funciona solo para valores que pueden ser números enteros.

Expresiones de muestra

Haz coincidir todas las solicitudes para alojar example.com con el bs1 del servicio de backend en 123 como destino final:

request.host == "example.com" && request.backend_service_name == "bs1" &&
  request.backend_service_project_number == 123

Haz coincidir todas las solicitudes para la ruta */inventory con un encabezado HTTP Hello. Ten en cuenta que los nombres de encabezado no distinguen entre mayúsculas y minúsculas para la coincidencia de CEL:

request.path.endsWith("/inventory") && "Hello" in request.headers

Limitaciones

Se aplican las siguientes limitaciones a las expresiones CEL cuando se especifican para las extensiones de servicio:

  • Cantidad máxima de expresiones por extensión: 1 para las extensiones de Edge y 5 para otras extensiones
  • Cantidad máxima de caracteres por expresión regular: 100
  • Cantidad máxima de caracteres por expresión CEL: 500