python编写的简单的mysql巡检脚本
准备工作:
1 安装python 3.5,本次使用源码安装。
2 安装psutil模块,使用python3.5自带的easy_install包直接运行
cd /opt/python3/bin
./easy_install-3.5 psuitl安装
3 安装mysql_connector模块,同样使用easy_install安装
easy_install-3.5 mysql-connector==2.1.4
准备工作完成后便可运行如下脚本:
[mysql@jing1 scripts]$ more healthcheck.py
#!/usr/bin/env python3
# -*- coding: gbk -*-
import psutil
import mysql.connector
import argparse
import json
import datetime
def get_cpu_info(verbose):
cpu_info={}
if verbose >0:
print("[cpu] start collect cpu info ...")
data=psutil.cpu_times_percent(3)
cpu_info['user']=data[0]
cpu_info['system']=data[2]
cpu_info['idle']=data[3]
cpu_info['iowait']=data[4]
cpu_info['hardirq']=data[5]
cpu_info['softirq']=data[6]
cpu_info['cpu_cores']=psutil.cpu_count()
if verbose >0:
print("{0}".format(json.dumps(cpu_info,ensure_ascii=False,indent=4)))
print("[cpu] collection compeleted ...")
return cpu_info
def get_mem_info(verbose):
mem_info={}
if verbose >0:
print("[mem] start collect mem info ...")
data=psutil.virtual_memory()
mem_info['total']=data[0]/1024/1024/1024
mem_info['avariable']=data[1]/1024/1024/1024
if verbose>0:
print("{0}".format(json.dumps(mem_info,ensure_ascii=False,indent=4)))
print("[mem] collection compeletd ...")
return mem_info
def get_disk_info(verbose):
disk_info={}
if verbose >0:
print("[disk] start collect disk info ...")
partitions=psutil.disk_partitions()
partitions=[(partition[1],partition[2])for partition in partitions if partition[2]!='iso9660']
disk_info={}
for partition in partitions:
disk_info[partition[0]]={}
disk_info[partition[0]]['fstype']=partition[1]
for mount_point in disk_info.keys():
data=psutil.disk_usage(mount_point)
disk_info[mount_point]['total']=data[0]/1024/1024/1024
disk_info[mount_point]['used_percent']=data[3]
if verbose >0:
print("{0}".format(json.dumps(disk_info,ensure_ascii=False,indent=4)))
print("[disk] collection compeleted ....")
return disk_info
def get_mysql_info(cnx_args,status_list):
config={
'user':cnx_args.user,
'password':cnx_args.password,
'host':cnx_args.host,
'port':cnx_args.port}
cnx=None
cursor=None
mysql_info={}
try:
cnx=mysql.connector.connect(**config)
cursor=cnx.cursor(prepared=True)
for index in range(len(status_list)):
status_list[index].get_status(cursor)
status=status_list[index]
mysql_info[status.name]=status.value
mysql_info['port']=config['port']
except mysql.connector.Error as err:
print(err)
finally:
if cursor != None:
cursor.close()
if cnx != None:
cnx.close()
return mysql_info
class Status(object):
def __init__(self,name):
self.name=name
self._value=None
def get_status(self,cursor):
stmt="show global status like '{0}';".format(self.name)
cursor.execute(stmt)
value=cursor.fetchone()[1].decode('utf8')
self._value=int(value)
@property
def value(self):
if self._value==None:
raise Exception("cant get value befor execute the get_status function")
else:
return self._value
IntStatus=Status
class diskResource(object):
def __init__(self,mount_point,status):
self.mount_point=mount_point
self.status=status
def __str__(self):
result=''' <div class="stage-list">
<div class="stage-title"><span>{0}</span></div>
<div class="detail">
<p class="detail-list">
<span class="detail-title">range_format</span>
<span class="detail-describe">{1}</span>
</p>
<p class="detail-list">
<span class="detail-title">total_space</span>
<span class="detail-describe">{2:8.2f}G</span>
</p>
<p class="detail-list">
<span class="detail-title">used_space(%)</span>
<span class="detail-describe">{3:8.2f}</span>
</p>
<p class="detail-list">
</p>
</div>
</div>\n'''.format(self.mount_point,self.status['fstype'],self.status['total'],self.status['used_percent']
)
return result
class diskResources(object):
def __init__(self,status):
self.disks=[]
for mount_point in status.keys():
self.disks.append(diskResource(mount_point,status[mount_point]))
def __str__(self):
result=''' <div class="list-item">
<div class="category">
<span>disk</span>
</div>
<div class="second-stage">\n'''
for index in range(len(self.disks)):
result=result+self.disks[index].__str__()
result=result+''' </div>
</div>\n'''
return result
class cpuResources(object):
def __init__(self,status):
self.status=status
def __str__(self):
result=''' <div class="list-item">
<div class="category">
<span>CPU</span>
</div>
<div class="second-stage">
<div class="stage-list">
<div class="stage-title"><span>global</span></div>
<div class="detail">
<p class="detail-list">
<span class="detail-title">user_space(%)</span>
<span class="detail-describe">{0}</span>
</p>
<p class="detail-list">
<span class="detail-title">kernel_space(%)</span>
<span class="detail-describe">{1}</span>
</p>
<p class="detail-list">
<span class="detail-title">space(%)</span>
<span class="detail-describe">{2}</span>
</p>
<p class="detail-list">
<span class="detail-title">hard_cruppt(%)</span>
<span class="detail-describe">{3}</span>
</p>
<p class="detail-list">
<span class="detail-title">soft_cruppt(%)</span>
<span class="detail-describe">{4}</span>
</p>
<p class="detail-list">
<span class="detail-title">io_wait(%)</span>
<span class="detail-describe">{5}</span>
</p>
<p class="detail-list">
</p>
</div>
</div>
</div>
</div>\n'''.format(self.status['user'],self.status['system'],self.status['idle'],self.status['hardirq'],self.statu
s['softirq'],self.status['iowait'])
return result
class memResources(object):
def __init__(self,status):
self.status=status
def __str__(self):
result=''' <div class="list-item">
<div class="category">
<span>MEM</span>
</div>
<div class="second-stage">
<div class="stage-list">
<div class="stage-title"><span>global</span></div>
<div class="detail">
<p class="detail-list">
<span class="detail-title">total</span>
<span class="detail-describe">{0:8.2f}G</span>
</p>
<p class="detail-list">
<span class="detail-title">free</span>
<span class="detail-describe">{1:8.2f}G</span>
</p>
<p class="detail-list">
</p>
</div>
</div>
</div>
</div>'''.format(self.status['total'],self.status['avariable'])
return result
class mysqlResources(object):
def __init__(self,status):
self.status=status
def __str__(self):
result=''' <div class="list-item">
<div class="category">
<span>MYSQL</span>
</div>
<div class="second-stage">
<div class="stage-list">
<div class="stage-title"><span>{0}</span></div>
<div class="detail">
<p class="detail-list">
<span class="detail-title">innodb_log_wait</span>
<span class="detail-describe">{1}</span>
</p>
<p class="detail-list">
<span class="detail-title">binlog_cache_use</span>
<span class="detail-describe">{2}</span>
</p>
<p class="detail-list">
<span class="detail-title">create_temp_disk_table</span>
<span class="detail-describe">{3}</span>
</p>
<p class="detail-list">
<span class="detail-title">Slow_querys</span>
<span class="detail-describe">{4}</span>
</p>
<p class="detail-list">
</p>
</div>
</div>
</div>
</div>'''.format(self.status['port'],self.status['Innodb_log_waits'],self.status['Binlog_cache_use'],
self.status['Created_tmp_disk_tables'],self.status['Slow_queries'])
return result
class hostResources(object):
def __init__(self,cpu_info,mem_info,disk_info,mysql_info,report_title='MySQL health check'):
self.cpu=cpuResources(cpu_info)
self.mem=memResources(mem_info)
self.disk=diskResources(disk_info)
self.mysql=mysqlResources(mysql_info)
self.report_title=report_title
def __str__(self):
result='''<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>health_check</title>
<style>
*{
margin: 0;
padding: 0;
}
.content{
width:1000px;
height: auto;
margin: 30px auto;
border-bottom:1px solid #b2b2b2;
}
.list-item{
border:1px solid #b2b2b2;
border-bottom: none;
transition: all .35s;
overflow: hidden;
display: flex;
}
.list-item:empty{
display: none;
}
.top-title{
line-height: 32px;
font-size: 16px;
color: #333;
text-indent: 10px;
font-weight: 600;
}
.category{
width:97px;
height: auto;
border-right: 1px solid #b2b2b2;
float: left;
text-align: center;
position: relative;
}
.stage-title>span,
.category>span{
display: block;
height: 20px;
width:100%;
text-align: center;
line-height: 20px;
position: absolute;
top: 50%;
margin-top: -10px;left: 0;
}
.second-stage{
width:900px;
float: left;
}
.stage-list{
border-bottom: 1px solid #b2b2b2;
display: flex;
}
.stage-list:last-child{
border-bottom: 0;
}
.stage-title{
width:99px;
border-right: 1px solid #b2b2b2;
position: relative;
}
.detail{
flex: 1;
}
.detail-list{
border-bottom: 1px solid #b2b2b2;
height: 40px;
display: flex;
transition: all .35s;
}
.detail-title{
padding: 10px;
height: 20px;
line-height: 20px;
border-right: 1px solid #b2b2b2;
width:200px;
}
.detail-describe{
flex: 1;
padding: 10px;line-height: 20px;
}
.detail-list:last-child{
border-bottom: 0;
}
.list-item:hover{
background-color: #eee;
}
.detail-list:hover{
background-color: #d1d1d1;
}
</style>
</head>
<body>
<div class="content">
<div class="list-item">
<p class="top-title">report_title</p>
</div>\n'''
result=result.replace('report_title',self.report_title)
result=result+self.cpu.__str__()
result=result+self.mem.__str__()
result=result+self.disk.__str__()
result=result+self.mysql.__str__()
result=result+''' </div>
</body>
</html>'''
return result
if __name__=="__main__":
parser=argparse.ArgumentParser()
parser.add_argument('--verbose',type=int,default=1,help='verbose for output')
parser.add_argument('--user',default='system',help='user name for connect to mysql')
parser.add_argument('--password',default='welcome123',help='user password for connect to mysql')
parser.add_argument('--host',default='127.0.0.1',help='mysql host ip')
parser.add_argument('--port',default=3306,type=int,help='mysql port')
parser.add_argument('--int-status',default=('Com_select,Com_insert,Com_update,Com_delete,Innodb_log_waits,'
'Binlog_cache_disk_use,Binlog_cache_use,Created_tmp_disk_tables,'
'Slow_queries')
,help='mysql status its value like int')
parser.add_argument('--report-title',default='MySQL health check',help='report title')
parser.add_argument('--output-dir',default='/tmp/',help='default report file output path')
args=parser.parse_args()
cpu_info=get_cpu_info(args.verbose)
mem_info=get_mem_info(args.verbose)
disk_info=get_disk_info(args.verbose)
status_list=[ IntStatus(name=item) for item in args.int_status.split(',')]
mysql_info=get_mysql_info(args,status_list)
#dr=diskResources(disk_info)
#cr=cpuResources(cpu_info)
#mr=memResources(mem_info)
#msr=mysqlResources(mysql_info)
hr=hostResources(cpu_info,mem_info,disk_info,mysql_info,args.report_title)
now=str(datetime.datetime.now()).replace(' ','^')
if args.output_dir.endswith('/') != True:
args.output_dir=args.output_dir+'/'
filename=args.output_dir+'mysql_inspection_{0}.html'.format(now)
with open(filename,'w') as output:
output.write(hr.__str__())
print('[report] the report been saved to {0} ok.... ....'.format(filename))
python编写的简单的mysql巡检脚本的更多相关文章
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- mysql巡检脚本
#!/usr/bin/env python3.5 import psutil import mysql.connector import argparse import json import dat ...
- 为Python编写一个简单的C语言扩展模块
最近在看pytorh方面的东西,不得不承认现在这个东西比较火,有些小好奇,下载了代码发现其中计算部分基本都是C++写的,这真是要我对这个所谓Python语音编写的框架或者说是库感觉到一丢丢的小失落,细 ...
- 使用python编写批量卸载android应用的脚本
该脚本的功能是卸载android手机中安装的所有第三方应用,主要是使用adb shell pm.adb uninstall 命令,所以使用的前提是需要配好adb的环境变量,下面上代码: #!/usr/ ...
- 新学了一个用python编写的简单的百度贴吧帖子的爬虫
# -*- coding: utf-8 -*- #--------------------------------------- # 作者:chendn # 语言:Python 2.7.10 #--- ...
- 使用python编写微信跳一跳的自动脚本
实现思路: 调用adb命令,截图 寻找小小人的底部中心点role(从下到上扫描,直到找到小小人相同像素的点,至于小小人像素点rgb是什么,可以使用photoshop查看) 寻找棋盘最高点top,然后寻 ...
- 使用python编写的简单远程管理软件
因为用户可以选择是否同意被控制,所以并不算是木马. 使用python3.7,spyder,在windows 10 开发. client为控制端,server为被控端. 参考 mygithub http ...
- python模块之sys和subprocess以及编写简单的主机扫描脚本
python模块之sys和subprocess以及编写简单的主机扫描脚本 1.sys模块 sys.exit(n) 作用:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.e ...
- Windows下用python编写简单GUI程序的方法
Python实现GUI简单的来说可以调用Tkinter库,这样一般的需求都可以实现,显示简单的windows窗口代码如下: python_gui.py #!C:\Python27\python.exe ...
随机推荐
- i2c设备驱动之设备地址
第一步:查找设备的数据手册可得到设备的从机地址.读写地址. 很不巧的是我在这里又卡了近一天,由于自己的硬件知识学得相当的那啥,哎,没办法,怨不得别人. 今天终于开窍了!!!!! 在开始条件(S)后,发 ...
- 2019.3.26 SQL语句(进阶3)
表的联查 员工表与部门表 员工表:id,姓名,年龄,部门id 部门表:部门id,部门名,部门成立时间,部门领导,部门职责.... 表和表之间的关系 一对一 一对多 多对多 创建联查 创建表 先创建被依 ...
- maven的resources插件
<build><sourceDirectory>src/jvm</sourceDirectory> <testSourceDirectory>test/ ...
- datagrip 导出数据库备份到本地
1.建立自己的数据库 2.如图 3,结果
- Google Authenticator(谷歌身份验证器)
<!DOCTYPE html>Google Authenticator(谷歌身份验证器) ] Google Authenticator(谷歌身份验证器) Google Authentica ...
- VUE-CLI 设置页面title
router > index.js { path: '/worklist', name: 'worklist', component: worklist, meta: {title:'维修工列表 ...
- 字典表+委托替代switch解决思路
参考:http://www.jianshu.com/p/8887b3b3e8ba 代码 namespace 解决Switch { class Program { delegate string fun ...
- Excle 导入DataSet
using System.Data.OleDb;using System.Data; public void ReadExcelFiless() { //strin ...
- 搭建一个最简单的node服务器
搭建一个最简单的node服务器 1.创建一个Http服务并监听8888端口 2.使用url模块 获取请求的路由和请求参数 var http = require('http'); var url = r ...
- Wpf ListView展示风格
ListView数据绑定控件,通常是竖列展示,也可以通过改变ListView的布局来改变它的展示方式 如图展示: 主要需用修改的样式如下: <!--GridView Header样式 去除Gri ...