@@ -295,27 +295,39 @@ func fetchShowVariablesBackwardCompatibile(stat map[string]float64) error {
295
295
return nil
296
296
}
297
297
298
+ // This code does not work with multi-source replication.
298
299
func (m * MySQLPlugin ) fetchShowSlaveStatus (db * sql.DB , stat map [string ]float64 ) error {
299
300
rows , err := db .Query ("show slave status" )
300
301
if err != nil {
301
302
return fmt .Errorf ("FetchMetrics (Slave Status): %w" , err )
302
303
}
303
304
defer rows .Close ()
304
305
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 {
310
308
return fmt .Errorf ("FetchMetrics (Slave Status): %w" , err )
311
309
}
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
317
330
}
318
- stat ["Seconds_Behind_Master" ] = f
319
331
}
320
332
}
321
333
}
0 commit comments