DataPrime Referência da linguagem de expressão (DPXL)

A DataPrime Expression Language (Linguagem de expressão ), ou DPXL, é uma linguagem de expressão baseada na expressão DataPrime. syntax.You pode usá-la para definir filtros baseados em expressões ricas, como na configuração de streaming.

As expressões DPXL são um subconjunto das expressões DataPrime, como as usadas no operador de filtro.

As expressões DPXL são versionadas para manter a previsibilidade e a estabilidade. Com o controle de versão, a DPXL pode ser aprimorada ao longo do tempo sem alterar a semântica das expressões existentes.

Cada expressão DPXL começa com um identificador de versão <vX>, atualmente <v1>. Em seguida, vem a expressão booleana propriamente dita, incluindo literais, construções lógicas e de comparação, acesso ao caminho-chave e funções.

<v1> <boolean-expression>

O prefixo <v> é incluído automaticamente ao usar a interface do usuário e não precisa ser especificado. No entanto, uma expressão DPXL usada em uma API deve começar com o prefixo <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')

Tipos de dados

A DPXL suporta diferentes tipos de dados.

Tipos de dados
Tipo de dados Exemplo
string 'us-east-1’
’dev-’
número 23
-12.32
bool true
false
registro de data e hora @(’2023-01-01T00:00Z’)
@’now’
expressão regular /H.*o$/
/^prod-.*/
gravidade VERBOSE
DEBUG
INFO
WARNING
ERROR
CRITICAL

Além disso, há um literal null, que pode ser usado com todos os outros tipos.

Operadores

A DPXL oferece suporte a vários operadores.

Operadores
Operador Significado Exemplo Exemplo de descrição
&& AND Lógico country == ‘us’ && region == ‘us-south’ Retornará true se tanto o country for us quanto o region for us-south.
|| OR Lógico age > 40 || country == ‘us’ Retornará verdadeiro se o age estiver acima de 40 ou se o country for us.
! NOT Lógico !region.contains(’us-’) Retornará true se o region não contiver us-

Fazendo pedidos

Você pode controlar a ordem de avaliação dentro de uma expressão usando parênteses. Por exemplo:

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

Operadores de comparação

O DPXL suporta vários operadores de comparação.

Operadores de comparação
Operador Significado Exemplos
> Maior que duration > 40.5
$m.timestamp > @(’2023-01-01T00:00:00’)
>= Maior ou igual a duration >= 40.5
< Menor que age < 20
<= Menor ou igual a age <= 20
lastName <= ‘Smith’
== Igual a region == 'us-south'
!= Diferente de first_name != 'joe'

Caminho-chave

Os caminhos-chave são divididos em três partes diferentes, cada uma com um prefixo separado:

$m
Metadados
$l
Rótulos, como applicationname ou subsystemName
$d
Dados do usuário (prefixo padrão)

$m- Caminhos-chave de metadados

Caminhos-chave de metadados
Caminho-chave Tipo de dados Descrição
$m.timestamp registro de data e hora Contém o registro de data e hora do evento
$m.severity gravidade Contém a gravidade do evento

$l- Rótulo de caminhos-chave

Rótulo de caminhos-chave para registros
Caminho-chave Tipo de dados
$l.applicationname string
$l.subsystemname string

$d- Caminhos-chave dos dados do usuário

Qualquer caminho de chave do usuário pode ser acessado usando $d.<keypath>, inclusive caminhos de chave aninhados.

$d é o prefixo padrão. Qualquer keypath que não contenha um prefixo será considerado um campo de dados do usuário.

Funções

As funções oferecem recursos adicionais nas expressões DPXL.

Funções
Função Descrição Exemplo
<s>.startsWith(<substr>):bool Verifica se uma string <s> começa com a substring especificada <substr> region.startsWith('us-')
<s>.endsWith(<substr>):bool Verifica se uma string <s> termina com a substring especificada <substr> firstName.endsWith(’Jo’)
<s>.contains(<substr>):bool Verifica se uma string <s> contém a substring especificada <substr> stream.contains(’err’)
<s>.matches(<regex>):bool Verifica se uma string <s> corresponde ao padrão especificado fornecido pelo <regex> hostname.matches(/prod-.*/)
<value>.in(<value1>,<value2>,...) Verifica se o valor é um dos valores fornecidos value1-valueN region.in(’us-east’,’us-south’)

Inferindo tipos de dados

A DPXL tenta inferir o tipo de dados esperado dos caminhos de chave. Por exemplo, ao processar age > 50, ele deduzirá que age deve ser um número. Nos casos em que a DPXL não puder inferir o tipo de dados de um caminho de chave, ela solicitará as informações necessárias sobre o tipo. Por exemplo:

'123':number

region1:string == region2

my_key:number > my_other_key

Exemplos

A seguir, exemplos de DPXL que você pode usar como base para suas próprias expressões de 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

Limitações de inferência

A função in não pode inferir automaticamente o tipo esperado de um caminho de chave. Para usar a função in, você precisa indicar o tipo. Por exemplo:

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