@@ -295,27 +295,39 @@ func fetchShowVariablesBackwardCompatibile(stat map[string]float64) error {
295295 return nil
296296}
297297
298+ // This code does not work with multi-source replication.
298299func (m * MySQLPlugin ) fetchShowSlaveStatus (db * sql.DB , stat map [string ]float64 ) error {
299300 rows , err := db .Query ("show slave status" )
300301 if err != nil {
301302 return fmt .Errorf ("FetchMetrics (Slave Status): %w" , err )
302303 }
303304 defer rows .Close ()
304305 for rows .Next () {
305- var (
306- variableName string
307- value * string
308- )
309- if err := rows .Scan (& variableName , & value ); err != nil {
306+ columns , err := rows .ColumnTypes ()
307+ if err != nil {
310308 return fmt .Errorf ("FetchMetrics (Slave Status): %w" , err )
311309 }
312- if variableName == "Seconds_Behind_Master" {
313- if value != nil {
314- f , err := atof (* value )
315- if err != nil {
316- return err
310+
311+ valuePtrs := make ([]interface {}, len (columns ))
312+ values := make ([]sql.RawBytes , len (columns ))
313+ for i := range values {
314+ values [i ] = sql.RawBytes {}
315+ valuePtrs [i ] = & values [i ]
316+ }
317+ if err = rows .Scan (valuePtrs ... ); err != nil {
318+ return fmt .Errorf ("FetchMetrics (Slave Status): %w" , err )
319+ }
320+ for i , column := range columns {
321+ variableName := column .Name ()
322+ value := values [i ]
323+ if variableName == "Seconds_Behind_Master" {
324+ if value != nil {
325+ f , err := atof (string (value ))
326+ if err != nil {
327+ return err
328+ }
329+ stat ["Seconds_Behind_Master" ] = f
317330 }
318- stat ["Seconds_Behind_Master" ] = f
319331 }
320332 }
321333 }
0 commit comments