Pode transformar os dados de eventos escrevendo expressões de transformação com a CEL. Por exemplo, pode modificar os payloads de eventos para satisfazer o contrato de API específico de um destino.
Tenha em atenção que os eventos são sempre enviados num formato CloudEvents através de um pedido HTTP no modo de conteúdo binário a menos que especifique uma associação de mensagens.
Defina os formatos de dados de entrada e saída
Além de escrever uma expressão de transformação em CEL, pode, opcionalmente, especificar o formato de dados dos dados de eventos recebidos. Isto permite que o Eventarc Advanced saiba como analisar o payload do evento. Também pode converter os dados de um formato para outro.
São suportados os seguintes formatos: Avro, JSON e Protobuf. Para mais informações, consulte o artigo Formate eventos recebidos.
Expressões de transformação
Quando transforma eventos, pode aceder a todos os atributos de eventos numa expressão CEL como variáveis através de um objeto message
predefinido. Estas variáveis
são preenchidas com valores baseados nos dados de eventos em tempo de execução. Por exemplo:
message.id
devolve o atributoid
do eventomessage.data
devolve uma representação de valor CEL da carga útil do eventomessage.data.some-key
devolve o conteúdo de um campo denominadosome-key
do payload do evento
Os campos em message.data
são sempre representados como tipos String
e os valores são mapeados a partir do evento original através do esquema especificado quando define o formato de dados de entrada.
A expressão de transformação deve expressar um evento completo que inclua os atributos de contexto do evento e a carga útil de dados do evento. As expressões são escritas em JSON, mas as funções, as macros e os operadores CEL predefinidos, bem como as expressões regulares que usam RE2, são suportados. O Eventarc Advanced também suporta determinadas funções de extensão que podem ser usadas para transformar os dados de eventos.
Seguem-se dois exemplos de utilização de expressões de IEC para transformar os dados de eventos. Para ver mais exemplos de utilização, consulte os exemplos de transformações.
Exemplo: formatar valores de atributos
O exemplo seguinte formata os phone_number
valores dos atributos
com funções de expressões regulares. (Outros atributos foram omitidos.)
// Input: // { // "data": // { // "email_address": "charlie@altostrat.com", // "phone_number": "8005550100", // } // } // Output: // { // "data": // { // "email_domain": "altostrat.com", // "phone_number": "(800) 555-0100", // "area_code": "800", // "local_number": "5550100", // } // } { "data": { "email_domain": re.capture( message.data.email_address, "\\S+@(\\S+)"), "phone_number": re.extract( message.data.phone_number, "^(\\d{3})(\\d{3})(\\d{4})", "(\\1) \\2-\\3" ), }.merge ( re.captureN(message.data.phone_number, "^(?P\d{3})[\w\-)(]*(?P ) ) }\d{7})"
Seguem-se as funções de expressão regular usadas no exemplo anterior:
re.capture
: captura o primeiro valor do grupo sem nome ou com nome. Os argumentos são os seguintes:target
: string que deve ser analisadaregex
: expressão regular usada para capturar valores
Devolve uma string do valor do primeiro grupo capturado.
re.captureN
: faz uma correspondência completa na string e na expressão regular dadas. Os argumentos são os seguintes:target
: string que deve ser analisadaregex
: expressão regular usada para capturar valores
Devolve um mapa com pares de chave e valor para um grupo com nome (nome do grupo, string capturada) ou um grupo sem nome (índice do grupo, string capturada).
re.extract
: faz corresponder os valores do grupo da string de destino fornecida e reescreve a string. Os argumentos são os seguintes:target
: string que deve ser analisadaregex
: expressão regular usada para extrair valoresrewrite
: expressão regular para como o resultado deve ser formatado
Devolve uma string dos valores extraídos formatada com base no argumento
rewrite
.
Exemplo: mapeie uma matriz para uma matriz de objetos
O exemplo seguinte mapeia uma matriz de números inteiros numa matriz de objetos. (Outros atributos foram omitidos.)
// Input: // { // "data": // { // "product_ids": [1, 2, 3] // } // } // Output: // { // "data": // { // "products": [ // { // "name": "apple", // "price": 70 // }, // { // "name": "orange", // "price": 80 // }, // { // "name": "Product(3)", // "price": 0 // }, // { // "name": "apple", // "price": 70 // } // ] // } // } { "data": { "products": message.data.product_ids.map(product_id, product_id == 1? { "name": "apple", "price": 70 } : product_id == 2? { "name": "orange", "price": 80 } : // Default: { "name": "Product(" + string(product_id) + ")", "price": 0 } ) } }
Configure um pipeline para transformar eventos
Pode configurar um pipeline para transformar dados de eventos na Google Cloud consola ou através da CLI gcloud.
Tenha em atenção que só é suportada uma mediação por pipeline.
Consola
Na Google Cloud consola, aceda à página Eventarc > Pipelines.
Pode criar um pipeline ou, se estiver a atualizar um pipeline, clicar no nome do pipeline.
Na página Detalhes do pipeline, clique em
Editar.No painel Mediação de eventos, faça o seguinte:
- Selecione a caixa de verificação Aplicar uma transformação.
Na lista Formato de entrada, selecione o formato aplicável.
Para mais informações, consulte o artigo Formate eventos recebidos.
No campo Expressão CEL, escreva uma expressão de transformação em JSON. As funções, as macros e os operadores CEL predefinidos, bem como as expressões regulares, são suportados. Por exemplo:
{ "id": message.id, "datacontenttype": "application/json", "data": "{ \"scrubbed\": \"true\" }" }
O exemplo anterior faz o seguinte:
- Remove todos os atributos do evento original, exceto o respetivo
id
- Define o atributo
datacontenttype
comoapplication/json
- Substitui o payload do evento por uma string JSON estática
- Remove todos os atributos do evento original, exceto o respetivo
Clique em Continuar.
No painel Destino, faça o seguinte:
Se aplicável, na lista Formato de saída, selecione um formato.
Para mais informações, consulte o artigo Formate eventos recebidos.
Opcionalmente, aplique uma vinculação de mensagens. Para mais informações, consulte a secção Defina uma associação de mensagens neste documento.
Clique em Guardar.
A atualização de um pipeline pode demorar alguns minutos.
gcloud
Abra um terminal.
Pode criar um pipeline ou atualizar um pipeline através do comando
gcloud eventarc pipelines update
:gcloud eventarc pipelines update PIPELINE_NAME \ --location=REGION \ --mediations=transformation_template= \ { TRANSFORMATION_EXPRESSION }
Substitua o seguinte:
PIPELINE_NAME
: o ID do pipeline ou um nome totalmente qualificadoREGION
: uma localização avançada do Eventarc suportadaEm alternativa, pode definir a propriedade de localização da CLI gcloud:
gcloud config set eventarc/location REGION
TRANSFORMATION_EXPRESSION
: uma expressão escrita em JSON. As funções, as macros e os operadores CEL predefinidos, bem como as expressões regulares, são suportados. É usada uma flagmediations
para aplicar uma chavetransformation_template
.
A atualização de um pipeline pode demorar alguns minutos.
Exemplo:
gcloud eventarc pipelines update my-pipeline \ --location=us-central1 \ --mediations=transformation_template= \ { "id": message.id, "datacontenttype": "application/json", "data": "{ \"scrubbed\": \"true\" }" }
O exemplo anterior faz o seguinte:
- Remove todos os atributos do evento original, exceto o respetivo
id
- Define o atributo
datacontenttype
comoapplication/json
- Substitui o payload do evento por uma string JSON estática
Funções de extensões
O Eventarc Advanced suporta as seguintes funções de extensão que podem ser usadas para transformar os dados de eventos recebidos através de um barramento.
Função | Descrição |
---|---|
denormalize |
Desnormaliza um mapa ou uma lista adicionando dados redundantes para melhorar o desempenho de leitura. Os nomes dos campos no mapa resultante são delimitados com um ponto
( Tenha em atenção que, como não pode usar um ponto ( Por exemplo: |
merge |
Junta dois campos e devolve o campo combinado. Os campos com nomes duplicados são unidos. Por exemplo:
|
removeFields |
Remove campos específicos de um evento. Os nomes dos campos são resolvidos como caminhos. O caráter de ponto ( Tenha em atenção que é esperado JSON não processado. Se serializar o JSON, a transformação pode ser aplicada a uma string JSON e resultar num erro. Por exemplo: |
setField |
Adiciona ou substitui um campo do evento por uma determinada chave. O nome do campo é resolvido como um caminho. O caráter de ponto ( Por exemplo: |
Exemplo: adicione um atributo ao payload do evento sem modificar outros dados
// Input: // { // "data": // { // "credit_card_number": "XXXX-XXXX-XXXX-XXXX" // } // } // Output: // { // "data": // { // "credit_card_number": "XXXX-XXXX-XXXX-XXXX", // "card_type": "credit" // } // } { "data": message.data.merge( { "card_type": "credit" } ) }
Exemplo: desnormalizar a lista de artigos da carga útil do evento
// Input: //{ //"data": // { // "products": [ // { // "number": 021774, // "type": "perishable", // "price": 2.00 // }, // { // "number": 95602, // "type": "diy", // "price": 120.00 // }, // { // "number": 568302, // "type": "toys", // "price": 12.00 // } // ] // } //} // // Output: //{ //"data": // { // "products": { // "0.number": 021774, // "0.type": "perishable", // "0.price": 2.00, // "1.number": 95602, // "1.type": "diy", // "1.price": 120.00, // "2.number": 568302, // "2.type": "toys", // "2.price": 12.00 // } // } //} // // message.setField("data.products", message.data.products.denormalize())
Exemplo: remova o campo do payload do evento
// Input: // { // "data": // { // "payment": { // "card_number": "XXXX-XXXX-XXXX-XXXX", // "card_type": "credit", // } // } // } // Output: // { // "data": // { // "payment": { // "card_type": "credit" // } // } // } message.removeFields(["data.payment.card_number"])
Defina uma associação de mensagens
Por predefinição, os eventos são sempre enviados para um destino num formato CloudEvents através de um pedido HTTP no modo de conteúdo binário. Opcionalmente, pode substituir este comportamento definindo uma associação de mensagens e criando um novo pedido HTTP.
Todos os cabeçalhos HTTP introduzidos por outras políticas ou controlos (por exemplo, tokens OAuth ou OIDC) são preservados e unidos aos cabeçalhos resultantes da expressão de associação.
Pode definir uma associação de mensagens quando configura um pipeline na Google Cloud consola ou através da CLI gcloud.
Consola
Na Google Cloud consola, aceda à página Eventarc > Pipelines.
Pode criar um pipeline ou, se estiver a atualizar um pipeline, clicar no nome do pipeline.
Tenha em atenção que a atualização de um pipeline pode demorar mais de 10 minutos.
Na página Detalhes do pipeline, clique em
Editar.No painel Destino, aplique uma Associação de mensagens, que é uma expressão CEL escrita em JSON. Isto resulta num pedido HTTP recém-criado que é enviado para o destino do pipeline.
Para mais informações, consulte as secções Aceda a mensagens recebidas e Crie pedidos HTTP neste documento.
Clique em Guardar.
gcloud
Abra um terminal.
Pode criar um pipeline ou atualizar um pipeline através do comando
gcloud eventarc pipelines update
:gcloud eventarc pipelines update PIPELINE_NAME \ --location=REGION \ --destinations=http_endpoint_message_binding_template='MESSAGE_BINDING'
Substitua o seguinte:
PIPELINE_NAME
: o ID do pipeline ou um nome totalmente qualificadoREGION
: uma localização avançada do Eventarc suportadaEm alternativa, pode definir a propriedade de localização da CLI gcloud:
gcloud config set eventarc/location REGION
MESSAGE_BINDING
: uma expressão CEL escrita em JSON que resulta num pedido HTTP recém-criado que é, em seguida, enviado para o destino do pipeline.Para mais informações, consulte as secções Aceda a mensagens recebidas e Construa pedidos HTTP neste documento.
Exemplo:
gcloud eventarc pipelines create my-pipeline \ --location=us-central1 \ --destinations=http_endpoint_uri='https://example-endpoint.com', \ http_endpoint_message_binding_template='{"headers":{"new-header-key": "new-header-value"}}'
Tenha em atenção que, se estiver a usar uma chave
http_endpoint_message_binding_template
, também tem de definir a chavehttp_endpoint_uri
.
Aceda às mensagens recebidas
Pode usar uma expressão de IEC para aceder a uma mensagem CloudEvents de entrada da seguinte forma:
- Use o valor
message.data
para aceder ao campodata
da mensagem recebida. - Use os valores
message.key
(em quekey
é o nome do atributo) para aceder aos atributos da mensagem recebida. Use uma variável
headers
para aceder a quaisquer cabeçalhos adicionados ao pedido HTTP por mediações anteriores na cadeia de processamento. Esta variável define um mapa de pares chave-valor correspondentes aos cabeçalhos HTTP adicionais e não aos cabeçalhos originais do pedido de entrada inicial.Por exemplo, a seguinte expressão CEL pode ser usada para criar um pedido HTTP apenas com cabeçalhos adicionando um cabeçalho adicional aos cabeçalhos adicionados nas mediações de pipeline anteriores:
{"headers": headers.merge({"new-header-key": "new-header-value"})}
Construa pedidos HTTP
O resultado da expressão CEL tem de ser um mapa de pares de chave/valor cujos campos headers
e body
são usados para criar o pedido HTTP da seguinte forma.
Para headers
campos:
- Se existir um mapa
headers
como resultado da expressão CEL, os respetivos pares de chave-valor são mapeados diretamente para os cabeçalhos dos pedidos HTTP, e os respetivos valores são construídos através da codificação de strings canónica do tipo de dados correspondente. - Se um campo
headers
não existir, o pedido HTTP resultante não contém cabeçalhos.
Para body
campos:
- Se existir um campo
body
como resultado da expressão CEL, o respetivo valor é mapeado diretamente para o corpo do pedido HTTP. - Se o valor do campo
body
for do tipobytes
oustring
, é usado como o corpo do pedido HTTP tal como está. Caso contrário, é convertido numa string JSON. - Se o campo
body
não existir, o corpo do pedido HTTP resultante é o corpo da associação de mensagens HTTP CloudEvents final no modo de conteúdo binário.
Quaisquer outros campos resultantes da expressão de IEC são ignorados.
Funções de extensões
O Eventarc Advanced suporta as seguintes funções de extensão que podem ser usadas para transformar os dados de eventos quando especifica uma associação de mensagens.
Função | Descrição |
---|---|
merge |
Mescla um mapa CEL transmitido no mapa CEL ao qual a função é
aplicada. Se a mesma chave existir em ambos os mapas ou se o valor da chave for do tipo
Exemplo: |
toBase64 |
Converte um valor CEL numa string codificada em URL base64. Exemplo: |
toCloudEventJsonWithPayloadFormat |
Converte uma mensagem num mapa CEL que corresponde a uma representação JSON de uma mensagem CloudEvents e aplica Exemplo: |
toDestinationPayloadFormat |
Converte Exemplo: |
toJsonString |
Converte um valor CEL numa string JSON. Por exemplo:
|
toMap |
Converte uma lista IEC de mapas IEC num único mapa IEC. Exemplo: |
Exemplo: manter cabeçalhos, adicionar novo cabeçalho, definir corpo para formato de destino
gcloud eventarc pipelines create my-pipeline \ --location=us-central1 \ --input-payload-format-json='{}' \ --destinations=http_endpoint_uri='https://example-endpoint.com',http_endpoint_message_binding_template='{"headers": headers.merge({"content-type":"application/avro"}), "body": message.data.toDestinationPayloadFormat()"}',output_payload_format_avro_schema_definition='{"schema_definition": "{"type":"record","name":"myrecord","fields":[{"name":"name","type":"string"},{"name":"account_late","type":"boolean"}]}"}'