src/go/plugin/go.d/modules/mysql/collect_global_status.go
// SPDX-License-Identifier: GPL-3.0-or-later
package mysql
import (
"strings"
)
const queryShowGlobalStatus = "SHOW GLOBAL STATUS;"
func (m *MySQL) collectGlobalStatus(mx map[string]int64) error {
// MariaDB: https://mariadb.com/kb/en/server-status-variables/
// MySQL: https://dev.mysql.com/doc/refman/8.0/en/server-status-variable-reference.html
q := queryShowGlobalStatus
m.Debugf("executing query: '%s'", q)
var name string
_, err := m.collectQuery(q, func(column, value string, _ bool) {
switch column {
case "Variable_name":
name = value
case "Value":
if !globalStatusKeys[name] {
return
}
switch name {
case "wsrep_connected":
mx[name] = parseInt(convertWsrepConnected(value))
case "wsrep_ready":
mx[name] = parseInt(convertWsrepReady(value))
case "wsrep_local_state":
// https://mariadb.com/kb/en/galera-cluster-status-variables/#wsrep_local_state
// https://github.com/codership/wsrep-API/blob/eab2d5d5a31672c0b7d116ef1629ff18392fd7d0/wsrep_api.h#L256
mx[name+"_undefined"] = boolToInt(value == "0")
mx[name+"_joiner"] = boolToInt(value == "1")
mx[name+"_donor"] = boolToInt(value == "2")
mx[name+"_joined"] = boolToInt(value == "3")
mx[name+"_synced"] = boolToInt(value == "4")
mx[name+"_error"] = boolToInt(parseInt(value) >= 5)
case "wsrep_cluster_status":
// https://www.percona.com/doc/percona-xtradb-cluster/LATEST/wsrep-status-index.html#wsrep_cluster_status
// https://github.com/codership/wsrep-API/blob/eab2d5d5a31672c0b7d116ef1629ff18392fd7d0/wsrep_api.h
// https://github.com/codership/wsrep-API/blob/f71cd270414ee70dde839cfc59c1731eea4230ea/examples/node/wsrep.c#L80
value = strings.ToUpper(value)
mx[name+"_primary"] = boolToInt(value == "PRIMARY")
mx[name+"_non_primary"] = boolToInt(value == "NON-PRIMARY")
mx[name+"_disconnected"] = boolToInt(value == "DISCONNECTED")
default:
mx[strings.ToLower(name)] = parseInt(value)
}
}
})
return err
}
func convertWsrepConnected(val string) string {
// https://www.percona.com/doc/percona-xtradb-cluster/LATEST/wsrep-status-index.html#wsrep_connected
switch val {
case "OFF":
return "0"
case "ON":
return "1"
default:
return "-1"
}
}
func convertWsrepReady(val string) string {
// https://www.percona.com/doc/percona-xtradb-cluster/LATEST/wsrep-status-index.html#wsrep_ready
switch val {
case "OFF":
return "0"
case "ON":
return "1"
default:
return "-1"
}
}
func boolToInt(v bool) int64 {
if v {
return 1
}
return 0
}
var globalStatusKeys = map[string]bool{
"Bytes_received": true,
"Bytes_sent": true,
"Queries": true,
"Questions": true,
"Slow_queries": true,
"Handler_commit": true,
"Handler_delete": true,
"Handler_prepare": true,
"Handler_read_first": true,
"Handler_read_key": true,
"Handler_read_next": true,
"Handler_read_prev": true,
"Handler_read_rnd": true,
"Handler_read_rnd_next": true,
"Handler_rollback": true,
"Handler_savepoint": true,
"Handler_savepoint_rollback": true,
"Handler_update": true,
"Handler_write": true,
"Table_locks_immediate": true,
"Table_locks_waited": true,
"Table_open_cache_overflows": true,
"Select_full_join": true,
"Select_full_range_join": true,
"Select_range": true,
"Select_range_check": true,
"Select_scan": true,
"Sort_merge_passes": true,
"Sort_range": true,
"Sort_scan": true,
"Created_tmp_disk_tables": true,
"Created_tmp_files": true,
"Created_tmp_tables": true,
"Connections": true,
"Aborted_connects": true,
"Max_used_connections": true,
"Binlog_cache_disk_use": true,
"Binlog_cache_use": true,
"Threads_connected": true,
"Threads_created": true,
"Threads_cached": true,
"Threads_running": true,
"Thread_cache_misses": true,
"Innodb_data_read": true,
"Innodb_data_written": true,
"Innodb_data_reads": true,
"Innodb_data_writes": true,
"Innodb_data_fsyncs": true,
"Innodb_data_pending_reads": true,
"Innodb_data_pending_writes": true,
"Innodb_data_pending_fsyncs": true,
"Innodb_log_waits": true,
"Innodb_log_write_requests": true,
"Innodb_log_writes": true,
"Innodb_os_log_fsyncs": true,
"Innodb_os_log_pending_fsyncs": true,
"Innodb_os_log_pending_writes": true,
"Innodb_os_log_written": true,
"Innodb_row_lock_current_waits": true,
"Innodb_rows_inserted": true,
"Innodb_rows_read": true,
"Innodb_rows_updated": true,
"Innodb_rows_deleted": true,
"Innodb_buffer_pool_pages_data": true,
"Innodb_buffer_pool_pages_dirty": true,
"Innodb_buffer_pool_pages_free": true,
"Innodb_buffer_pool_pages_flushed": true,
"Innodb_buffer_pool_pages_misc": true,
"Innodb_buffer_pool_pages_total": true,
"Innodb_buffer_pool_bytes_data": true,
"Innodb_buffer_pool_bytes_dirty": true,
"Innodb_buffer_pool_read_ahead": true,
"Innodb_buffer_pool_read_ahead_evicted": true,
"Innodb_buffer_pool_read_ahead_rnd": true,
"Innodb_buffer_pool_read_requests": true,
"Innodb_buffer_pool_write_requests": true,
"Innodb_buffer_pool_reads": true,
"Innodb_buffer_pool_wait_free": true,
"Innodb_deadlocks": true,
"Qcache_hits": true,
"Qcache_lowmem_prunes": true,
"Qcache_inserts": true,
"Qcache_not_cached": true,
"Qcache_queries_in_cache": true,
"Qcache_free_memory": true,
"Qcache_free_blocks": true,
"Qcache_total_blocks": true,
"Key_blocks_unused": true,
"Key_blocks_used": true,
"Key_blocks_not_flushed": true,
"Key_read_requests": true,
"Key_write_requests": true,
"Key_reads": true,
"Key_writes": true,
"Open_files": true,
"Opened_files": true,
"Binlog_stmt_cache_disk_use": true,
"Binlog_stmt_cache_use": true,
"Connection_errors_accept": true,
"Connection_errors_internal": true,
"Connection_errors_max_connections": true,
"Connection_errors_peer_address": true,
"Connection_errors_select": true,
"Connection_errors_tcpwrap": true,
"Com_delete": true,
"Com_insert": true,
"Com_select": true,
"Com_update": true,
"Com_replace": true,
"Opened_tables": true,
"Open_tables": true,
"wsrep_local_recv_queue": true,
"wsrep_local_send_queue": true,
"wsrep_received": true,
"wsrep_replicated": true,
"wsrep_received_bytes": true,
"wsrep_replicated_bytes": true,
"wsrep_local_bf_aborts": true,
"wsrep_local_cert_failures": true,
"wsrep_flow_control_paused_ns": true,
"wsrep_cluster_weight": true,
"wsrep_cluster_size": true,
"wsrep_local_state": true,
"wsrep_open_transactions": true,
"wsrep_thread_count": true,
"wsrep_connected": true,
"wsrep_ready": true,
"wsrep_cluster_status": true,
}