DataWorks提供內建的流程檢查,如任務發布前程式碼檢閱、資料治理中心治理項的內建檢查項校正,此外,DataWorks還支援您自訂校正邏輯並接入DataWorks,實現DataWorks流程管控。本文以在提交與發布時校正代碼中是否存在MAX_PT函數為例,為您介紹如何基於擴充程式實現工作空間中不允許使用特定函數。
情境說明
本實踐樣本的情境為校正提交發布的代碼中是否有MAX_PT函數,樣本的校正流程為:
序號 | 核心流程 | 核心功能點 |
1 | 將工作空間中的檔案提交與發布訊息(例如提交、發布節點)通過OpenEvent發布至EventBridge,後續通過EventBridge過濾事件訊息,並將訊息發送至您的服務。 | 開啟訊息訂閱的時候,通過事件規則指定訂閱的事件類型為檔案提交與發布(dataworks:FileChange:CommitFile和dataworks:FileChange:DeployFile) 配置詳情請參見最佳實務:(進階特性應用)禁止使用MAX_PT函數。 |
2 | 本地或線上服務接收訊息,通過對擴充程式的設定,實現:
|
配置詳情請參見最佳實務:(進階特性應用)禁止使用MAX_PT函數。 |
前提條件
操作步驟
步驟一:配置自訂匯流排
登入事件匯流排EventBridge控制台,單擊左側導覽列事件匯流排,進入事件匯流排建立頁面。
單擊按鈕,建立自訂事件匯流排。
在匯流排模組內配置完自訂事件匯流排名稱後,單擊下一步,進入對事件來源配置中。
單擊跳過,跳過事件來源、規則、目標模組的配置。
單擊左側導覽列事件匯流排進入事件匯流排建立頁面,找到已建立的事件匯流排後,單擊名稱,進入事件匯流排概覽頁面。
單擊左側導覽列事件規則進入事件規則頁面後,單擊建立規則建立事件規則。
本實踐定義該EventBridge自訂匯流排可接收DataWorks檔案提交事件訊息和檔案發布事件訊息,配置demo與核心參數如下。
配置基本資料:自訂規則名稱即可。
實踐模式內容。
事件來源類型:選擇自訂事件來源。
事件來源:不進行配置。
模式內容:以JSON格式編寫,配置內容如下。
{ "source": [ "acs.dataworks" ], "type": [ "dataworks:FileChange:CommitFile", "dataworks:FileChange:DeployFile" ] }
source:定義事件的產品名稱標識acs.dataworks。
type:定義產品下事件的類型標識,配置為dataworks:FileChange:CommitFile、dataworks:FileChange:DeployFile。
事件模式調試:將source、type取值進行補充修改,然後進行事件測試,測試成功後單擊下一步。
配置事件目標。
服務類型:選擇HTTPS或HTTP,更多服務類型可參見管理事件規則。
URL:填寫接收自訂匯流排推送資訊的URL,例如
https://伺服器位址:連接埠號碼/extensions/consumer
。Body:選擇完整事件。
網路類型:選擇公網。
步驟二:配置事件分發通道
進入開放平台頁面。
登入DataWorks控制台,切換至目標地區後,單擊左側導覽列的 ,進入開放平台的開發人員後台頁面。
在開發人員後台頁面,單擊左側導覽列OpenEvent,進入頁面後,單擊添加事件分發通道,在彈窗內進行配置。
要分發事件的工作空間:選擇已建立空間。
指定分發到EventBridge中自訂匯流排:選擇步驟一建立的事件匯流排。
儲存事件分發通道後,在事件分發通道的操作列,單擊啟用按鈕,啟用建立的事件分發通道。
步驟三:註冊並配置擴充程式(Extensions)
進入開放平台頁面。
登入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" } } } }
配置完成以上內容後,單擊確定儲存註冊擴充程式。
在已建立好的擴充程式的操作列,單擊提交,進入審核狀態。
說明擴充程式審核由DataWorks平台審核,審核事件通常在T+3個工作日完成,請耐心等待。
如需要測試建立的擴充程式,需要配置測試用工作空間。
審核通過後,單擊操作列的上線,即可上線使用該擴充程式。
單擊擴充程式管理按鈕,進入
頁面,選擇建立的擴充程式,在啟用列啟用該擴充程式,並單擊設定工作空間對MAX_PT函數使用的管控力度。
開發配置擴充程式
事件匯流排EventBridge通過Http請求擷取DataWorks發送的JSON格式事件,解析訊息,並推送至目標服務程式上,對事進行處理後,返回結果至DataWorks中。
示例代碼
該程式碼範例是通過調用UpdateIDEEventResultAPI,指定API中的messageId
參數來擷取詳細的事件詳情後進行邏輯判斷是否包含限制函數,判斷結果使用UpdateIDEEventResult這個API將判斷結果返回至DataWorks中。詳情請參見開發擴充程式。
環境構建:Java8,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.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("未能過濾其他事件,請檢查配置步驟");
}
}
}
樣本工程部署
準備環境與工程
依賴環境:java8及以上,maven構建工具。
部署方式
本地部署:將工程檔案打成jar包後,在本地環境中已部署Java8和Maven工具的本機伺服器或Windows上進行
java -jar yourapp.jar
運行服務程式。雲平台部署:將工程檔案打成jar包後,上傳至相應的運行環境例如:Docker容器、雲端服務器等進行部署。
說明部署完成的服務,需要保證EventBridge可通過公網訪問到該服務。
下載工程後,進入工程根目錄下執行打包命令,將工程專案打成jar包。
mvn clean package -Dmaven.test.skip=true spring-boot:repackage
執行jar包:
java -jar target/extensions-demo-maxpt-1.0.jar
此時會成功啟動工程,如下圖所示:在瀏覽器輸入
http://localhost:8080/index
會得到"hello world!"
,表示應用成功部署,打通網路後即可訂閱EventBridge的訊息了。
結果驗證
完成代碼部署與打通EventBridge的網路後,您可以在開啟擴充程式的空間內進行驗證。
驗證步驟
在資料開發頁面建立節點,在節點內編輯被禁止的
MAX_PT
函數儲存並提交。單鍵發行按鈕,進入建立發布包頁面對該節點直接進行發布,則會觸發擴充程式校正。
說明根據擴充程式配置,並不會對指定工作空間的代碼檔案提交事件生效,所以在提交包含
MAX_PT
函數的節點時不會觸發擴充校正程式,而是在對包含MAX_PT
函數節點進行發布時,觸發擴充程式校正。