diff --git a/README.md b/README.md
index fd16dc10..66853254 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,11 @@
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
-English | [中文](/README_zh.md)
+English | [中文](docs/zh_CN/ch1/README.md)
## Overview
Qualitis is a data quality management platform that supports quality verification, notification, and management for various datasource. It is used to solve various data quality problems caused by data processing.
-Based on Spring Boot, Qualitis submits quality model task to [Linkis](https://github.com/apache/incubator-linkis) platform. It provides functions such as data quality model construction, data quality model execution, data quality verification, reports of data quality generation and so on.
-
-At the same time, Qualitis provides enterprise-level features of financial-level resource isolation, management and access control. It is also guaranteed working well under high-concurrency, high-performance and high-availability scenarios.
+Based on Spring Boot, Qualitis submits quality model task to [Linkis](https://github.com/WeBankFinTech/Linkis) platform. It provides functions such as data quality model construction, data quality model execution, data quality verification, reports of data quality generation and so on. At the same time, Qualitis provides enterprise-level features of financial-level resource isolation, management and access control. It is also guaranteed working well under high-concurrency, high-performance and high-availability scenarios.
## Features
- **Define Data Quality Model**
@@ -34,14 +32,13 @@ Supports workflow
Workflow needs [DataSphereStudio](https://github.com/WeBankFinTech/DataSphereStudio).
- **Administrator Console**
-Administrator console provided.
-And it also supports personnel management, access control management, privilege control management, metadata management and so on.
+Administrator console provided. And it also supports personnel management, access control management, privilege control management, metadata management and so on.
## Compared with similar systems
![](images/en_US/ch1/CompareSimilarSystem.png)
## Documents
-[Quick Deploy](docs/en_US/ch1/QuickDeploy.md)
+[Quick Deploy](docs/en_US/ch1/Quick%20Deploy%20Standalone.md)
[User Manual](docs/en_US/ch1/User%20Manual.md)
[Architecture Design](docs/en_US/ch1/Architecture%20Design.md)
@@ -67,6 +64,11 @@ Supports generating data quality reports with optional latitude.
### 4. Support intelligent discovery of data quality problems
+**If you have any needs, please send us an issue and we will reply to you in time.**
+
+## Contributing
+Community partners are very welcome to contribute new engines and codes to us!
+
## Communication
If you desire immediate response, please kindly raise issues to us or scan the below QR code by WeChat and QQ to join our group:
![](images/en_US/ch1/ContractUs.png)
@@ -74,5 +76,3 @@ If you desire immediate response, please kindly raise issues to us or scan the b
## License
**Qualitis is under the Apache 2.0 license. See the [LICENSE](/LICENSE) file for details.**
-## Tips
-The front-end code of Qualitis adopts the front-end framework FES self-developed by WeBank. The FES framework is currently open source, and the source code can be downloaded through the ui folder in the root directory. Of course, it can also be used directly by downloading the release. The default front-end compilation package is installed in Qualitis-x.x.x/conf/static.
\ No newline at end of file
diff --git a/README_zh.md b/README_zh.md
deleted file mode 100644
index 0f58890a..00000000
--- a/README_zh.md
+++ /dev/null
@@ -1,80 +0,0 @@
-[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
-
-[English](/README.md) | 中文
-
-## 引言
-Qualitis是一个支持多种异构数据源的质量校验、通知、管理服务的数据质量管理平台,用于解决业务系统运行、数据中心建设及数据治理过程中的各种数据质量问题。
-
-Qualitis基于Spring Boot,依赖于Linkis进行数据计算,提供数据质量模型构建,数据质量模型执行,数据质量任务管理,异常数据发现保存以及数据质量报表生成等功能。并提供了金融级数据质量模型资源隔离,资源管控,权限隔离等企业特性,具备高并发,高性能,高可用的大数据质量管理能力。
-
-## 核心特点
-- **数据质量模型定义**
-支持以下数据模型定义:
-1.单表校验数据模型。
-2.跨表校验数据模型。
-3.自定义校验数据模型。
-
同时,系统预置了多个数据质量校验模版,包括空值校验,枚举校验等常用校验,并且支持自定义数据质量模版。
-
-- **数据质量模型调度**
-支持数据质量模型调度。
-
-- **数据质量报表**
-支持生成数据质量报表。
-
-- **日志管理**
-日志聚合管理,方便排查数据质量任务
-
-- **异常数据管理**
-支持异常数据提取和存储,快速定位问题
-
-- **支持工作流**
-支持在工作流当中进行数据质量校验
-工作流必装[DataSphereStudio](https://github.com/WeBankFinTech/DataSphereStudio).
-
-- **管理员控制台**
-提供管理员控制台界面,支持人员管理,权限管理,权限管理,元数据管理等管理功能。
-
-## 与类似系统对比
-![](/images/zh_CN/ch1/相似系统对比图.png)
-
-## 文档列表
-[快速搭建手册](/docs/zh_CN/ch1/快速搭建手册——单机版.md)
-[架构设计文档](/docs/zh_CN/ch1/架构设计文档.md)
-[用户手册](/docs/zh_CN/ch1/用户手册.md)
-[升级指南](/docs/zh_CN/ch1/升级指南.md)
-
-
-## Architecture
-![](/images/zh_CN/ch1/总体架构设计.png)
-
-## Road Map
-### 1. 支持对报表数据进行数据质量校验
-
-- 支持在工作流当中,对生成的报表数据进行数据质量校验
-
-### 2. 支持多种数据源的数据质量校验
-
-- 支持HDFS, HIVE, MySQL等数据源间的数据质量校验
-- 支持实时数据的数据质量校验,如Kafka
-
-### 3. 支持生成可选纬度的数据质量报表
-
-- 支持可选纬度生成数据质量报表
-
-### 4. 支持智能发现数据质量问题
-
-
-**如果您有任何需求,欢迎给我们提issue,我们将会及时给您回复。**
-
-## Contributing
-非常欢迎广大的社区伙伴给我们贡献新引擎和代码!
-
-## Communication
-如果您想得到最快的响应,请给我们提issue,或者您也可以扫码进群:
-![](/images/en_US/ch1/ContractUs.png)
-
-## License
-**Qualitis is under the Apache 2.0 license. See the [LICENSE](/LICENSE) file for details.**
-
-## Tips
-Qualitis的前端代码是采用WeBank自研的前端框架FES,FES框架目前已开源,可以通过根目录的 ui 文件夹下进行源码下载,当然也可以通过下载 release 直接启动使用,默认的前端编译包安装在 Qualitis-x.x.x/conf/static 下。
diff --git a/appconn/pom.xml b/appconn/pom.xml
index 96ae3f14..50ddd9e2 100644
--- a/appconn/pom.xml
+++ b/appconn/pom.xml
@@ -79,7 +79,7 @@
org.apache.linkis
linkis-cs-common
${linkis.version}
- compile
+ provided
linkis-bml-client
@@ -99,6 +99,7 @@
org.apache.linkis
linkis-httpclient
${linkis.version}
+ provided
linkis-common
@@ -130,9 +131,13 @@
${dss.version}
provided
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.14.1
+
-
diff --git a/appconn/src/main/icons/TableRules.icon b/appconn/src/main/icons/TableRules.icon
new file mode 100644
index 00000000..cc3ea13b
--- /dev/null
+++ b/appconn/src/main/icons/TableRules.icon
@@ -0,0 +1 @@
+
diff --git a/appconn/src/main/icons/checkalert.icon b/appconn/src/main/icons/checkalert.icon
new file mode 100644
index 00000000..cc3ea13b
--- /dev/null
+++ b/appconn/src/main/icons/checkalert.icon
@@ -0,0 +1 @@
+
diff --git a/appconn/src/main/java/com/webank/wedatasphere/dss/appconn/qualitis/execution/QualitisRefExecutionOperation.java b/appconn/src/main/java/com/webank/wedatasphere/dss/appconn/qualitis/execution/QualitisRefExecutionOperation.java
index 35b08ed5..34f49de2 100644
--- a/appconn/src/main/java/com/webank/wedatasphere/dss/appconn/qualitis/execution/QualitisRefExecutionOperation.java
+++ b/appconn/src/main/java/com/webank/wedatasphere/dss/appconn/qualitis/execution/QualitisRefExecutionOperation.java
@@ -25,7 +25,6 @@
import com.webank.wedatasphere.dss.standard.app.development.listener.core.LongTermRefExecutionOperation;
import com.webank.wedatasphere.dss.standard.app.development.listener.core.Killable;
import com.webank.wedatasphere.dss.standard.app.development.listener.core.Procedure;
-import com.webank.wedatasphere.dss.standard.app.development.service.DevelopmentService;
import com.webank.wedatasphere.dss.standard.app.development.listener.ref.ExecutionResponseRef;
import com.webank.wedatasphere.dss.standard.app.development.listener.ref.RefExecutionRequestRef;
import com.webank.wedatasphere.dss.standard.common.exception.operation.ExternalOperationFailedException;
@@ -53,23 +52,25 @@
*/
public class QualitisRefExecutionOperation extends LongTermRefExecutionOperation
implements Killable, Procedure {
- private static final String SUBMIT_TASK_PATH = "qualitis/outer/api/v1/execution";
- private static final String GET_TASK_STATUS_PATH = "qualitis/outer/api/v1/application/{applicationId}/status/";
- private static final String GET_TASK_RESULT_PATH = "qualitis/outer/api/v1/application/{applicationId}/result/";
- private static final String KILL_TASK_PATH = "qualitis/outer/api/v1/execution/application/kill/{applicationId}/{executionUser}";
+
+ private static Logger LOGGER = LoggerFactory.getLogger(QualitisRefExecutionOperation.class);
+
+ private static final String FILTER = "filter";
private static final String NODE_NAME_KEY = "nodeName";
private static final String RULEGROUPID = "ruleGroupId";
private static final String RULE_GROUP_ID = "rule_group_id";
private static final String EXECUTION_USER_KEY = "executionUser";
private static final String WDS_SUBMIT_USER_KEY = "wds.dss.workflow.submit.user";
+ private static final String SUBMIT_TASK_PATH = "qualitis/outer/api/v1/execution";
+ private static final String GET_TASK_LOG_PATH = "qualitis/outer/api/v1/application/{applicationId}/log";
+ private static final String GET_TASK_STATUS_PATH = "qualitis/outer/api/v1/application/{applicationId}/status/";
+ private static final String GET_TASK_RESULT_PATH = "qualitis/outer/api/v1/application/{applicationId}/result/";
+ private static final String KILL_TASK_PATH = "qualitis/outer/api/v1/execution/application/kill/{applicationId}/{executionUser}";
- private static Logger LOGGER = LoggerFactory.getLogger(QualitisRefExecutionOperation.class);
private String appId = "linkis_id";
private String appToken = "***REMOVED***";
- private static final String FILTER = "filter";
-
@Override
protected String getAppConnName() {
return QualitisAppConn.QUALITIS_APPCONN_NAME;
@@ -254,7 +255,7 @@ public RefExecutionState state(RefExecutionAction action) {
}
LOGGER.info("Start to check job. url: {}, method: {}, body: {}", url, HttpMethod.GET, entity);
Map response = restTemplate.getForEntity(url, Map.class).getBody();
- String finishLog = String.format("Succeed to submit job to qualitis. response: %s", response);
+ String finishLog = String.format("Succeed to check job. response: %s", response);
LOGGER.info(finishLog);
if (response == null) {
@@ -265,7 +266,7 @@ public RefExecutionState state(RefExecutionAction action) {
if (! checkResponse(response)) {
String message = (String) response.get("message");
- String errorMsg = String.format("Error! Can not submit job, exception: %s", message);
+ String errorMsg = String.format("Error! Can not check job, exception: %s", message);
LOGGER.error(errorMsg);
return null;
}
@@ -362,7 +363,7 @@ public ExecutionResponseRef result(RefExecutionAction action) {
}
LOGGER.info("Start to get job result. url: {}, method: {}, body: {}", url, HttpMethod.GET, entity);
Map response = restTemplate.getForEntity(url, Map.class).getBody();
- String finishLog = String.format("Succeed to submit job to qualitis. response: %s", response);
+ String finishLog = String.format("Succeed to get job result. response: %s", response);
LOGGER.info(finishLog);
if (response == null) {
@@ -373,7 +374,7 @@ public ExecutionResponseRef result(RefExecutionAction action) {
if (! checkResponse(response)) {
String message = (String) response.get("message");
- String errorMsg = String.format("Error! Can not submit job, exception: %s", message);
+ String errorMsg = String.format("Error! Can not get job result, exception: %s", message);
LOGGER.error(errorMsg);
return null;
}
@@ -388,6 +389,13 @@ public ExecutionResponseRef result(RefExecutionAction action) {
LOGGER.info(taskMsg);
LOGGER.info(resultMessage);
+ try {
+ action.getExecutionRequestRefContext().appendLog(this.log(action));
+ } catch (Exception e) {
+ LOGGER.error("Get qualitis log failed.");
+ LOGGER.error(e.getMessage(), e);
+ }
+
if (failedNum != 0) {
return ExecutionResponseRef.newBuilder().error();
} else {
@@ -403,6 +411,50 @@ public float progress(RefExecutionAction action) {
@Override
public String log(RefExecutionAction action) {
- return "";
+ if (null == action) {
+ return "";
+ }
+
+ QualitisRefExecutionAction qualitisRefExecutionAction = (QualitisRefExecutionAction) action;
+ String applicationId = qualitisRefExecutionAction.getApplicationId();
+ String executionUser = qualitisRefExecutionAction.getExecutionUser();
+ LOGGER.info("Qualitis application ID: {}", applicationId);
+ LOGGER.info("Qualitis execution user: {}", executionUser);
+ if (StringUtils.isEmpty(applicationId) || StringUtils.isEmpty(executionUser)) {
+ return "";
+ }
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+
+ HttpEntity