1. 程式人生 > >數據源監控與預警

數據源監控與預警

ava echo 每天 其他 bus 上班 one tail tab

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

名詞解釋:

同比 (本期-上期)/上期 = 本期/上期 -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內的腳本

數據源監控與預警