summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go
blob: 37d4bf59b54d34abed9b12b81bc4d4b3940af184 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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
}