基于Antlr在Apache Flink中实现监控规则DSL化的探索实践大数据应用

来源:互联网 / 作者:SKY / 2019-04-30 15:06 / 点击:
目前业界已经有很多杰出的监控系统如Nagios、Zabbix、Prometheus,但都是面向运维人员,在应对复杂多变的业务指标监控时显得不够灵活。为此苏宁数据云在流式计算

【Chinaz.com原创稿件】1 引言

目前业界已经有很多杰出的监控系统如Nagios、Zabbix、Prometheus,但都是面向运维人员,在应对复杂多变的业务指标监控时显得不够灵活。

为此苏宁数据云在流式计算框架Apache Flink之上设计了一组包含ETL、指标计算、告警触发、告警通知模块的业务监控引擎。

其基本规则是告警SQL DSL语言,定义完备易用的场景规则语法和算子并支持动态更新调整,以便于业务方接入。下面对其基本原理和实现进行介绍,供各位同行参考指正。

2 DSL规则设计

初期调研了各个业务方的需求,整理归纳出核心需求点主要是基于维度和时间的指标绝对值、同环比或方差在超出阈值范围则触发告警,且业务方接入的是原始明细数据,故在设计规则中需要包含数据清洗过滤、分组、聚合计算、时间窗口设置特性。

SQL语言作为开发人员最熟悉的数据处理语言,选择其作为原型,可以省去理解和沟通的成本。

语法规则如下:

SELECT {metrics} FROM {metricFilters} WHERE {alertConditions} GROUP BY {groupByExpr} ORDER BY {orderByExpr} FOR LAST {number} MINUTE 

SELECT子句指标计算

FROM子句数据过滤表达式

WHERE子句告警状态判断表达式

GROUP BY子句数据分组

ORDER BY子句排序规则

FOR LAST子句计算窗口时间

目前聚合函数支持的均值(avg)、最大值(max)、最小值(min)、记数(count)、总数(sum)、去重记数(distinct_count)等指标计算,并支持多个指标四则混合运算、位运算、比较运算、逻辑运算。

以下SQL规则表达的业务含义是根据错误类型和城市信息进行分组,5分钟内错误数量大于100且与前5分钟环比大于20%则触发告警:

SELECT COUNT(errorType, 5) AS currentTypeNum, COUNT(errorType, 10, 5) AS previewTypeNum, (currentTypeNum - previewTypeNum) / previewTypeNumAS circularPercent, errorType, city 

FROM mobileAppIdIN ("Suning_PCbrowser","Suning_WAP")   

WHERE currentTypeNum>100 AND circularPercent>0.2   

GROUP BY errorType, city 

ORDER BY EVENT_TIME  

FOR LAST10 MINUTE 

3 实现设计

3.1 SQL解析

基于Antlr定义词法和语法,使用Maven Antlr插件生成AST解析器,Visitor模式遍历语法树实现各个部分处理器,不熟悉的同学可以参考Antlr官方手册,此处不再赘述。

解析SQL语句过程如下:

提取所有计算中用的到字段和过滤条件(FROM语句),作为预处理器用于ETL过程

WHERE子句抽象为布尔表达式,系统状态判断条件

GROUP BY子句抽象为从一个数据对象中提取分组Key的处理器

ORDER BY从句中提取时间窗口字段即Apache Flink中Event Time或Process Time

FOR LAST子句提取出时间窗口大小

SELECT语句是一组支持AS别名的算子,执行后的结果为键值对,即业务指标

需要注意的是考虑到ETL过程和计算过程都是独立模块,若计算过程通过字段名引用字段值,则中间对象必然是键值对方式的Map结构,在传输中序列化和反序列化必然会对性能有一定的影响。

为此在遍历抽象语法树过程中须构建一个解析上下文,把字段名引用改为数组下标,ETL过程产生的中间数据对象为数组结构,计算时访问字段值的时间复杂度为O(1)。

例如原始数据为:

{"errorType":"E005","mobileAppId":"Suning_WAP","city":"025","network":"CMCC"

解析出子字段数组[“errorType”,”city”]发送ETL模块,处理后数据对象Row为[“E005”,”025”],算子COUNT(“errorType”)实际运行中为COUNT(ROW[0]) 

3.2 整体架构

基于Antlr在Apache Flink中实现监控规则DSL化的探索实践

整个流程中ETL和告警计算模块都是运行在Apache Flink中,借用Flink实时计算和状态持久化能力。

每个业务接入方的数据格式不尽相同,把相关数据解析、清洗、过滤、丰富等功能单独抽离成ETL模块,可以根据接入方业务需求单独定制部署,其中SQL中FROM阶段提前到ETL模块,提取过滤掉不需要的数据,降低数据传输量。

3.3 SQL引擎在Flink中的运行机制

ETL模块

阅读延展

1
3