github.com/netdata/go.d.plugin@v0.58.1/modules/mysql/collect_slave_status.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package mysql
     4  
     5  import (
     6  	"strings"
     7  
     8  	"github.com/blang/semver/v4"
     9  )
    10  
    11  const (
    12  	queryShowReplicaStatus   = "SHOW REPLICA STATUS;"
    13  	queryShowSlaveStatus     = "SHOW SLAVE STATUS;"
    14  	queryShowAllSlavesStatus = "SHOW ALL SLAVES STATUS;"
    15  )
    16  
    17  func (m *MySQL) collectSlaveStatus(mx map[string]int64) error {
    18  	// https://mariadb.com/docs/reference/es/sql-statements/SHOW_ALL_SLAVES_STATUS/
    19  	mariaDBMinVer := semver.Version{Major: 10, Minor: 2, Patch: 0}
    20  	mysqlMinVer := semver.Version{Major: 8, Minor: 0, Patch: 22}
    21  	var q string
    22  	if m.isMariaDB && m.version.GTE(mariaDBMinVer) {
    23  		q = queryShowAllSlavesStatus
    24  	} else if !m.isMariaDB && m.version.GTE(mysqlMinVer) {
    25  		q = queryShowReplicaStatus
    26  	} else {
    27  		q = queryShowSlaveStatus
    28  	}
    29  	m.Debugf("executing query: '%s'", q)
    30  
    31  	v := struct {
    32  		name         string
    33  		behindMaster int64
    34  		sqlRunning   int64
    35  		ioRunning    int64
    36  	}{}
    37  
    38  	_, err := m.collectQuery(q, func(column, value string, lineEnd bool) {
    39  		switch column {
    40  		case "Connection_name", "Channel_Name":
    41  			v.name = value
    42  		case "Seconds_Behind_Master", "Seconds_Behind_Source":
    43  			v.behindMaster = parseInt(value)
    44  		case "Slave_SQL_Running", "Replica_SQL_Running":
    45  			v.sqlRunning = parseInt(convertSlaveSQLRunning(value))
    46  		case "Slave_IO_Running", "Replica_IO_Running":
    47  			v.ioRunning = parseInt(convertSlaveIORunning(value))
    48  		}
    49  		if lineEnd {
    50  			if !m.collectedReplConns[v.name] {
    51  				m.collectedReplConns[v.name] = true
    52  				m.addSlaveReplicationConnCharts(v.name)
    53  			}
    54  			s := strings.ToLower(slaveMetricSuffix(v.name))
    55  			mx["seconds_behind_master"+s] = v.behindMaster
    56  			mx["slave_sql_running"+s] = v.sqlRunning
    57  			mx["slave_io_running"+s] = v.ioRunning
    58  		}
    59  	})
    60  	return err
    61  }
    62  
    63  func convertSlaveSQLRunning(value string) string {
    64  	switch value {
    65  	case "Yes":
    66  		return "1"
    67  	default:
    68  		return "0"
    69  	}
    70  }
    71  
    72  func convertSlaveIORunning(value string) string {
    73  	// NOTE: There is 'Connecting' state and probably others
    74  	switch value {
    75  	case "Yes":
    76  		return "1"
    77  	default:
    78  		return "0"
    79  	}
    80  }
    81  
    82  func slaveMetricSuffix(conn string) string {
    83  	if conn == "" {
    84  		return ""
    85  	}
    86  	return "_" + conn
    87  }