DataPrime Référence au langage d'expression (DPXL)

Le langage d'expression DataPrime, ou DPXL, est un langage d'expression basé sur l'expression DataPrime. syntax.You peut l'utiliser pour définir des filtres riches basés sur l'expression, par exemple lors de la configuration de la diffusion en continu.

Les expressions DPXL sont un sous-ensemble d'expressions DataPrime, telles que celles utilisées dans l'opérateur de filtrage.

Les expressions DPXL sont versionnées afin de maintenir la prévisibilité et la stabilité. Grâce au versionnage, DPXL peut être amélioré au fil du temps sans modifier la sémantique des expressions existantes.

Chaque expression DPXL commence par un identifiant de version <vX>, actuellement <v1>. Vient ensuite l'expression booléenne proprement dite, y compris les littéraux, les constructions logiques et de comparaison, l'accès au chemin de clé et les fonctions.

<v1> <boolean-expression>

Le préfixe <v> est automatiquement inclus lors de l'utilisation de l'interface utilisateur et ne doit pas être spécifié. Toutefois, une expression DPXL utilisée dans une API doit commencer par le préfixe <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')

Types de données

DPXL prend en charge différents types de données.

Types de données
Type de données Exemple
chaîne 'us-east-1’
’dev-’
number 23
-12.32
booléen true
false
horodatage @(’2023-01-01T00:00Z’)
@’now’
expression régulière /H.*o$/
/^prod-.*/
gravité VERBOSE
DEBUG
INFO
WARNING
ERROR
CRITICAL

En outre, il existe un littéral null, qui peut être utilisé avec tous les autres types.

Opérateurs

DPXL prend en charge plusieurs opérateurs.

Opérateurs
Opérateur Signification Exemple Exemple de description
&& AND logique country == ‘us’ && region == ‘us-south’ Retourne true si le country est us et si le region est us-south.
|| OU logique age > 40 || country == ‘us’ Renverra true si le age est supérieur à 40, ou si le country est us.
! NOT logique !region.contains(’us-’) Renverra true si le region ne contient pas us-

Commande

Vous pouvez contrôler l'ordre d'évaluation à l'intérieur d'une expression à l'aide de parenthèses. Exemple :

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

Opérateurs de comparaison

DPXL prend en charge plusieurs opérateurs de comparaison.

Opérateurs de comparaison
Opérateur Signification Exemples
> Supérieur à duration > 40.5
$m.timestamp > @(’2023-01-01T00:00:00’)
>= Supérieur ou égal à duration >= 40.5
< Inférieur à age < 20
<= Inférieur ou égal à age <= 20
lastName <= ‘Smith’
== Egal region == 'us-south'
!= Différent de first_name != 'joe'

Chemin de ronde

Les chemins d'accès sont divisés en trois parties différentes, chacune ayant un préfixe distinct :

$m
Métadonnées
$l
Étiquettes, telles que applicationname ou subsystemName
$d
Données de l'utilisateur (préfixe par défaut)

$m- Chemins d'accès aux métadonnées

Chemins d'accès aux métadonnées
Chemin de ronde Type de données Description
$m.timestamp horodatage Contient l'horodatage de l'événement
$m.severity gravité Contient la gravité de l'événement

$l- Chemins d'accès aux étiquettes

Étiqueter les chemins d'accès pour les journaux
Chemin de ronde Type de données
$l.applicationname chaîne
$l.subsystemname chaîne

$d- Chemins d'accès aux données de l'utilisateur

Il est possible d'accéder à n'importe quel chemin d'accès utilisateur en utilisant $d.<keypath>, y compris les chemins d'accès imbriqués.

$d est le préfixe par défaut. Tout chemin de clé qui ne contient pas de préfixe sera considéré comme un champ de données utilisateur.

Fonctions

Les fonctions offrent des possibilités supplémentaires dans les expressions DPXL.

Fonctions
Fonction Description Exemple
<s>.startsWith(<substr>):bool Vérifie si une chaîne <s> commence par la sous-chaîne spécifiée <substr> region.startsWith('us-')
<s>.endsWith(<substr>):bool Vérifie si une chaîne de caractères <s> se termine par la sous-chaîne spécifiée <substr> firstName.endsWith(’Jo’)
<s>.contains(<substr>):bool Vérifie si une chaîne <s> contient la sous-chaîne spécifiée <substr> stream.contains(’err’)
<s>.matches(<regex>):bool Vérifie si une chaîne de caractères <s> correspond au motif spécifié par la chaîne <regex> hostname.matches(/prod-.*/)
<value>.in(<value1>,<value2>,...) Vérifie si la valeur est l'une des valeurs fournies value1-valueN region.in(’us-east’,’us-south’)

Déduire les types de données

DPXL tente de déduire le type de données attendu des chemins de clé. Par exemple, lors du traitement de age > 50, il en déduira que age doit être un nombre. Dans les cas où DPXL ne peut pas déduire le type de données d'un chemin de clé, il demandera les informations nécessaires sur le type. Exemple :

'123':number

region1:string == region2

my_key:number > my_other_key

Exemples

Les exemples suivants sont des exemples DPXL que vous pouvez utiliser comme base pour vos propres expressions 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

Limites de l'inférence

La fonction in ne peut pas déduire automatiquement le type attendu d'un chemin de clé. Pour utiliser la fonction in, vous devez indiquer le type. Exemple :

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