github.com/netdata/go.d.plugin@v0.58.1/modules/mysql/collect_slave_status.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package mysql 4 5 import ( 6 "strings" 7 8 "github.com/blang/semver/v4" 9 ) 10 11 const ( 12 queryShowReplicaStatus = "SHOW REPLICA STATUS;" 13 queryShowSlaveStatus = "SHOW SLAVE STATUS;" 14 queryShowAllSlavesStatus = "SHOW ALL SLAVES STATUS;" 15 ) 16 17 func (m *MySQL) collectSlaveStatus(mx map[string]int64) error { 18 // https://mariadb.com/docs/reference/es/sql-statements/SHOW_ALL_SLAVES_STATUS/ 19 mariaDBMinVer := semver.Version{Major: 10, Minor: 2, Patch: 0} 20 mysqlMinVer := semver.Version{Major: 8, Minor: 0, Patch: 22} 21 var q string 22 if m.isMariaDB && m.version.GTE(mariaDBMinVer) { 23 q = queryShowAllSlavesStatus 24 } else if !m.isMariaDB && m.version.GTE(mysqlMinVer) { 25 q = queryShowReplicaStatus 26 } else { 27 q = queryShowSlaveStatus 28 } 29 m.Debugf("executing query: '%s'", q) 30 31 v := struct { 32 name string 33 behindMaster int64 34 sqlRunning int64 35 ioRunning int64 36 }{} 37 38 _, err := m.collectQuery(q, func(column, value string, lineEnd bool) { 39 switch column { 40 case "Connection_name", "Channel_Name": 41 v.name = value 42 case "Seconds_Behind_Master", "Seconds_Behind_Source": 43 v.behindMaster = parseInt(value) 44 case "Slave_SQL_Running", "Replica_SQL_Running": 45 v.sqlRunning = parseInt(convertSlaveSQLRunning(value)) 46 case "Slave_IO_Running", "Replica_IO_Running": 47 v.ioRunning = parseInt(convertSlaveIORunning(value)) 48 } 49 if lineEnd { 50 if !m.collectedReplConns[v.name] { 51 m.collectedReplConns[v.name] = true 52 m.addSlaveReplicationConnCharts(v.name) 53 } 54 s := strings.ToLower(slaveMetricSuffix(v.name)) 55 mx["seconds_behind_master"+s] = v.behindMaster 56 mx["slave_sql_running"+s] = v.sqlRunning 57 mx["slave_io_running"+s] = v.ioRunning 58 } 59 }) 60 return err 61 } 62 63 func convertSlaveSQLRunning(value string) string { 64 switch value { 65 case "Yes": 66 return "1" 67 default: 68 return "0" 69 } 70 } 71 72 func convertSlaveIORunning(value string) string { 73 // NOTE: There is 'Connecting' state and probably others 74 switch value { 75 case "Yes": 76 return "1" 77 default: 78 return "0" 79 } 80 } 81 82 func slaveMetricSuffix(conn string) string { 83 if conn == "" { 84 return "" 85 } 86 return "_" + conn 87 }