Um pipeline conecta um barramento a um destino e encaminha mensagens de eventos para esse destino. É possível configurar um pipeline para esperar dados de eventos em um formato específico ou, antes que os eventos sejam entregues a um destino, converter os dados de eventos de um formato compatível para outro. Por exemplo, talvez seja necessário encaminhar eventos para um endpoint que só aceite dados Avro.
Formatos compatíveis
As conversões de formato a seguir são compatíveis:
- Avro para JSON
- Avro para Protobuf
- JSON para Avro
- JSON para Protobuf
- Protobuf para Avro
- Protobuf para JSON
Observe o seguinte:
Ao converter o formato de eventos, apenas o payload do evento é convertido, e não a mensagem de evento inteira.
Se um formato de dados de entrada for especificado para um pipeline, todos os eventos precisarão corresponder a esse formato. Todos os eventos que não corresponderem ao formato esperado serão tratados como erros persistentes.
Se um formato de dados de entrada não for especificado para um pipeline, um formato de saída não poderá ser definido.
Antes que um formato de evento seja convertido para um destino específico, qualquer transformação de dados configurada será aplicada primeiro.
Os eventos são sempre entregues em um formato CloudEvents usando uma solicitação HTTP no modo de conteúdo binário , a menos que você especifique uma vinculação de mensagem.
Os esquemas JSON são detectados dinamicamente. Para definições de esquema do Protobuf, é possível definir apenas um tipo de nível superior, e as instruções de importação que se referem a outros tipos não são compatíveis. As definições de esquema sem um identificador
syntaxsão definidas comoproto2por padrão. Observe que há um limite de tamanho do esquema.
Configurar um pipeline para formatar eventos
É possível configurar um pipeline para esperar dados de eventos em um formato específico ou para converter dados de eventos de um formato para outro, no Google Cloud console ou usando a CLI gcloud.
Console
Noconsole, acesse a página Eventarc > Pipelines. Google Cloud
É possível criar um pipeline ou, se você estiver atualizando um, clique no nome dele.
Na página Detalhes do pipeline, clique em Editar.
No painel Mediação de eventos, faça o seguinte:
- Marque a caixa de seleção Aplicar uma transformação.
Na lista Formato de entrada, selecione o formato aplicável.
Observação: se um formato de dados de entrada for especificado para um pipeline, todos os eventos precisarão corresponder a esse formato. Todos os eventos que não corresponderem ao formato esperado serão tratados como erros persistentes.
Para formatos Avro ou Protobuf, é necessário especificar um esquema de entrada. Como alternativa, em vez de especificar diretamente, é possível fazer upload de um esquema de entrada.
No campo Expressão CEL, escreva uma expressão de transformação usando CEL.
Clique em Continuar.
No painel Destino, faça o seguinte:
Se aplicável, na lista Formato de saída, selecione um formato.
Se um formato de dados de entrada não for especificado para um pipeline, um formato de dados de saída não poderá ser definido.
Opcional: aplique uma vinculação de mensagem. Para mais informações, consulte Vinculação de mensagens.
Clique em Salvar.
Pode levar alguns minutos para atualizar um pipeline.
gcloud
Abra um terminal.
É possível criar um pipeline ou atualizar um usando o
gcloud eventarc pipelines updatecomando:gcloud eventarc pipelines update PIPELINE_NAME \ --location=REGION \ --INPUT_PAYLOAD_FLAG \ --destinations=OUTPUT_PAYLOAD_KEY
Substitua:
PIPELINE_NAME: o ID do pipeline ou um nome totalmente qualificadoREGION: um local compatível do Eventarc AdvancedComo alternativa, é possível definir a propriedade de local da CLI gcloud:
gcloud config set eventarc/location REGIONINPUT_PAYLOAD_FLAG: um flag de formato de dados de entrada que pode ser um dos seguintes:--input-payload-format-avro-schema-definition--input-payload-format-json--input-payload-format-protobuf-schema-definition
Observação: se um formato de dados de entrada for especificado para um pipeline, todos os eventos precisarão corresponder a esse formato. Todos os eventos que não corresponderem ao formato esperado serão tratados como erros persistentes.
OUTPUT_PAYLOAD_KEY: uma chave de formato de dados de saída que pode ser uma das seguintes:output_payload_format_avro_schema_definitionoutput_payload_format_jsonoutput_payload_format_protobuf_schema_definition
Observe que, se você definir uma chave de formato de dados de saída, também será necessário especificar um flag de formato de dados de entrada.
Pode levar alguns minutos para atualizar um pipeline.
Exemplos:
O exemplo a seguir usa um flag
--input-payload-format-protobuf-schema-definitionpara especificar que o pipeline espera eventos em um formato de dados Protobuf com um esquema específico:gcloud eventarc pipelines update my-pipeline \ --input-payload-format-protobuf-schema-definition \ ' syntax = "proto3"; message schema { string name = 1; string severity = 2; } '
O exemplo a seguir usa uma chave
output_payload_format_avro_schema_definitione um flag--input-payload-format-avro-schema-definitionpara criar um pipeline que espera eventos em um formato Avro e os gera no mesmo formato:gcloud eventarc pipelines create my-pipeline \ --location=us-central1 \ --destinations=http_endpoint_uri='https://example-endpoint.com',output_payload_format_avro_schema_definition='{"type": "record", "name": "my_record", "fields": [{"name": "my_field", "type": "string"}]}' \ --input-payload-format-avro-schema-definition='{"type": "record", "name": "my_record", "fields": [{"name": "my_field", "type": "string"}]}'
O exemplo a seguir usa uma chave
output_payload_format_protobuf_schema_definitione um flag--input-payload-format-avro-schema-definitionpara atualizar um pipeline e converter os dados de eventos de Avro para Protobuf usando definições de esquema:gcloud eventarc pipelines update my-pipeline \ --location=us-central1 \ --destinations=output_payload_format_protobuf_schema_definition='message MessageProto {string prop1 = 1; string prop2 = 2;}' \ --input-payload-format-avro-schema-definition= \ ' { "type": "record", "name": "MessageProto", "fields": [ { "name" : "prop1", "type": "string" }, { "name" : "prop2", "type": "string" }, ] } '