• GO 小程序《监控DBqps和tps》


    监控DB qps和tps

     

    1.想直接使用现成软件的朋友  可以直接查看最后的 连接中进行下载使用。

    2. 想学习交流的朋友 可以慢慢查看代码和提出建议。 

    1. 软件说明:

    1 声明; 本人是go语言初学者,软件是到达了可以实现功能的层次,希望大家提交和反馈优化我的代码或者在这基础上增加功能,向大家学习,本代码逻辑混乱,小弟不才 
    2 mysql :监控QPS和TPS很准确,但是需要开启一个参数[set global show_compatibility_56=on;]
    3 oralce:  因数据库底层视图原因,获取的数值不太准确,仅供性能测试参考。
    4 sqlserver: QPS数值准确,TPS数值因数据库底层视图原因不太准确。

    2. 功能列表:

    1 #增加mysql,oracle,sqlserver  qps,tps监控
    2 
    3 #增加自动输出csv监控日志.
    4 
    5 #执行脚本 自动创建README.md说明文件
    6 
    7 # 增加可选间隔次数,比如 只监控60次 也就是1分钟时间。
    8 
    9 #增加结束后输出 最大监控数值

     

    3. 效果截图和用法:

    1. mysql

     

    2. oracle

     

    3. sqlserver

     

     

    4. 源代码

      1 package main
      2 
      3 import (
      4     "database/sql"
      5     "flag"
      6     "fmt"
      7     _ "github.com/go-sql-driver/mysql"
      8     _ "github.com/denisenkom/go-mssqldb"
      9     _ "github.com/mattn/go-oci8"
     10     "log"
     11     "os"
     12     "time"
     13     "io/ioutil"
     14 )
     15 
     16 var (
     17     //mysql 变量
     18     QPS1      int
     19     QPS2      int
     20     TPS1      int
     21     TPS2      int
     22     QPS_Totol int
     23     TPS_Totol int
     24     Varlues   string
     25 
     26     //Oracle 变量
     27     QPS  float32
     28     TPS  float32
     29     MBPS float32
     30 
     31     FormatTimes = time.Now().Format("2006-01-02") //定义备份的文件显示的日期格式
     32     ListQps  = make([]int, 0) //提供收集统计最大QPS
     33     ListTps  = make([]int, 0) //提供收集统计最大TPS
     34 
     35     //oracle 有小数点
     36     OListQps  = make([]float32, 0) //提供收集统计最大QPS
     37     OListTps  = make([]float32, 0) //提供收集统计最大TPS
     38     OListMbps  = make([]float32, 0) //提供收集统计最大MPS
     39 )
     40 
     41 func main() {
     42 
     43 
     44     README()
     45 
     46 
     47     //获取参数值
     48     dbtype, host, username, password, port, db, Interval := GetValues()
     49 
     50     //判断当前数据库类型
     51     if dbtype == "mysql" || dbtype == "MYSQL" {
     52          Mysql(username, password, host, port, db, Interval)
     53     
     54     } else if dbtype == "oracle" || dbtype == "ORACLE" {
     55         Oracl1(username, password, host, port, db, Interval )
     56 
     57     }else if dbtype == "sqlserver" || dbtype == "SQLSERVER" ||  dbtype == "MSSQL" || dbtype == "mssql"   {
     58         
     59         Sqlserver(username, password, host, port, db, Interval )
     60 
     61     } else {
     62         fmt.Println("error: Execute - h for query option, please confirm whether the parameter input is correct...")
     63     }
     64     
     65 
     66 }
     67 
     68 func Mysql(username, password, host, port, db string,Interval int)  {
     69 
     70     //将数据转换成数据库url作为返回值
     71     conn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, db)
     72     open, err := sql.Open("mysql", conn)
     73     if err != nil {
     74         log.Printf("open database error:%v", err)
     75     }
     76     defer open.Close()
     77     if err != nil {
     78         log.Println(err)
     79     }
     80 
     81     //创建日志文件
     82     file, err := os.OpenFile("./"+FormatTimes+"_Mysql_qtps.csv", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
     83     if err != nil {
     84         fmt.Println("File open failed: ", err)
     85     }
     86     defer file.Close()
     87     file.WriteString("date,QPS,TPS
    ")
     88 
     89 
     90     //查询这个参数是否开启,如果开启不做操作,没有开启进行自动开启。
     91     // show variables like '%show_compatibility_56%';
     92     //set global show_compatibility_56=on;
     93 
     94     fmt.Println("        ------------------------------")
     95     fmt.Println("        | Mysql:QPS,TPS monitor v2.0 |")
     96     fmt.Println("        ------------------------------")
     97     fmt.Println("")
     98     fmt.Printf("         %s      | %s |%s |
    ", "date", "QPS", "TPS")
     99 
    100     for i := 0; i < Interval; i++ {
    101         //一秒前的数据
    102         Qps1, err := open.Query(" select sum(VARIABLE_VALUE) QPS_Totol from  information_schema.GLOBAL_STATUS where VARIABLE_NAME in (?,?,?,?)", "com_select", "com_insert", "com_delete", "com_update")
    103         Tps1, err := open.Query(" select sum(VARIABLE_VALUE) TPS_Totol from  information_schema.GLOBAL_STATUS where VARIABLE_NAME in (?,?,?,?,?)", "Com_commit", "Com_rollback", "com_insert", "com_delete", "com_update")
    104 
    105         if err != nil {
    106             log.Fatal(err)
    107         }
    108 
    109         for Qps1.Next() {
    110             if err := Qps1.Scan(&QPS_Totol); err != nil {
    111                 log.Fatal(err)
    112             }
    113             QPS1 = QPS_Totol
    114         }
    115 
    116         for Tps1.Next() {
    117             if err := Tps1.Scan(&TPS_Totol); err != nil {
    118                 log.Fatal(err)
    119             }
    120             TPS1 = TPS_Totol
    121 
    122         }
    123 
    124         //停顿1秒
    125         time.Sleep(time.Second * 1)
    126 
    127         //一秒后的数据
    128         Qps2, err := open.Query(" select sum(VARIABLE_VALUE) QPS_Totol from  information_schema.GLOBAL_STATUS where VARIABLE_NAME in (?,?,?,?)", "com_select", "com_insert", "com_delete", "com_update")
    129         Tps2, err := open.Query(" select sum(VARIABLE_VALUE) TPS_Totol from  information_schema.GLOBAL_STATUS where VARIABLE_NAME in (?,?,?,?,?)", "Com_commit", "Com_rollback", "com_insert", "com_delete", "com_update")
    130         if err != nil {
    131             log.Fatal(err)
    132         }
    133 
    134         for Qps2.Next() {
    135             if err := Qps2.Scan(&QPS_Totol); err != nil {
    136                 log.Fatal(err)
    137             }
    138             QPS2 = QPS_Totol
    139         }
    140 
    141         for Tps2.Next() {
    142             if err := Tps2.Scan(&TPS_Totol); err != nil {
    143                 log.Fatal(err)
    144             }
    145             TPS2 = TPS_Totol
    146         }
    147         log.Println("|", QPS2-QPS1-2, "|", TPS2-TPS1, "|")
    148         
    149         ListQps = append(ListQps, QPS2-QPS1-2)
    150         ListTps = append(ListTps, TPS2-TPS1)
    151 
    152         //写入日志
    153         Nows := time.Now().Format("2006/1/2 15:04:05")
    154         sprintf := fmt.Sprintf("%v,%v,%v", Nows, QPS2-QPS1-2, TPS2-TPS1)
    155         file.WriteString(sprintf + "
    ")
    156 
    157     }
    158         //排序算法来排序QPS哪个最大
    159         for i := 0; i < len(ListQps)-1; i++ {
    160             for j := i + 1; j < len(ListQps); j++ {
    161                 if ListQps[j] > ListQps[i] {
    162                     ListQps[i], ListQps[j] = ListQps[j], ListQps[i]
    163                 }
    164             }
    165         }
    166 
    167             //排序算法来排序TPS哪个最大
    168             for i := 0; i < len(ListTps)-1; i++ {
    169                 for j := i + 1; j < len(ListTps); j++ {
    170                     if ListTps[j] > ListTps[i] {
    171                         ListTps[i], ListTps[j] = ListTps[j], ListTps[i]
    172                     }
    173                 }
    174             }
    175 
    176     fmt.Println()
    177     fmt.Printf("     MAX QPS values: %v  MAX TPS values: %v 
    ",ListQps[0],ListTps[0])
    178 
    179 }
    180 
    181 func Oracl1(username, password, host, ports, dbs string,Interval int) {
    182     ORA_conn := fmt.Sprintf("%s/%s@%s:%s/%s", username, password, host, ports, dbs)
    183     db, err := sql.Open("oci8", ORA_conn)
    184     if err != nil {
    185         log.Fatal(err)
    186     }
    187     defer db.Close()
    188     
    189 
    190     //创建日志文件
    191     file1, err := os.OpenFile("./"+FormatTimes+"_ORA_qtps.csv", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    192     if err != nil {
    193         fmt.Println("文件打开失败: ", err)
    194     }
    195     defer file1.Close()
    196     file1.WriteString("date,QPS,TPS,MBPS
    ")
    197 
    198     fmt.Println("        ------------------------------------")
    199     fmt.Println("        | Oracle:QPS,TPS,MBPS monitor v2.0 |")
    200     fmt.Println("        ------------------------------------")
    201     fmt.Println("")
    202     fmt.Printf("         %s       | %s |%s |%s |
    ", "date", "QPS", "TPS", "MBPS")
    203 
    204     for i := 0; i < Interval; i++ {
    205         Ora01, err := db.Query("select round((select sum(value)  from gv$sysmetric where metric_name='I/O Requests per Second'),1)as qps,round((select sum(value) from gv$sysmetric where metric_name='User Transaction Per Sec'),1) as tps,round((select sum(value) from gv$sysmetric where metric_name='I/O Megabytes per Second'),1) as mbps from dual")
    206         if err != nil {
    207             log.Fatal(err)
    208         }
    209 
    210         for Ora01.Next() {
    211 
    212             Ora01.Scan(&QPS, &TPS, &MBPS)
    213         }
    214 
    215         Ora01.Close()
    216         log.Println("|", QPS, "|", TPS, "|", MBPS, "|")
    217 
    218         //将每次获取的数据存入列表中
    219         OListQps = append(OListQps, QPS)
    220         OListTps = append(OListTps, TPS)
    221         OListMbps= append(OListMbps, MBPS)
    222 
    223         //写入日志
    224         Nows := time.Now().Format("2006/1/2 15:04:05")
    225         sprintf := fmt.Sprintf("%v,%v,%v,%v", Nows, QPS, TPS, MBPS)
    226         file1.WriteString(sprintf + "
    ")
    227 
    228         //停顿1秒
    229         time.Sleep(time.Second * 1)
    230 
    231     }
    232 
    233     //排序算法来排序QPS哪个最大
    234     for i := 0; i < len(OListQps)-1; i++ {
    235         for j := i + 1; j < len(OListQps); j++ {
    236             if OListQps[j] > OListQps[i] {
    237                 OListQps[i], OListQps[j] = OListQps[j], OListQps[i]
    238             }
    239         }
    240     }
    241 
    242         //排序算法来排序TPS哪个最大
    243         for i := 0; i < len(OListTps)-1; i++ {
    244             for j := i + 1; j < len(OListTps); j++ {
    245                 if OListTps[j] > OListTps[i] {
    246                     OListTps[i], OListTps[j] = OListTps[j], OListTps[i]
    247                 }
    248             }
    249         }
    250 
    251             //排序算法来排序MBPS哪个最大
    252             for i := 0; i < len(OListMbps)-1; i++ {
    253                 for j := i + 1; j < len(OListMbps); j++ {
    254                     if OListMbps[j] > OListMbps[i] {
    255                         OListMbps[i], OListMbps[j] = OListMbps[j], OListMbps[i]
    256                     }
    257                 }
    258             }
    259 
    260 
    261 fmt.Println()
    262 fmt.Printf("     MAX QPS values: %v  MAX TPS values: %v   MAX MBPS values: %v 
    ",OListQps[0],OListTps[0],OListMbps[0])
    263 
    264 
    265 }
    266 
    267 
    268 func Sqlserver(username, password, host, port, db string,Interval int)  {
    269 
    270     var QPS3 int
    271     var QPS4 int
    272     var TPS3 int
    273     var TPS4 int
    274 
    275 
    276     //连接字符串
    277     connString := fmt.Sprintf("server=%s;port%d;database=%s;user id=%s;password=%s", host, port, db, username, password)
    278     //建立连接
    279     conn, err := sql.Open("mssql", connString)
    280     if err != nil {
    281         log.Fatal("Open Connection failed:", err.Error())
    282     }
    283     defer conn.Close()
    284 
    285     //创建日志文件
    286     file, err := os.OpenFile("./"+FormatTimes+"_SQL_qtps.csv", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    287     if err != nil {
    288         fmt.Println("File open failed: ", err)
    289     }
    290     defer file.Close()
    291 
    292     file.WriteString("date,QPS,TPS
    ")
    293 
    294     fmt.Println("        ----------------------------------")
    295     fmt.Println("        | Sqlserver:QPS,TPS monitor v2.0 |")
    296     fmt.Println("        ----------------------------------")
    297     fmt.Println("")
    298     fmt.Printf("         %s       | %s |%s |
    ", "date", "QPS", "TPS")
    299 
    300 for i := 0; i < Interval; i++ {
    301    //通过连接对象执行查询
    302 rows, err := conn.Query(`select (select sum(cntr_value) QPS3 from sys.dm_os_performance_counters where  ltrim(rtrim(instance_name))
    303 not in ('master','model','msdb','tempdb','mssqlsystemresource','_Total')
    304 and rtrim(counter_name) in ('Batch Requests/sec')) QPS3 ,(select sum(cntr_value) TPS3 from sys.dm_os_performance_counters
    305 where  ltrim(rtrim(instance_name)) not in ('master','model','msdb','tempdb','mssqlsystemresource','_Total')
    306 and rtrim(counter_name) in ('Transactions/sec') ) TPS3 `)
    307 
    308 
    309 
    310    if err != nil {
    311       log.Fatal("Query failed:", err.Error())
    312    }
    313    defer rows.Close()
    314 
    315 
    316    for rows.Next() {
    317       rows.Scan(&QPS3,&TPS3)
    318       
    319     }
    320     //fmt.Println("1#####",TPS3,IOPS3)
    321 
    322     
    323 
    324         //停顿1秒
    325         time.Sleep(time.Second * 1)
    326 
    327 
    328        //通过连接对象执行查询
    329        rows1, err := conn.Query(`select (select sum(cntr_value) QPS4 from sys.dm_os_performance_counters where  ltrim(rtrim(instance_name))
    330        not in ('master','model','msdb','tempdb','mssqlsystemresource','_Total')
    331        and rtrim(counter_name) in ('Batch Requests/sec')) QPS4 ,(select sum(cntr_value) TPS4 from sys.dm_os_performance_counters
    332        where  ltrim(rtrim(instance_name)) not in ('master','model','msdb','tempdb','mssqlsystemresource','_Total')
    333        and rtrim(counter_name) in ('Transactions/sec') ) TPS4 `)
    334 
    335    if err != nil {
    336       log.Fatal("Query failed:", err.Error())
    337    }
    338    defer rows1.Close()
    339 
    340 
    341    for rows1.Next() {
    342     rows1.Scan(&QPS4,&TPS4)
    343 }
    344     //fmt.Println("2#####",QPS4,TPS4)
    345 
    346 
    347 log.Println("|",QPS4-QPS3,"|",TPS4-TPS3,"|" )
    348 
    349 ListQps = append(ListQps, QPS4-QPS3)
    350 ListTps = append(ListTps, TPS4-TPS3)
    351 
    352 //写入日志
    353 Nows := time.Now().Format("2006/1/2 15:04:05")
    354 sprintf := fmt.Sprintf("%v,%v,%v", Nows,QPS4-QPS3,TPS4-TPS3)
    355 file.WriteString(sprintf + "
    ")
    356 
    357 }
    358 
    359         //排序算法来排序QPS哪个最大
    360         for i := 0; i < len(ListQps)-1; i++ {
    361             for j := i + 1; j < len(ListQps); j++ {
    362                 if ListQps[j] > ListQps[i] {
    363                     ListQps[i], ListQps[j] = ListQps[j], ListQps[i]
    364                 }
    365             }
    366         }
    367 
    368             //排序算法来排序TPS哪个最大
    369             for i := 0; i < len(ListTps)-1; i++ {
    370                 for j := i + 1; j < len(ListTps); j++ {
    371                     if ListTps[j] > ListTps[i] {
    372                         ListTps[i], ListTps[j] = ListTps[j], ListTps[i]
    373                     }
    374                 }
    375             }
    376 
    377     fmt.Println()
    378     fmt.Printf("     MAX QPS values: %v  MAX TPS values: %v 
    ",ListQps[0],ListTps[0])
    379 
    380 }
    381 
    382 
    383 
    384 //定义人工输入参数
    385 func GetValues() (dbtype, host, username, password, port, db string,Interval int) {
    386 
    387     flag.StringVar(&dbtype, "dbtype", "", "* Database support type (mysql,oracle,sqlserver)")
    388     flag.StringVar(&host, "host", "127.0.0.1", "* Database address")
    389     flag.StringVar(&username, "user", "root", "* database username")
    390     flag.StringVar(&password, "pass", "", "* Database password [nill]")
    391     flag.StringVar(&port, "port", "3306", "Database port")
    392     flag.StringVar(&db, "instance", "", "Specify the instance name or database name: (Mysql is db, Oracle is an instance, Sqlserver is an instance)")
    393     flag.IntVar(&Interval, "interval", 99999999, "Data acquisition times: once every 1 second")
    394 
    395     //解析胡获取参数
    396     flag.Parse() //解析一下
    397     return dbtype, host, username, password, port, db,Interval
    398 
    399 }
    400 
    401 //软件使用介绍
    402 func README(){
    403     
    404         dataStr := `
    405 1. Software introduction: 
    406 This tool mainly realizes monitoring the QPS information of the DB to detect the pressure of the database.
    407 
    408 
    409 2. Instructions:
    410 
    411 
    412     example Mysql:
    413 
    414     qtps.exe -dbtype mysql  -host 127.0.0.1 -user monitor -pass monitor -port 3306 -instance mysql -interval 5
    415 
    416 
    417     If there is Error 3167: The 'INFORMATION_SCHEMA.GLOBAL_STATUS' feature is disabled; see the documentation for 'show_compatibility_56'
    418 
    419     Solution:
    420     Execute the command with root authority 【set global show_compatibility_56=on】
    421 
    422 
    423 
    424     example oracle:
    425 
    426     qtps.exe -dbtype oracle -host  127.0.0.1 -user monitor -pass monitor  -port 1521  -instance ORCL   -interval 5
    427 
    428 
    429 
    430     example sqlserver:
    431 
    432     qtps.exe -dbtype sqlserver -host  127.0.0.1 -user monitor -pass monitor  -interval 10
    433 
    434         
    435            `
    436 
    437      //字符串转为字节类型
    438     dataBytes := []byte(dataStr)
    439 
    440     err := ioutil.WriteFile("./README.md", dataBytes, 0666)
    441     if err != nil {
    442         fmt.Println("An error has occurred: ", err)
    443     } 
    444         
    445 
    446 }

     

     

     

     

    5. 现成软件下载和详细信息:

    http://note.youdao.com/noteshare?id=b629cee746e9d69baff4c53aaae056c5&sub=0A5CFB29B3594CC4BCB024E9DDC94AD0

  • 相关阅读:
    laravel 使用构造器进行增删改查
    explan各项说明
    data函数参数
    php引用
    PHP开发api接口安全验证方法一
    redis主从配置
    php 实现同一个账号同时只能一个人登录
    MySQL慢查询1- 开启慢查询
    前端基础 & 初识HTML
    HTTP协议概述
  • 原文地址:https://www.cnblogs.com/chaoyangxu/p/12855874.html
Copyright © 2020-2023  润新知