python脚本监控mysql数据库_Python脚本监控mysql数据库,Python脚本监控mongo数据库

任务:应帅气的领导要求,需要监控生产环境mysql和mongo数据库服务。不仅要connect successful还要进行数据交互进一步确认数据库服务正常。

思路:

mysql和mongo 数据库ip、端口、用户名、密码、认证库(mongo)分别写在mysqldb_message.txt和mongodb_message.txt两个文件中。查询脚本db_test.py,邮件脚本sendEmail.py

格式如下:

mysqldb_message.txt

host:192.168.0.32 user:test passwd:123456 port:3306

host:192.168.0.222 user:test passwd:123456 port:3307

host:192.168.1.101 user:cctest passwd:Yj7netlkj port:3990

mongodb_message.txt

host:192.168.1.101 user:errorbook passwd:wangyue port:37017 authDB:admin

host:127.0.0.1 user:qingcong passwd:qingcong port:27017 authDB:admin

.

查询脚本db_test.py:

需要注意的是:

1、由于Python3.6,pymongo模块中的MongoClient函数连接mongo数据库时,超时参数connecttimeOutMS并不会生效(亲测),并且如果仅仅用MongoClient连接mongo数据库而不对数据库内的数据进行交互,那么无论MongoClient返回的是正确的连接对象还是发生了错误,Python3.6均不会报错。所以,必须要对数据库数据进行交互,才能确定数据库服务是否正常

2、由于mongo超时时间大概在30多秒左右,因此引入Python提供的超时函数timeout_decorator.timeout(),但此函数对不同的操作系统用法不一样。此脚本在windows环境下运行会报错。#!/usr/bin/env python#encoding: utf-8#author: 847907826@qq.com#注意,需要在Linux环境下Python3以上版本执行,且需要安装pymysql、pymongo、timeout_decorator模块import reimport timeimport pymysqlimport timeout_decoratorfrom pymongo import MongoClientimport sys

sys.path.append('/tools/scripts')   # /tools/scripts脚本目录,导入进sys.path中为后续才能调用send_mail函数from sendEmail import send_mail

#定义host、user、passwd、port、auth_db列表,用与存储数据库信息host = []

user = []

passwd = []

port = []

auth_db = []#mysql配置信息文件路径mysql_file = '/tools/scripts/mysqldb_message.txt'#data format: host:192.168.1.101 user:errorbook passwd:wangyue port:37017 authDB:adminmongo_file = '/tools/scripts/mongodb_message.txt'# data format: host:172.17.0.2 user:root passwd:123456 port:3306#获取mysql_db的配置信息def get_message_mysqldb():

print("读取mysql数据库详细信息文件中,请稍后....")        # time.sleep(1)

with open(mysql_file, 'r') as source:

lines = source.read().splitlines()  # splitlines 去除空行,即不保留每行结尾的\n,否则读取的每行中末尾均有\n

i = 0

for char in lines:                        if char.strip() != '':  # 去掉字符串前后的空格

char = re.split('[ :]', lines[i])  # 以空格和分号作为空格符进行分割

num = 1

host.append(char[num])

user.append(char[num + 2])

passwd.append(char[num + 4])

port.append(char[num + 6])

i = i + 1

print("读取完成\n---------------------------")        return host, user, passwd, port#获取mongodb_db的配置信息def get_message_mongodb():

with open(mongo_file, 'r') as source:

lines = source.read().splitlines()

i = 0

for char in lines:                        if char.strip() != '':  # 去掉字符串前后的空格

char = re.split('[ :]', lines[i])  # 以空格和分号作为空格符进行分割

num = 1

host.append(char[num])

user.append(char[num + 2])

passwd.append(char[num + 4])

port.append(char[num + 6])

auth_db.append(char[num + 8])

i = i + 1

return host, user, passwd, port, auth_db#连接mysql数据库def mysqldb_connect_and_test(ip, user, passwd, port):

print("连接mysql数据库{0}中,请稍后....".format(ip))        # time.sleep(1)

try:                # print("ip:{0}, user:{1}, passwd:{2}, port:{3}".format(ip, user, passwd, port))

conn = pymysql.connect(host=ip,

user=user,

passwd=passwd,

port=int(port),

charset='utf8',

connect_timeout=3)

print("连接成功,执行测试语句中...")                with conn.cursor() as cur:

sql = 'select 1 from dual'

a = str(cur.execute(sql))

print("successful! 进一步确认数据库服务正常。执行结果-->a: {0}".format(a))        except Exception:

print("发生异常,数据库连接失败,服务器ip:{0}".format(ip), Exception)

send_mail("监控中心", ["吴青聪"], [], "测试email", "(测试)邮件内容:python检测到mysql数据库异常,服务器为{0}".format(host), "")        else:

print("连接成功:{0}\n".format(ip))#连接mongodb数据库@timeout_decorator.timeout(3)def mongodb_connect_and_test(ip, user, passwd, port, auth_db):

print("请稍等,连接mongodb中...")        try:

client = MongoClient(ip, int(port))                # 利用server_info()判断mongodb状态

dbnames = client.server_info()  #

print(dbnames)                #利用authenticate判断mongodb状态

db = client[auth_db]

result = db.authenticate(user, passwd)        except Exception as es:

print("Error!连接失败,服务器ip:{0}".format(ip), es)

send_mail("监控中心", ["吴青聪"], [], "测试email", "(测试)邮件内容:python检测到mongo数据库异常,服务器为{0}".format(host), "")        else:

print("Successful!连接mongodb成功,测试语句执行成功")

client.close()#清空列表变量def clear_list():

host.clear()

user.clear()

passwd.clear()

port.clear()def main():

# 检查mysql

print("检查mysql数据库:")

get_message_mysqldb()

index = 0

for ip in host:

print("------------------------")

mysqldb_connect_and_test(ip, user[index], passwd[index], port[index])

index = index + 1

clear_list()  # 清空变量列表

#检查mongodb

print("\n检查mysql数据库:")

get_message_mongodb()

index = 0

for ip in host:

print("------------------------")                # print("ip:{0}, user:{1}, passwd:{2}, port:{3}".format(ip, user[index], passwd[index], port[index]))

mongodb_connect_and_test(ip, user[index], passwd[index], port[index], auth_db[index])

index = index + 1if __name__ == '__main__':

main()

发送邮件脚本sendEmail.py:#!/usr/bin/env python#encoding: utf-8import smtplib  # 加载smtplib模块import tracebackfrom email.header import Headerfrom email.mime.application import MIMEApplicationfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddr

login_name = 'monitor@7net.cc'  # 发件人邮箱账号,为了后面易于维护,所以写成了变量login_pass = '******'           # 邮箱密码,此处隐藏^_^smtp_port = 465def _format_addr(s):name, addr = parseaddr(s)return formataddr(( \

Header(name, 'utf-8').encode(), \

addr))# addr.encode('utf-8') if isinstance(addr, unicode) else addr))def send_mail(sender, recps, Ccs, subject, htmlmsg, fileAttachment):# 参数分别是:发送人邮箱、收件人邮箱、抄送人邮箱、主题、内容、附件,如果看不懂此处代码,知道如何使用即可smtpserver = 'smtp.exmail.qq.com'receivers = recps + Ccstry:        # msg = MIMEText(htmlmsg, 'html', 'utf-8')

msg = MIMEMultipart()

msg.attach(MIMEText(htmlmsg, 'html', 'utf-8'))        # msg['Subject'] = subject

msg['Subject'] = Header(subject, 'utf-8').encode()        # msg['From'] = sender

msg['From'] = _format_addr(sender)

Recp = []        for recp in recps:

Recp.append(_format_addr(recp))

ccs = []        for cc in Ccs:

ccs.append(_format_addr(cc))

msg['To'] = ','.join(Recp)

msg['Cc'] = ','.join(ccs)        # if fileAttachment!='' :

#     # 附件

for file in fileAttachment:

part = MIMEApplication(open(file, 'rb').read())

attFileName = file.split('/')[-1]

part.add_header('Content-Disposition', 'attachment', filename=attFileName)

msg.attach(part)        # part = MIMEApplication(open(fileAttachment, 'rb').read())

# part.add_header('Content-Disposition', 'attachment', filename=fileAttachment)

# msg.attach(part)

smtp = smtplib.SMTP_SSL()

smtp.connect(smtpserver, smtp_port)

smtp.login(login_name, login_pass)        #      smtp.login(username, password)

smtp.sendmail(sender, receivers, msg.as_string())

smtp.quit()

print('SendEmail success')except:

traceback.print_exc()

--------------------------------------

本文转自枕着稻香博客51CTO博客

如需转载,请联系作者授权

原文链接:https://blog.51cto.com/wuqingcong/2356570

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue中 $ref 的用法

ref 被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的 $refs 对象进行注册。如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息就是组件实例 注意:只要想要在Vue中直接操作DOM元素,就必须用r…

Nginx服务器之基础学习

一、Nginx介绍 nginx:Nginx是一种软件服务器(轻量级),故它最主要的功能就是可以与服务器硬件结合,我们的应用程序可以放在nginx服务器上进行发布,已达到让网民浏览的效果。除此自外,Nginx是一种…

工作44:阅读代码1 dictionary

dictionary tabmixin 这个是dictionary混入 create里面有混入addedit addedit方法

mysql coalesce函数用法_MySQL coalesce函数用法说明(转)

在mysql中,其实有不少方法和函数是很有用的,一个叫coalesce的,作用是将返回传入的参数中第一个非null的值,比如SELECT COALESCE(NULL, NULL, 1);-- Return 1SELECT COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1);…

mysql开启布隆过滤器_海量数据去重之布隆过滤器

背景在使⽤word⽂档时,word如何判断某个单词是否拼写正确?⽹络爬⾍程序,怎么让它不去爬相同的url⻚⾯?垃圾邮件(短信)过滤算法如何设计?公安办案时,如何判断某嫌疑⼈是否在⽹逃名单中?缓存穿透问…

linux 中 svn 服务器搭建 重启

鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,故此总结 /******开始*********/ 系统环境&…

mysql master host_mysql异步备份的有关问题,MASTER_HOST可否指定多个

mysql异步备份的问题,MASTER_HOST可否指定多个?mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中。实现mysql数据库的热备份。主库#数据库的id这个应该默认是1就不用改动server-id1#日志文件的名称&…

前端学习(2464):vue中 slot

Slot Slot>内容分发,占位元素 父级模板里的所有内容都是在父级作用域中编译的&#xff1b;子模板里的所有内容都是在子作用域中编译的。Slot分发的内容&#xff0c;作用域是在父组件上1.Vue2.6版本前的旧特性用法 1.1不具名slot 父组件内使用子组件 <children><…

Spring Boot快速入门

安装 安装依赖 maven是一个依赖管理工具&#xff0c;我们利用maven进行构建。创建一个maven项目&#xff0c;在pom.xml里面添加依赖项 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmln…

前端学习(2465):ajax发送请求

原文链接&#xff1a;https://www.cnblogs.com/0x29a/p/11231950.html 1. 创建XMLHttpRequest异步对象 步骤一代码引自&#xff1a;https://www.w3school.com.cn/ajax/ajax_xmlhttprequest_create.asp var xhr; if (window.XMLHttpRequest){// code for IE7, Firefox, Chrome, …

mysql数据库with ur_Python使用MySQL数据库(新)

一&#xff0c;安装mysql如果是windows用户&#xff0c;mysql的安装非常简单&#xff0c;直接下载安装文件&#xff0c;双击安装文件一步一步进行操作即可。Linux 下的安装可能会更加简单&#xff0c;除了下载安装包进行安装外&#xff0c;一般的linux仓库中都会有mysql&#x…

洛谷——P1067 多项式输出

https://www.luogu.org/problem/show?pid1067#sub 题目描述 一元 n 次多项式可用如下的表达式表示&#xff1a; 其中&#xff0c;aixi称为 i 次项&#xff0c;ai 称为 i 次项的系数。给出一个一元多项式各项的次数和系数&#xff0c;请按照如下规定的格式要求输出该多项式&…

前端学习(2466):在前端页面中引入百度地图

1.配置你需要的地图效果百度地图生成器 可选配置&#xff1a;位置、宽高、缩放、标注样式 2.导出导入地图代码点击获取代码&#xff0c;将代码引入到你的html、js、vue等文件中 ps:标注不显示的解决方法&#xff1a;将图标链接换成&#xff1a; var icon new BMap.Icon("…

$动态规划系列(2)——找零钱问题

refer:http://interactivepython.org/courselib/static/pythonds/index.html 1. 问题描述 Tom在自动售货机上买了一瓶饮料&#xff0c;售价37美分&#xff0c;他投入了1美元&#xff08;1美元 100美分&#xff09;&#xff0c;现在自动售货机需要找钱给他。售货机中现在只有四…

前端学习(2467):在前端页面中引入百度地图

走在前端的大道上 插槽&#xff0c;也就是slot&#xff0c;是组件的一块HTML模板&#xff0c;这块模板显示不显示、以及怎样显示由父组件来决定。 实际上&#xff0c;一个slot最核心的两个问题在这里就点出来了&#xff0c;是显示不显示和怎样显示。 由于插槽是一块模板&…

pm961 mysql_Oracle GoldenGate学习之--异构平台同步(Mysql到Oracle)

Oracle GoldenGate学习之--异构平台同步(Mysql到Oracle)如图所示&#xff1a;源端采用Mysql库&#xff0c;目标端采用Oracle库一、OGG安装配置(源端)1、OGG下载https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number14841438https://edelivery.oracle.com/EP…

错误记录

1.Soap 1.1 endpoint already registered on address /cxfService答案&#xff1a;web.xml中多配置了 <init-param> <param-name>config-location</param-name> <param-value>classpath:cxf.xml</param-value> </init-param> 2.The serve…