1. 概述
1.1 应用场景
数据检测任务检测不通过时,用户希望收到自定义的检测结果摘要以及异常明细的推送,从而通过通知可以了解规则不通过的原因。
1.2 预期效果
1)检测失败
数据检测任务中断、检测失败时,进行消息通知。
2)检测不通过
企微群消息中,通知对应负责人规则运行结果:

邮箱中收到异常明细:

1.3 实现思路

1)使用「调用检测任务」节点,对「数据同步」节点中目标表进行质量检测。
2)「条件分支」节点中,使用内置参数${调用检测任务节点名称.det_result},判断检测结果。
若检测结果为通过,进行后续数据加工。
若检测结果为中断或检测失败,进行消息通知。
若检测结果为不通过,使用 检测结果输入 算子,获取数据检测任务的相关信息,将检测结果数据进行处理,输出为参数,进行消息通知。
2. 操作步骤
2.1 准备工作

本文重点介绍如何实现自定义检测任务结果摘要,并以附件形式推送异常明细推送,即上图中带背景色的节点如何配置。
2.2 SQL 脚本配置
后续步骤中我们要使用内置参数${调用检测任务.det_execute_id}来获取数据,但部分版本参数获取的结果会有延迟,可使用「SQL脚本」节点,SQL 语句为select sleep(10),表示检测任务运行 10 秒后,再调取内置参数${调用检测任务.det_execute_id}来获取检测任务运行的结果。

2.3 消息通知内容输出为参数

2.3.1 检测运行结果摘要输出为参数
1)2.2 节的「SQL脚本」节点后拖入「数据转换」节点,进入「数据转换」节点。
2)拖入「检测结果输入」算子,使用内置参数${调用检测任务.det_execute_id}来获取最近一次的数据检测结果。

点击「数据预览」,可看到具体字段,字段说明请参见 检测结果输入 文档,字段值为空是正常的,因为数据检测任务要运行的时候才会产生当前的运行记录。

3)「检测结果输入」算子后,拖入「Spark SQL」算子和「新增计算列」算子,默认进行数据分发,分发内容默认为所有字段。

4)「Spark SQL」算子中,基于检测结果的数据集来编辑需要推送的检测任务运行结果摘要形式。
SELECT
CONCAT(
'【', COALESCE(work_name, '未知任务'), '运行结果】', chr(10), chr(10),
'检测通过:', CAST(pass_count AS STRING), ' | 检测不通过:', CAST(not_pass_count AS STRING), ' | 检测失败:', CAST(fail_count AS STRING), chr(10), chr(10),
-- 根据是否有不通过的规则,动态决定是否拼接这行字及明细
CASE
WHEN not_pass_count > 0 THEN
CONCAT(
'检测不通过的规则如下:', chr(10), chr(10),
array_join(failed_details_list, CONCAT(chr(10), chr(10))),
chr(10), chr(10)
)
ELSE ''
END,
'详情请登录FineDataLink查看对应检测任务的运行记录!'
) AS alert_message
FROM (
SELECT
work_name,
-- 1. 统计各类状态的数量
SUM(CASE WHEN rule_state = 'PASS' THEN 1 ELSE 0 END) AS pass_count,
SUM(CASE WHEN rule_state IN ('NOT_PASS', 'WEAK_NOT_PASS') THEN 1 ELSE 0 END) AS not_pass_count,
SUM(CASE WHEN rule_state IN ('INTERRUPT', 'FAILED') THEN 1 ELSE 0 END) AS fail_count,
-- 2. 把不通过的明细单独展示
collect_list(
CASE
WHEN rule_state IN ('NOT_PASS', 'WEAK_NOT_PASS') THEN
CONCAT(
COALESCE(table_name, '【未知表】'), '中',
COALESCE(target_name, '【未知对象】'), '的',
COALESCE(rule_name, '【未知规则】'), ' 检测于',
COALESCE(CAST(finish_time AS STRING), '【未知时间】'), '检测不通过'
)
ELSE NULL
END
) AS failed_details_list
FROM
$[检测结果输入]
GROUP BY
work_name
) t

处理后的数据格式示例:

5)拖入「参数输出」算子,输出为参数,由于参数调试值不能为空,可任意输入一个值,该值并不影响定时任务的实际运行结果。

2.3.2 将异常明细文件地址输出为参数
由于需要将 异常明细文件 以邮件形式发送给用户,该文件地址为 err_detail_path 字段值。「消息通知-邮件」中,文件来源为服务器本地目录时,文件地址需要是相对路径(值不能包含assets/local_files)。

1)拖入「新增计算列」算子,新增字段after_file_path,处理err_detail_path字段值,去除字段值中的assets/local_files/。
REPLACE(err_detail_path,'assets/local_files/','')

2)拖入「数据过滤」算子,过滤出检测结果为不通过的数据。

3)拖入「参数输出」算子,将after_file_path、work_name、table_name、rule_name输出为参数,参数默认值可任意输入一个值,调试值不影响定时任务实际运行结果。

2.4 消息通知

2.4.1 检测运行结果摘要推送
1)「数据转换」节点后拖入「消息通知」节点、「循环容器」节点。
2)「消息通知」节点中,通知渠道选择企业微信群消息推送,消息内容设置为${not_pass},即 2.3.1 节输出的参数。

2.4.2 异常明细文件推送
1)如果数据检测任务中,检测对象有多个,err_detail_path 字段将有多个值,所以循环容器节点循环方式为遍历循环。

2)「循环容器」节点内拖入「消息通知」节点,通知渠道选择邮件:
| 设置项 | 值 |
|---|---|
| 主题 | 【异常明细附件】${rule_name}检测不通过 |
| 内容 | 【检测任务】${work_name} 【检测表】${table_name} 【检测规则】${rule_name} |
| 附件 | ![]() |

2.5 效果查看
请参见本文 1.2 节。
