數據源監控與預警
近期工作須要做一個數據源監控系統,監測每天的數據是否,按時。按量送過來,首先應為數據接入過來的時候,已經記錄了相關的日誌。比方文件到達時間,文件總個數,文件裏總記錄數,文件大小,數據日期等,如今要對這些指標進行監控並及時預警(發短信或郵件到相應的負責人),並記錄到預警表中。好對預警後的異常進行跟蹤處理。考慮到節假日對數據量的影響,還添加文件記錄數和文件大小的同比。環比進行監測。
名詞解釋:
同比 (本期-上期)/上期 = 本期/上期 -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內的腳本
數據源監控與預警