@@ -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 }
0 commit comments