全部產品
Search
文件中心

DataWorks:最佳實務:(進階特性應用)禁止使用MAX_PT函數

更新時間:Jun 19, 2024

DataWorks提供內建的流程檢查,如任務發布前程式碼檢閱、資料治理中心治理項的內建檢查項校正,此外,DataWorks還支援您自訂校正邏輯並接入DataWorks,實現DataWorks流程管控。本文以在提交與發布時校正代碼中是否存在MAX_PT函數為例,為您介紹如何基於擴充程式實現工作空間中不允許使用特定函數。

情境說明

本實踐樣本的情境為校正提交發布的代碼中是否有MAX_PT函數,樣本的校正流程為:
序號核心流程核心功能點
1將工作空間中的檔案提交與發布訊息(例如提交、發布節點)通過OpenEvent發布至EventBridge,後續通過EventBridge過濾事件訊息,並將訊息發送至您的服務。開啟訊息訂閱的時候,通過事件規則指定訂閱的事件類型為檔案提交與發布(dataworks:FileChange:CommitFiledataworks:FileChange:DeployFile

配置詳情請參見開啟並配置訊息訂閱(OpenEvent)

2本地或線上服務接收訊息,通過對擴充程式的設定,實現:
  • 對於某個指定工作空間的提交檔案的訊息:不觸發校正,流程直接通過。
  • 對於某個指定工作空間的發布檔案的訊息:觸發校正,判斷代碼中是否使用MAX_PT函數並給出響應。

    若存在MAX_PT函數,則通過回調API阻塞DataWorks上的提交或發布流程,或者發送警示資訊。

  • 註冊擴充程式時,通過擴充程式的參數配置,指定不生效的工作空間和事件。本樣本指定提交檔案事件不生效(不觸發擴充程式校正)。
  • 註冊擴充程式時,通過擴充程式選項配置,指定擴充程式對於不滿足校正條件的事件的響應選項,後續在啟用擴充程式時選擇具體的回應程式式。本樣本可選的回應程式式有警示和禁用。
配置詳情請參見註冊並配置擴充程式(Extensions)

開啟並配置訊息訂閱(OpenEvent)

開啟並配置訊息訂閱的詳細步驟請參見開啟訊息訂閱,以下為本實踐中的核心配置流程與注意事項。
  1. EvenBridge控制台,跳過事件來源等配置,快速建立一個自訂匯流排。建立自訂匯流排
  2. EvenBridge控制台對應的事件匯流排中,建立事件規則。
    本實踐定義該EventBridge自訂匯流排可接收DataWorks檔案提交事件訊息和檔案發布事件訊息,配置demo與核心參數配置如下。
    1. 配置事件模式建立規則
      {
          "source": [
              "acs.dataworks"
          ],
          "type": [
              "dataworks:FileChange:CommitFile",
              "dataworks:FileChange:DeployFile"
          ]
      }
      • source:定義事件的產品名稱標識,配置為acs.dataworks
      • type:定義產品下事件的類型標識,配置為dataworks:FileChange:CommitFiledataworks:FileChange:DeployFile。您可以在下方的事件模式調試中,將source、type取值進行補充修改,然後進行事件測試,測試成功後單擊下一步測試
    2. 配置事件目標中,服務類型選擇為HTTPS,並填寫合適的URL,其他參數可保持預設。事件目標
  3. 進入DataWorks控制台的開放平台頁面,在OpenEvent頁簽添加事件分發通道。分發通道
  4. DataWorks控制台的開放平台頁面,啟用上述訊息分發通道。啟用

註冊並配置擴充程式(Extensions)

註冊並配置擴充程式的詳細步驟請參見準備工作,以下為本實踐中的核心配置流程與注意事項。

  1. 註冊擴充程式。

    進入DataWorks控制台的開放平台頁面,在擴充程式頁簽單擊註冊擴充程式

    本實踐以在資料開發頁面提交節點的事件為樣本,註冊擴充程式時,核心參數配置說明如下,其他參數可根據介面提示進行配置。
    核心參數配置說明
    處理的擴充點需選擇為檔案提交前置事件檔案發布前置事件
    擴充程式參數配置您可通過本參數的配置來控制擴充程式的生效範圍,在指定工作空間下:
    • 提交節點(檔案提交前置事件)時不觸發擴充程式校正、不阻塞提交節點的流程。
    • 發布節點(檔案發布前置事件)時觸發擴充程式校正,如果不滿足校正通過條件會阻塞發布節點的流程。

    需配置為extension.project.commit-file.disabled=YourProjectId。其中YourProjectId需替換為擴充程式不生效的擴充點事件所在的工作空間ID。

    擴充程式選項配置需配置為以下樣本內容,用於後續設定不滿足校正條件後的回應程式式,以下樣本中指定的回應程式式包括警示和禁用。
    {
      "type":"object",
      "properties":{
        "checkStatus":{
          "type":"number",
          "title":"MAX-PT函數檢查方式",
          "x-decorator":"FormItem",
          "x-component":"Radio.Group",
          "x-decorator-props":{
            "tooltip":"描述檔案"
          },
          "x-component-props":{
            "dataSource":[
              {
                "value":"WARN",
                "label":"警示"
              },
              {
                "value":"FAIL",
                "label":"禁用"
              }
            ],
            "mode":"multiple"
          }
        }
      }
    }
  2. 開發部署擴充程式。
    配置DataWorks的SDK,配置詳情請參見安裝Java SDK,本實踐的範例程式碼如下。
    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.aliyuncs.IAcsClient;
    import com.aliyuncs.dataworks_public.model.v20200518.*;
    import com.aliyuncs.exceptions.ClientException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    /**
     * @author dataworks demo
     */
    @RestController
    @RequestMapping("/extensions")
    public class ExtensionsController {
    
        @Autowired(required = false)
        private DataWorksOpenApiClient dataWorksOpenApiClient;
    
        @Autowired
        private ExtensionParamProperties extensionParamProperties;
    
        /**
         * 接收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)){
                //初始化client
                IAcsClient client = dataWorksOpenApiClient.createClient();
                try {
                    //當前事件參數資訊
                    String messageId = jsonObj.getString("id");
                    JSONObject data = jsonObj.getObject("data", JSONObject.class);
                    Long projectId = data.getLong("projectId");
    
                    //初始化事件回調
                    UpdateIDEEventResultRequest updateIDEEventResultRequest = new UpdateIDEEventResultRequest();
                    updateIDEEventResultRequest.setMessageId(messageId);
                    updateIDEEventResultRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
    
                    //查詢觸發擴充點事件時的擴充點資料快照
                    GetIDEEventDetailRequest getIDEEventDetailRequest = new GetIDEEventDetailRequest();
                    getIDEEventDetailRequest.setMessageId(messageId);
                    getIDEEventDetailRequest.setProjectId(projectId);
                    GetIDEEventDetailResponse getIDEEventDetailResponse = client.getAcsResponse(getIDEEventDetailRequest);
                    String content = getIDEEventDetailResponse.getEventDetail().getCommittedFile().getContent();
    
                    //判斷代碼是否包含限制函數
                    if(content.contains(Constants.CHECK_CODE)){
                        //擷取擴充程式選項配置在專案空間下的配置
                        GetOptionValueForProjectRequest getOptionValueForProjectRequest = new GetOptionValueForProjectRequest();
                        getOptionValueForProjectRequest.setProjectId(String.valueOf(projectId));
                        getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
                        GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getAcsResponse(getOptionValueForProjectRequest);
                        JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getOptionValue());
                        //注意:這裡需根據在DataWorks上實際設定格式來填寫
                        String checkStatus = jsonObject.getString("checkStatus");
                        updateIDEEventResultRequest.setCheckResult(checkStatus);
                        updateIDEEventResultRequest.setCheckResultTip("代碼中存在限制函數");
                    }else{//成功回調
                        updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode());
                        updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName());
                    }
                    //回調DataWorks
                    UpdateIDEEventResultResponse acsResponse = client.getAcsResponse(updateIDEEventResultRequest);
                    //請求的唯一標識,用於後續錯誤排查使用
                    System.out.println("acsResponse:" + acsResponse.getRequestId());
                } catch (ClientException e) {
                    //請求的唯一標識,用於後續錯誤排查使用
                    System.out.println("RequestId:" + e.getRequestId());
                    //錯誤狀態代碼
                    System.out.println("ErrCode:" + e.getErrCode());
                    //錯誤描述資訊
                    System.out.println("ErrMsg:" + e.getErrMsg());
                }
            }else{
                System.out.println("未能過濾其他事件,請檢查配置步驟");
            }
        }
    }
  3. 啟用擴充程式。
    擴充程式註冊完成後,單擊擴充程式管理,進入管理中心,在擴充程式頁面開啟上述註冊的擴充程式的啟動開關,根據介面提示完成授權啟用擴充程式,完成後單擊操作列的設定,設定工作空間對MAX_PT函數使用的管控力度。啟用擴充程式02
  4. 本地部署運行。
    下載工程:下載工程後,進入工程根目錄下執行:
    mvn clean package -Dmaven.test.skip=true spring-boot:repackage
    獲得可直接啟動並執行jar後執行:
    java -jar target/extensions-demo-maxpt-1.0.jar
    此時會成功啟動工程,如下圖所示:maxpt在瀏覽器輸入http://localhost:8080/index會得到"hello world!",表示應用成功部署,打通網路後即可訂閱EventBridge的訊息了。

結果驗證

完成上述實踐配置後,您可以在工作空間進行驗證。本樣本中,檔案提交事件(如提交節點)與檔案發布事件(如發布節點)會觸發擴充程式校正,但通過擴充程式的參數配置,對指定的工作空間的檔案提交事件不生效,所以在指定工作空間內提交包含MAX_PT函數的節點時,不會觸發擴充程式校正,當發布該包含MAX_PT函數的節點時,將觸發該擴充程式校正。