需求定义:
job运行中如果有失败,发送邮件到指定邮箱用于报警
由于没有相关方面的经验,在思考如何发送报警经过了如下几个过程:
【思路一】首先想到的是根据spark job的运行状态来确定是否发送报警邮件,那么只要我们能获取到spark运行出错时候的返回值,就可以通过smtplib模块进行邮件发送。所以思路一的关键点在于运行状态的获取。再查找资料后发现,spark-1.1.0版本未提供像1.3.0版本那样可以返回TaskId和TaskState的接口(或许存在可以获取的方法,但我没有找到,如果哪位大侠知道,烦请告知一下),而暂时我们还没有需要要升级spark版本,考量之后,放弃;
【思路二】因为job执行的时候会打log,于是想到日志的关键字扫描。如果发现日志里面存在‘error’,则发送报警邮件,告知job运行失败;这个存在问题就是,每天的日志文件有很多, 这种方法势必要花费大量的时间来读取文件。如果能够在写日志的同时发送报警就好了,于是有了思路三;
【思路三】最开始想到的是改写logger.error()或者是获取record的level等级。在查找资料的过程中发现了logging.handlers.SMTPHandler(再次感叹一下Python模块的强大性)可以直接实现远程输入日志到邮件地址,通过简单的配置就可以使用,不必自己再烦心重写。
handler = logging.handlers.SMTPHandler(mail_host,mail_from,mail_to,'%s__JOB FAILED Attention__' % date.today()