MySQL inspection script (must read)

MySQL inspection script (must read)

As shown below:

#!/usr/bin/env python3.5

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 completed ...")
  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 before 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">Distinguish formats</span>
              <span class="detail-describe">{1}</span>
            </p>
            <p class="detail-list">
              <span class="detail-title">Total space size</span>
              {2:8.2f}G
            </p>
            <p class="detail-list">
              <span class="detail-title">Free space (%)</span>
              {3:8.2f}
            </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 usage (%)</span>
              <span class="detail-describe">{0}</span>
            </p>
            <p class="detail-list">
              <span class="detail-title">Kernel space usage (%)</span>
              <span class="detail-describe">{1}</span>
            </p>
            <p class="detail-list">
              <span class="detail-title">Idle (%)</span>
              <span class="detail-describe">{2}</span>
            </p>
            <p class="detail-list">
              <span class="detail-title">Hard interrupt (%)</span>
              <span class="detail-describe">{3}</span>
            </p>
            <p class="detail-list">
              <span class="detail-title">Soft interrupt (%)</span>
              <span class="detail-describe">{4}</span>
            </p>
            <p class="detail-list">
              <span class="detail-title">io wait (%)</span>
              {5}
            </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.status['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 size</span>
              {0:8.2f}G
            </p>
            <p class="detail-list">
              <span class="detail-title">Free size</span>
              {1:8.2f}G
            </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">
              innodb_log_wait
              <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 Inspection Report'):
    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>Inspection Report</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='chkuser',help='user name for connect to mysql')
  parser.add_argument('--password',default='123456',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 Inspection Report',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 was saved to {0} ok.... ....'.format(filename))

The above MySQL inspection script (must read) is all the content that the editor shares with you. I hope it can give you a reference. I also hope that you will support 123WORDPRESS.COM.

<<:  In-depth explanation of environment variables and configuration files in CentOS

>>:  JavaScript to achieve the effect of clicking on the submenu

Recommend

Eight rules for effective web forms

If you're collecting information from your us...

Examples of using the ES6 spread operator

Table of contents What are spread and rest operat...

Three ways to parse QR codes using javascript

Table of contents 1. Use JavaScript to parse the ...

A brief discussion on several specifications of JS front-end modularization

Table of contents Preface The value of front-end ...

Tutorial on upgrading from Centos7 to Centos8 (with pictures and text)

If you upgrade in a formal environment, please ba...

JavaScript Composition and Inheritance Explained

Table of contents 1. Introduction 2. Prototype ch...

JavaScript implements double-ended queue

This article example shares the specific code of ...

Use of Linux bzip2 command

1. Command Introduction bzip2 is used to compress...

Summary of special processing statements of MySQL SQL statements (must read)

1. Update the entire table. If the value of a col...

WeChat applet example of using functions directly in {{ }}

Preface In WeChat applet development (native wxml...

Detailed graphic explanation of mysql query control statements

mysql query control statements Field deduplicatio...

15 JavaScript functions worth collecting

Table of contents 1. Reverse the numbers 2. Get t...

Use Xshell to connect to the Linux virtual machine on VMware (graphic steps)

Preface: I recently started to study the construc...