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.
| Type de données | Exemple |
|---|---|
| chaîne | 'us-east-1’’dev-’ |
| number | 23-12.32 |
| booléen | truefalse |
| horodatage | @(’2023-01-01T00:00Z’)@’now’ |
| expression régulière | /H.*o$//^prod-.*/ |
| gravité | VERBOSEDEBUGINFOWARNINGERRORCRITICAL |
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é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é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 <= 20lastName <= ‘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
applicationnameousubsystemName $d- Données de l'utilisateur (préfixe par défaut)
$m- 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
| 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.
| 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')