Sintaxe da expressão para processamento condicional
Os processadores de pipelines do CloudWatch compatíveis com o processamento condicional aceitam um parâmetro when que contém uma expressão. Quando a expressão for avaliada como true, o processador ou a entrada será executada. As expressões usam notação de pontos (.) para acesso a campos aninhados. Por exemplo, user.role acessa o campo role dentro do objeto user. Para obter mais detalhes sobre processadores compatíveis com o processamento condicional e seus parâmetros específicos, consulte Processadores de pipelines do CloudWatch. Para exemplos de configuração da , consulte Casos de uso comuns de processador.
Condições no nível de processador e no nível de entrada
Há dois níveis em que você pode aplicar uma condição when, dependendo do processador.
- Nível de processador
when(nível externo) -
Um
wheninserido no nível superior da configuração do processador. Se a expressão for avaliada como false, todo o processador será ignorado e nenhuma operação dentro dele será executada. Todos os processadores compatíveis com o processamento condicional são compatíveis com esse nível.exemplo Condição no nível de processador: ignorar todo o processador
O processador
delete_entriesa seguir é executado somente quando o ambiente está em produção ou em teste. Se a condição for false, nenhuma das chaves será excluída.processor: - delete_entries: with_keys: ["password", "api_key", "ssn"] when: "environment in {'prod', 'staging'}" - Nível de entrada
when(dentro de cada entrada) -
Um
wheninserido dentro de uma entrada individual na matrizentries. Cada entrada é avaliada de forma independente. Se a expressão for false, somente essa entrada específica será ignorada enquanto as outras entradas no mesmo processador continuarão a ser executadas. Somente processadores com uma matrizentriessão compatíveis com esse nível (comoadd_entries,copy_values,rename_keys,move_keys,extract_valueesubstitute_string).exemplo Condição no nível de entrada: ignorar entradas individuais
O processador
add_entriesa seguir adiciona chaves diferentes, dependendo da condição de cada entrada. A primeira entrada adicionaseveritysomente quando o nível de log é ERROR. A segunda entrada sempre adicionaprocessedporque não tem nenhuma condição.processor: - add_entries: entries: - key: "severity" value: "high" when: "log.level == 'ERROR'" - key: "processed" value: "true"
Os processadores compatíveis com os dois níveis podem usá-los juntos. Quando ambos são especificados, a condição no nível do processador é avaliada primeiro. Se for false, todo o processador será ignorado e nenhuma condição no nível de entrada será avaliada.
exemplo Ambos os níveis combinados
O nível de processador when garante que todo o processador seja executado somente para tráfego de produção. Nesse nível, cada entrada tem sua própria condição para controlar qual chave é adicionada.
processor: - add_entries: when: "environment == 'prod'" entries: - key: "alert_level" value: "critical" when: "log.level == 'ERROR'" - key: "alert_level" value: "warning" when: "log.level == 'WARN'"
Para ver uma tabela que mostra quais processadores são compatíveis com qual nível, consulte a seção Compatibilidade com o processamento condicional abaixo.
Fallback com when_else
Os processadores compatíveis com condições no nível de entrada também são compatíveis com when_else. Uma entrada com when_else atua como um fallback. Ela é executada somente quando nenhuma das outras condições when no mesmo processador corresponde. O valor da expressão fornecido para when_else identifica qual conjunto de condições when considerar, mas a entrada em si é executada com base apenas no fato de todas essas condições serem avaliadas como false. Não há verificação de negação explícita. A entrada simplesmente é executada quando nenhum outro when corresponde.
exemplo Entrada de fallback com when_else
A primeira entrada é executada quando o nível de log é ERROR. A segunda entrada usa when_else e é executada somente quando a primeira condição when da entrada não corresponde (ou seja, o nível do log é diferente de ERROR).
processor: - add_entries: entries: - key: "alert_level" value: "critical" when: "log.level == 'ERROR'" - key: "alert_level" value: "info" when_else: "log.level == 'ERROR'"
Compatibilidade com o processamento condicional
A tabela a seguir mostra quais processadores são compatíveis com o processamento condicional e em que nível.
| Processor | Compatibilidade com condicional | Nível |
|---|---|---|
| add_entries | Sim | Processador e entrada |
| copy_values | Sim | Processador e entrada |
| delete_entries | Sim | Processor |
| move_keys | Sim | Processador e entrada |
| nivelamento | Sim | Processor |
| lowercase_string | Sim | Processor |
| uppercase_string | Sim | Processor |
| trim_string | Sim | Processor |
| substitute_string | Sim | Processador e entrada |
| truncate | Sim | Processor |
| extract_value | Sim | Processador e entrada |
| convert_entry_type | Sim | Processor |
| date | Sim | Processor |
| dissect | Sim | Processor |
| list_to_map | Sim | Processor |
| rename_keys | Sim | Processador e entrada |
| select_entries | Sim | Processor |
| translate | Sim | Processor |
| grok | Sim | Processor |
| drop_events | Sim | Processador (obrigatório) |
| OCSF, CSV, JSON, KeyValue, WAF, Postgres, CloudFront, VPC, Route53 | Não | — |
Operadores
| Categoria | Operadores | Exemplo |
|---|---|---|
| Relacional | <, <=, >,
>= |
status_code >= 200 and status_code < 300 |
| Igualdade | ==, != |
log.level == "ERROR" |
| Condicional | and, or, not |
log.level == "ERROR" or log.level == "FATAL" |
| Aritmética | +, -, *,
/ |
response_time * 1000 > 5000 |
| Associação a conjuntos | in, not in |
environment in {"prod", "staging", "preprod"} |
| Correspondência a Regex | =~, !~ |
message =~ "^ERROR.*timeout" |
Funções
length(value)-
Retorna o tamanho de uma string ou matriz. Exemplo:
length(message) > 100 contains(value, search)-
Verifica se uma string contém uma substring ou se uma matriz contém um elemento. Exemplo:
contains(message, "error") startsWith(field, prefix)-
Verifica se uma string começa com um prefixo especificado. Exemplo:
startsWith(message, "ERROR")
Exemplos de expressões
log.level == "ERROR" status_code >= 200 and status_code < 300 environment in {"prod", "staging", "preprod"} message =~ "^ERROR.*timeout" user.role == "admin" and user.permissions.write == true length(message) > 100 and contains(message, "error") (log.level == "ERROR" or log.level == "FATAL") and environment == "prod"
Limitações
-
O tamanho máximo de expressões é de 256 caracteres.
-
Os processadores analisadores (exceto o Grok) não são compatíveis com o processamento condicional. Isso inclui os analisadores JSON, CSV, KeyValue, WAF, Postgres, CloudFront, VPC, Route53 e OCSF.
-
Se o processador Grok for usado como analisador (primeiro processador) em um pipeline e sua condição
whenfor avaliada como false, todo o pipeline não será executado para esse evento de logs.