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 Bedingungsausdruck, der in CEL geschrieben ist und zum Auswerten und Filtern von Nachrichten verwendet wird. In Eventarc Advanced können Sie mit CEL auch Folgendes tun:
Veröffentlichungszugriff steuern, indem Sie einen CEL-Bedingungsausdruck auf ein Attribut des Ereigniskontexts anwenden
Inhalte 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. Am häufigsten 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:
- Registrierung erstellen, um Ereignisse zu empfangen
- Veröffentlichungszugriff steuern
- Empfangene Ereignisse transformieren
- CEL-Sprachdefinition
Verfügbare Attribute
Auf alle Ereigniskontextattribute kann als Variablen über ein vordefiniertes message-Objekt zugegriffen werden. Diese Variablen werden zur Laufzeit mit Werten auf Grundlage von Attributen des Ereigniskontexts gefüllt. Bei einer Registrierung kann eine Variable verwendet werden, um ein bestimmtes Attribut auszudrücken. message.type gibt beispielsweise den Wert des Attributs type zurück.
Wichtige Hinweise:
Ereignisse können eine beliebige Anzahl zusätzlicher benutzerdefinierter CloudEvents-Attribute mit unterschiedlichen 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. Sie können einen CEL-Ausdruck verwenden, um ihre Werte in andere Typen umzuwandeln.Sie können Registrierungen nicht anhand des Inhalts der Ereignisnutzlast auswerten oder den Veröffentlichungszugriff steuern. Sowohl
message.dataals auchmessage.data_base64sind 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 für ein bestimmtes Ziel zu entsprechen.
Beim Auswerten von Bedingungsausdrücken 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, an das sich data hält. |
message.id |
String |
Kennzeichnet das Event. Produzenten 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 Thema des Ereignisses im Kontext des Veranstalters (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 sich auf das ursprüngliche Ereignis bezieht. Weitere Informationen finden Sie unter Von Eventarc unterstützte Google-Ereignistypen. |
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 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 gleich dem konstanten Stringliteral-Argument ist. |
x == R"my_string\n" |
Gibt True zurück, wenn x dem angegebenen Rohstringliteral entspricht, in dem Escape-Sequenzen nicht interpretiert werden. Raw-String-Literale sind praktisch, um Strings auszudrücken, die selbst 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 ungleich 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, wird der Wert für den 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 für die Stringbearbeitung
In der folgenden Tabelle werden die Operatoren zur Stringbearbeitung beschrieben, die von Eventarc Advanced unterstützt werden.
| Ausdruck | Beschreibung |
|---|---|
double(x) |
Wandelt das String-Ergebnis von x in einen double-Typ um. Der konvertierte Wert kann verwendet werden, um Gleitkommazahlen mit arithmetischen Standardoperatoren wie > und <= zu vergleichen. Das funktioniert nur für Werte, die Gleitkommazahlen sein können. |
int(x) |
Wandelt das String-Ergebnis von x in einen int-Typ um. Der konvertierte Wert 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 die Elemente im resultierenden String eingefügt wird. Der folgende Ausdruck gibt beispielsweise 'hello world' zurück:
|
x.lowerAscii() |
Gibt einen neuen String zurück, in dem alle ASCII-Zeichen in Kleinbuchstaben umgewandelt wurden. |
x.matches(y) |
Gibt 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, mit dem die Anzahl der Ersetzungen begrenzt wird. Der folgende Ausdruck gibt beispielsweise 'wello hello' zurück:
|
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:
|
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 dargestellt werden. |
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) |
Verwendet
|
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 target-String erfasst. Die Funktion gibt eine Zuordnung von Schlüssel- und Wertepaaren zurück. Der folgende Ausdruck gibt beispielsweise {"1": "user", "Username": "testuser", "Domain": "testdomain"} zurück:
|
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:
|
x.matches(regex) |
Gibt 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 Maskierung erforderlich ist.
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.