DataPrime Verweis auf die Ausdruckssprache (DPXL)

Die DataPrime Expression Language (DPXL) ist eine Ausdruckssprache, die auf DataPrime expression syntax.You basiert und mit der sich umfangreiche ausdrucksbasierte Filter definieren lassen, z. B. beim Einrichten von Streaming.

DPXL-Ausdrücke sind eine Untermenge von DataPrime-Ausdrücken, wie sie beispielsweise im Filteroperator verwendet werden.

DPXL-Ausdrücke werden versioniert, um Vorhersehbarkeit und Stabilität zu gewährleisten. Mit der Versionierung kann DPXL im Laufe der Zeit erweitert werden, ohne die Semantik bestehender Ausdrücke zu verändern.

Jeder DPXL-Ausdruck beginnt mit einem Versionsbezeichner <vX>, derzeit <v1>. Danach folgt der eigentliche boolesche Ausdruck, einschließlich Literalen, logischen und Vergleichskonstrukten, Schlüsselpfadzugriff und Funktionen.

<v1> <boolean-expression>

Das Präfix <v> wird bei Verwendung der Benutzeroberfläche automatisch eingefügt und muss nicht angegeben werden. Ein in einer API verwendeter DPXL-Ausdruck muss jedoch mit dem Präfix <v1> beginnen.

# 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')

Datentypen

DPXL unterstützt verschiedene Datentypen.

Datentypen
Datentyp Beispiel
Zeichenfolge 'us-east-1’
’dev-’
Zahl 23
-12.32
bool true
false
timestamp @(’2023-01-01T00:00Z’)
@’now’
Regulärer Ausdruck /H.*o$/
/^prod-.*/
severity VERBOSE
DEBUG
INFO
WARNING
ERROR
CRITICAL

Darüber hinaus gibt es ein null-Literal, das mit allen anderen Typen verwendet werden kann.

Operatoren

DPXL unterstützt mehrere Operatoren.

Operatoren
Operator Bedeutung Beispiel Beispielhafte Beschreibung
&& Logisches UND country == ‘us’ && region == ‘us-south’ Gibt true zurück, wenn sowohl country us als auch region us-south ist.
|| Logisches ODER age > 40 || country == ‘us’ Gibt true zurück, wenn entweder age über 40 liegt oder country us ist.
! Logisches NICHT !region.contains(’us-’) Gibt true zurück, wenn das region nicht us- enthält

Bestellung

Sie können die Auswertungsreihenfolge innerhalb eines Ausdrucks mit Hilfe von Klammern steuern. Zum Beispiel:

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

Vergleichsoperatoren

DPXL unterstützt mehrere Vergleichsoperatoren.

Vergleichsoperatoren
Operator Bedeutung Beispiele
> Größer als duration > 40.5
$m.timestamp > @(’2023-01-01T00:00:00’)
>= Größer-gleich duration >= 40.5
< Kleiner als age < 20
<= Kleiner-gleich age <= 20
lastName <= ‘Smith’
== Ist gleich region == 'us-south'
!= Ungleich first_name != 'joe'

Keypath

Keypaths sind in drei verschiedene Teile unterteilt, die jeweils ein eigenes Präfix haben:

$m
Metadaten
$l
Bezeichnungen, wie applicationname oder subsystemName
$d
Benutzerdaten (Standardpräfix)

$m- Metadaten-Schlüsselpfade

Metadaten-Keypaths
Keypath Datentyp Beschreibung
$m.timestamp timestamp Enthält den Zeitstempel des Ereignisses
$m.severity severity Enthält den Schweregrad des Ereignisses

$l- Beschriftung der Tastaturpfade

Tastenpfade für Protokolle beschriften
Keypath Datentyp
$l.applicationname Zeichenfolge
$l.subsystemname Zeichenfolge

$d- Benutzerdaten-Tastaturpfade

Mit $d.<keypath> kann auf jeden Benutzer-Keypath zugegriffen werden, einschließlich verschachtelter Keypaths.

$d ist das Standardpräfix. Jeder Keypath, der kein Präfix enthält, wird als Benutzerdatenfeld betrachtet.

Funktionen

Funktionen bieten zusätzliche Möglichkeiten innerhalb von DPXL-Ausdrücken.

Funktionen
Funktion Beschreibung Beispiel
<s>.startsWith(<substr>):bool Überprüft, ob eine Zeichenkette <s> mit der angegebenen Teilzeichenkette <substr> beginnt region.startsWith('us-')
<s>.endsWith(<substr>):bool Überprüft, ob eine Zeichenkette <s> mit der angegebenen Teilzeichenkette <substr> endet firstName.endsWith(’Jo’)
<s>.contains(<substr>):bool Überprüft, ob eine Zeichenkette <s> die angegebene Teilzeichenkette <substr> enthält stream.contains(’err’)
<s>.matches(<regex>):bool Prüft, ob eine Zeichenkette <s> mit dem angegebenen Muster aus <regex> übereinstimmt hostname.matches(/prod-.*/)
<value>.in(<value1>,<value2>,...) Prüft, ob der Wert einer der angegebenen Werte ist value1-valueN region.in(’us-east’,’us-south’)

Ableitung von Datentypen

DPXL versucht, den erwarteten Datentyp von Keypaths zu ermitteln. Bei der Verarbeitung von age > 50 wird zum Beispiel gefolgert, dass age eine Zahl sein soll. In Fällen, in denen DPXL den Datentyp für einen Keypath nicht ableiten kann, benötigt es die notwendigen Informationen über den Typ. Zum Beispiel:

'123':number

region1:string == region2

my_key:number > my_other_key

Beispiele

Im Folgenden finden Sie DPXL-Beispiele, die Sie als Grundlage für Ihre eigenen DPXL-Ausdrücke verwenden können.

# 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

Einschränkungen bei der Schlussfolgerung

Die Funktion in kann nicht automatisch auf den erwarteten Typ eines Tastaturpfads schließen. Um die Funktion in zu verwenden, müssen Sie den Typ angeben. Zum Beispiel:

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