Skip to content

Commit 11f71db

Browse files
authored
Merge pull request #18 from mackerelio/slave-to-replica
Replace command of fetching replica status for MySQL 8.4
2 parents 07e62d9 + 19150f5 commit 11f71db

3 files changed

Lines changed: 18 additions & 9 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ command = "/path/to/mackerel-plugin-mysql"
1818

1919
## Supported MySQL version
2020

21-
- `v1.1.0 >=` mysql 5.7, 8.0 and above
21+
- `v1.3.0 >=` mysql 5.7, 8.0, 8.4 and above
22+
- `v1.1.0 >=` mysql 5.7, 8.0
2223
- `v1.0.0` mysql 5.0, 5.1, 5.5, 5.6, 5.7, 8.0

lib/mysql.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,16 +296,24 @@ func fetchShowVariablesBackwardCompatibile(stat map[string]float64) error {
296296
}
297297

298298
// This code does not work with multi-source replication.
299-
func (m *MySQLPlugin) fetchShowSlaveStatus(db *sql.DB, stat map[string]float64) error {
300-
rows, err := db.Query("show slave status")
299+
func (m *MySQLPlugin) fetchShowReplicaStatus(db *sql.DB, stat map[string]float64, version [3]int) error {
300+
command := "show replica status"
301+
secondsBehindSourceColumn := "Seconds_Behind_Source"
302+
if version[0] < 8 || (version[0] == 8 && version[1] == 0 && version[2] < 22) {
303+
// From MySQL 8.0.22, SHOW RELICA STATUS command is created and SHOW SLAVE STATUS command is deprecated.
304+
// cf.) https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-22.html
305+
command = "show slave status"
306+
secondsBehindSourceColumn = "Seconds_Behind_Master"
307+
}
308+
rows, err := db.Query(command)
301309
if err != nil {
302-
return fmt.Errorf("FetchMetrics (Slave Status): %w", err)
310+
return fmt.Errorf("FetchMetrics (Replica Status): %w", err)
303311
}
304312
defer rows.Close()
305313
for rows.Next() {
306314
columns, err := rows.ColumnTypes()
307315
if err != nil {
308-
return fmt.Errorf("FetchMetrics (Slave Status): %w", err)
316+
return fmt.Errorf("FetchMetrics (Replica Status): %w", err)
309317
}
310318

311319
valuePtrs := make([]interface{}, len(columns))
@@ -315,12 +323,12 @@ func (m *MySQLPlugin) fetchShowSlaveStatus(db *sql.DB, stat map[string]float64)
315323
valuePtrs[i] = &values[i]
316324
}
317325
if err = rows.Scan(valuePtrs...); err != nil {
318-
return fmt.Errorf("FetchMetrics (Slave Status): %w", err)
326+
return fmt.Errorf("FetchMetrics (Replica Status): %w", err)
319327
}
320328
for i, column := range columns {
321329
variableName := column.Name()
322330
value := values[i]
323-
if variableName == "Seconds_Behind_Master" {
331+
if variableName == secondsBehindSourceColumn {
324332
if value != nil {
325333
f, err := atof(string(value))
326334
if err != nil {
@@ -441,7 +449,7 @@ func (m *MySQLPlugin) FetchMetrics() (map[string]float64, error) {
441449
}
442450
}
443451

444-
err = m.fetchShowSlaveStatus(db, stat)
452+
err = m.fetchShowReplicaStatus(db, stat, v)
445453
if err != nil {
446454
return nil, err
447455
}

tests/extend-mysql8/test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ docker run -d \
2525
--name "test-$plugin" \
2626
-p $port:3306 \
2727
-e MYSQL_ROOT_PASSWORD=$password \
28-
"$image" --default-authentication-plugin=mysql_native_password
28+
"$image"
2929
trap 'docker stop test-$plugin; docker rm test-$plugin; exit' 1 2 3 15 EXIT
3030
sleep 10
3131

0 commit comments

Comments
 (0)