准备工作:
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. img的事件

    <img src="../images/clock.jpg" onload=alert('加载成功'); onerror=alert("加载失败");/& ...

  2. VBS修改本机的账号密码

    On Error Resume Next strComputer = "." Set WshShell = WScript.CreateObject("WScript.S ...

  3. vue 实现表单中password输入的显示与隐藏.

    实现效果: 点击 “眼睛” 的时候显示与隐藏 代码: <!DOCTYPE html> <html lang="en"> <head> <m ...

  4. 图解 I帧,B帧以及P帧

    I‑frame (Intra-coded picture): 即完整的一张图片 P‑frame (Predicted picture): 与前面一张图片的区别的区域 B‑frame (Bidirect ...

  5. Unity中Shader和AssetBundle结合使用的注意事项

    之前遇到了一件事情就是打包安卓的ab后,unity在editor启动下,加载出来的abshader丢失,其实发布安卓后运行是正常的,当时还纠结了半天,还写了个重新赋值的脚本 下面是unity开发的一些 ...

  6. ife task0003学习笔记(一):JavaScript作用域

    在学习JavaScript作用域概念之前,首先要明白几个概念:执行环境.变量对象.作用域链. 一.JavaScript执行环境(execution context): 在<Professiona ...

  7. Linux安装PHP加速器Xcache

    XCache 是一个又快又稳定的 PHP opcoolcode 缓存器. 经过良好的测试并在大流量/高负载的生产机器上稳定运行. 经过(在linux 上)测试并支持所有现行 PHP 分支的最新发布版本 ...

  8. import java.util.Collections类

    Collections类提供了一些操作集合的方法  下面介绍几个方法 1.将集合变为线程安全的 三个方法分别对应了ArrayList,HashMap,HashSet: Collections.sync ...

  9. Java学习第二十五天

    1:如何让Netbeans的东西Eclipse能访问. 在Eclipse中创建项目,把Netbeans项目的src下的东西给拿过来即可. 注意:修改项目编码为UTF-8 2:GUI(了解) (1)用户 ...

  10. C#请求http向网页发送数据,网页接收

    首先,我们需要的是什么东西? 用POST方式请求http,给网页传输数据,网页接收到数据之后,把数据存储到数据库中. 1.首先请求http,建立连接,把转码过的数据传输过去 2.网页接收数据,在转码之 ...