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. Sie können auch den Inhalt Ihrer Ereignisdaten transformieren, indem Sie Transformationsausdrücke mit CEL schreiben.

Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die durch logische 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" 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 von Attributen des Ereigniskontexts mit Werten gefüllt. Bei einer Registrierung kann eine Variable verwendet werden, um ein bestimmtes Attribut auszudrücken. Mit message.type wird beispielsweise der Wert des Attributs type zurückgegeben.

Wichtige Hinweise:

  • Ereignisse können eine beliebige Anzahl zusätzlicher benutzerdefinierter CloudEvents-Attribute mit eindeutigen Namen (auch als Erweiterungsattribute bezeichnet) enthalten und Registrierungen können diese verwenden. In CEL-Ausdrücken werden sie jedoch unabhängig von ihrem tatsächlichen Format als String-Typen dargestellt. Mit einem CEL-Ausdruck können Sie ihre Werte in andere Typen umwandeln.

  • Sie können Registrierungen 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 beim Transformieren von Ereignisdaten unterstützt. So können Sie den Inhalt der Ereignisnutzlast ändern, um beispielsweise dem API-Vertrag eines bestimmten Ziels zu entsprechen.

Beim Auswerten von Bedingungsausdrücken für eine Registrierung kann auf die folgenden Attribute zugegriffen werden:

Attribut Attributtyp Beschreibung
message.datacontenttype String Der Inhaltstyp des data-Werts
message.dataschema URI Gibt das Schema an, das data entspricht.
message.id String Gibt das Ereignis an. Feedersteller müssen dafür sorgen, dass source + id für jedes Event 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 Subjekt des Ereignisses im Kontext des Ereignisproduzenten (identifiziert durch source).
message.time Timestamp Zeitstempel des Ereignisses. Er kann vom CloudEvents-Ersteller auf eine andere Zeit (z. B. die aktuelle Zeit) festgelegt werden. Alle Ersteller für dieselbe source müssen jedoch konsistent sein.
message.type String Beschreibt den Ereignistyp, der mit dem ursprünglichen Ereignis zusammenhängt.

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 bedingten Ausdruck 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 ist.

Mit Operatoren zur Stringbearbeitung wie x.contains('y') können Sie Strings oder Teilstrings abgleichen, die Sie definieren. So können Sie Regeln entwickeln, mit denen Nachrichten abgeglichen werden, ohne dass Sie jede mögliche Kombination auflisten 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 kann.

Liste der vordefinierten CEL-Operatoren und -Funktionen und Liste 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 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 ungleich y ist.
x && y Gibt True zurück, wenn sowohl x als auch y gleich 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, 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 String-Bearbeitung

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

Ausdruck Beschreibung
double(x) Wandelt das Stringergebnis von x in einen double-Typ um. Der konvertierte String kann verwendet werden, um Gleitkommazahlen mit standardmäßigen arithmetischen Operatoren wie > und <= zu vergleichen. Das funktioniert nur für Werte, die Gleitkommazahlen sein können.
int(x) Wandelt das Stringergebnis von x in einen int-Typ um. Der konvertierte String kann verwendet werden, um Ganzzahlen mit standardmäßigen arithmetischen Operatoren wie > und <= zu vergleichen. Dies 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 werden. Akzeptiert ein optionales Trennzeichen, das zwischen den Elementen im resultierenden String platziert wird. 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 umgewandelt 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. 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 aus der Eingabe getrennt wurden. Akzeptiert ein optionales Argument, das die Anzahl der zu erstellenden Teilstrings begrenzt. 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 umgewandelt 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 unbenannte oder benannte Gruppenwert im String target 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. Es wird eine Map mit Schlüssel/Wert-Paaren 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 Gruppierungswerte aus dem String target extrahiert. Es wird 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. Beachten Sie, dass das R vor den regulären Ausdrücken einen Rohstring angibt, für den keine Escapezeichen 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