DataPrime 式言語 (DPXL) リファレンス

DataPrime Expression Language(DPXL)は、 DataPrime 式に基づく式言語です。 syntax.You ストリーミングの設定など、豊富な式ベースのフィルタを定義するために使用できます。

DPXL式はDataPrime式のサブセットであり、filter演算子で使われるようなものである。

DPXL式は予測可能性と安定性を維持するためにバージョン管理されています。 バージョン管理により、DPXLは既存の式のセマンティクスを変更することなく、時間をかけて拡張することができます。

各DPXL表現はバージョン識別子 <vX> で始まり、現在は <v1> です。 リテラル、論理構文、比較構文、キーパス・アクセス、関数を含む実際のブーリアン式がこれに続く。

<v1> <boolean-expression>

<v> 接頭辞は、UIを使うときに自動的に含まれるので、指定する必要はありません。 しかし、APIで使われるDPXL式は、<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')

データ・タイプ

DPXLは様々なデータタイプをサポートしています。

データ・タイプ
データ・タイプ
ストリング 'us-east-1’
’dev-’
number 23
-12.32
ブール true
false
タイムスタンプ @(’2023-01-01T00:00Z’)
@’now’
正規表現 /H.*o$/
/^prod-.*/
重大度 VERBOSE
DEBUG
INFO
WARNING
ERROR
CRITICAL

さらに、null リテラルがあり、これは他のすべての型と一緒に使うことができます。

オペレーター

DPXLは複数のオペレーターをサポートしています。

Operators
オペレーター 意味 記述例
&& 論理 AND country == ‘us’ && region == ‘us-south’ countryus であり、かつ regionus-south であれば真を返す。
|| 論理 OR age > 40 || country == ‘us’ age が40以上か、countryus の場合に真を返す。
! 論理 NOT !region.contains(’us-’) regionus- が含まれていなければ真を返します

オーダー

括弧を使って、式の中の評価順序を制御することができる。 以下に例を示します。

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

比較演算子

DPXLは複数の比較演算子をサポートしています。

比較演算子
オペレーター 意味
> より大きい duration > 40.5
$m.timestamp > @(’2023-01-01T00:00:00’)
>= より大か等しい duration >= 40.5
< より小さい age < 20
<= より小か等しい age <= 20
lastName <= ‘Smith’
== 等しい region == 'us-south'
!= 等しくない first_name != 'joe'

キーパス

キーパスは3つの異なる部分に分けられ、それぞれ別の接頭辞を持つ:

$m
メタデータ
$l
applicationnamesubsystemName のようなラベル
$d
ユーザーデータ(デフォルトプレフィックス)

$m- メタデータのキーパス

メタデータのキーパス
キーパス データ・タイプ 説明
$m.timestamp タイムスタンプ イベントのタイムスタンプを含む
$m.severity 重大度 イベントの重大度を含む

$l- ラベルのキーパス

ログのキーパスにラベルを付ける
キーパス データ・タイプ
$l.applicationname ストリング
$l.subsystemname ストリング

$d- ユーザーデータのキーパス

ネストしたキーパスも含めて、$d.<keypath> を使えばどのユーザーキーパスにもアクセスできます。

$d はデフォルトの接頭辞です。 プレフィックスを含まないキーパスは、ユーザー・データ・フィールドとみなされる。

関数

関数はDPXL式に追加機能を提供します。

関数
関数 説明
<s>.startsWith(<substr>):bool 文字列 <s> が指定された部分文字列 <substr> で始まるかどうかをチェックする region.startsWith('us-')
<s>.endsWith(<substr>):bool 文字列 <s> が指定された部分文字列 <substr> で終わるかどうかをチェックする firstName.endsWith(’Jo’)
<s>.contains(<substr>):bool 文字列 <s> が指定された部分文字列 <substr> を含むかどうかをチェックする stream.contains(’err’)
<s>.matches(<regex>):bool 文字列 <s> が、<regex> で指定されたパターンにマッチするかどうかを調べます hostname.matches(/prod-.*/)
<value>.in(<value1>,<value2>,...) valueが提供された値のいずれかであるかどうかをチェックする value1-valueN region.in(’us-east’,’us-south’)

データ型の推測

DPXLはキーパスのデータ型を推測しようとする。 例えば、age > 50 を処理するとき、age は数字であると推測されます。 DPXLがキーパスのデータ型を推測できない場合、データ型に関する必要な情報を要求する。 以下に例を示します。

'123':number

region1:string == region2

my_key:number > my_other_key

以下はDPXLの例で、独自の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

推論の限界

in 関数は、キーパスに期待されるタイプを自動的に推測することはできません。 in 関数を使うには、型を示す必要があります。 以下に例を示します。

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