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))
}
}
上面脚本执行后的结果为:



