分享最近遇到的一个问题,每天早上都会发送一些报表,会产生一些问题:
- 报表太多,没注意哪个发了,哪个没发
- 不可能每天都看看报表发送是否正常
这其实就是监控的问题,所以需要来一个监控的小程序,来帮助提醒,这里来分享下实践思路
- 设计一个元数据表,保存每天需要发送的报表和基础信息,比如发送时间,一个大致的预警时间,因为7点开始调度,不可能1分钟就跑完吧,有的可能要久一些,所以有一个预警时间,表结构大概这样:
create table etl_monitor_job_metadata(
id int,
job_name varchar(100),
send_time varchar(20),
warn_time varchar(20),
is_open int,
etl_insert_time date
);
这里的is_open
表示是否启用,有时候报表只发送几天,过了就不发送了,哦,写着写着,又想到了一个新的需求,就是发送日期,有的报表只需要周一发,也就是周报,看来还需要完善一下了
2.报表日志表,记录每天的报表执行情况
create table etl_monitor_job_log(
log_date date,
log_id varchar(100),
job_name varchar(100),
log_time date,
log_status varchar(100),
log_msg varchar(200),
etl_insert_time date
);
目前比较简单,用job_name关联,获取当天的报表日志
3.获取当天没有完成的报表信息
我是定义了一个视图,来查找,超过预警时间,而且还没有执行成功日志的报表出来
create or replace view v_monitor_job_today as
select
a.id,
a.job_name,
a.send_time,
to_date( to_char(sysdate,'yyyy-mm-dd')||' '||a.send_time,'yyyy-mm-dd hh24:mi') as send_time_today,
a.warn_time,
to_date( to_char(sysdate,'yyyy-mm-dd')||' '||a.warn_time,'yyyy-mm-dd hh24:mi') as warn_time_today
from
etl_monitor_job_metadata a
where a.is_open=1 and not exists (select 1 from etl_monitor_job_log b
where b.job_name=a.job_name and trunc(b.log_date)=trunc(sysdate) and b.log_status='success'
) and to_date( to_char(sysdate,'yyyy-mm-dd')||' '||a.warn_time,'yyyy-mm-dd hh24:mi')<sysdate
;
4.监控主程序
我是用python写了个小程序,直接就While True,让他一直在后台跑着,一旦有没有执行的程序就发消息,推送到企业微信
大致思路就是这样了,我继续去完善代码了