summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/mysql/collect_global_status.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_global_status.go216
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,
+}