准备工作:
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. vue 同一个组件的跳转, 返回时保留原来的下拉位置

    1,需求分析 公司的项目有这样一个需求: 同一个list组件,根据传过来的listId渲染成多个页面,每个页面都可以下拉.在返回到不同的list页面时,要保留当时下拉的位置. 说的我自己都有点懵逼了, ...

  2. 计算机插U盘没用了

    今天遇到一个神奇的状况,我想把台机上面的文件通过U盘拷贝到我的笔记本上.文件拷到U盘上没问题,然后把U盘插到笔记本上,一点反应都没有.我想了下,这U盘肯定没坏.然后我笔记本又是新买没多久,一直爱护有加 ...

  3. 将Eclipse的Java Project转换为Dynamic Web Project

    在用Eclipse做JavaEE开发时经常遇到Web工程被识别为Java工程的问题,导致很多功能无法使用. 只需做以下操作便可解决该问题. 1.右击Java工程选择Properties 2.选择左边目 ...

  4. vue指令与事件修饰符

    一.条件渲染指令 vue中提供了两个指令可以用于判断是否要显示元素,分别是v-if和v-show. 实例: <!DOCTYPE html> <html lang="en&q ...

  5. 切换myEclipse工作空间后设置,myEclipse添加注释/设置豆沙背景颜色/调节字体大小

    一.添加注释 操作位置: 注释规范 Files/** * @文件名称: ${file_name} * @文件路径: ${package_name} * @功能描述: ${todo} * @作者: ${ ...

  6. TimesTen客户端DSN配置

    打开控制面板\管理工具 1.打开数据源(ODBC) 2.选择系统DSN 3.选择添加: 4.单击完成 5.Servers

  7. 数据段描述符和代码段描述符(一)——《x86汇编语言:从实模式到保护模式》读书笔记10

    一.段描述符的分类 在上一篇博文中已经说过,为了使用段,我们必须要创建段描述符.80X86中有各种各样的段描述符,下图展示了它们的分类. 看了上图,你也许会说:天啊,怎么这么多段描述符啊!我可怎么记住 ...

  8. 【Shell】运行shell出现-ash: ./test.sh: not found

    1.这是一个读取文件的脚本 #!/bin/bash for line in `cat pidtestconf` do echo $line done 因为命名的时候这边使用的是 test.sh 这边将 ...

  9. 深入理解JavaScript系列(32):设计模式之观察者模式

    介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们 ...

  10. 深入理解JavaScript系列(5):强大的原型和原型链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...