Skip to content

Commit cf82946

Browse files
authored
Merge pull request #577 from betanummeric/fix-show-slave-hosts
fix mysql_slave_hosts_info for mysql 5.5 and mariadb 10.5, add unit test
2 parents f8b636f + 5132a1c commit cf82946

File tree

2 files changed

+64
-9
lines changed

2 files changed

+64
-9
lines changed

collector/slave_hosts.go

+26-9
Original file line numberDiff line numberDiff line change
@@ -80,25 +80,42 @@ func (ScrapeSlaveHosts) Scrape(ctx context.Context, db *sql.DB, ch chan<- promet
8080
var masterId string
8181
var slaveUuid string
8282

83+
columnNames, err := slaveHostsRows.Columns()
84+
if err != nil {
85+
return err
86+
}
87+
8388
for slaveHostsRows.Next() {
8489
// Newer versions of mysql have the following
8590
// Server_id, Host, Port, Master_id, Slave_UUID
8691
// Older versions of mysql have the following
8792
// Server_id, Host, Port, Rpl_recovery_rank, Master_id
88-
err := slaveHostsRows.Scan(&serverId, &host, &port, &rrrOrMasterId, &slaveUuidOrMasterId)
93+
// MySQL 5.5 and MariaDB 10.5 have the following
94+
// Server_id, Host, Port, Master_id
95+
if len(columnNames) == 5 {
96+
err = slaveHostsRows.Scan(&serverId, &host, &port, &rrrOrMasterId, &slaveUuidOrMasterId)
97+
} else {
98+
err = slaveHostsRows.Scan(&serverId, &host, &port, &rrrOrMasterId)
99+
}
89100
if err != nil {
90101
return err
91102
}
92103

93-
// Check to see if slaveUuidOrMasterId resembles a UUID or not
94-
// to find out if we are using an old version of MySQL
95-
if _, err = uuid.FromString(slaveUuidOrMasterId); err != nil {
96-
// We are running an older version of MySQL with no slave UUID
97-
slaveUuid = ""
98-
masterId = slaveUuidOrMasterId
104+
// if a Slave_UUID or Rpl_recovery_rank field is present
105+
if len(columnNames) == 5 {
106+
// Check to see if slaveUuidOrMasterId resembles a UUID or not
107+
// to find out if we are using an old version of MySQL
108+
if _, err = uuid.FromString(slaveUuidOrMasterId); err != nil {
109+
// We are running an older version of MySQL with no slave UUID
110+
slaveUuid = ""
111+
masterId = slaveUuidOrMasterId
112+
} else {
113+
// We are running a more recent version of MySQL
114+
slaveUuid = slaveUuidOrMasterId
115+
masterId = rrrOrMasterId
116+
}
99117
} else {
100-
// We are running a more recent version of MySQL
101-
slaveUuid = slaveUuidOrMasterId
118+
slaveUuid = ""
102119
masterId = rrrOrMasterId
103120
}
104121

collector/slave_hosts_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,41 @@ func TestScrapeSlaveHostsNewFormat(t *testing.T) {
9999
t.Errorf("there were unfulfilled exceptions: %s", err)
100100
}
101101
}
102+
103+
func TestScrapeSlaveHostsWithoutSlaveUuid(t *testing.T) {
104+
db, mock, err := sqlmock.New()
105+
if err != nil {
106+
t.Fatalf("error opening a stub database connection: %s", err)
107+
}
108+
defer db.Close()
109+
110+
columns := []string{"Server_id", "Host", "Port", "Master_id"}
111+
rows := sqlmock.NewRows(columns).
112+
AddRow("192168010", "iconnect2", "3306", "192168012").
113+
AddRow("1921680101", "athena", "3306", "192168012")
114+
mock.ExpectQuery(sanitizeQuery("SHOW SLAVE HOSTS")).WillReturnRows(rows)
115+
116+
ch := make(chan prometheus.Metric)
117+
go func() {
118+
if err = (ScrapeSlaveHosts{}).Scrape(context.Background(), db, ch, log.NewNopLogger()); err != nil {
119+
t.Errorf("error calling function on test: %s", err)
120+
}
121+
close(ch)
122+
}()
123+
124+
counterExpected := []MetricResult{
125+
{labels: labelMap{"server_id": "192168010", "slave_host": "iconnect2", "port": "3306", "master_id": "192168012", "slave_uuid": ""}, value: 1, metricType: dto.MetricType_GAUGE},
126+
{labels: labelMap{"server_id": "1921680101", "slave_host": "athena", "port": "3306", "master_id": "192168012", "slave_uuid": ""}, value: 1, metricType: dto.MetricType_GAUGE},
127+
}
128+
convey.Convey("Metrics comparison", t, func() {
129+
for _, expect := range counterExpected {
130+
got := readMetric(<-ch)
131+
convey.So(got, convey.ShouldResemble, expect)
132+
}
133+
})
134+
135+
// Ensure all SQL queries were executed
136+
if err := mock.ExpectationsWereMet(); err != nil {
137+
t.Errorf("there were unfulfilled exceptions: %s", err)
138+
}
139+
}

0 commit comments

Comments
 (0)