DataPrime Riferimento al linguaggio di espressione (DPXL)

Il linguaggio di espressione DataPrime, o DPXL, è un linguaggio di espressione basato sull'espressione DataPrime syntax.You può essere utilizzato per definire filtri ricchi di espressioni, ad esempio per l'impostazione dello streaming.

Le espressioni DPXL sono un sottoinsieme delle espressioni DataPrime, come quelle usate nell'operatore filtro.

Le espressioni DPXL sono sottoposte a versioni per mantenere la prevedibilità e la stabilità. Con il versioning DPXL può essere migliorato nel tempo senza modificare la semantica delle espressioni esistenti.

Ogni espressione DPXL inizia con un identificatore di versione <vX>, attualmente <v1>. Segue l'espressione booleana vera e propria, compresi i letterali, i costrutti logici e di confronto, l'accesso ai percorsi chiave e le funzioni.

<v1> <boolean-expression>

Il prefisso <v> viene incluso automaticamente quando si utilizza l'interfaccia utente e non deve essere specificato. Tuttavia, un'espressione DPXL utilizzata in un'API deve iniziare con il prefisso <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')

Tipi di dati

DPXL supporta diversi tipi di dati.

Tipi di dati
Tipo di dati Esempio
stringa 'us-east-1’
’dev-’
number 23
-12.32
bool true
false
data/ora @(’2023-01-01T00:00Z’)
@’now’
espressione regolare /H.*o$/
/^prod-.*/
gravità VERBOSE
DEBUG
INFO
WARNING
ERROR
CRITICAL

Inoltre, esiste un letterale null, che può essere utilizzato con tutti gli altri tipi.

Operatori

DPXL supporta più operatori.

Operatori
Operatore Significato Esempio Esempio di descrizione
&& AND logico country == ‘us’ && region == ‘us-south’ Restituisce true se sia country che us che region sono us-south.
|| OR logico age > 40 || country == ‘us’ Restituisce true se age è superiore a 40 o se country è us.
! NOT logico !region.contains(’us-’) Restituirà true se l'elemento region non contiene us-

Ordinazione

È possibile controllare l'ordine di valutazione all'interno di un'espressione utilizzando le parentesi. Ad esempio:

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

Operatori di confronto

DPXL supporta più operatori di confronto.

Operatori di confronto
Operatore Significato Esempi
> Maggiore di duration > 40.5
$m.timestamp > @(’2023-01-01T00:00:00’)
>= Maggiore di o uguale a duration >= 40.5
< Minore di age < 20
<= Minore di o uguale a age <= 20
lastName <= ‘Smith’
== Uguale region == 'us-south'
!= Non uguale a first_name != 'joe'

Percorso chiave

I percorsi chiave sono divisi in tre parti diverse, ciascuna con un prefisso separato:

$m
Metadati
$l
Etichette, come applicationname o subsystemName
$d
Dati utente (prefisso predefinito)

$m- Percorsi chiave dei metadati

Percorsi chiave dei metadati
Percorso chiave Tipo di dati Descrizione
$m.timestamp data/ora Contiene il timestamp dell'evento
$m.severity gravità Contiene la gravità dell'evento

$l- Percorsi chiave delle etichette

Etichetta dei percorsi chiave per i registri
Percorso chiave Tipo di dati
$l.applicationname stringa
$l.subsystemname stringa

$d- Percorsi chiave dei dati utente

Con $d.<keypath> si può accedere a qualsiasi percorso chiave dell'utente, compresi i percorsi chiave annidati.

$d è il prefisso predefinito. Qualsiasi percorso chiave che non contenga un prefisso sarà considerato un campo di dati utente.

Funzioni

Le funzioni forniscono ulteriori capacità all'interno delle espressioni DPXL.

Funzioni
Funzione Descrizione Esempio
<s>.startsWith(<substr>):bool Controlla se una stringa <s> inizia con la sottostringa specificata <substr> region.startsWith('us-')
<s>.endsWith(<substr>):bool Controlla se una stringa <s> termina con la sottostringa specificata <substr> firstName.endsWith(’Jo’)
<s>.contains(<substr>):bool Controlla se una stringa <s> contiene la sottostringa specificata <substr> stream.contains(’err’)
<s>.matches(<regex>):bool Controlla se una stringa <s> corrisponde allo schema specificato fornito dall'elemento <regex> hostname.matches(/prod-.*/)
<value>.in(<value1>,<value2>,...) Verifica se il valore è uno dei valori forniti value1-valueN region.in(’us-east’,’us-south’)

Inferenza dei tipi di dati

DPXL tenta di dedurre il tipo di dati previsto per i percorsi chiave. Ad esempio, quando si elabora age > 50, si deduce che age deve essere un numero. Nei casi in cui DPXL non sia in grado di dedurre il tipo di dati di un percorso chiave, richiederà le informazioni necessarie sul tipo. Ad esempio:

'123':number

region1:string == region2

my_key:number > my_other_key

Esempi

I seguenti sono esempi di DPXL che possono essere utilizzati come base per le proprie espressioni 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

Limiti dell'inferenza

La funzione in non è in grado di dedurre automaticamente il tipo previsto di un percorso chiave. Per utilizzare la funzione in è necessario indicare il tipo. Ad esempio:

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