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
總結
以上是生活随笔為你收集整理的python脚本监控mysql数据库_Python脚本监控mysql数据库,Python脚本监控mongo数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DevCon 命令与批处理自动禁用启用网
- 下一篇: Python 源码剖析 目录