Sie können Ihre CloudEvents-Daten transformieren, indem Sie Transformationsausdrücke mit CEL schreiben. Weitere Informationen finden Sie unter Empfangene Ereignisse transformieren.
Im Folgenden finden Sie einige gängige Anwendungsfälle und Beispiele, die zeigen, wie Sie CEL-Ausdrücke schreiben, um Ihre Ereignisdaten zu transformieren.
Standardanwendungsfälle
Im Folgenden finden Sie einige Standardanwendungsfälle für die Transformation von Ereignisdaten.
Datennormalisierung
Sie müssen eine verschachtelte Datenstruktur in Ihrer Ereignisnachricht vereinfachen, damit sie von einem Downstream-Dienst leichter verarbeitet werden kann.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "orderId": "12345", "customer": { "firstName": "Alex", "lastName": "Taylor", "address": { "street": "1800 Amphibious Blvd.", "city": "Mountain View" } } } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "orderId": "12345", "customerFirstName": "Alex", "customerLastName": "Taylor", "customerStreet": "1800 Amphibious Blvd.", "customerCity": "Mountain View" } }
- Lösung 1:
Ausgabedaten manuell formatieren So können Sie die Feldnamen auflisten und nur die Elemente auswählen, die in der Ausgabe benötigt werden. Das ist ein sinnvoller Ansatz, wenn die Eingabe vorhersehbar ist und die Anzahl der Felder gering ist. Mit der Funktion
setFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Beispiel:message.setField("data", { "orderId": message.data.orderId, "customerFirstName": message.data.customer.firstName, "customerLastName": message.data.customer.lastName, "customerStreet": message.data.customer.address.street, "customerCity": message.data.customer.address.city, })
- Lösung 2:
Verwenden Sie eine Funktion in Ihrem Ausdruck. Mit der Funktion
setFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Mit der Funktiondenormalizewerden verschachtelte Strukturen in eine Liste von Schlüssel/Wert-Paaren umgewandelt. Feldnamen werden durch einen Punkt (.) getrennt, um die Strukturhierarchie zu segmentieren. Beispiel:message.setField("data", message.data.denormalize())
Das führt zu der folgenden Ausgabe, die sich geringfügig von der erwarteten Nutzlast unterscheidet. Zu den Vorteilen gehören jedoch ein kürzerer CEL-Ausdruck, der für jede Eingabe funktioniert und automatisch eine beliebige Anzahl von eingehenden Feldern enthält.
{ "data": { "orderId": "12345", "customer.firstName": "Alex", "customer.lastName": "Taylor", "customer.address.street": "1800 Amphibious Blvd.", "customer.address.city": "Mountain View" } }
Datenmaskierung
Sie müssen sensible Daten in einer Ereignisnutzlast maskieren, bevor sie an eine weniger sichere Umgebung gesendet werden.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "userId": "user123", "email": "alex@example.com", "creditCardNumber": "1234-5678-9012-3456" } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "userId": "user123", "email": "a***@example.com", "creditCardNumber": "xxxx-xxxx-xxxx-3456" } }
- Lösung:
Verwenden Sie einen Ausdruck, um vertrauliche Informationen wie die E-Mail-Adresse und die Kreditkartennummer zu maskieren. Mit der Funktion
setFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Die Funktion für reguläre Ausdrückeextractfolgt der RE2-Syntax. Beispiel:message .setField("data.email", re.extract(message.data.email, "(^.).*@(.*)", "\\1***@\\2")) .setField("data.creditCardNumber", re.extract(message.data.creditCardNumber, "(\\d{4})\\D*$", "xxxx-xxxx-xxxx-\\1"))
Datenentfernung
Sie müssen bestimmte Felder aus einer Ereignisnutzlast entfernen, die auf bestimmten Bedingungen basieren.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "orderId": "12345", "customerType": "gold", "discountCode": "VIP" } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ { "orderId": "12345", "customerType": "gold" } }
- Lösung:
Verwenden Sie einen Ausdruck, mit dem das Feld
discountCodeunkenntlich gemacht wird, wenncustomerType„gold“ ist. Mit der FunktionremoveFieldswerden bestimmte Felder aus einem Ereignis entfernt. Beispiel:message.data.customerType == "gold" ? message.removeFields(["data.discountCode"]) : message
Datenkonvertierung
Sie müssen Daten von einem Format oder Typ in ein anderes konvertieren.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "orderDate": "2024-10-31T12:00:00Z", "totalAmount": "1500" } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "orderDate": 1704086400, "totalAmount": 1500.00 } }
- Lösung:
Verwenden Sie einen Ausdruck, der
orderDatein einen UNIX-Zeitstempel und den TyptotalAmountvonstringindouble(Gleitkommazahl) konvertiert. Mit der FunktionsetFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Sie können Funktionen zur Stringbearbeitung verwenden, um die String-Ergebnisse zu konvertieren. Beispiel:message .setField("data.orderDate", int(timestamp(message.data.orderDate))) .setField("data.totalAmount", double(message.data.totalAmount))
Bedingtes Routing
Sie müssen Ereignisse basierend auf den Ereignisdaten an verschiedene Ziele weiterleiten.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "eventType": "order.created", "orderValue": 200 } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "eventType": "order.created", "orderValue": 200, "routingKey": "highValue" } }
- Lösung:
Verwenden Sie einen Ausdruck, der ein
routingKey-Feld mit dem Wert „highValue“ hinzufügt, wennorderValuegrößer als 100 ist. Andernfalls wird"normal"verwendet. Mit dem FeldroutingKeykann der Routingpfad bestimmt werden. Mit der FunktionsetFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Beispiel:message.data.orderValue > 100 ? message.setField("data.routingKey", "highValue") : message.setField("data.routingKey", "normal")
Umgang mit Standardwerten
Sie müssen dafür sorgen, dass bestimmte Felder in der Ereignisnutzlast Standardwerte haben, wenn sie nicht vorhanden sind.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "itemName": "Product A" } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "itemName": "Product A", "quantity": 1 } }
- Lösung:
Verwenden Sie einen Ausdruck, der das Feld
quantitymit dem Standardwert1hinzufügt, wenn das Feld noch nicht vorhanden ist. Mit dem Makrohaswird geprüft, ob ein Feld verfügbar ist. Mit der FunktionsetFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Beispiel:has(message.data.quantity) ? message : message.setField("data.quantity", 1)
String-Bearbeitung
Sie müssen Teile eines Stringfelds in den Ereignisdaten extrahieren oder ändern.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "customerEmail": "alex@example.com" } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "customerEmail": "alex@example.com", "emailDomain": "example.com" } }
- Lösung:
Verwenden Sie einen Ausdruck, mit dem der Domainname („beispiel.de“) aus dem Feld
customerEmailextrahiert und in einem neuen FeldemailDomaingespeichert wird. Mit der FunktionsetFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Die Funktion für reguläre Ausdrückeextractfolgt der RE2-Syntax. Beispiel:message .setField("data.emailDomain", re.extract(message.data.customerEmail, "(^.*@)(.*)", "\\2"))
Listen- und Kartenvorgänge
Sie müssen mit Listen oder Karten in den Ereignisdaten arbeiten.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "productIds": [ "product123", "product456" ] } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "productIds": [ "product123", "product456" ], "productFound": true } }
- Lösung:
Verwenden Sie einen Ausdruck, mit dem geprüft wird, ob „product456“ in der Liste
productIdsvorhanden ist, und speichern Sie das Ergebnis (trueoderfalse) in einem neuen FeldproductFound. Mit der FunktionsetFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Das Makroexistsprüft, ob ein Prädikat für alle Elemente einer Liste gilt, und kombiniert die Ergebnisse mit dem Operator „or“. Beispiel:message.setField("data.productFound", message.data.productIds.exists(id, id == "product123"))
Fehlerbehandlung
Sie müssen potenzielle Fehler oder unerwartete Daten in der Ereignis-Payload abfangen.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "quantity": "abc" } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "quantity": 0, "error": "Invalid quantity" } }
- Lösung:
Verwenden Sie einen Ausdruck, mit dem versucht wird, das Feld
quantityin eine Ganzzahl zu konvertieren. Wenn die Conversion fehlschlägt, setzen Sie das Feldquantityauf0und fügen Sie ein neues Felderrormit dem Wert „Invalid quantity“ (Ungültige Menge) hinzu.- Mit dem Makro
haswird geprüft, ob ein Feld verfügbar ist. - Die Funktion
typegibt den Typ eines Werts zurück. - Die Funktion für reguläre Ausdrücke
matchesfolgt der RE2-Syntax. - Mit der Funktion
setFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt.
Beispiel:
// Check if data.quantity exists has(message.data.quantity) && // Check if data.quantity is a string type(message.data.quantity) == string && // Check if string consists of digits message.data.quantity.matches(r'^-?[0-9]+$') ? // If data.quantity is valid, use message message : // If data.quantity is invalid, set to 0 and generate error message .setField("data.quantity", 0) .setField("data.error", "Invalid quantity")
- Mit dem Makro
Komplexe Anwendungsfälle
Im Folgenden finden Sie einige komplexe Anwendungsfälle für die Transformation von Ereignisdaten.
Datentransformation
Sie müssen mehrere Transformationen für verschachtelte Ereignisdaten ausführen.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "orderId": "12345", "customer": { "firstName": "Alex", "lastName": "Taylor", "email": "alex@example.com", "address": { "street": "1800 Amphibious Blvd.", "city": "Mountain View", "state": "CA" } }, "items": [ { "itemId": "item1", "price": 10.00, "quantity": 2 }, { "itemId": "item2", "price": 5.00, "quantity": 1 } ] } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "orderId": "12345", "customer.firstName": "Alex", "customer.lastName": "Taylor", "customer.email": "a***@example.com", "customer.address.city": "Mountain View", "customer.address.state": "CA" } }
- Lösung:
Verwenden Sie einen Ausdruck, mit dem Stadt und Bundesstaat aus der Adresse extrahiert und die E-Mail-Adresse maskiert werden.
- Mit der Funktion
setFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. - Mit der Funktion
toMapwird eine CEL-Liste von CEL-Maps in eine einzelne CEL-Map konvertiert. - Die Funktion für reguläre Ausdrücke
extractfolgt der RE2-Syntax. - Mit der Funktion
removeFieldswerden bestimmte Felder aus einem Ereignis entfernt. - Die Funktion
denormalizefasst verschachtelte Strukturen in einer Liste von Schlüssel/Wert-Paaren zusammen. Feldnamen werden durch einen Punkt (.) getrennt, um die Strukturhierarchie zu segmentieren.
Beispiel:
message .setField("data", message.data.setField("customer.address", message.data.customer.address.map(key, key == "city" || key == "state", { key: message.data.customer.address[key] }).toMap()) .setField("customer.email", re.extract(message.data.customer.email, "(^..?).*@(.*)", "\\1***@\\2")) .removeFields(["items"]) .denormalize() )
- Mit der Funktion
Datenformatierung und ‑routing
Sie müssen Ereignisdaten formatieren, Produktinformationen hinzufügen und dann die Ereignisnachricht weiterleiten.
- Szenario:
Angenommen, Sie haben die folgenden CloudEvents-Daten:
{ "data": { "productId": "p123", "productName": "Example Product", "category": "electronics" } }
Sie möchten einen CEL-Ausdruck schreiben, der die folgende Ausgabe erzeugt:
{ "data": { "productId": "electronics-p123", "productName": "EXAMPLE PRODUCT", "category": "electronics", "routingKey": "electronics" } }
- Lösung:
Verwenden Sie einen Ausdruck, der den Produktnamen in Großbuchstaben formatiert, der Produkt-ID basierend auf der Kategorie ein Präfix hinzufügt und einen Routing-Schlüssel für die Downstream-Verarbeitung enthält. Mit der Funktion
setFieldwird einem Ereignis ein Feld mit einem bestimmten Schlüssel hinzugefügt oder ein vorhandenes Feld ersetzt. Die FunktionupperAsciigibt einen String zurück, in dem alle ASCII-Zeichen in die entsprechenden Großbuchstaben umgewandelt wurden. Beispiel:message .setField("data.productId", message.data.category + "-" + message.data.productId) .setField("data.productName", message.data.productName.upperAscii()) .setField("data.routingKey", message.data.category)