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.
| Tipo de dados | Exemplo |
|---|---|
| string | 'us-east-1’’dev-’ |
| número | 23-12.32 |
| bool | truefalse |
| registro de data e hora | @(’2023-01-01T00:00Z’)@’now’ |
| expressão regular | /H.*o$//^prod-.*/ |
| gravidade | VERBOSEDEBUGINFOWARNINGERRORCRITICAL |
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.
| 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.
| 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 <= 20lastName <= ‘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
applicationnameousubsystemName $d- Dados do usuário (prefixo padrão)
$m- 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
| 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çã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')