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.
| Tipo de datos | Ejemplo |
|---|---|
| string | 'us-east-1’’dev-’ |
| number | 23-12.32 |
| bool | truefalse |
| indicación de fecha y hora | @(’2023-01-01T00:00Z’)@’now’ |
| expresión regular | /H.*o$//^prod-.*/ |
| gravedad | VERBOSEDEBUGINFOWARNINGERRORCRITICAL |
Además, hay un literal null, que se puede utilizar con todos los demás tipos.
Operadores
DPXL admite varios 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.
| 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 <= 20lastName <= ‘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
applicationnameosubsystemName $d- Datos del usuario (prefijo por defecto)
$m- Rutas clave 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
| 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.
| 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')