需求

监测dolphinscheduler调度系统,任务执行异常情况。如有异常,则发送邮件通知。

处理思路

因DS本身自带的邮件发送功能,不能正常发送邮件。

故而,通过查询DS源数据表,获取当前任务执行情况。将获取结果,使用python发送邮件。

通过shell脚本获取执行情况,并将结果保存到本地。

执行代码

mysql -hip -P3306 -u用户 -p密码 -e"
use dolphinscheduler;
select a.name,
a.state,
a.submit_time,
a.start_time,
a.end_time,
CONCAT(TIMESTAMPDIFF(SECOND, a.start_time,a.end_time),'(s)') dur
from t_ds_task_instance a,
(
select name,
max(submit_time) submit_time
from t_ds_task_instance
group by name
) b
where a.name=b.name
and a.submit_time=b.submit_time
and substr(a.start_time,1,10)='${deal_day}'
and a.state not in(0,1,7)
union all
select a.name,
a.state,
a.submit_time,
a.start_time,
'-' end_time,
CONCAT(cast(TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)/60/60 as decimal(10,2)),'(h)') dur
from t_ds_task_instance a,
(
select name,
max(submit_time) submit_time
from t_ds_task_instance
group by name
) b
where a.name=b.name
and a.submit_time=b.submit_time
and substr(a.submit_time,1,10)='${deal_day}'
and a.state in(1,10,11)
and TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)>7200;
" > rwjk.txt

登陆mysql数据库,并执行SQL,导出结果

python处理导出结果,并发送邮件

# !/user/bin/env python
# -*- coding: utf-8 -*- import smtplib
from email.mime.text import MIMEText
from email.header import Header def send_mail():
# 第三方 SMTP 服务
mail_host = "" # 设置服务器
mail_user = "" # 用户名
mail_pass = "" # 口令 sender = '' # 发送邮件用户
receivers = ['收件人1',
'收件人2',
'收件人3'
] msg_text = '邮件正文发送内容'
mail_msg_list=['<p>你好,DS调度异常任务如下:</p>',
'<table border="1" cellpadding="0" cellspacing="0" width="1000" style="border-collapse: collapse; style="text-align:center"">',
'<tbody>',
'<tr><th>任务</th><th>状态</th><th>提交时间</th><th>开始时间</th><th>结束时间</th><th>执行时长(s)</th></tr>'
]
with open('/zhjs/work01/lizhenhua/rwjk/rwjk.txt', 'r') as f:
s = f.readlines()
for k,v in enumerate(s):
s[k]=v.replace('\n','').split('\t') # 替换掉换行符、并转换为列表
for i in range(len(s)):
mail_msg_list.append('<tr>')
for j in range(len(s[i])):
if i>=1:
s[i][1] = s[i][1].replace('0','提交成功')
s[i][1] = s[i][1].replace('1', '正在运行')
s[i][1] = s[i][1].replace('2', '准备暂停')
s[i][1] = s[i][1].replace('3', '暂停')
s[i][1] = s[i][1].replace('4', '准备停止')
s[i][1] = s[i][1].replace('5', '停止')
s[i][1] = s[i][1].replace('6', '失败')
s[i][1] = s[i][1].replace('7', '成功')
s[i][1] = s[i][1].replace('8', '需要容错')
s[i][1] = s[i][1].replace('9', 'kill')
s[i][1] = s[i][1].replace('10', '等待线程')
s[i][1] = s[i][1].replace('11', '等待依赖完成')
mail_msg_list.append('<td>{}</td>'.format(s[i][j]))
mail_msg_list.append('</tr>') # 结尾标识
mail_msg_list.append('</tbody>')
mail_msg_list.append('</table>') mail_msg=''.join(mail_msg_list) # 列表转为字符串HTML message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("任务监测", 'utf-8')
message['To'] = ','.join(receivers) subject = 'DS调度异常任务监控'
message['Subject'] = Header(subject, 'utf-8') try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user, mail_pass) # 登陆
smtpObj.sendmail(sender, receivers, message.as_string()) # 发送
print('邮件发送成功')
except smtplib.SMTPException:
print('Error: 无法发送邮件') if __name__ == '__main__':
send_mail()

Send_Email.py

整合以上两个为一个shell脚本

#!/bin/bash

if [ ${#} -ne 1 ]
then
deal_day=$(date +"%Y-%m-%d")
else
deal_day=$1
fi echo ${day}
mysql -hip -P3306 -u用户 -p密码 -e"
use dolphinscheduler;
select a.name,
a.state,
a.submit_time,
a.start_time,
a.end_time,
CONCAT(TIMESTAMPDIFF(SECOND, a.start_time,a.end_time),'(s)') dur
from t_ds_task_instance a,
(
select name,
max(submit_time) submit_time
from t_ds_task_instance
group by name
) b
where a.name=b.name
and a.submit_time=b.submit_time
and substr(a.start_time,1,10)='${deal_day}'
and a.state not in(0,1,7)
union all
select a.name,
a.state,
a.submit_time,
a.start_time,
'-' end_time,
CONCAT(cast(TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)/60/60 as decimal(10,2)),'(h)') dur
from t_ds_task_instance a,
(
select name,
max(submit_time) submit_time
from t_ds_task_instance
group by name
) b
where a.name=b.name
and a.submit_time=b.submit_time
and substr(a.submit_time,1,10)='${deal_day}'
and a.state in(1,10,11)
and TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)>7200;
" > rwjk.txt # 发送邮件
n=`cat rwjk.txt|wc -l`
if [ $n -ge 2 ]
then
python rwjk_mail.py # 执行python,发送邮件
else
echo "无异常任务"
fi

rwjk.sh

执行结果

初识python 之 smtplib 发送(dolphinscheduler任务监测)邮件的更多相关文章

  1. Python+request+ smtplib 测试结果html报告邮件发送(上)《五》

    此方法通用适合所有邮箱的使用,只需注意几个点,如下: QQ邮箱.其他非QQ邮箱的写法,区别点如下: #--------------------------使用腾讯企业邮箱作为发件人的操作如下----- ...

  2. web端自动化——Python的smtplib发送电子邮件

    SMTP (Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. Python的smtplib模块提 ...

  3. 接口测试基础——第3篇smtplib发送带图片的邮件

    smtplib发送邮件最后一篇,发送带图片的邮件: 大家可以去廖雪峰的网站看一下,下面的代码就是我跟着博客写的,哈哈,大家即使不明白为什么,也要多写两遍,记在心里,如果有不明白的地方可以留言,船长会第 ...

  4. Python+request+ smtplib 测试结果html报告邮件发送(下)《六》

    目录结构如下: 1.cfg.ini的配置信息写法如下: [email] ;--------------------------使用腾讯企业邮箱作为发件人的操作如下------------------- ...

  5. 接口测试基础——第2篇smtplib发送带附件的邮件

    我先给大家补充一个用QQ发送纯文本电子邮件的代码,用QQ的朋友可以参考一下: # coding=utf-8 import smtplib from email.mime.text import MIM ...

  6. Python模块探秘 Smtplib发送带有各种附件的邮件

    这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须 ...

  7. 利用Python+163邮箱授权码发送带附件的邮件

    背景 前段时间写了个自动爬虫的脚本,定时在阿里云服务器上执行,会从某个网站上爬取链接保存到txt文本中,但是脚本不够完善,我需要爬虫完毕之后通过邮件把附件给我发送过来,之前写过一个<利用Pyth ...

  8. python利用smtplib和MIMETYPE发送邮件

    # -*- coding:utf- -*- import smtplib from email.mime.text import MIMEText sender = '你的发送邮件' my_pass= ...

  9. python使用smtplib发送邮件

    python要实现发送邮件的功能,需要使用smtplib库. 1. 过程大致如下: 1. 建立和SMTP邮件服务器的连接 # 默认端口25 smtp = smtplib.SMTP(host, port ...

随机推荐

  1. 开源低代码开发平台entfrm2.1.0更新

    开源低代码开发平台entfrm2.1.0更新 新功能 代码生成支持主子表,支持预览: 新增多应用顶部菜单与左侧菜单联动: element-ui升级到2.15.1: 新增表单管理,集成avue-from ...

  2. 【Linux】【Shell】【Basic】数组

    1. 数组:         变量:存储单个元素的内存空间:         数组:存储多个元素的连续的内存空间:             数组名:整个数组只有一个名字:             数组 ...

  3. js - 日期、时间 Date对象方法

    Date 是 JS 内置的日期构造函数 var d = new Date();  // 这个是系统当前时间的日期实例 d.getYear(); // 返回 d 实例年份 - 1900 d.getFul ...

  4. ClassLoader.loadClass()与Class.forName()的区别《 转》

    ClassLoader.loadClass()与Class.forName()区别: ClassLoader.loadClass()与Class.forName()大家都知道是反射用来构造类的方法,但 ...

  5. linux系统目录初识

    目录 今日内容概要 内容详细 系统目录结构介绍 目录结构知识描述 今日内容概要 系统目录结构介绍 目录结构详细描述 内容详细 系统目录结构介绍 # 1.linux系统中的目录 一切从根开始 结构拥有层 ...

  6. numpy基础教程--where函数的使用

    在numpy中,where函数是一个三元运算符,函数原型为where(condition, x, y),意思是当条件成立的时候,将矩阵的值设置为x,否则设置为y 一个很简单的应用就是,在一个矩阵当中, ...

  7. java 编程基础 类加载器

    什么是类加载器 类加载器负责将class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象.Java开发中无须过分关心类加载机制,但所有的编程人员都应 ...

  8. 磁盘分区级文件系统丢失找回 testdisk

    故障修复步骤: 1. 检查磁盘分区级文件系统确实不在: 2. 云主机内部下载testdisk工具修复 yum install testdisk -y 3. 执行命令testdisk /dev/vdc进 ...

  9. UDP&串口调试助手用法(4)

    接收配置用法 概览 保存文件 可将数据保存到文件和文件夹 如果选择的时文件,则需要自己手动选择保存的文件. 如果选择的时文件夹,则需要指定文件夹的类型和文件的后缀 支持保存文件类型: 文本文件和二进制 ...

  10. lldb调试C++总结(3)

    note 本文将弥补之前的遗漏部分. continue 前面提到,当设置断点后,使用step和next和finish,程序会停下来,需要程序继续运行,键入continue, 程序可自动继续向下执行. ...