14.2. 事件转换的常见用例
EventTransform 允许您根据系统要求以不同的方式操作和重塑事件。最常见的用例如下:
14.2.1. 字段提取 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
您可以从事件有效负载中提取特定字段,并将其公开为 CloudEvent 属性。这样可以更轻松地过滤和路由下游事件。
从事件有效负载提取用户 ID 的示例
apiVersion: eventing.knative.dev/v1alpha1
kind: EventTransform
metadata:
name: extract-user-id
spec:
jsonata:
expression: |
{
"specversion": "1.0",
"id": id,
"type": "user.extracted",
"source": "transform.user-extractor",
"time": time,
"userid": data.user.id,
"data": $
}
14.2.2. 事件格式转换 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
您可以将事件的结构转换为不同的格式,以便保持与不同消费者系统兼容的。
将订单事件转换为以客户为中心的格式的示例
apiVersion: eventing.knative.dev/v1alpha1
kind: EventTransform
metadata:
name: format-converter
spec:
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: destination-service
jsonata:
expression: |
{
"specversion": "1.0",
"id": id,
"type": "order.converted",
"source": "transform.format-converter",
"time": time,
"data": {
"orderId": data.id,
"customer": {
"name": data.user.fullName,
"email": data.user.email
},
"items": data.items
}
}
14.2.3. 事件增强 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
您可以将固定或动态元数据(如环境或区域)添加到事件,而无需更改原始制作者。
在事件中添加环境和区域元数据的示例
apiVersion: eventing.knative.dev/v1alpha1
kind: EventTransform
metadata:
name: event-enricher
spec:
jsonata:
expression: |
{
"specversion": "1.0",
"id": id, /* Add the "id", "type", "source", and "time" attributes based on the input JSON object fields */
"type": type,
"source": source,
"time": time,
"environment": "production", /* Add fixed environment and region attributes to the event metadata */
"region": "us-west-1",
"data": $ /* Add the event transform input JSON body as CloudEvent "data" field */
}
14.2.4. 事件响应回复转换 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
您只能转换发送到 sink 的请求,以及从 sink 接收的响应,启用端到端事件 shaping。
转换请求和回复消息的示例
apiVersion: eventing.knative.dev/v1alpha1
kind: EventTransform
metadata:apiVersion: eventing.knative.dev/v1alpha1
kind: EventTransform
metadata:
name: request-reply-transform
spec:
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: processor-service
jsonata:
expression: |
# Request transformation
{
"specversion": "1.0",
"id": id,
"type": "request.transformed",
"source": source,
"time": time,
"data": data
}
reply:
jsonata:
expression: |
# Reply transformation
{
"specversion": "1.0",
"id": id,
"type": "reply.transformed",
"source": "transform.reply-processor",
"time": time,
"data": data
}