summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go b/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go
new file mode 100644
index 000000000..37d4bf59b
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "strings"
+
+ "github.com/blang/semver/v4"
+)
+
+const (
+ queryShowReplicaStatus = "SHOW REPLICA STATUS;"
+ queryShowSlaveStatus = "SHOW SLAVE STATUS;"
+ queryShowAllSlavesStatus = "SHOW ALL SLAVES STATUS;"
+)
+
+func (m *MySQL) collectSlaveStatus(mx map[string]int64) error {
+ // https://mariadb.com/docs/reference/es/sql-statements/SHOW_ALL_SLAVES_STATUS/
+ mariaDBMinVer := semver.Version{Major: 10, Minor: 2, Patch: 0}
+ mysqlMinVer := semver.Version{Major: 8, Minor: 0, Patch: 22}
+ var q string
+ if m.isMariaDB && m.version.GTE(mariaDBMinVer) {
+ q = queryShowAllSlavesStatus
+ } else if !m.isMariaDB && m.version.GTE(mysqlMinVer) {
+ q = queryShowReplicaStatus
+ } else {
+ q = queryShowSlaveStatus
+ }
+ m.Debugf("executing query: '%s'", q)
+
+ v := struct {
+ name string
+ behindMaster int64
+ sqlRunning int64
+ ioRunning int64
+ }{}
+
+ _, err := m.collectQuery(q, func(column, value string, lineEnd bool) {
+ switch column {
+ case "Connection_name", "Channel_Name":
+ v.name = value
+ case "Seconds_Behind_Master", "Seconds_Behind_Source":
+ v.behindMaster = parseInt(value)
+ case "Slave_SQL_Running", "Replica_SQL_Running":
+ v.sqlRunning = parseInt(convertSlaveSQLRunning(value))
+ case "Slave_IO_Running", "Replica_IO_Running":
+ v.ioRunning = parseInt(convertSlaveIORunning(value))
+ }
+ if lineEnd {
+ if !m.collectedReplConns[v.name] {
+ m.collectedReplConns[v.name] = true
+ m.addSlaveReplicationConnCharts(v.name)
+ }
+ s := strings.ToLower(slaveMetricSuffix(v.name))
+ mx["seconds_behind_master"+s] = v.behindMaster
+ mx["slave_sql_running"+s] = v.sqlRunning
+ mx["slave_io_running"+s] = v.ioRunning
+ }
+ })
+ return err
+}
+
+func convertSlaveSQLRunning(value string) string {
+ switch value {
+ case "Yes":
+ return "1"
+ default:
+ return "0"
+ }
+}
+
+func convertSlaveIORunning(value string) string {
+ // NOTE: There is 'Connecting' state and probably others
+ switch value {
+ case "Yes":
+ return "1"
+ default:
+ return "0"
+ }
+}
+
+func slaveMetricSuffix(conn string) string {
+ if conn == "" {
+ return ""
+ }
+ return "_" + conn
+}