准备工作:
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巡检脚本的更多相关文章

  1. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  2. mysql巡检脚本

    #!/usr/bin/env python3.5 import psutil import mysql.connector import argparse import json import dat ...

  3. 为Python编写一个简单的C语言扩展模块

    最近在看pytorh方面的东西,不得不承认现在这个东西比较火,有些小好奇,下载了代码发现其中计算部分基本都是C++写的,这真是要我对这个所谓Python语音编写的框架或者说是库感觉到一丢丢的小失落,细 ...

  4. 使用python编写批量卸载android应用的脚本

    该脚本的功能是卸载android手机中安装的所有第三方应用,主要是使用adb shell pm.adb uninstall 命令,所以使用的前提是需要配好adb的环境变量,下面上代码: #!/usr/ ...

  5. 新学了一个用python编写的简单的百度贴吧帖子的爬虫

    # -*- coding: utf-8 -*- #--------------------------------------- # 作者:chendn # 语言:Python 2.7.10 #--- ...

  6. 使用python编写微信跳一跳的自动脚本

    实现思路: 调用adb命令,截图 寻找小小人的底部中心点role(从下到上扫描,直到找到小小人相同像素的点,至于小小人像素点rgb是什么,可以使用photoshop查看) 寻找棋盘最高点top,然后寻 ...

  7. 使用python编写的简单远程管理软件

    因为用户可以选择是否同意被控制,所以并不算是木马. 使用python3.7,spyder,在windows 10 开发. client为控制端,server为被控端. 参考 mygithub http ...

  8. python模块之sys和subprocess以及编写简单的主机扫描脚本

    python模块之sys和subprocess以及编写简单的主机扫描脚本 1.sys模块 sys.exit(n)  作用:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.e ...

  9. Windows下用python编写简单GUI程序的方法

    Python实现GUI简单的来说可以调用Tkinter库,这样一般的需求都可以实现,显示简单的windows窗口代码如下: python_gui.py #!C:\Python27\python.exe ...

随机推荐

  1. 江西理工大学南昌校区排名赛 B: 单身狗的数字游戏

    题目描述 萌樱花是一只单身狗. 萌樱花今天初始化了N个数字,使它们都为0 0 0 0... 萌樱花决定选取某一个位置,分别增加1到N(如果到达数组末尾就从头开始). 比如: 0 0 0(选择第二个位置 ...

  2. Win10安装MySQL5.7.22解压缩版的方法及手动配置讲解

    1.先去MYSQL官网下载安装包,解压放到C盘 2.新建一个my.ini文件放到bin文件夹下面,内容如下,路径对应自己的安装目录: [mysql] # 设置mysql客户端默认字符集 default ...

  3. 网络那点事之socket队列

    1.socket 在内核中是怎么表示的,怎么与文件系统建立关系 2.socket在什么时候创建了接收队列,接收队列的长度是怎么确定的 3.接收到一个数据包根据怎么找到到接收队列的 使用hash算法,分 ...

  4. PIE SDK存储格式转换

      1.算法功能简介 影像存储格式转换可以实现栅格数据存储格式的自由转换,其中存储格式可以是 BSQ. BIP. BIL 三种格式. 遥感数字图像数据的存储与分发,通常采用以下三种数据格式: BSQ( ...

  5. Promise个人笔记---【Promise的前世今生】

    Promise第一版本 案例是使用Node.js内置的fs模块[就是文件系统模块,负责读写文件.]来模拟异步操作 const fs = require('fs'); function getFileP ...

  6. 06-struts2与ognl的结合

    1 参数接收 2 配置文件中 1 Demo2Action package www.test.c_config; import com.opensymphony.xwork2.ActionSupport ...

  7. 使用nodejs 访问mongodb

    我使用了 express 框架 目录结构 db.js 文件 function connectionDB(hostname, port) { //注释地方暂时没有使用.是把官方代码照抄下来 // var ...

  8. C++ Memory System Part1: new和delete

    在深入探索自定义内存系统之前,我们需要了解一些基础的背景知识,这些知识点是我们接下来自定义内存系统的基础.所以第一部分,让我们来一起深入了解一下C++的new和delete家族,这其中有很多令人吃惊的 ...

  9. Java网站开发的一些问题以及解决(cookie消失,上传头像,js等)

    1.首先是cookie的问题,很多人都是遇到了将数据存储到cookie中并且add到response之中,但是还有返回其他页面或者刷新页面cookie消失的情况,除了设置cookie的存活时间外, 还 ...

  10. 【防火墙】iptables查看、添加、删除规则

    root@ROUTER:~# iptables -t -nvL 查看到当前我的端口映射下有很多规则. 1.删除端口映射规则和端口映射的链 ①先删除子链里的所有规则 iptables -t nat -F ...