diff --git a/mysqlchk.go b/mysqlchk.go index 0f1a4f9..a5fbb0b 100644 --- a/mysqlchk.go +++ b/mysqlchk.go @@ -11,6 +11,8 @@ import "net/http" var db *sql.DB var wsrepStmt *sql.Stmt var readOnlyStmt *sql.Stmt +var maxConnStmt *sql.Stmt +var connUsedStmt *sql.Stmt var username = flag.String("username", "clustercheckuser", "MySQL Username") var password = flag.String("password", "clustercheckpassword!", "MySQL Password") @@ -32,6 +34,8 @@ func init() { func checkHandler(w http.ResponseWriter, r *http.Request) { var fieldName, readOnly string var wsrepState int + var maxConn int + var connUsed int if _, err := os.Stat(*forceUpFile); err == nil { fmt.Fprint(w, "Cluster node OK by manual override\n") @@ -43,7 +47,25 @@ func checkHandler(w http.ResponseWriter, r *http.Request) { return } - err := wsrepStmt.QueryRow().Scan(&fieldName, &wsrepState) + err := maxConnStmt.QueryRow().Scan(&fieldName, &maxConn) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + err = connUsedStmt.QueryRow().Scan(&fieldName, &connUsed) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if maxConn <= (connUsed + 10) { + http.Error(w, "Cluster node is unavailable Max connections", http.StatusServiceUnavailable) + } else { + log.Println("Number of free connections", maxConn-connUsed) + } + + err = wsrepStmt.QueryRow().Scan(&fieldName, &wsrepState) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -96,6 +118,16 @@ func main() { log.Fatal(err) } + maxConnStmt, err = db.Prepare("show variables like 'max_connections'") + if err != nil { + log.Fatal(err) + } + + connUsedStmt, err = db.Prepare("show status where variable_name = 'Threads_connected'") + if err != nil { + log.Fatal(err) + } + log.Println("Listening...") http.HandleFunc("/", checkHandler) log.Fatal(http.ListenAndServe(fmt.Sprintf("%s:%d", *bindAddr, *bindPort), nil)) diff --git a/mysqlchk.service b/mysqlchk.service new file mode 100644 index 0000000..5fff781 --- /dev/null +++ b/mysqlchk.service @@ -0,0 +1,10 @@ +[Unit] +Description=Mysqlchk check +After=mariadb.service + +[Service] +ExecStart=/usr/bin/mysqlchk +Restart=always + +[Install] +WantedBy=multi-user.target