Common Expression Language verwenden

Common Expression Language (CEL) ist eine Open-Source-Sprache ohne Turing-Vollständigkeit, die zum Auswerten von Ausdrücken verwendet werden kann. Jede Registrierung in Eventarc Advanced enthält einen in CEL geschriebenen Bedingungsausdruck, der zum Auswerten und Filtern von Nachrichten verwendet wird. In Eventarc Advanced können Sie CEL auch für Folgendes verwenden:

  • Veröffentlichungszugriff steuern, indem Sie einen CEL-Bedingungsausdruck auf ein Attribut des Ereigniskontexts anwenden

  • Inhaltsdaten von Ereignissen transformieren, indem Sie Transformationsausdrücke mit CEL schreiben

Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die durch logische Operatoren (&&, || oder !) verknüpft werden. Jede Anweisung drückt eine attributbasierte Regel aus, die auf die Daten angewendet wird. Meist werden Operatoren verwendet, um den Wert einer Variablen mit einem Literalwert zu vergleichen.

Wenn der Wert von message.type beispielsweise google.cloud.dataflow.job.v1beta3.statusChanged ist, wird der Ausdruck message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" als True ausgewertet.

Hier finden Sie weitere Informationen:

Verfügbare Attribute

Auf alle Attribute des Ereigniskontexts kann über ein vordefiniertes message-Objekt als Variablen zugegriffen werden. Diese Variablen werden zur Laufzeit anhand der Attribute des Ereigniskontexts mit Werten gefüllt. In einer Registrierung kann eine Variable verwendet werden, um ein bestimmtes Attribut auszudrücken. Beispielsweise gibt message.type den Wert des Attributs type zurück.

Wichtige Hinweise:

  • Ereignisse können eine beliebige Anzahl zusätzlicher benutzerdefinierter CloudEvents-Attribute mit unterschiedlichen Namen enthalten und Registrierungen können diese verwenden (auch bekannt als Erweiterungsattribute). Sie werden jedoch unabhängig von ihrem tatsächlichen Format in CEL-Ausdrücken als String-Typen dargestellt. Sie können einen CEL-Ausdruck verwenden, um ihre Werte in andere Typen umzuwandeln.

  • Sie können Registrierungen nicht auswerten oder den Veröffentlichungszugriff nicht anhand des Inhalts der Ereignisnutzlast steuern. Sowohl message.data als auch message.data_base64 sind reservierte Variablen und können nicht in Ausdrücken verwendet werden. CEL wird jedoch unterstützt wenn Ereignisdaten transformiert werden , sodass Sie den Inhalt der Ereignisnutzlast ändern können (z. B. um den API-Vertrag für ein bestimmtes Ziel zu erfüllen).

Auf die folgenden Attribute kann beim Auswerten von Bedingungsausdrücken zugegriffen werden:

Attribut Attributtyp Beschreibung
message.datacontenttype String Der Inhaltstyp des data-Werts
message.dataschema URI Gibt das Schema an, an das sich die data hält
message.id String Gibt das Ereignis an. Die Producer müssen dafür sorgen, dass source + id für jedes einzelne Ereignis eindeutig ist.
message.source URI-reference Gibt den Kontext an, in dem ein Ereignis aufgetreten ist
message.specversion String Die Version der CloudEvents-Spezifikation, die für das Ereignis verwendet wird
message.subject String Beschreibt das Thema des Ereignisses im Kontext des Ereignis-Producers (identifiziert durch source)
message.time Timestamp Zeitstempel des Ereignisses. Er kann vom CloudEvents-Producer auf eine andere Zeit festgelegt werden (z. B. die aktuelle Zeit). Alle Producer für dieselbe source müssen jedoch konsistent sein.
message.type String Beschreibt den Ereignistyp im Zusammenhang mit dem ursprünglichen Ereignis. Informationen zu den von Eventarc unterstützten Google-Ereignistypen finden Sie hier.

Operatoren und Funktionen

Sie können Operatoren und Funktionen verwenden, um komplexe logische Ausdrücke zu erstellen.

Mit logischen Operatoren wie &&, || und ! können Sie mehrere Variablen in einem Bedingungsausdruck überprüfen. Beispiel: message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" verknüpft zwei Anweisungen, die beide True sein müssen, damit das Gesamtergebnis True ist.

Mit Operatoren zur Stringbearbeitung wie x.contains('y') können Sie Strings oder Teilstrings abgleichen, die Sie definieren, und Regeln entwickeln, um Nachrichten abzugleichen, ohne jede mögliche Kombination auflisten zu müssen.

Eventarc Advanced unterstützt auch Erweiterungsfunktionen wie merge und flatten, mit denen Sie Daten transformieren und die Änderung von Ereignissen vereinfachen können, die von einem Bus empfangen wurden.

Eine Liste der vordefinierten CEL-Operatoren und -Funktionen sowie der vordefinierten CEL-Makrosfinden Sie hier.

Logische Operatoren

In der folgenden Tabelle werden die logischen Operatoren beschrieben, die von Eventarc Advanced unterstützt werden.

Ausdruck Beschreibung
x == "my_string" Gibt True zurück, wenn x dem konstanten String-Literalargument entspricht.
x == R"my_string\n" Gibt True zurück, wenn x dem angegebenen Raw String-Literal entspricht, das keine Escape-Sequenzen interpretiert. Raw-String-Literale eignen sich gut für die Darstellung von Strings, die ihrerseits Escape-Sequenzen verwenden müssen, z. B. reguläre Ausdrücke oder Programmcode.
x == y Gibt True zurück, wenn x gleich y ist.
x != y Gibt True zurück, wenn x nicht gleich y ist.
x && y Gibt True zurück, wenn sowohl x als auch y sind.True
x || y Gibt True zurück, wenn x, y, oder beide sind True.
!x Gibt True zurück, wenn der boolesche Wert x False ist, oder gibt False zurück, wenn der boolesche Wert x True ist.
m['k'] Wenn der Schlüssel k vorhanden ist, wird der Wert bei Schlüssel k in der String-zu-String-Zuordnung m zurückgegeben. Wenn der Schlüssel k nicht vorhanden ist, wird ein Fehler zurückgegeben, der dazu führt, dass die auszuwertende Regel nicht übereinstimmt.

Operatoren zur Stringbearbeitung

In der folgenden Tabelle werden die Operatoren zur Stringbearbeitung beschrieben, die von Eventarc Advanced unterstützt werden.

Ausdruck Beschreibung
double(x) Konvertiert das Stringergebnis von x in einen double Typ. Der konvertierte Wert kann verwendet werden, um Gleitkommazahlen mit standardmäßigen arithmetischen Operatoren wie > und <= zu vergleichen. Das funktioniert nur bei Werten, die Gleitkommazahlen sein können.
int(x) Konvertiert das Stringergebnis von x in einen int Typ. Der konvertierte Wert kann verwendet werden, um Ganzzahlen mit standardmäßigen arithmetischen Operatoren wie > und <= zu vergleichen. Das funktioniert nur bei Werten, die Ganzzahlen sein können.
x + y Gibt den verketteten String xy zurück.
x.contains(y) Gibt True zurück, wenn der String x den Teilstring y enthält.
x.endsWith(y) Gibt True zurück, wenn der String x mit dem Teilstring y endet.
x.join() Gibt einen neuen String zurück, in dem die Elemente einer Stringliste verkettet sind. Akzeptiert ein optionales Trennzeichen, das zwischen den Elementen im resultierenden String platziert wird. Beispiel: Der folgende Ausdruck gibt 'hello world' zurück:

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

x.lowerAscii() Gibt einen neuen String zurück, in dem alle ASCII-Zeichen kleingeschrieben sind.
x.matches(y)

Gibt True zurück, wenn der String x mit dem angegebenen RE2 Muster y übereinstimmt.

Das RE2-Muster wird mithilfe der Option „RE2::Latin1“ kompiliert, die Unicode-Funktionen deaktiviert.

x.replace(y,z) Gibt einen neuen String zurück, in dem Vorkommen des Teilstrings y durch den Teilstring z ersetzt werden. Akzeptiert ein optionales Argument, das die Anzahl der Ersetzungen begrenzt. Beispiel: Der folgende Ausdruck gibt 'wello hello' zurück:

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

x.split(y) Gibt eine Liste von Strings zurück, die durch das Trennzeichen y aus der Eingabe getrennt wurden. Akzeptiert ein optionales Argument, das die Anzahl der zu erstellenden Teilstrings begrenzt. Beispiel: Der folgende Ausdruck gibt ['hello', 'hello hello'] zurück:

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

x.startsWith(y) Gibt True zurück, wenn der String x mit dem Teilstring y beginnt.
x.upperAscii() Gibt einen neuen String zurück, in dem alle ASCII-Zeichen großgeschrieben sind.

Funktionen für reguläre Ausdrücke

In der folgenden Tabelle werden die Funktionen für reguläre Ausdrücke beschrieben, die von Eventarc Advanced unterstützt werden.

Ausdruck Beschreibung
re.capture(target,regex)

Verwendet regex zum Erfassen des ersten unbenannten oder benannten Gruppenwerts im String target und gibt einen String zurück. Beispiel: Der folgende Ausdruck gibt "o" zurück:

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

re.captureN(target,regex) Verwendet regex, um den Gruppennamen und den String (für benannte Gruppen) sowie den Gruppenindex und den String (für unbenannte Gruppen) aus dem String target zu erfassen, und gibt eine Zuordnung von Schlüssel/Wert-Paaren zurück. Beispiel: Der folgende Ausdruck gibt {"1": "user", "Username": "testuser", "Domain": "testdomain"} zurück:

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

re.extract(target,regex,rewrite) Verwendet regex, um übereinstimmende Gruppenwerte aus dem target String zu extrahieren, und gibt einen String der extrahierten Werte zurück, der basierend auf dem rewrite Argument formatiert ist. Beispiel: Der folgende Ausdruck gibt "example.com" zurück:

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

x.matches(regex)

Gibt True zurück, wenn der String x mit dem angegebenen RE2 Muster regex übereinstimmt.

Das RE2-Muster wird mithilfe der Option „RE2::Latin1“ kompiliert, die Unicode-Funktionen deaktiviert.

Die regulären Ausdrücke folgen der RE2-Syntax. Das R vor den regulären Ausdrücken gibt einen Raw-String an, für den keine Escape-Sequenzen erforderlich sind.

Erweiterungsfunktionen

Eventarc Advanced unterstützt bestimmte Erweiterungsfunktionen, mit denen die über einen Bus empfangenen Ereignisdaten transformiert werden können. Weitere Informationen und Beispiele finden Sie unter Empfangene Ereignisse transformieren.

Nächste Schritte