首页 > 代码库 > 数据源监控与预警
数据源监控与预警
最近工作需要做一个数据源监控系统,监测每天的数据是否,按时,按量送过来,首先应为数据接入过来的时候,已经记录了相关的日志,比如文件到达时间,文件总个数,文件中总记录数,文件大小,数据日期等,现在要对这些指标进行监控并及时预警(发短信或邮件到对应的负责人),并记录到预警表中,好对预警后的异常进行跟踪处理。考虑到节假日对数据量的影响,还增加文件记录数和文件大小的同比,环比进行监测。
名词解释:
同比 (本期-上期)/上期 = 本期/上期 -1(本月-上年度的本月)/上年度的本月 * 100%
环比分为日环比、周环比、月环比和年环比。环比发展速度是以报告期水平与其前一期水平对比(相邻期间的比较),所得到的动态相对数。表明现象逐期的发展变动程度。如计算一年内各月与前一个月对比,即2月比1月,3月比2月,4月比3月 (本月-上个月)/上个月 * 100% 环比增长。
分析:现在调度系统记录数据源相关的表有3个,第一个是t_ds_job记录数据源类型,是没有时间增量的,第二个是每天对1中的数据源进行汇总的情况,有时间增量,第三个是更详细的数据源记录信息。第二个和第三个区别就是,比如一个数据源可能分10个文件,每个文件都有到达时间,文件总记录数,文件大小等,第三个表就详细记录了每个单独文件到达情况,但是第二个表只记录了整个数据源到达了多少文件数量,文件大小,时间等信息。所以要计算的数据,存放在3个表中,而且有2个表还是增量,如果一步到位关联同比和环比的非常慢,而且导致sql很长,不易读。
思想:把过程细化,每个细化的步骤完成一个目标数据。
建立结果中间表,然后通过中间表左联接即可,又因为是每天跑的任务,所有把shell脚本配置到 crontab 调度或其它调度中。
具体脚本如下:
#!/bin/bash # 传入参数日期,或默认昨天的日期 if [ $# -lt 1 ];then startDate=`date -d "1 day ago " +%Y%m%d` startDate_one=`date -d "2 day ago " +%Y%m%d` startDate_seven=`date -d "8 day ago " +%Y%m%d` else startDate=`date -d "$1" +%Y%m%d` startDate_one=`date -d "1 day ago $1" +%Y%m%d` startDate_seven=`date -d "7 day ago $1" +%Y%m%d` fi logfile=/logs/basename $0.log` #定义写日志文件名 echo ${startDate} echo ${startDate_one} echo ${startDate_seven} # 清除 mysql 数据 CMD="/usr/local/mysql/bin/mysql -h 192.1168.1.119 -uroot -pli72 -e \"delete from ods.t_ds_monitor where data_date = '${startDate}';\"" EXESH_CMD #导入数据到mysql CMD="/usr/local/mysql/bin/mysql -h 192.1168.1.119 -uroot -pli72 -e \" insert into ods.t_ds_monitor( data_date ,ds_name ,ds_business_type ,fileTime ,must_file_cnt ,reach_file_cnt ,no_reach ,total_rec_cnt ,file_hb ,file_tb ,total_file_size ,rec_hb ,rec_tb ,takeTime ,taskTime_hb ,file_arrive_time ,file_status ) SELECT DISTINCT a.data_date, c.ds_name, c.ds_business_type, LEFT(a.last_update_time, 10) AS fileTime, a.must_file_cnt, a.reach_file_cnt, a.must_file_cnt - a.reach_file_cnt AS no_reach, a.total_rec_cnt, ROUND((a.reach_file_cnt/e.reach_file_cnt-1),2) AS file_hb, ROUND((a.reach_file_cnt/f.reach_file_cnt-1),2) AS file_tb, a.total_file_size, ROUND((a.total_file_size/e.total_file_size-1),2) AS rec_hb, ROUND((a.total_file_size/f.total_file_size-1),2) AS rec_tb, d.takeTime, ROUND((d.takeTime/e.takeTime-1),2) AS taskTime_hb, d.file_arrive_time_end, '状态' FROM ods.T_ds_job c LEFT JOIN ods.t_ds_job_day_detail b ON c.ds_id = b.ds_id LEFT JOIN ods.t_ds_job_day a ON c.ds_id = a.ds_id AND a.data_date = b.data_date LEFT JOIN ( SELECT COUNT(1), ds_id, MAX(file_arrive_time) AS file_arrive_time_end, MIN(file_arrive_time) AS file_arrive_time_start, ROUND( ( UNIX_TIMESTAMP(MAX(file_arrive_time)) - UNIX_TIMESTAMP(MIN(file_arrive_time)) ) / 3600, 2 ) AS takeTime FROM ods.T_DS_FILEINFO WHERE data_date ='${startDate}' GROUP BY ds_id ) d ON c.ds_id=d.ds_id LEFT JOIN ods.t_ds_monitor e ON c.ds_name=e.ds_name AND e.data_date='${startDate_one}' LEFT JOIN ods.t_ds_monitor f ON c.ds_name=f.ds_name AND f.data_date='${startDate_seven}' WHERE a.data_date = '${startDate}' ;\"" EXESH_CMD
得到数据插入到关系型数据库mysql中,然后通过Java写一个定时任务,每天上班前发起预警程序,如果出现异常,把异常信息发到对应的负责人,这样就不用每天守着调度任务看,甚至有时周末也要远程看看自己数据任务有没有异常。
配置 cronable -e
02 4 * * * t_ds_monitor.sh //每天执行t_ds_monitor.sh内的脚本
数据源监控与预警