需求

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

处理思路

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

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

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

执行代码

  1. mysql -hip -P3306 -u用户 -p密码 -e"
  2. use dolphinscheduler;
  3. select a.name,
  4. a.state,
  5. a.submit_time,
  6. a.start_time,
  7. a.end_time,
  8. CONCAT(TIMESTAMPDIFF(SECOND, a.start_time,a.end_time),'(s)') dur
  9. from t_ds_task_instance a,
  10. (
  11. select name,
  12. max(submit_time) submit_time
  13. from t_ds_task_instance
  14. group by name
  15. ) b
  16. where a.name=b.name
  17. and a.submit_time=b.submit_time
  18. and substr(a.start_time,1,10)='${deal_day}'
  19. and a.state not in(0,1,7)
  20. union all
  21. select a.name,
  22. a.state,
  23. a.submit_time,
  24. a.start_time,
  25. '-' end_time,
  26. CONCAT(cast(TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)/60/60 as decimal(10,2)),'(h)') dur
  27. from t_ds_task_instance a,
  28. (
  29. select name,
  30. max(submit_time) submit_time
  31. from t_ds_task_instance
  32. group by name
  33. ) b
  34. where a.name=b.name
  35. and a.submit_time=b.submit_time
  36. and substr(a.submit_time,1,10)='${deal_day}'
  37. and a.state in(1,10,11)
  38. and TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)>7200;
  39. " > rwjk.txt

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

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

  1. # !/user/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import smtplib
  5. from email.mime.text import MIMEText
  6. from email.header import Header
  7.  
  8. def send_mail():
  9. # 第三方 SMTP 服务
  10. mail_host = "" # 设置服务器
  11. mail_user = "" # 用户名
  12. mail_pass = "" # 口令
  13.  
  14. sender = '' # 发送邮件用户
  15. receivers = ['收件人1',
  16. '收件人2',
  17. '收件人3'
  18. ]
  19.  
  20. msg_text = '邮件正文发送内容'
  21. mail_msg_list=['<p>你好,DS调度异常任务如下:</p>',
  22. '<table border="1" cellpadding="0" cellspacing="0" width="1000" style="border-collapse: collapse; style="text-align:center"">',
  23. '<tbody>',
  24. '<tr><th>任务</th><th>状态</th><th>提交时间</th><th>开始时间</th><th>结束时间</th><th>执行时长(s)</th></tr>'
  25. ]
  26. with open('/zhjs/work01/lizhenhua/rwjk/rwjk.txt', 'r') as f:
  27. s = f.readlines()
  28. for k,v in enumerate(s):
  29. s[k]=v.replace('\n','').split('\t') # 替换掉换行符、并转换为列表
  30. for i in range(len(s)):
  31. mail_msg_list.append('<tr>')
  32. for j in range(len(s[i])):
  33. if i>=1:
  34. s[i][1] = s[i][1].replace('0','提交成功')
  35. s[i][1] = s[i][1].replace('1', '正在运行')
  36. s[i][1] = s[i][1].replace('2', '准备暂停')
  37. s[i][1] = s[i][1].replace('3', '暂停')
  38. s[i][1] = s[i][1].replace('4', '准备停止')
  39. s[i][1] = s[i][1].replace('5', '停止')
  40. s[i][1] = s[i][1].replace('6', '失败')
  41. s[i][1] = s[i][1].replace('7', '成功')
  42. s[i][1] = s[i][1].replace('8', '需要容错')
  43. s[i][1] = s[i][1].replace('9', 'kill')
  44. s[i][1] = s[i][1].replace('10', '等待线程')
  45. s[i][1] = s[i][1].replace('11', '等待依赖完成')
  46. mail_msg_list.append('<td>{}</td>'.format(s[i][j]))
  47. mail_msg_list.append('</tr>')
  48.  
  49. # 结尾标识
  50. mail_msg_list.append('</tbody>')
  51. mail_msg_list.append('</table>')
  52.  
  53. mail_msg=''.join(mail_msg_list) # 列表转为字符串HTML
  54.  
  55. message = MIMEText(mail_msg, 'html', 'utf-8')
  56. message['From'] = Header("任务监测", 'utf-8')
  57. message['To'] = ','.join(receivers)
  58.  
  59. subject = 'DS调度异常任务监控'
  60. message['Subject'] = Header(subject, 'utf-8')
  61.  
  62. try:
  63. smtpObj = smtplib.SMTP()
  64. smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
  65. smtpObj.login(mail_user, mail_pass) # 登陆
  66. smtpObj.sendmail(sender, receivers, message.as_string()) # 发送
  67. print('邮件发送成功')
  68. except smtplib.SMTPException:
  69. print('Error: 无法发送邮件')
  70.  
  71. if __name__ == '__main__':
  72. send_mail()

Send_Email.py

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

  1. #!/bin/bash
  2.  
  3. if [ ${#} -ne 1 ]
  4. then
  5. deal_day=$(date +"%Y-%m-%d")
  6. else
  7. deal_day=$1
  8. fi
  9.  
  10. echo ${day}
  11. mysql -hip -P3306 -u用户 -p密码 -e"
  12. use dolphinscheduler;
  13. select a.name,
  14. a.state,
  15. a.submit_time,
  16. a.start_time,
  17. a.end_time,
  18. CONCAT(TIMESTAMPDIFF(SECOND, a.start_time,a.end_time),'(s)') dur
  19. from t_ds_task_instance a,
  20. (
  21. select name,
  22. max(submit_time) submit_time
  23. from t_ds_task_instance
  24. group by name
  25. ) b
  26. where a.name=b.name
  27. and a.submit_time=b.submit_time
  28. and substr(a.start_time,1,10)='${deal_day}'
  29. and a.state not in(0,1,7)
  30. union all
  31. select a.name,
  32. a.state,
  33. a.submit_time,
  34. a.start_time,
  35. '-' end_time,
  36. CONCAT(cast(TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)/60/60 as decimal(10,2)),'(h)') dur
  37. from t_ds_task_instance a,
  38. (
  39. select name,
  40. max(submit_time) submit_time
  41. from t_ds_task_instance
  42. group by name
  43. ) b
  44. where a.name=b.name
  45. and a.submit_time=b.submit_time
  46. and substr(a.submit_time,1,10)='${deal_day}'
  47. and a.state in(1,10,11)
  48. and TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)>7200;
  49. " > rwjk.txt
  50.  
  51. # 发送邮件
  52. n=`cat rwjk.txt|wc -l`
  53. if [ $n -ge 2 ]
  54. then
  55. python rwjk_mail.py # 执行python,发送邮件
  56. else
  57. echo "无异常任务"
  58. 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. Thymeleaf标准表达式

    Thymeleaf的官网为: http://www.thymeleaf.org/ 一.变量表达式${-} 使用${-}括起来的表达式,称为变量表达式.该表达式的内容会显示在HTML标签体文本处. 该表 ...

  2. 项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?

    存在即是合理的,业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性,都是前辈血淋淋的宝贵经验,为什么不用? 随着现在后端编程标 ...

  3. Springboot 入门及Demo

    一:SpringBoot入门1.1:SpringBoot简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的 ...

  4. Tableau如何使用 度量值和度量名称

    一.把子类别拖拽至列 二.度量值拖拽至行 三.度量名称拖拽至筛选器,右键-编辑筛选器-选择销售额和利润 四.度量名称拖拽是标记选择颜色-其它细节调整-最终结果如下所示

  5. Redis入门及常用命令学习

    Redis简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持 ...

  6. 使用.NET 6开发TodoList应用(2)——项目结构搭建

    为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P TodoList需求简介 首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能 ...

  7. Google Earth Engine 批量点击RUN任务,批量取消正在上传的任务

    本文内容参考自: https://blog.csdn.net/qq_21567935/article/details/89061114 https://blog.csdn.net/qq_2156793 ...

  8. CF151B Phone Numbers 题解

    Content 在一座城市中,每个人的电话号码都是由六位整数组成的,例如 11-45-14. 现在有 \(n\) 个人,第 \(i\) 个人有 \(s_i\) 个人的电话号码.已知: 出租车司机的电话 ...

  9. java 图形化工具Swing 基本使用

    Swing介绍: 使用Swing开发图形界面比AWT更加优秀,因为Swing是一种轻量级组件,它采用100% Java实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平 ...

  10. 【LeetCode】1060. Missing Element in Sorted Array 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...