O DataWorks oferece verificações integradas, como revisões de código antes da implantação de tarefas e validações do Data Governance Center. Você também pode integrar lógicas de validação personalizadas para aplicar controles de processo no DataWorks. Este tópico demonstra como usar uma extensão para proibir funções específicas em um workspace, com um exemplo que verifica a presença da função MAX_PT durante o envio ou a implantação.
Cenário
Esta melhor prática apresenta um exemplo de como verificar a função MAX_PT no código enviado e implantado. A tabela a seguir descreve o processo de validação:
|
Etapa |
Processo principal |
Recurso principal |
|
1 |
O Open Event envia mensagens de envio e implantação de arquivos (como o envio e a implantação de nós) de um workspace para o EventBridge. Em seguida, o EventBridge filtra as mensagens de evento e as envia para o seu service. |
Ative a assinatura de mensagens e use uma regra de evento para assinar tipos de evento específicos, como envio de arquivo (dataworks:FileChange:CommitFile) e implantação de arquivo (dataworks:FileChange:DeployFile). Para obter detalhes de configuração, consulte Best practice: (advanced feature) Prohibit the MAX_PT function. |
|
2 |
Um service local ou online recebe as mensagens. A extensão lida com os eventos da seguinte forma:
|
Para obter detalhes de configuração, consulte Best practice: (advanced feature) Prohibit the MAX_PT function. |
Pré-requisitos
O EventBridge está ativado. Para mais informações, consulte Activate EventBridge.
O DataWorks está ativado. Para mais informações, consulte Activate DataWorks.
Crie um workspace do DataWorks. Para mais informações, consulte Create a workspace.
Procedimento
Etapa 1: Configure um barramento de eventos personalizado
Faça login no EventBridge console. No painel de navegação à esquerda, clique em Event Bus e acesse a página do barramento de eventos.
-
Clique em
para Create Custom Event Bus.Na seção Bus, configure o Custom Event Bus Name e, em seguida, clique em Next step para prosseguir para a configuração do source do evento.
Clique em Skip para pular a configuração de Event Source, Rule e Target Module. Insira uma Description.
-
No painel de navegação à esquerda, clique em Event Bus e acesse a página do barramento de eventos. Encontre o barramento de eventos criado e clique em seu nome e acesse a página de visão geral.
No painel de navegação à esquerda, clique em Event Rules e acesse a página de regras de evento e, em seguida, clique em Create Rule e crie uma regra de evento.
-
Neste exemplo, configuramos o barramento personalizado do EventBridge para receber mensagens de evento de envio e implantação de arquivos do DataWorks. A seção a seguir descreve a demonstração de configuração e os parâmetros principais.
Configure Basic Information: personalize o nome da regra.
-
Pattern Content.
Event Source Type: selecione custom event source.
Event Source: deixe este campo vazio.
-
Pattern Content: escreva em formato json. A configuração é a seguinte.
{ "source": [ "acs.dataworks" ], "type": [ "dataworks:FileChange:CommitFile", "dataworks:FileChange:DeployFile" ] }source: define o identificador do nome do product acs.dataworks.
type: define os identificadores de tipo de evento do product. Defina como dataworks:FileChange:CommitFile e dataworks:FileChange:DeployFile.
Event Pattern Debugging: preencha e modifique os valores de source e type e, em seguida, execute um teste de evento. Quando o teste for bem-sucedido, clique em Next. Clique em Test e verifique se o evento personalizado corresponde ao padrão. Se o teste for aprovado, a página exibirá Match passed, event can be triggered normally.
-
Configure Event Target.
Service Type: selecione HTTPS ou HTTP. Para obter mais tipos de service, consulte Event targets.
URL: insira a URL que recebe as mensagens enviadas pelo barramento personalizado, como
https://server-address:port/extensions/consumer.Body: selecione Complete Event.
Network Type: selecione Public Network.
Etapa 2: Configure um canal de distribuição de eventos
-
Faça login no console do DataWorks. Na região de destino, clique em no painel de navegação à esquerda. Clique em Go to Open Platform e acesse a página Developer Backend.
-
Na página Developer Backend, clique em OpenEvent no painel de navegação à esquerda. Na página exibida, clique em Add Event Distribution Channel e configure as opções na caixa de diálogo.
Workspace for Event Distribution: selecione um workspace criado.
Custom Bus in Eventbridge for Distribution: selecione o barramento de eventos criado na Etapa 1.
Salve o canal de distribuição de eventos. Na coluna Operation do canal, clique em Enable e ative o novo canal de distribuição de eventos.
Etapa 3: Registre e configure uma extensão
-
Faça login no console do DataWorks. Na região de destino, clique em no painel de navegação à esquerda. Clique em Go to Open Platform e acesse a página Developer Backend.
-
Na página Developer Backend, clique em Extension no painel de navegação à esquerda. Na página exibida, clique em Register Extension e configure as opções na caixa de diálogo.
Método de implantação: selecione Deploy via self-built service.
-
Registre a extensão
Extension Name: insira um nome personalizado.
Extension Point Event: selecione Before File Commit e Before File Deploy.
Workspace for Testing: configure esta opção e teste a extensão no workspace especificado antes de enviá-la.
-
Parameter Configurations for Extension
Use este parâmetro para controlar o escopo da extensão. No workspace especificado:
O envio de um nó (Before File Commit) não aciona a validação da extensão nem bloqueia o processo de envio.
A implantação de um nó (Before File Deploy) aciona a validação da extensão. Se a validação falhar, o sistema bloqueia o processo de implantação.
Defina como extension.project.commit-file.disabled=YourProjectId, onde YourProjectId é o ID do workspace no qual o evento do ponto de extensão não se aplica.
-
Options for Extension: use esta opção e defina métodos de resposta quando a validação falhar. Neste exemplo, os métodos de resposta especificados incluem alerta e bloqueio.
{ "type":"object", "properties":{ "checkStatus":{ "type":"number", "title":"MAX-PT function check method", "x-decorator":"FormItem", "x-component":"Radio.Group", "x-decorator-props":{ "tooltip":"Description file" }, "x-component-props":{ "dataSource":[ { "value":"WARN", "label":"Warning" }, { "value":"FAIL", "label":"Disabled" } ], "mode":"multiple" } } } }A configuração de opções tem os seguintes campos:
checkStatus: um nome de campo personalizado (nome do componente, deve ser único) que o desenvolvedor da extensão define na configuração de opções. O servidor da extensão lê o valor que o administrador do workspace configura para o workspace por meio deste nome de campo.
title: o título da opção. Para obter os valores, consulte a análise de parâmetros e os exemplos de configuração em Advanced feature: Extension options configuration. Neste exemplo, o título é MAX-PT Function Check Method.
x-component: o componente de formulário que a opção usa. Neste exemplo, utilizamos um componente de botão de opção (Radio.Group).
dataSource: as opções selecionáveis para o componente de botão de opção, em que label é o texto exibido na UI e value é o identificador correspondente. Este exemplo fornece dois valores: Alert (WARN) e Block (FAIL), permitindo que o administrador do workspace selecione o método de resposta ao detectar a função MAX_PT e ative a extensão.
Com o código de exemplo neste tópico, você entende o fluxo de valores de checkStatus: ative a extensão e selecione Alert ou Block em MAX-PT Function Check Method. O servidor da extensão lê essa configuração por meio de GetOptionValueForProject, recupera a seleção do administrador por meio de jsonObject.getString("checkStatus") e retorna o resultado para o DataWorks por meio de setCheckResult como um callback, alertando ou bloqueando o processo de implantação do nó.
NotacheckStatus é apenas um exemplo de configuração com o componente de botão de opção. A configuração de opções suporta atualmente sete tipos de componentes: texto, entrada de linha única, entrada de várias linhas, menu suspenso de seleção única, menu suspenso de seleção múltipla, caixa de seleção e botão de opção. Para obter a lista completa de tipos de componentes e métodos de configuração, consulte Configure extension options.
Ao concluir a configuração, clique em Determine, salve e registre a extensão.
-
Na coluna Operation da extensão criada, clique em Submit e envie a extensão para revisão.
NotaA plataforma DataWorks realiza a revisão da extensão. A revisão geralmente leva T+3 dias úteis para ser concluída.
Para testar a extensão criada, configure o Workspace for Testing.
Após a aprovação da revisão, clique em Deploy na coluna Operation para colocar a extensão online.
Clique em Manage Extensions e acesse a página . Selecione a extensão criada, ative-a na coluna Enable e clique em Settings e configure o nível de controle para o uso da função MAX_PT no workspace.
Desenvolva e configure a extensão
O EventBridge recebe mensagens de evento do DataWorks no formato json por meio de solicitações HTTP, analisa as mensagens e as envia para o service de destino. Depois que o service processa os eventos, ele retorna os resultados para o DataWorks.
Código de exemplo
Este exemplo de código chama a API UpdateIDEEventResult para retornar o resultado do callback. Ele usa o parâmetro messageId na API para obter os detalhes do evento, executa a lógica para determinar se o código usa funções restritas e retorna o resultado para o DataWorks por meio da API UpdateIDEEventResult. Para mais informações, consulte Develop an extension.
Configuração do ambiente: Java 8, ferramenta de compilação Maven.
package com.aliyun.dataworks.demo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyun.dataworks.config.Constants; import com.aliyun.dataworks.config.EventCheckEnum; import com.aliyun.dataworks.config.ExtensionParamProperties; import com.aliyun.dataworks.services.DataWorksOpenApiClient; import com.aliyun.dataworks_public20200518.Client; import com.aliyun.dataworks_public20200518.models.; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; / @author dataworks demo / @RestController @RequestMapping("/extensions") public class ExtensionsController { @Autowired(required = false) private DataWorksOpenApiClient dataWorksOpenApiClient; @Autowired private ExtensionParamProperties extensionParamProperties; / Receive messages pushed by EventBridge @param jsonParam */ @PostMapping("/consumer") public void consumerEventBridge(@RequestBody String jsonParam) { JSONObject jsonObj = JSON.parseObject(jsonParam); String eventCode = jsonObj.getString(Constants.EVENT_CODE_FILED); if (Constants.COMMIT_FILE_EVENT_CODE.equals(eventCode) || Constants.DEPLOY_FILE_EVENT_CODE.equals(eventCode)) { //Initialize client Client client = dataWorksOpenApiClient.createClient(); try { //Current event parameter information String messageId = jsonObj.getString("id"); JSONObject data = jsonObj.getObject("data", JSONObject.class); Long projectId = data.getLong("projectId"); //Initialize event callback UpdateIDEEventResultRequest updateIDEEventResultRequest = new UpdateIDEEventResultRequest(); updateIDEEventResultRequest.setMessageId(messageId); updateIDEEventResultRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); //Query the extension point data snapshot when the extension point event was triggered GetIDEEventDetailRequest getIDEEventDetailRequest = new GetIDEEventDetailRequest(); getIDEEventDetailRequest.setMessageId(messageId); getIDEEventDetailRequest.setProjectId(projectId); GetIDEEventDetailResponse getIDEEventDetailResponse = client.getIDEEventDetail(getIDEEventDetailRequest); String content = getIDEEventDetailResponse.getBody().getEventDetail().getCommittedFile().getContent(); //Check whether the code contains restricted functions if (content.contains(Constants.CHECK_CODE)) { //Get the extension option configuration for the workspace GetOptionValueForProjectRequest getOptionValueForProjectRequest = new GetOptionValueForProjectRequest(); getOptionValueForProjectRequest.setProjectId(String.valueOf(projectId)); getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getOptionValueForProject(getOptionValueForProjectRequest); JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getBody().getOptionValue()); //Note: fill in according to the actual format configured in DataWorks String checkStatus = jsonObject.getString("checkStatus"); updateIDEEventResultRequest.setCheckResult(checkStatus); updateIDEEventResultRequest.setCheckResultTip("Restricted functions found in code"); } else {//Success callback updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode()); updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName()); } //Callback to DataWorks UpdateIDEEventResultResponse response = client.updateIDEEventResult(updateIDEEventResultRequest); //Unique request ID for subsequent troubleshooting System.out.println("response:" + response.getBody().getRequestId()); } catch (Exception e) { //Error description System.out.println("ErrMsg:" + e.getMessage()); } } else { System.out.println("Failed to filter other events, please check the configuration steps"); } } }
Implantar o projeto de exemplo
-
Prepare o ambiente e o projeto
Ambiente necessário: Java 8 ou posterior, ferramenta de compilação Maven.
Baixe o projeto no link: extensions-demo-maxpt.zip (219 KB).
-
Métodos de implantação
Implantação local: empacote o projeto como um arquivo JAR e, em seguida, execute o comando
java -jar yourapp.jarem um servidor local com Java 8 e Maven instalados para iniciar o service.Implantação na cloud: empacote o projeto como um arquivo JAR e, em seguida, faça o upload para o ambiente de execução apropriado, como um contêiner docker ou servidor na cloud, para implantação.
NotaO service implantado precisa estar acessível pelo EventBridge via Internet.
-
Baixe o projeto, acesse o diretório raiz e execute o comando de empacotamento para compilar o arquivo JAR.
mvn clean package -Dmaven.test.skip=true spring-boot:repackage -
Execute o arquivo JAR:
java -jar target/extensions-demo-maxpt-1.0.jarO projeto inicia com sucesso.
/\ / /'---'. __ __ ____ /'\'\\ ( ( )\'---'| '--'| '--'\/'--'| '\ \\\\ \/ /__) | |__| | | |__(___| | ) ) ) ) ' '__| | |__| |'| |___| | / / / / =========|_|===============|__/=/=/_/ :: Spring Boot :: (v2.7.2) 2022-08-22 11:17:35.261 INFO 28648 --- [ main] com.aliyun.dataworks.DemoStarter : Starting DemoStarter v1.0 using Java 1.8.0_151 on xxx.local with PID 28648 (/Users/xxx/ts/extensions-demo-maxpt) ns-demo-maxpt/target/extensions-demo-maxpt-1.0.jar started by guangzhen.zk in /Users/xxx/ts/extensions-demo-maxpt) 2022-08-22 11:17:35.264 INFO 28648 --- [ main] com.aliyun.dataworks.DemoStarter : No active profile set, falling back to 1 default profile: "default" 2022-08-22 11:17:35.276 INFO 28648 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2022-08-22 11:17:36.291 INFO 28648 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-08-22 11:17:36.291 INFO 28648 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.65] 2022-08-22 11:17:36.419 INFO 28648 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-08-22 11:17:36.419 INFO 28648 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1099 ms 2022-08-22 11:17:36.851 INFO 28648 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-08-22 11:17:36.860 INFO 28648 --- [ main] com.aliyun.dataworks.DemoStarter : Started DemoStarter in 1.98 seconds (JVM running for 2.449)Insira
http://localhost:8080/indexem um navegador. Se receber"hello world!", a implantação do aplicativo foi bem-sucedida. Após estabelecer a conectividade de rede, assine as mensagens do EventBridge.
Verificação do resultado
Após concluir a implantação do código e estabelecer a conectividade de rede com o EventBridge, verifique a configuração no workspace onde a extensão está ativada.
Etapas de verificação
Na página Data Studio, crie um nó, insira a função
MAX_PTproibida no nó, salve-o e envie-o.-
Clique em Deploy e acesse a página de criação de pacote de implantação e implante o nó. Essa ação aciona a validação da extensão.
NotaCom base na configuração da extensão, a extensão não tem efeito para eventos de envio de arquivo no workspace especificado. Portanto, o envio de um nó que contém a função
MAX_PTnão aciona a validação da extensão. O sistema aciona a extensão apenas ao implantar um nó que contém a funçãoMAX_PT.