Utilizzare Common Expression Language

Common Expression Language (CEL) è un linguaggio open source non Turing completo che può essere utilizzato per valutare le espressioni. Ogni registrazione in Eventarc Advanced include un'espressione di condizione scritta in CEL che viene utilizzata per valutare e filtrare i messaggi. Puoi anche trasformare i contenuti dei dati degli eventi scrivendo espressioni di trasformazione utilizzando CEL.

In generale, un'espressione di condizione è costituita da una o più istruzioni unite da operatori logici (&&, || o !). Ogni istruzione esprime una regola basata sugli attributi che viene applicata ai dati. In genere, gli operatori vengono utilizzati per confrontare il valore contenuto in una variabile con un valore letterale.

Ad esempio, se il valore di message.type è google.cloud.dataflow.job.v1beta3.statusChanged, l'espressione message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" restituisce True.

Per ulteriori informazioni, consulta le seguenti risorse:

Attributi disponibili

È possibile accedere a tutti gli attributi del contesto dell'evento come variabili tramite un oggetto message predefinito. Queste variabili vengono compilate con valori basati sugli attributi di contesto dell'evento in fase di runtime. Una registrazione può utilizzare una variabile per esprimere un determinato attributo. Ad esempio, message.type restituisce il valore dell'attributo type.

Tieni presente quanto segue:

  • Gli eventi possono includere e le registrazioni possono utilizzare un numero qualsiasi di attributi CloudEvents personalizzati aggiuntivi con nomi distinti (noti anche come attributi di estensione). Tuttavia, nelle espressioni CEL sono rappresentati come tipi String indipendentemente dal loro formato effettivo. Puoi utilizzare un'espressione CEL per eseguire il cast dei valori in altri tipi.

  • Non puoi valutare le registrazioni in base ai contenuti del payload dell'evento. message.data e message.data_base64 sono variabili riservate e non possono essere utilizzate nelle espressioni. Tuttavia, CEL è supportato quando vengono trasformati i dati degli eventi, il che ti consente di modificare il contenuto del payload degli eventi (ad esempio, per soddisfare il contratto API per una destinazione specifica).

È possibile accedere ai seguenti attributi durante la valutazione delle espressioni di condizione per una registrazione:

Attributo Tipo di attributo Descrizione
message.datacontenttype String Il tipo di contenuti del valore data
message.dataschema URI Identifica lo schema a cui aderisce data
message.id String Identifica l'evento. I produttori devono assicurarsi che source + id sia univoco per ogni evento distinto.
message.source URI-reference Identifica il contesto in cui si è verificato un evento.
message.specversion String La versione della specifica CloudEvents utilizzata dall'evento
message.subject String Descrive l'argomento dell'evento nel contesto del produttore dell'evento (identificato da source)
message.time Timestamp Timestamp dell'evento; potrebbe essere impostato su un altro orario (ad esempio l'ora corrente) dal produttore di CloudEvents; tuttavia, tutti i produttori per lo stesso source devono essere coerenti
message.type String Descrive il tipo di evento correlato all'occorrenza di origine

Operatori e funzioni

Puoi utilizzare operatori e funzioni per creare espressioni logiche complesse.

Gli operatori logici, come &&, ||, e !, consentono di verificare più variabili in un'espressione condizionale. Ad esempio, message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" unisce due istruzioni e richiede che entrambe siano True per produrre un risultato complessivo di True.

Gli operatori di manipolazione delle stringhe, come x.contains('y'), corrispondono a stringhe o sottostringhe che definisci e ti consentono di sviluppare regole per trovare corrispondenze nei messaggi senza elencare ogni possibile combinazione.

Eventarc Advanced supporta anche le funzioni di estensione, come merge e flatten, che possono essere utilizzate per trasformare i dati e semplificare la modifica degli eventi ricevuti da un bus.

Consulta l'elenco degli operatori e delle funzioni predefiniti di CEL e delle macro predefinite di CEL.

Operatori logici

La seguente tabella descrive gli operatori logici supportati da Eventarc Advanced.

Espressione Descrizione
x == "my_string" Restituisce True se x è uguale all'argomento letterale stringa costante.
x == R"my_string\n" Restituisce True se x è uguale al valore letterale della stringa non elaborata specificata che non interpreta le sequenze di escape. I valori letterali delle stringhe non elaborate sono utili per esprimere stringhe che devono utilizzare sequenze di escape, come espressioni regolari o testo del programma.
x == y Restituisce True se x è uguale a y.
x != y Restituisce True se x non è uguale a y.
x && y Restituisce True se sia x che y sono True.
x || y Restituisce True se x, y o entrambi sono True.
!x Restituisce True se il valore booleano x è False oppure restituisce False se il valore booleano x è True.
m['k'] Se è presente la chiave k, restituisce il valore della chiave k nella mappa stringa-stringa m. Se la chiave k non è presente, restituisce un errore che fa sì che la regola in valutazione non corrisponda.

Operatori di manipolazione delle stringhe

La seguente tabella descrive gli operatori di manipolazione delle stringhe supportati da Eventarc Advanced.

Espressione Descrizione
double(x) Converte il risultato della stringa di x in un tipo double. La stringa convertita può essere utilizzata per confrontare numeri in virgola mobile con operatori aritmetici standard come > e <=. Questa opzione funziona solo per i valori che possono essere numeri in virgola mobile.
int(x) Converte il risultato della stringa di x in un tipo int. La stringa convertita può essere utilizzata per confrontare numeri interi con operatori aritmetici standard come > e <=. Funziona solo per i valori che possono essere numeri interi.
x + y Restituisce la stringa concatenata xy.
x.contains(y) Restituisce True se la stringa x contiene la sottostringa y.
x.endsWith(y) Restituisce True se la stringa x termina con la sottostringa y.
x.join() Restituisce una nuova stringa in cui gli elementi di un elenco di stringhe sono concatenati. Accetta un separatore facoltativo che viene inserito tra gli elementi della stringa risultante. Ad esempio, la seguente espressione restituisce 'hello world':

['hello', 'world'].join(' ')

x.lowerAscii() Restituisce una nuova stringa in cui tutti i caratteri ASCII sono minuscoli.
x.matches(y)

Restituisce True se la stringa x corrisponde al pattern RE2 specificato y.

Il pattern RE2 viene compilato utilizzando l'opzione RE2::Latin1 che disabilita le funzionalità Unicode.

x.replace(y,z) Restituisce una nuova stringa in cui le occorrenze della sottostringa y vengono sostituite dalla sottostringa z. Accetta un argomento facoltativo che limita il numero di sostituzioni da effettuare. Ad esempio, la seguente espressione restituisce 'wello hello':

'hello hello'.replace('he', 'we', 1)

x.split(y) Restituisce un elenco di stringhe suddivise dall'input in base al separatore y. Accetta un argomento facoltativo che limita il numero di sottostringhe da produrre. Ad esempio, la seguente espressione restituisce ['hello', 'hello hello']:

'hello hello hello'.split(' ', 2)

x.startsWith(y) Restituisce True se la stringa x inizia con la sottostringa y.
x.upperAscii() Restituisce una nuova stringa in cui tutti i caratteri ASCII sono maiuscoli.

Funzioni di espressioni regolari

La tabella seguente descrive le funzioni di espressioni regolari supportate da Eventarc Advanced.

Espressione Descrizione
re.capture(target,regex)

Utilizza regex per acquisire il primo valore del gruppo senza nome o con nome nella stringa target e restituisce una stringa. Ad esempio, la seguente espressione restituisce "o":

re.capture("hello", R"hell(o)")

re.captureN(target,regex) Utilizza regex per acquisire il nome e la stringa del gruppo (per i gruppi denominati) e l'indice e la stringa del gruppo (per i gruppi senza nome) dalla stringa target e restituisce una mappa di coppie chiave-valore. Ad esempio, la seguente espressione restituisce {"1": "user", "Username": "testuser", "Domain": "testdomain"}:

re.captureN("The user testuser belongs to testdomain", R"The (user|domain) (?P.*) belongs to (?P.*)")

re.extract(target,regex,rewrite) Utilizza regex per estrarre i valori dei gruppi corrispondenti dalla stringa target e restituisce una stringa dei valori estratti formattata in base all'argomento rewrite. Ad esempio, la seguente espressione restituisce "example.com":

re.extract("alex@example.com", "(^.*@)(.*)", "\\2")

x.matches(regex)

Restituisce True se la stringa x corrisponde al pattern RE2 specificato regex.

Il pattern RE2 viene compilato utilizzando l'opzione RE2::Latin1 che disabilita le funzionalità Unicode.

Le espressioni regolari seguono la sintassi RE2. Tieni presente che il R che precede le espressioni regolari indica una stringa non elaborata che non richiede l'escape.

Funzioni di estensione

Eventarc Advanced supporta determinate funzioni di estensione che possono essere utilizzate per trasformare i dati sugli eventi ricevuti tramite un bus. Per maggiori informazioni ed esempi, vedi Trasformare gli eventi ricevuti.

Passaggi successivi