Neste tópico, veja como monitorar alterações de recursos com uma condição personalizada. Saiba mais sobre notificações em tempo real no tópico geral.
Informações gerais
Para visualizar apenas determinado tipo de alteração de um determinado recurso, você pode adicionar uma condição ao seu feed.
O objeto condition
é opcional. Se um feed não tiver um objeto condition
,
o destino configurado receberá todas as alterações nos recursos.
O objeto condition
tem a seguinte estrutura:
"condition": {
"title": "...",
"description": "...",
"expression": "..."
}
Title
e description
são opcionais. Esses campos podem ajudar a identificar e
descrever a condição.
O campo expression
define a expressão usada para avaliar a notificação
em Common Expression Language (CEL). A
expressão condicional pode conter várias instruções, e as instruções são
combinadas com operadores lógicos, seguindo a especificação da linguagem CEL.
Como usar CEL
Common Expression Language (CEL) é a linguagem usada para especificar uma condição de feed. Ela é personalizada para expressar expressões lógicas baseadas em atributos. Para mais informações, consulte a especificação da CEL e a respectiva definição de linguagem (links em inglês).
Em uma condição de feed, a CEL é usada para tomar decisões booleanas com base nos dados do
atributo. Uma expressão condicional consiste em uma ou mais instruções que são unidas usando operadores lógicos (&&
, ||
). Cada instrução expressa uma regra de controle baseada em atributos que se aplica a TemporalAsset
para determinar se a notificação será enviada.
Os seguintes recursos de CEL são os mais importantes para as condições do feed:
Variáveis:as condições usam variáveis para expressar um determinado atributo, como
temporal_asset.deleted
(do tipo booleano) outemporal_asset.asset.name
(do tipoString
). Essas variáveis são preenchidas com valores com base no contexto no ambiente de execução.Operadores:cada tipo de dados, como
String
, oferece suporte a um conjunto de operadores que podem ser usados para criar uma expressão lógica. Geralmente, os operadores são usados para comparar o valor contido em uma variável com um valor literal, comotemporal_asset.asset.name == "//cloudresourcemanager.googleapis.com/projects/12345"
. Neste exemplo, se o valor de entrada detemporal_asset.asset.name
for//cloudresourcemanager.googleapis.com/projects/12345
, a expressão será avaliada comotrue
.Funções:uma função é um operador composto para tipos de dados que aceitam operações mais complexas. Em expressões condicionais, existem funções predefinidas que podem ser usadas em conjunto com um determinado tipo de dados. Por exemplo,
temporal_asset.asset.name.contains("keyword")
usa uma função "contains"String
e será avaliado comotrue
se o valor detemporal_asset.asset.name
tiver "palavra-chave".Operadores lógicos:as condições são compatíveis com operadores lógicos que podem ser usados para criar expressões lógicas complexas a partir de instruções de expressão simples:
&&
e||
. Esses operadores lógicos possibilitam o uso de várias variáveis de entrada em uma expressão condicional. Por exemplo:temporal_asset.deleted && temporal_asset.window.start_time.getFullYear() > 2020
une duas instruções simples e exige que ambas sejam atendidas para produzir um resultado de avaliação geraltrue
.
Para mais informações sobre os recursos de CEL, consulte a definição de linguagem.
Como usar variáveis de condição
As variáveis de condição permitem que você crie condições em atributos diferentes. As variáveis de condição compatíveis são:
- temporal_asset::a mudança atual do recurso no formato
TemporalAsset. Se a condição for avaliada como verdadeira, o
TemporalAsset
será enviado para o destino configurado.
Exemplo de expressões condicionais
A expressão de condição a seguir envia notificações sobre eventos de criação:
temporal_asset.deleted == false &&
temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST
A expressão de condição a seguir envia notificações para os recursos que estão
localizados nas pastas 12345
e 23456
:
"folders/12345" in temporal_asset.asset.ancestors ||
"folders/23456" in temporal_asset.asset.ancestors
A expressão de condição a seguir enviará notificações quando novas regras permitidas
forem adicionadas aos firewalls, supondo que asset_type
já esteja definido como
compute.googleapis.com/Firewall
no feed.
size(temporal_asset.asset.resource.data.allowed) >
size(temporal_asset.prior_asset.resource.data.allowed)
A expressão de condição a seguir envia notificações para instâncias de VM com o tipo de máquina
n1-standard-1
, supondo que
asset_type
já esteja definido como
compute.googleapis.com/Instance
no feed.
temporal_asset.asset.resource.data.machineType.endsWith('/machineTypes/n1-standard-1')
A expressão de condição a seguir envia notificações para buckets de armazenamento com
qualquer política de IAM para allUsers
, supondo que asset_type
esteja definido como
storage.googleapis.com/Bucket
e content_type
esteja definido como IAM_POLICY
no
feed.
temporal_asset.asset.iam_policy.bindings.exists(b, b.members.exists(m, m == "allUsers"))
A expressão de condição a seguir envia uma notificação quando um bucket de armazenamento com uma chave test
no rótulo é excluído:
temporal_asset.deleted == true && temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.PRESENT && "test" in temporal_asset.prior_asset.resource.data.labels
Limitações conhecidas
A maioria dos nomes de variáveis em expressões de condição é representada em snake_case. A única exceção são os nomes de variáveis dos subcampos de
data
no objeto Recurso, representados em camelCase.As expressões de condição têm um limite de 3.000 caracteres.
Algumas validações em expressões de condição são realizadas durante a criação/atualização do feed. No entanto, essas validações não são abrangentes, especialmente para condições definidas no campo
temporal_asset.asset.resource.data
, que tem tipo dinâmico. Recomendamos condições de feed simples com oasset_type
adequado especificado no feed. Se ocorrerem erros de validação durante o tempo de avaliação, a notificação não será enviada e os erros serão registrados. Saiba mais sobre como visualizar registros.Para tipos dinâmicos em
temporal_asset.asset.resource.data
, as condições especificadas em campos ausentes acionam erros de ambiente de execução, e as notificações não são publicadas. Por exemplo, para a condiçãotemporal_asset.asset.resource.data.name != "my_name"
, se o camponame
estiver ausente em uma atualização, a avaliação falhará e você não receberá notificações. Se sua condição funcionar apenas na presença de determinados campos, verifique a existência na condição para garantir que ela seja avaliada corretamente.Os tipos de enumeração estáticos podem ser representados como nomes de caminho totalmente qualificados ou inteiros brutos. Por exemplo, as expressões a seguir são válidas para
prior_asset_state
:temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST
e
temporal_asset.prior_asset_state == 3
Os tipos de enumeração dinâmica em
temporal_asset.asset.resource.data
são representados como strings brutas. Por exemplo, a expressão a seguir é válida para o tipo de recursocloudresourcemanager.googleapis.com/Project
:temporal_asset.asset.resource.data.lifecycleState == "ACTIVE"