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.
| Datentyp | Beispiel |
|---|---|
| Zeichenfolge | 'us-east-1’’dev-’ |
| Zahl | 23-12.32 |
| bool | truefalse |
| timestamp | @(’2023-01-01T00:00Z’)@’now’ |
| Regulärer Ausdruck | /H.*o$//^prod-.*/ |
| severity | VERBOSEDEBUGINFOWARNINGERRORCRITICAL |
Darüber hinaus gibt es ein null-Literal, das mit allen anderen Typen verwendet werden kann.
Operatoren
DPXL unterstützt mehrere 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.
| 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 <= 20lastName <= ‘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
applicationnameodersubsystemName $d- Benutzerdaten (Standardpräfix)
$m- Metadaten-Schlüsselpfade
| 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
| 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.
| 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')