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:
- Registrierung erstellen, um Ereignisse zu empfangen
- Veröffentlichungszugriff steuern
- Empfangene Ereignisse transformieren
- CEL-Sprachdefinition
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.dataals auchmessage.data_base64sind 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:
|
x.lowerAscii() |
Gibt einen neuen String zurück, in dem alle ASCII-Zeichen kleingeschrieben sind. |
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, das
die Anzahl der Ersetzungen begrenzt. Beispiel: Der folgende
Ausdruck gibt '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. Beispiel: Der folgende Ausdruck gibt
['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 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
|
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.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:
|
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 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.