Skip to content

Commit 8df7437

Browse files
committed
Add EventTransform documentation
Signed-off-by: Pierangelo Di Pilato <[email protected]>
1 parent 6de5caa commit 8df7437

File tree

3 files changed

+681
-0
lines changed

3 files changed

+681
-0
lines changed

Diff for: config/nav.yml

+3
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ nav:
265265
- Using Sequences in series: eventing/flows/sequence/sequence-reply-to-sequence/README.md
266266
- Create additional events: eventing/flows/sequence/sequence-terminal/README.md
267267
- Using with Broker and Trigger: eventing/flows/sequence/sequence-with-broker-trigger/README.md
268+
- Event Transformations:
269+
- About Event Transformations: eventing/transforms/README.md
270+
- Event Transformations for JSON with JSONata: eventing/transforms/event-transform-jsonata.md
268271
# about triggers docs
269272
# - Administrator configuration options: eventing/triggers/trigger-admin-config-options.md
270273
# - Developer configuration options: eventing/triggers/trigger-developer-config-options.md

Diff for: docs/eventing/transforms/README.md

+268
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
# Event Transformation
2+
3+
## Overview
4+
5+
`EventTransform` is a Knative API resource that enables declarative transformations of HTTP requests without requiring
6+
custom code. It allows you to modify event attributes, extract data from event payloads, and reshape events to fit
7+
different systems' requirements.
8+
9+
EventTransform is designed to be a flexible component in your event-driven architecture that can be placed at various
10+
points in your event flow to facilitate seamless integration between diverse systems.
11+
12+
## Key Features
13+
14+
- **Declarative transformations** using standard Kubernetes resources
15+
- **JSONata expressions** for powerful data extraction and transformation
16+
- **Addressable resource** that can be referenced from any Knative source, trigger, or subscription
17+
- **Flexible deployment options** within your event flow
18+
- **Sink configuration** to direct transformed events to specific destinations
19+
- **Reply support** to leverage Broker's built-in reply feature
20+
21+
## Common Use Cases
22+
23+
### Field Extraction
24+
25+
Extract specific fields from event payloads and promote them as CloudEvent attributes for filtering:
26+
27+
```yaml
28+
apiVersion: eventing.knative.dev/v1alpha1
29+
kind: EventTransform
30+
metadata:
31+
name: extract-user-id
32+
spec:
33+
jsonata:
34+
expression: |
35+
{
36+
"specversion": "1.0",
37+
"id": id,
38+
"type": "user.extracted",
39+
"source": "transform.user-extractor",
40+
"time": time,
41+
"userid": data.user.id,
42+
"data": $
43+
}
44+
```
45+
46+
### Event Format Conversion
47+
48+
Transform events from one format to another to ensure compatibility between systems:
49+
50+
```yaml
51+
apiVersion: eventing.knative.dev/v1alpha1
52+
kind: EventTransform
53+
metadata:
54+
name: format-converter
55+
spec:
56+
sink:
57+
ref:
58+
apiVersion: serving.knative.dev/v1
59+
kind: Service
60+
name: destination-service
61+
jsonata:
62+
expression: |
63+
{
64+
"specversion": "1.0",
65+
"id": id,
66+
"type": "order.converted",
67+
"source": "transform.format-converter",
68+
"time": time,
69+
"data": {
70+
"orderId": data.id,
71+
"customer": {
72+
"name": data.user.fullName,
73+
"email": data.user.email
74+
},
75+
"items": data.items
76+
}
77+
}
78+
```
79+
80+
### Event Enrichment
81+
82+
Add additional context or metadata to events:
83+
84+
```yaml
85+
apiVersion: eventing.knative.dev/v1alpha1
86+
kind: EventTransform
87+
metadata:
88+
name: event-enricher
89+
spec:
90+
jsonata:
91+
expression: |
92+
{
93+
"specversion": "1.0",
94+
"id": id, /* Add the "id", "type", "source", and "time" attributes based on the input JSON object fields */
95+
"type": type,
96+
"source": source,
97+
"time": time,
98+
"environment": "production", /* Add fixed environment and region attributes to the event metadata */
99+
"region": "us-west-1",
100+
"data": $ /* Add the event transform input JSON body as CloudEvent "data" field */
101+
}
102+
```
103+
104+
### Event Response Reply Transformation
105+
106+
When using the EventTransform with a sink, you can also transform the responses from the sink:
107+
108+
!!! important
109+
The same type of transformation must be used for Sink and Reply transformation
110+
111+
```yaml
112+
apiVersion: eventing.knative.dev/v1alpha1
113+
kind: EventTransform
114+
metadata:
115+
name: request-reply-transform
116+
spec:
117+
sink:
118+
ref:
119+
apiVersion: serving.knative.dev/v1
120+
kind: Service
121+
name: processor-service
122+
jsonata:
123+
expression: |
124+
# Request transformation
125+
{
126+
"specversion": "1.0",
127+
"id": id,
128+
"type": "request.transformed",
129+
"source": source,
130+
"time": time,
131+
"data": data
132+
}
133+
reply:
134+
jsonata:
135+
expression: |
136+
# Reply transformation
137+
{
138+
"specversion": "1.0",
139+
"id": id,
140+
"type": "reply.transformed",
141+
"source": "transform.reply-processor",
142+
"time": time,
143+
"data": data
144+
}
145+
```
146+
147+
## Deployment Patterns
148+
149+
EventTransform can be used in different positions within your event flow:
150+
151+
### Source → EventTransform → Broker
152+
153+
Transform events before they reach the Broker:
154+
155+
```yaml
156+
apiVersion: sources.knative.dev/v1
157+
kind: ApiServerSource
158+
metadata:
159+
name: k8s-events
160+
spec:
161+
serviceAccountName: event-watcher
162+
resources:
163+
- apiVersion: v1
164+
kind: Event
165+
sink:
166+
ref:
167+
apiVersion: eventing.knative.dev/v1alpha1
168+
kind: EventTransform
169+
name: event-transformer
170+
---
171+
apiVersion: eventing.knative.dev/v1alpha1
172+
kind: EventTransform
173+
metadata:
174+
name: event-transformer
175+
spec:
176+
sink:
177+
ref:
178+
apiVersion: eventing.knative.dev/v1
179+
kind: Broker
180+
name: default
181+
jsonata:
182+
expression: |
183+
# transformation expression
184+
```
185+
186+
### Broker → Trigger → EventTransform → Service or Sink
187+
188+
Transform events after they're filtered by a Trigger:
189+
190+
```yaml
191+
apiVersion: eventing.knative.dev/v1
192+
kind: Trigger
193+
metadata:
194+
name: transform-trigger
195+
spec:
196+
broker: default
197+
filter:
198+
attributes:
199+
type: original.event.type
200+
subscriber:
201+
ref:
202+
apiVersion: eventing.knative.dev/v1alpha1
203+
kind: EventTransform
204+
name: event-transformer
205+
---
206+
apiVersion: eventing.knative.dev/v1alpha1
207+
kind: EventTransform
208+
metadata:
209+
name: event-transformer
210+
spec:
211+
sink:
212+
ref:
213+
apiVersion: serving.knative.dev/v1
214+
kind: Service
215+
name: destination-service
216+
jsonata:
217+
expression: |
218+
# transformation expression
219+
```
220+
221+
### Using Broker Reply Feature
222+
223+
Transform events and republish them back to the Broker:
224+
225+
!!! important
226+
Preventing infinite event loops: When using the reply feature with a Broker, you must ensure that your transformed
227+
events don't trigger the same Trigger that sent them to the EventTransform in the first place.
228+
229+
```yaml
230+
apiVersion: eventing.knative.dev/v1
231+
kind: Trigger
232+
metadata:
233+
name: transform-trigger
234+
spec:
235+
broker: default
236+
filter:
237+
attributes:
238+
type: original.event.type
239+
subscriber:
240+
ref:
241+
apiVersion: eventing.knative.dev/v1alpha1
242+
kind: EventTransform
243+
name: event-transformer
244+
---
245+
apiVersion: eventing.knative.dev/v1alpha1
246+
kind: EventTransform
247+
metadata:
248+
name: event-transformer
249+
spec:
250+
# No sink specified - will use reply feature
251+
jsonata:
252+
expression: |
253+
{
254+
"specversion": "1.0",
255+
"id": id,
256+
"time": time,
257+
"type": "transformed.event.type",
258+
"source": "transform.event-transformer",
259+
"data": $
260+
}
261+
```
262+
263+
## Next Steps
264+
265+
- [JSONata Transformations](./event-transform-jsonata.md) - Learn about using JSONata expressions for event
266+
transformations
267+
- [Trigger Filtering](./../triggers/README.md#trigger-filtering) - Learn how to use Trigger filtering
268+
- [EventTransform API Reference](./../reference/eventing-api.md) - Detailed API reference for EventTransform

0 commit comments

Comments
 (0)