Supervisa cambios en los recursos con condiciones

En este tema, se muestra cómo supervisar los cambios de los elementos con una condición personalizada. Consulta el tema general para obtener más información sobre las notificaciones en tiempo real.

Descripción general

Para ver solo un tipo de cambio en un recurso determinado, puedes agregar una condición a tu feed.

El objeto condition es opcional. Si un feed no tiene un objeto condition, el destino configurado recibe todas las notificaciones de cambios en los recursos.

El objeto condition tiene la siguiente estructura:

"condition": {
    "title": "...",
    "description": "...",
    "expression": "..."
}

Title y description son opcionales. Estos campos pueden ayudarte a identificar y describir la condición.

El campo expression define la expresión usada para evaluar la notificación en Common Expression Language (CEL). La expresión de la condición puede contener varias declaraciones y estas se combinan con operadores lógicos, según la especificación del lenguaje CEL.

Usa CEL

Common Expression Language (CEL) es el lenguaje de expresión que se usa para especificar una condición de feed. Está diseñado para expresar expresiones lógicas basadas en atributos. Para obtener más información, consulta las especificaciones de CEL y su definición de lenguaje.

En una condición de feed, el CEL se usa para tomar decisiones booleanas basadas en datos de atributos. Una expresión de condición consta de una o más declaraciones que se unen mediante operadores lógicos (&&, ||). Cada declaración expresa una regla de control basada en atributos que se aplica a TemporalAsset para determinar si se envía la notificación.

Las siguientes funciones de CEL son las más importantes para las condiciones del feed:

  • Variables: Las condiciones usan variables para expresar un atributo determinado, como temporal_asset.deleted (de tipo booleano) o temporal_asset.asset.name (de tipo String). Estas variables se propagan con valores según el contexto en el entorno de ejecución.

  • Operadores: Cada tipo de datos, como String, admite un conjunto de operadores que se pueden usar para crear una expresión lógica. Por lo general, los operadores se usan para comparar el valor contenido en una variable con un valor literal, como temporal_asset.asset.name == "//cloudresourcemanager.googleapis.com/projects/12345". En este ejemplo, si el valor de entrada de temporal_asset.asset.name es //cloudresourcemanager.googleapis.com/projects/12345, la expresión se evalúa como true.

  • Funciones: Una función es un operador compuesto para los tipos de datos que admiten operaciones más complejas. En las expresiones de condición, hay funciones predefinidas que se pueden usar junto con un tipo de datos determinado. Por ejemplo, temporal_asset.asset.name.contains("keyword") usa una función String que contiene y se evalúa como true si el valor de temporal_asset.asset.name contiene "palabra clave".

  • Operadores lógicos: Las condiciones admiten operadores lógicos que se pueden usar para compilar expresiones lógicas complejas a partir de declaraciones de expresiones simples: && y ||. Estos operadores lógicos permiten usar múltiples variables de entrada en una expresión de condición. Por ejemplo: temporal_asset.deleted && temporal_asset.window.start_time.getFullYear() > 2020 une dos declaraciones simples y requiere que se cumplan ambas declaraciones para producir un resultado de evaluación general true.

Para obtener más información sobre las características de CEL, consulta la definición del lenguaje.

Usa variables de condición

Las variables de condición le permiten crear condiciones para diferentes atributos. Las variables de condición admitidas son las siguientes:

  • temporal_asset: Es el cambio actual del elemento en el formato TemporalAsset. Si la condición se evalúa como verdadera, TemporalAsset se envía al destino configurado.

Ejemplos de expresiones de condición

La siguiente expresión de condición envía notificaciones sobre eventos de creación:

temporal_asset.deleted == false &&
temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST

La siguiente expresión de condición envía notificaciones para los recursos ubicados en carpetas 12345 y 23456:

"folders/12345" in temporal_asset.asset.ancestors ||
"folders/23456" in temporal_asset.asset.ancestors

La siguiente expresión de condición envía notificaciones cuando se agregan nuevas reglas permitidas a los firewalls si asset_type ya está configurado como compute.googleapis.com/Firewall en el feed.

size(temporal_asset.asset.resource.data.allowed) >
size(temporal_asset.prior_asset.resource.data.allowed)

La siguiente expresión de condición envía notificaciones para las instancias de VM con el tipo de máquina n1-standard-1 si asset_type ya está configurado como compute.googleapis.com/Instance en el feed.

temporal_asset.asset.resource.data.machineType.endsWith('/machineTypes/n1-standard-1')

La siguiente expresión de condición envía notificaciones para depósitos de almacenamiento con alguna política de IAM para allUsers, si suponemos que asset_type se establece en storage.googleapis.com/Bucket y content_type se establece en IAM_POLICY en el feed.

temporal_asset.asset.iam_policy.bindings.exists(b, b.members.exists(m, m == "allUsers"))

La siguiente expresión de condición envía una notificación cuando se borra un bucket de almacenamiento con una clave test en la etiqueta:

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

Limitaciones conocidas

  • La mayoría de los nombres de variables en las expresiones de condiciones se muestran con snake_case. La única excepción son los nombres de variables de los subcampos de data en el objeto Recurso, que se muestran con CamelCase.

  • Las expresiones de condiciones tienen un límite de longitud de 3,000 caracteres.

  • Algunas validaciones en las expresiones de condiciones se realizan durante el momento de la creación o actualización del feed. Sin embargo, esas validaciones no son integrales, especialmente las de las condiciones establecidas en el campo temporal_asset.asset.resource.data, que tiene un tipo dinámico. Recomendamos las condiciones simples para feeds con el asset_type adecuado especificado en el feed. Si se producen errores de validación durante el momento de la evaluación, no se enviará la notificación y se registrarán los errores. Más información sobre cómo ver los registros.

  • Para los tipos dinámicos de temporal_asset.asset.resource.data, las condiciones especificadas en campos faltantes activan errores de entorno de ejecución, y no se publican notificaciones. Por ejemplo, para la condición temporal_asset.asset.resource.data.name != "my_name", si falta el campo name en una actualización, la evaluación fallará y no recibirás notificaciones. Si tu condición solo funciona en presencia de ciertos campos, verifica la existencia en la condición para asegurarte de que se evalúe de forma apropiada.

  • Los tipos de enumeración estáticas pueden aparecer como nombres de rutas completamente calificados o números enteros sin procesar. Por ejemplo, las siguientes expresiones son válidas para prior_asset_state:

    temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST
    

    y

    temporal_asset.prior_asset_state == 3
    

    Los tipos de enumeración dinámicos de temporal_asset.asset.resource.data se representan como strings sin procesar. Por ejemplo, la siguiente expresión es válida para el tipo de recurso cloudresourcemanager.googleapis.com/Project:

    temporal_asset.asset.resource.data.lifecycleState == "ACTIVE"