CEL-Matcher-Sprachreferenz

Common Expression Language (CEL) ist eine Open-Source-Sprache ohne Turing-Vollständigkeit, die eine gemeinsame Semantik für die Auswertung von Ausdrücken implementiert. Diensterweiterungen verwenden eine Teilmenge von CEL-Bedingungen, um Entscheidungen zur Kettenbewertung auf Grundlage von Attributdaten zu treffen. Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die durch logische Operatoren (&&, || oder !) verbunden sind.

Attribute

Für jede Verbindungsanfrage extrahiert der Proxy Attribute, die eine Reihe von Kontextinformationen sind. Attribute haben einen festen Typ (z. B. string oder int) und können je nach Kontext vorhanden sein oder nicht. Attribute werden während der Verarbeitung der Übereinstimmungsbedingung für die CEL-Laufzeit verfügbar gemacht. Wenn Sie bestimmte Attribute an Ihren Erweiterungsdienst oder Ihr Plug-in weiterleiten möchten, verwenden Sie das Feld forwardAttributes. Weitere Informationen finden Sie unter Unterstützte Attribute.

Anfrageattribute

Sie können die folgenden Attribute aus Anfragen extrahieren:

Attribut Typ LbEdge LbRoute LbTraffic Authz CdnEdge Beschreibung
request.headers Karte ✓ ✓ ✓ ✓ ✓ Eine String-zu-String-Zuordnung von HTTP-Anfrageheadern, wobei alle Schlüssel kleingeschrieben sind.
request.method String ✓ ✓ ✓ ✓ ✓ Die HTTP-Anfragemethode (z. B. GET, POST).
request.host String ✓ ✓ ✓ ✓ ✓ Convenience-Äquivalent zu request.headers['host'].
request.path String ✓ ✓ ✓ ✓ ✓ Der angeforderte HTTP-URL-Pfad.
request.query String ✓ ✓ ✓ ✓ ✓ Der URL-Abfragestring (name1=value&name2=value2).
request.scheme String ✓ ✓ ✓ ✓ ✓ Das URL-Schema (http oder https).
request.backend_service_name String – ✓ ✓ – – Der Name des Backend-Dienstes.
request.backend_service_project_number int – ✓ ✓ – – Projektnummer des Backend-Dienstes.

Verbindungsattribute

Sie können die folgenden Attribute aus Verbindungen extrahieren:

Attribut Typ LbEdge LbRoute LbTraffic Authz CdnEdge Beschreibung
source.ip String ✓ ✓ ✓ ✓ – Client-IP-Adresse.
source.port int ✓ ✓ ✓ ✓ ✓ Portnummer der Clientverbindung.
source.client_region String ✓ – ✓ – ✓ Länder- oder Regionscode des Kunden mit zwei Buchstaben.
connection.sni String ✓ – ✓ ✓ ✓ Downstream-TLS-Server Name Indication.
connection.tls_version String ✓ – ✓ ✓ ✓ Downstream-TLS-Version (z. B. TLSv1.2, TLSv1.3).
connection.sha256_peer_certificate_digest String ✓ – ✓ ✓ – SHA-256-Digest des Peer-Zertifikats.

Operatoren

Service Extensions unterstützt mehrere Operatoren, mit denen Sie komplexe Übereinstimmungsbedingungen aus einfachen Ausdrucksanweisungen erstellen können. Service Extensions unterstützt logische Operatoren wie &&, || und ! sowie Operatoren zur Stringmanipulation wie x.contains('y').

Mit Operatoren zur Stringmanipulation werden von Ihnen definierte Strings oder Teilstrings abgeglichen. Beispiel: request.host.endsWith('.example.com') wird mit true ausgewertet, wenn die HTTP-Anfrage an eine Domain gestellt wurde, die auf example.com endet.

Mit logischen Operatoren können Sie mehrere Variablen in einem Bedingungsausdruck prüfen. Beispiel: In request.method == 'GET' && request.host.matches('.example.com') werden zwei Anweisungen verknüpft, die beide true sein müssen, damit das Gesamtergebnis true ist.

Logische Operatoren

In der folgenden Tabelle werden die logischen Operatoren beschrieben, die von Service Extensions unterstützt werden.

Beispielausdruck Beschreibung
x == "foo" Gibt true zurück, wenn x gleich dem konstanten Stringliteral-Argument ist.
x == R"fo'o" Gibt true zurück, wenn x mit dem angegebenen Rohstringliteral übereinstimmt, das keine Escape-Sequenzen interpretiert. Raw-String-Literale sind nützlich, um Strings auszudrücken, die der Code zum Maskieren von Sequenzzeichen verwenden muss.
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, wird der Wert am 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 zu prüfende Regel nicht übereinstimmt.
k in m Gibt true zurück, wenn der Schlüssel k in der String-Schlüsselzuordnung m vorhanden ist. Andernfalls wird false zurückgegeben.

Operatoren zur Stringmanipulation

In der folgenden Tabelle werden die von Service Extensions unterstützten Operatoren zur Stringbearbeitung beschrieben.

Ausdruck Beschreibung
x.contains(y) Gibt true zurück, wenn der String x den Teilstring y enthält.
x.startsWith(y) Gibt true zurück, wenn der String x mit dem Teilstring y beginnt.
x.endsWith(y) Gibt true zurück, wenn der String x mit dem Teilstring y endet.
x.matches(y)

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

Service Extensions verwendet die Option „RE2::Latin1“, wenn das RE2-Muster kompiliert wird. Dadurch werden Unicode-Funktionen deaktiviert.

Bei Edge-Erweiterungen können Sie nur einen regulären Ausdruck pro CEL-Ausdruck verwenden.

x.lower() Gibt den Kleinbuchstabenwert des Strings x zurück.
x.upper() Gibt den Großbuchstabenwert des Strings x zurück.
int(x) Konvertiert das Stringergebnis von x in einen int-Typ. Sie können den konvertierten String für einen ganzzahligen Vergleich verwenden, indem Sie standardmäßige arithmetische Operatoren wie „größer als“ (>) und „kleiner als oder gleich“ (≤) verwenden. Dies funktioniert nur bei Werten, die ganze Zahlen sein können.

Beispielausdrücke

Alle Anfragen an Host example.com mit Backend-Dienst bs1 in 123 als Endziel abgleichen:

request.host == "example.com" && request.backend_service_name == "bs1" &&
  request.backend_service_project_number == 123

Alle Anfragen für den Pfad */inventory mit einem HTTP-Header Hello abgleichen. Beachten Sie, dass bei Headernamen für den CEL-Abgleich die Groß-/Kleinschreibung nicht berücksichtigt wird:

request.path.endsWith("/inventory") && "Hello" in request.headers

Beschränkungen

Für CEL-Ausdrücke, die für Service Extensions angegeben werden, gelten die folgenden Einschränkungen:

  • Maximale Anzahl von Ausdrücken pro Erweiterung: 1 für Edge-Erweiterungen und 5 für andere Erweiterungen
  • Maximale Anzahl von Zeichen pro regulärem Ausdruck: 100
  • Maximale Anzahl von Zeichen pro CEL-Ausdruck: 500