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 |
| ブール | truefalse |
| タイムスタンプ | @(’2023-01-01T00:00Z’)@’now’ |
| 正規表現 | /H.*o$//^prod-.*/ |
| 重大度 | VERBOSEDEBUGINFOWARNINGERRORCRITICAL |
さらに、null リテラルがあり、これは他のすべての型と一緒に使うことができます。
オペレーター
DPXLは複数のオペレーターをサポートしています。
| オペレーター | 意味 | 例 | 記述例 |
|---|---|---|---|
&& |
論理 AND | country == ‘us’ && region == ‘us-south’ |
country が us であり、かつ region が us-south であれば真を返す。 |
|| |
論理 OR | age > 40 || country == ‘us’ |
age が40以上か、country が us の場合に真を返す。 |
! |
論理 NOT | !region.contains(’us-’) |
region に us- が含まれていなければ真を返します |
オーダー
括弧を使って、式の中の評価順序を制御することができる。 以下に例を示します。
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 <= 20lastName <= ‘Smith’ |
== |
等しい | region == 'us-south' |
!= |
等しくない | first_name != 'joe' |
キーパス
キーパスは3つの異なる部分に分けられ、それぞれ別の接頭辞を持つ:
$m- メタデータ
$lapplicationnameやsubsystemNameのようなラベル$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')