diff options
Diffstat (limited to '')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/mysql/collect_global_status.go | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect_global_status.go b/src/go/collectors/go.d.plugin/modules/mysql/collect_global_status.go new file mode 100644 index 000000000..c6dff9e93 --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/mysql/collect_global_status.go @@ -0,0 +1,216 @@ +// 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, +} |