Golang+夜鹰监控判断mysql主从是否断开

本例子通过golang脚本+夜莺监控v3版本来判断mysql主从,原理就是通过获取SlaveIORunning和SlaveSQLRunning的值,来判断是否为yes,只要有一个不是yes,那么就证明主从已经端开,最后输出复合夜莺监控规则的格式,即可被监控识别

脚本内容如下:

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"time"
)

// 此处的结构体名可自定义
type slavestatus struct {
	SlaveIORunning      string `gorm:"column:Slave_IO_Running"`
	SlaveSQLRunning     string `gorm:"column:Slave_SQL_Running"`
	SecondsBehindMaster int    `gorm:"column:Seconds_Behind_Master"`
}

var db *gorm.DB

func init() {
	user := "root"
	password := "abcd@2020"
	dbName := "mysql"
	host := "192.168.12.172"
	port := "3306"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", user, password, host, port, dbName)
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal(err)
	}
	sqlDB, err := db.DB()
	//SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	//SetMaxOpenConns 设置打开数据库连接的最大数量
	sqlDB.SetMaxOpenConns(100)
	//SetConnMaxLifetime 设置了连接可复用的最大时间
	sqlDB.SetConnMaxLifetime(time.Hour)
}
func main() {
	out := `
          [ 
            {
               "endpoint": "192.168.12.172",
               "tags": "",
               "timestamp": 0,
               "metric": "slave_status_12_172",
               "value": %d
            }
          ]
        `
	var ss slavestatus
	db.Raw("show slave status").Scan(&ss)
	//fmt.Println("从库IO线程:", ss.SlaveIORunning)
	//fmt.Println("从库SQL线程:", ss.SlaveSQLRunning)
	//fmt.Println("从库落后主库时间:", ss.SecondsBehindMaster)
	if ss.SlaveIORunning != "Yes" || ss.SlaveSQLRunning != "Yes" {
		fmt.Println(fmt.Sprintf(out, 0))
	} else {
		fmt.Println(fmt.Sprintf(out, 1))
	}
}

上面脚本执行后的结果为:

标签