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, mit dem Nachrichten ausgewertet und gefiltert werden. Sie können Ihre Ereignisdaten auch transformieren, indem Sie Transformationsausdrücke mit CEL schreiben.

Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die mithilfe von logischen Operatoren (&&, || oder !) verbunden sind. 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" zu True ausgewertet.

Hier finden Sie weitere Informationen:

Verfügbare Attribute

Auf alle Ereigniskontextattribute kann über ein vordefiniertes message-Objekt als Variable zugegriffen werden. Diese Variablen werden zur Laufzeit anhand von Ereigniskontextattributen mit Werten gefüllt. Bei einer Registrierung kann ein bestimmtes Attribut durch eine Variable ausgedrückt werden. message.type gibt beispielsweise den Wert des Attributs type zurück.

Wichtige Hinweise:

  • Ereignisse können beliebig viele zusätzliche benutzerdefinierte CloudEvents-Attribute mit unterschiedlichen Namen enthalten und für Registrierungen verwendet werden (auch Erweiterungsattribute genannt). Sie werden jedoch in CEL-Ausdrücken unabhängig von ihrem tatsächlichen Format als String-Typen dargestellt. Mit einem CEL-Ausdruck können Sie die Werte in andere Typen umwandeln.

  • Sie können Anmeldungen nicht anhand des Inhalts der Ereignisnutzlast auswerten. Sowohl message.data als auch message.data_base64 sind reservierte Variablen und können nicht in Ausdrücken verwendet werden. CEL wird jedoch bei der Transformation von Ereignisdaten unterstützt. So können Sie den Inhalt der Ereignisnutzlast ändern, um beispielsweise den API-Vertrag für ein bestimmtes Ziel zu erfüllen.

Bei der Auswertung von Bedingungsausdrücken für eine Registrierung können die folgenden Attribute abgerufen werden:

Attribut Attributtyp Beschreibung
message.datacontenttype String Der Inhaltstyp des data-Werts
message.dataschema URI Gibt das Schema an, an das data entspricht
message.id String Identifiziert das Ereignis. Feedersteller 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 Ereigniserstellers (source)
message.time Timestamp Zeitstempel des Auftretens des Ereignisses. Kann vom CloudEvents-Produzenten auf eine andere Zeit (z. B. die aktuelle Zeit) festgelegt werden. Alle Produzenten für dieselbe source müssen jedoch konsistent sein.
message.type String Beschreibt die Art des Ereignisses im Zusammenhang mit dem ursprünglichen Ereignis.

Operatoren und Funktionen

Mit Operatoren und Funktionen können Sie komplexe logische Ausdrücke erstellen.

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

Mit Stringmanipulationsoperatoren wie x.contains('y') können Sie Strings oder Teilstrings abgleichen, die Sie definieren. So können Sie Regeln für den Abgleich von Nachrichten entwickeln, ohne jede mögliche Kombination auflisten zu müssen.

Eventarc Advanced unterstützt auch Erweiterungsfunktionen wie merge und flatten, mit denen Daten transformiert und die Änderung von Ereignissen, die von einem Bus empfangen werden, vereinfacht werden können.

Weitere Informationen finden Sie in den Listen der vordefinierten CEL-Operatoren und -Funktionen und der vordefinierten CEL-Makros.

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 Stringliteralargument 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 Programmtext.
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 True sind.
x || y Gibt True zurück, wenn x, y oder beide True sind.
!x Gibt True zurück, wenn der boolesche Wert x False ist, oder False, wenn der boolesche Wert x True ist.
m['k'] Wenn der Schlüssel k vorhanden ist, gibt das Attribut den Wert bei Schlüssel k in der String-zu-String-Zuordnung m zurück. Wenn der Schlüssel k nicht vorhanden ist, wird ein Fehler zurückgegeben, der dazu führt, dass die zu prüfende Regel nicht übereinstimmt.

Operatoren zur Stringmanipulation

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

Ausdruck Beschreibung
double(x) Wandelt das Stringergebnis von x in einen double-Typ um. Mit dem konvertierten String können Gleitkommazahlen mit standardmäßigen arithmetischen Operatoren wie > und <= verglichen werden. Dies funktioniert nur für Werte, die als Gleitkommazahlen dargestellt werden können.
int(x) Wandelt das Stringergebnis von x in einen int-Typ um. Der konvertierte String kann zum Vergleichen von Ganzzahlen mit standardmäßigen arithmetischen Operatoren wie > und <= verwendet werden. Dies funktioniert nur bei Werten, die ganze Zahlen 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. Es kann ein optionales Trennzeichen zwischen den Elementen im resultierenden String verwendet werden. Der folgende Ausdruck gibt beispielsweise 'hello world' zurück:

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

x.lowerAscii() Gibt einen neuen String zurück, in dem alle ASCII-Zeichen in Kleinbuchstaben geschrieben 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. Nimmt ein optionales Argument an, mit dem die Anzahl der Ersetzungen begrenzt wird. Der folgende Ausdruck gibt beispielsweise '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 von der Eingabe getrennt wurden. Nimmt ein optionales Argument an, mit dem die Anzahl der zu generierenden Teilstrings begrenzt wird. Der folgende Ausdruck gibt beispielsweise ['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 in Großbuchstaben geschrieben sind.

Funktionen für reguläre Ausdrücke

In der folgenden Tabelle werden die regulären Ausdrucksfunktionen beschrieben, die von Eventarc Advanced unterstützt werden.

Ausdruck Beschreibung
re.capture(target,regex)

Mit regex wird der erste benannte oder unbenannte Gruppenwert im target-String erfasst und ein String zurückgegeben. Der folgende Ausdruck gibt beispielsweise "o" zurück:

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

re.captureN(target,regex) Mit regex werden der Gruppenname und der String (für benannte Gruppen) sowie der Gruppenindex und der String (für unbenannte Gruppen) aus dem String target erfasst und eine Zuordnung von Schlüssel- und Wertpaaren zurückgegeben. Der folgende Ausdruck gibt beispielsweise {"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) Mit regex werden übereinstimmende Gruppenwerte aus dem String target extrahiert und ein String mit den extrahierten Werten zurückgegeben, der basierend auf dem Argument rewrite formatiert ist. Der folgende Ausdruck gibt beispielsweise "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 Rohstring an, der nicht mit einem Escapezeichen maskiert werden muss.

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