实时报警平台搭建
在本实践用户可以了解到如何搭建一个简单的实时报警平台,该平台将应用多个云服务,结合数据开发模块的作业编辑和作业调度功能来实现。
假设客户有一个数据中心部署了很多应用,需要建立统一的运维系统,实时接收应用的告警信息。
- 当告警级别达到严重及以上级别时,向用户发送一条消息。
- 每天提供一个运维报表,统计各应用的告警级别数据。
为解决以上场景的需求,我们设计了如下方案:
操作流程如下:
- 实时数据导入:通过数据接入服务(DIS)将数据中心的告警数据实时导入到数据湖探索(DLI)。
- 数据清洗和预处理:DLI对告警数据进行数据清洗和预处理。
- 发送告警消息:当告警级别超过指定值时向用户发送短信。
- 数据导出和存储:清洗过的数据进入DIS通道,DIS根据导入时间将告警数据按日期存放到OBS。
- 输出告警统计报表:通过DLI SQL脚本建立外部分区数据表,以及按照告警分区时间和告警类别进行统计。
- 迁移数据:告警统计表计算完成后,将数据通过云数据迁移服务(CDM)统一导出到RDS MySQL数据库。
环境准备
- 已开通对象存储服务(OBS),并创建桶,例如“obs://dlfexample/alarm_info”、“obs://dlfexample/alarm_count_info”,分别用于存放原始告警表和告警统计报表。
- 已开通数据治理中心DataArts Studio,并具备CDM集群“cdm-alarm”,用于创建CDM作业。
- 已开通数据湖探索服务(DLI)。
- 已开通消息通知服务(SMN)。
数据准备
原始告警表为数据中心的实时数据,包含告警ID、告警级别。示例数据如表1所示。
创建SMN主题
我们需要创建一个SMN主题并添加订阅,将需要收到告警通知的用户添加到订阅终端中。
- 创建一个SMN主题,主题名称为“alarm_over”。
图5 创建SMN主题
- 为1中的主题添加订阅,指定告警消息类型和需要接收告警通知的用户。
图6 添加订阅
关键参数说明:
- 协议:选择“短信”,当告警级别达到指定值时向用户发送短信通知。
- 订阅终端:填写需要接收告警通知的用户手机号码。
使用DLI作业管理构建告警通知工程
DIS通道(创建DIS通道)和SMN主题(创建SMN主题)创建完成后,我们就可以在DLI中构建告警通知工程。
- 在DLI中创建一个Flink作业,作业名称为“test”。
图7 创建Flink SQL作业
- 编辑1中创建的Flink SQL作业,在SQL编辑器中输入语句。
图8 编辑Flink SQL作业
SQL语句实现的功能:
- DIS通过工具上传实时数据至DLI,使用1中创建的“dis-alarm-input”通道。
- 判断告警级别,当告警级别达到指定值时向用户发送短信通知。
- DLI处理过的数据再通过DIS导出到OBS中,使用2中创建的“dis-alarm-output”通道。
CREATE SOURCE STREAM alarm_info ( alarm_id STRING, alarm_type INT ) WITH ( type = "dis", region = "cn-south-1", channel = "dis-alarm-input", partition_count = "1", encode = "csv", field_delimiter = "," ); CREATE SINK STREAM over_alarm ( alarm_over STRING /* over speed message */ ) WITH ( type = "smn", region = "cn-south-1", topic_urn = "urn:smn:cn-south-1:6f2bf33af5104f45ab85de31d7841f5a:alarm_over", message_subject = "alarm", message_column = "alarm_over" ); INSERT INTO over_alarm SELECT "your alarm over (" || CAST(alarm_type as CHAR(20)) || ") ." FROM alarm_info WHERE alarm_type > 8; CREATE SINK STREAM alarm_info_output ( alarm_id STRING, alarm_type INT )WITH ( type ="dis", region = "cn-south-1", channel = "dis-alarm-output", PARTITION_KEY = "alarm_type", encode = "csv", field_delimiter = "," ); INSERT INTO alarm_info_output SELECT * FROM alarm_info WHERE alarm_type > 0;
- Flink SQL作业开发完成后,保存并启动作业。
使用DLI SQL脚本开发构建告警报表脚本
我们需要通过SQL脚本在DLI中新建OBS表来存放数据表,然后再构建一个SQL脚本来统计告警信息。
- 在DataArts Studio管理中心模块创建一个到DLI的连接,数据连接名称为“dli”。
- 进入数据开发模块,在DLI中创建一个数据库,用于存放数据表,数据库名称为“dlitest”。
- 创建一个DLI SQL脚本,通过SQL语句来创建数据表alarm_info,alarm_count_info。
其中,alarm_info、alarm_count_info都为OBS表,数据存储在OBS中,分别用于存放原始告警表、告警统计报表。
关键操作说明:
- 图9中的脚本开发区为临时调试区,关闭脚本页签后,开发区的内容将丢失。如需保留该SQL脚本,请单击,将脚本保存至指定的目录中。
关键参数说明:
- 数据连接:1中创建的DLI数据连接。
- 数据库:2中创建的数据库。
- 资源队列:使用DLI提供的默认资源队列“default”。
- SQL语句:如下所示。
create table alarm_info(alarm_time string, alarm_id string, alarm_type int ) using csv options(path 'obs://dlfexample/alarm_info') partitioned by(alarm_time); create table alarm_count_info(alarm_time string, alarm_type int, alarm_count int) using csv options(path 'obs://dlfexample/alarm_count_info');
- 单击运行脚本,创建alarm_info、alarm_count_info数据表。
- 清空编辑器中4的SQL语句,重新输入SQL语句。
ALTER TABLE alarm_info ADD PARTITION (alarm_time = ${dayParam}) LOCATION 'obs://dlfexample/alarm_info/${obsPathYear}'; insert into alarm_count_info select alarm_time,alarm_type,count(alarm_type) from alarm_info where alarm_time = ${dayParam} group by alarm_time,alarm_type;
SQL语句实现的功能:
- 在OBS的“obs://dlfexample/alarm_info”目录下,根据日期新建DLI分区。假设当前日期为2018/10/10,那么在“obs://dlfexample/alarm_info”目录下新建“2018/10/09”的DLI分区,用于存放前一天的数据表。
- 按照告警分区时间和告警类别进行统计,将统计结果插入alarm_count_info数据表。
关键参数说明:
- ${dayParam}:dayParam是指alarm_info表分区值,在脚本编辑器下方输入具体的参数值“$getCurrentTime(@@yyyyMMdd@@,-24*60*60)”。
- ${obsPathYear}:obsPathYear是指OBS分区目录路径,在脚本编辑器下方输入具体的参数值“$getCurrentTime(@@yyyy/MM/dd@@,-24*60*60)”。
- 脚本调试无误后,我们需要保存该脚本,脚本名称为“dli_partition_count”。在后续的作业中设置为定期执行该脚本(使用DLF作业开发和作业调度每天定时输出告警统计报表),实现定期输出告警统计报表。
创建CDM作业
方案的最后一步需要将OBS中的告警统计报表迁移到RDS MySQL中,我们选择使用CDM来实现该功能。
关键参数说明:
- 作业名称:obs_rds,在后续的作业中设置为定期执行该作业(使用DLF作业开发和作业调度每天定时输出告警统计报表),实现定期迁移数据。
- 源端:存储告警统计报表的OBS目录,源连接“obs_link”需要提前在CDM中创建好。
- 目的端:即将存储告警统计报表的RDS MySQL空间,目的连接“mysql_link”需要提前在CDM中创建好。
使用DLF作业开发和作业调度每天定时输出告警统计报表
告警统计报表的脚本(使用DLI SQL脚本开发构建告警报表脚本)和数据迁移的CDM作业(创建CDM作业)创建完成后,我们在数据开发模块中构建一个作业每天自动执行,那么就可以每天输出告警统计报表、每天自动迁移数据。
- 创建一个批处理作业,作业名称为“job_alarm”。
图10 创建DLF作业
- 然后进入到作业开发页面,拖动DLI SQL和CDM Job节点到画布中,连接并配置节点的属性。
图11 连接和配置节点属性
关键说明:
- dli_partition_count(DLI SQL节点):在节点属性中,关联使用DLI SQL脚本开发构建告警报表脚本中开发完成的DLI SQL脚本“dli_partition_count”。
- obs_rds(CDM Job节点):在节点属性中,关联创建CDM作业中创建的CDM作业“obs_rds”。
- 作业编排完成后,单击,测试运行作业。
- 如果日志运行正常,单击右侧的“调度配置”,配置作业的调度策略。
图12 调度配置
说明:
- 2018/10/10至2018/11/09,每天2点执行一次作业。
- 最后我们需要保存作业并提交版本,执行调度作业(单击),实现作业每天自动运行。