DataPrime (DPXL)

El DataPrime Expression Language, o DPXL, es un lenguaje de expresión basado en la expresión DataPrime syntax.You puede utilizarlo para definir filtros ricos basados en expresiones, como cuando se configura el streaming.

Las expresiones DPXL son un subconjunto de las expresiones DataPrime, como las utilizadas en el operador de filtro.

Las expresiones DPXL se versionan para mantener la previsibilidad y la estabilidad. Con el versionado, DPXL puede mejorarse con el tiempo sin cambiar la semántica de las expresiones existentes.

Cada expresión DPXL comienza con un identificador de versión <vX>, actualmente <v1>. A continuación viene la expresión booleana propiamente dicha, incluidos los literales, las construcciones lógicas y de comparación, el acceso a las rutas de teclado y las funciones.

<v1> <boolean-expression>

El prefijo <v> se incluye automáticamente al utilizar la interfaz de usuario y no es necesario especificarlo. Sin embargo, una expresión DPXL utilizada en una API debe comenzar con el prefijo <v1>.

# A filter that returns true if my_text field has the value 'example'
<v1> $d.my_text == 'example'

# A filter that returns true if the event's timestamp is before the beginning of the year 2024
<v1> $m.timestamp < @'2024-01-01T00:00:00'

# A filter that returns true if the application name starts with 'dev-'
<v1> $l.applicationname.startsWith('dev-')

# A filter that returns true if the field region_id is us-east-1 or us-east-2
<v1> region_id:string.in('us-east-1', 'us-west-2')

Tipos de datos

DPXL admite diferentes tipos de datos.

Tipos de datos
Tipo de datos Ejemplo
string 'us-east-1’
’dev-’
number 23
-12.32
bool true
false
indicación de fecha y hora @(’2023-01-01T00:00Z’)
@’now’
expresión regular /H.*o$/
/^prod-.*/
gravedad VERBOSE
DEBUG
INFO
WARNING
ERROR
CRITICAL

Además, hay un literal null, que se puede utilizar con todos los demás tipos.

Operadores

DPXL admite varios operadores.

Operadores
Operador Significado Ejemplo Ejemplo de descripción
&& AND lógico country == ‘us’ && region == ‘us-south’ Devolverá true si tanto el country es us como el region es us-south.
|| OR lógico age > 40 || country == ‘us’ Devuelve verdadero si age es superior a 40, o si country es us.
! NOT lógico !region.contains(’us-’) Devolverá true si el region no contiene us-

Pedidos

Puede controlar el orden de evaluación dentro de una expresión utilizando paréntesis. Por ejemplo:

region.startsWith('us-') &&
(country == 'us' && (age > 40 || age < 10)) || (country == 'il' && age > 25)

Operadores de comparación

DPXL admite varios operadores de comparación.

Operadores de comparación
Operador Significado Ejemplos
> Mayor que duration > 40.5
$m.timestamp > @(’2023-01-01T00:00:00’)
>= Mayor o igual que duration >= 40.5
< Menor que age < 20
<= Menor o igual que age <= 20
lastName <= ‘Smith’
== Igual que region == 'us-south'
!= No es igual que first_name != 'joe'

Keypath

Las rutas clave se dividen en tres partes diferentes, cada una con un prefijo distinto:

$m
Metadatos
$l
Etiquetas, como applicationname o subsystemName
$d
Datos del usuario (prefijo por defecto)

$m- Rutas clave de metadatos

Rutas de metadatos
Keypath Tipo de datos Descripción
$m.timestamp indicación de fecha y hora Contiene la fecha y hora del evento
$m.severity gravedad Contiene la gravedad del suceso

$l- Rutas clave de las etiquetas

Etiquetar rutas clave para registros
Keypath Tipo de datos
$l.applicationname string
$l.subsystemname string

$d- Rutas de datos de usuario

Se puede acceder a cualquier keypath de usuario utilizando $d.<keypath> incluyendo keypaths anidados.

$d es el prefijo por defecto. Cualquier keypath que no contenga un prefijo se considerará un campo de datos de usuario.

Funciones

Las funciones proporcionan capacidades adicionales dentro de las expresiones DPXL.

Funciones
Función Descripción Ejemplo
<s>.startsWith(<substr>):bool Comprueba si una cadena <s> comienza con la subcadena especificada <substr> region.startsWith('us-')
<s>.endsWith(<substr>):bool Comprueba si una cadena <s> termina con la subcadena especificada <substr> firstName.endsWith(’Jo’)
<s>.contains(<substr>):bool Comprueba si una cadena <s> contiene la subcadena especificada <substr> stream.contains(’err’)
<s>.matches(<regex>):bool Comprueba si una cadena <s> coincide con el patrón especificado proporcionado por <regex> hostname.matches(/prod-.*/)
<value>.in(<value1>,<value2>,...) Comprueba si el valor es uno de los valores proporcionados value1-valueN region.in(’us-east’,’us-south’)

Inferir tipos de datos

DPXL intenta deducir el tipo de datos esperado de las rutas clave. Por ejemplo, al procesar age > 50, deducirá que se espera que age sea un número. En los casos en que DPXL no pueda deducir el tipo de datos para una ruta clave, requerirá la información necesaria sobre el tipo. Por ejemplo:

'123':number

region1:string == region2

my_key:number > my_other_key

Ejemplos

Los siguientes son ejemplos DPXL que puede utilizar como base para sus propias expresiones DPXL.

# Allow access only to logs where the application name is "production"
<v1> $l.applicationname == 'production'
# Allow access only to logs in which app name starts with dev, or the field "region_id" in the data is us-east
<v1> $l.applicationname.startsWith('dev-') && region_id == 'us-east'
# Allow access only to logs in which the field "country" is not one of the listed below.
<v1> !$d.country:string.in('us','il','gr')
# Allow access only to logs where the pod name matches the regex provided
<v1> kubernetes.pod_name.matches(/^kafka-[0-9]+/)
# Allow access only to logs that don't have a DEBUG severity
<v1> $m.severity != DEBUG
# Allow access only to logs in which some query duration is very large
<v1> query_duration_seconds > 100
# Allow access only to logs up to the beginning of the year 2024
<v1> $m.timestamp < @'2024-01-01T00:00:00'
# Disallow access to all logs entirely
<v1> false

Limitaciones de la inferencia

La función in no puede inferir automáticamente el tipo esperado de un keypath. Para utilizar la función in es necesario indicar el tipo. Por ejemplo:

<v1> !$d.country:string.in('us','il','gr')