summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/mysql
diff options
context:
space:
mode:
Diffstat (limited to '')
l---------src/go/collectors/go.d.plugin/modules/mysql/README.md1
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/charts.go1239
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect.go202
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_global_status.go216
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_global_vars.go43
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_process_list.go87
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go87
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_user_statistics.go51
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/collect_version.go62
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/config_schema.json52
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/disable_logging.go58
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/integrations/mariadb.md370
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/integrations/mysql.md370
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/integrations/percona_mysql.md370
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/metadata.yaml806
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/mycnf.go79
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/mycnf_test.go100
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/mysql.go169
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/mysql_test.go1759
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/config.json6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/config.yaml4
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_status.txt621
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_variables.txt8
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/process_list.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/user_statistics.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/version.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_multi_source.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_single_source.txt5
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_status.txt569
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_variables.txt8
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/process_list.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/user_statistics.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/version.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_status.txt423
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_variables.txt7
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/process_list.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/version.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_status.txt490
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_variables.txt9
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/process_list.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/replica_status_multi_source.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/version.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_status.txt533
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_variables.txt9
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/process_list.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/user_statistics.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/version.txt6
-rw-r--r--src/go/collectors/go.d.plugin/modules/mysql/testdata/session_variables.txt6
48 files changed, 8909 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/README.md b/src/go/collectors/go.d.plugin/modules/mysql/README.md
new file mode 120000
index 000000000..edf116dee
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/README.md
@@ -0,0 +1 @@
+integrations/mysql.md \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/charts.go b/src/go/collectors/go.d.plugin/modules/mysql/charts.go
new file mode 100644
index 000000000..054e4e01d
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/charts.go
@@ -0,0 +1,1239 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/netdata/netdata/go/go.d.plugin/agent/module"
+)
+
+const (
+ prioBandwidth = module.Priority + iota
+ prioQueries
+ prioQueriesType
+ prioHandlers
+ prioTableOpenCacheOverflows
+ prioTableLocks
+ prioTableJoinIssues
+ prioTableSortIssues
+ prioTmpOperations
+ prioConnections
+ prioActiveConnections
+ prioBinlogCache
+ prioBinlogStatementCache
+ prioThreads
+ prioThreadsCreated
+ prioThreadCacheMisses
+ prioInnoDBIO
+ prioInnoDBIOOperations
+ prioInnoDBIOPendingOperations
+ prioInnoDBLog
+ prioInnoDBOSLog
+ prioInnoDBOSLogFsyncWrites
+ prioInnoDBOSLogIO
+ prioInnoDBCurRowLock
+ prioInnoDBRows
+ prioInnoDBBufferPoolPages
+ prioInnoDBBufferPoolPagesFlushed
+ prioInnoDBBufferPoolBytes
+ prioInnoDBBufferPoolReadAhead
+ prioInnoDBBufferPoolReadAheadRnd
+ prioInnoDBBufferPoolOperations
+ prioMyISAMKeyBlocks
+ prioMyISAMKeyRequests
+ prioMyISAMKeyDiskOperations
+ prioOpenFiles
+ prioOpenFilesRate
+ prioConnectionErrors
+ prioOpenedTables
+ prioOpenTables
+ prioProcessListFetchQueryDuration
+ prioProcessListQueries
+ prioProcessListLongestQueryDuration
+ prioInnoDBDeadlocks
+ prioQCacheOperations
+ prioQCacheQueries
+ prioQCacheFreeMem
+ prioQCacheMemBlocks
+ prioGaleraWriteSets
+ prioGaleraBytes
+ prioGaleraQueue
+ prioGaleraConflicts
+ prioGaleraFlowControl
+ prioGaleraClusterStatus
+ prioGaleraClusterState
+ prioGaleraClusterSize
+ prioGaleraClusterWeight
+ prioGaleraClusterConnectionStatus
+ prioGaleraReadinessState
+ prioGaleraOpenTransactions
+ prioGaleraThreadCount
+ prioSlaveSecondsBehindMaster
+ prioSlaveSQLIOThreadRunningState
+ prioUserStatsCPUTime
+ prioUserStatsRows
+ prioUserStatsCommands
+ prioUserStatsDeniedCommands
+ prioUserStatsTransactions
+ prioUserStatsBinlogWritten
+ prioUserStatsEmptyQueries
+ prioUserStatsConnections
+ prioUserStatsLostConnections
+ prioUserStatsDeniedConnections
+)
+
+var baseCharts = module.Charts{
+ chartBandwidth.Copy(),
+ chartQueries.Copy(),
+ chartQueriesType.Copy(),
+ chartHandlers.Copy(),
+ chartTableLocks.Copy(),
+ chartTableJoinIssues.Copy(),
+ chartTableSortIssues.Copy(),
+ chartTmpOperations.Copy(),
+ chartConnections.Copy(),
+ chartActiveConnections.Copy(),
+ chartThreads.Copy(),
+ chartThreadCreationRate.Copy(),
+ chartThreadsCacheMisses.Copy(),
+ chartInnoDBIO.Copy(),
+ chartInnoDBIOOperations.Copy(),
+ chartInnoDBPendingIOOperations.Copy(),
+ chartInnoDBLogOperations.Copy(),
+ chartInnoDBCurrentRowLocks.Copy(),
+ chartInnoDBRowsOperations.Copy(),
+ chartInnoDBBufferPoolPages.Copy(),
+ chartInnoDBBufferPoolPagesFlushed.Copy(),
+ chartInnoDBBufferPoolBytes.Copy(),
+ chartInnoDBBufferPoolReadAhead.Copy(),
+ chartInnoDBBufferPoolReadAheadRnd.Copy(),
+ chartInnoDBBufferPoolOperations.Copy(),
+ chartOpenFiles.Copy(),
+ chartOpenedFilesRate.Copy(),
+ chartConnectionErrors.Copy(),
+ chartOpenedTables.Copy(),
+ chartOpenTables.Copy(),
+ chartProcessListFetchQueryDuration.Copy(),
+ chartProcessListQueries.Copy(),
+ chartProcessListLongestQueryDuration.Copy(),
+}
+
+var (
+ chartBandwidth = module.Chart{
+ ID: "net",
+ Title: "Bandwidth",
+ Units: "kilobits/s",
+ Fam: "bandwidth",
+ Ctx: "mysql.net",
+ Type: module.Area,
+ Priority: prioBandwidth,
+ Dims: module.Dims{
+ {ID: "bytes_received", Name: "in", Algo: module.Incremental, Mul: 8, Div: 1000},
+ {ID: "bytes_sent", Name: "out", Algo: module.Incremental, Mul: -8, Div: 1000},
+ },
+ }
+ chartQueries = module.Chart{
+ ID: "queries",
+ Title: "Queries",
+ Units: "queries/s",
+ Fam: "queries",
+ Ctx: "mysql.queries",
+ Priority: prioQueries,
+ Dims: module.Dims{
+ {ID: "queries", Name: "queries", Algo: module.Incremental},
+ {ID: "questions", Name: "questions", Algo: module.Incremental},
+ {ID: "slow_queries", Name: "slow_queries", Algo: module.Incremental},
+ },
+ }
+ chartQueriesType = module.Chart{
+ ID: "queries_type",
+ Title: "Queries By Type",
+ Units: "queries/s",
+ Fam: "queries",
+ Ctx: "mysql.queries_type",
+ Type: module.Stacked,
+ Priority: prioQueriesType,
+ Dims: module.Dims{
+ {ID: "com_select", Name: "select", Algo: module.Incremental},
+ {ID: "com_delete", Name: "delete", Algo: module.Incremental},
+ {ID: "com_update", Name: "update", Algo: module.Incremental},
+ {ID: "com_insert", Name: "insert", Algo: module.Incremental},
+ {ID: "com_replace", Name: "replace", Algo: module.Incremental},
+ },
+ }
+ chartHandlers = module.Chart{
+ ID: "handlers",
+ Title: "Handlers",
+ Units: "handlers/s",
+ Fam: "handlers",
+ Ctx: "mysql.handlers",
+ Priority: prioHandlers,
+ Dims: module.Dims{
+ {ID: "handler_commit", Name: "commit", Algo: module.Incremental},
+ {ID: "handler_delete", Name: "delete", Algo: module.Incremental},
+ {ID: "handler_prepare", Name: "prepare", Algo: module.Incremental},
+ {ID: "handler_read_first", Name: "read first", Algo: module.Incremental},
+ {ID: "handler_read_key", Name: "read key", Algo: module.Incremental},
+ {ID: "handler_read_next", Name: "read next", Algo: module.Incremental},
+ {ID: "handler_read_prev", Name: "read prev", Algo: module.Incremental},
+ {ID: "handler_read_rnd", Name: "read rnd", Algo: module.Incremental},
+ {ID: "handler_read_rnd_next", Name: "read rnd next", Algo: module.Incremental},
+ {ID: "handler_rollback", Name: "rollback", Algo: module.Incremental},
+ {ID: "handler_savepoint", Name: "savepoint", Algo: module.Incremental},
+ {ID: "handler_savepoint_rollback", Name: "savepointrollback", Algo: module.Incremental},
+ {ID: "handler_update", Name: "update", Algo: module.Incremental},
+ {ID: "handler_write", Name: "write", Algo: module.Incremental},
+ },
+ }
+ chartTableOpenCacheOverflows = module.Chart{
+ ID: "table_open_cache_overflows",
+ Title: "Table open cache overflows",
+ Units: "overflows/s",
+ Fam: "open cache",
+ Ctx: "mysql.table_open_cache_overflows",
+ Priority: prioTableOpenCacheOverflows,
+ Dims: module.Dims{
+ {ID: "table_open_cache_overflows", Name: "open_cache", Algo: module.Incremental},
+ },
+ }
+ chartTableLocks = module.Chart{
+ ID: "table_locks",
+ Title: "Table Locks",
+ Units: "locks/s",
+ Fam: "locks",
+ Ctx: "mysql.table_locks",
+ Priority: prioTableLocks,
+ Dims: module.Dims{
+ {ID: "table_locks_immediate", Name: "immediate", Algo: module.Incremental},
+ {ID: "table_locks_waited", Name: "waited", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartTableJoinIssues = module.Chart{
+ ID: "join_issues",
+ Title: "Table Select Join Issues",
+ Units: "joins/s",
+ Fam: "issues",
+ Ctx: "mysql.join_issues",
+ Priority: prioTableJoinIssues,
+ Dims: module.Dims{
+ {ID: "select_full_join", Name: "full join", Algo: module.Incremental},
+ {ID: "select_full_range_join", Name: "full range join", Algo: module.Incremental},
+ {ID: "select_range", Name: "range", Algo: module.Incremental},
+ {ID: "select_range_check", Name: "range check", Algo: module.Incremental},
+ {ID: "select_scan", Name: "scan", Algo: module.Incremental},
+ },
+ }
+ chartTableSortIssues = module.Chart{
+ ID: "sort_issues",
+ Title: "Table Sort Issues",
+ Units: "issues/s",
+ Fam: "issues",
+ Ctx: "mysql.sort_issues",
+ Priority: prioTableSortIssues,
+ Dims: module.Dims{
+ {ID: "sort_merge_passes", Name: "merge passes", Algo: module.Incremental},
+ {ID: "sort_range", Name: "range", Algo: module.Incremental},
+ {ID: "sort_scan", Name: "scan", Algo: module.Incremental},
+ },
+ }
+ chartTmpOperations = module.Chart{
+ ID: "tmp",
+ Title: "Tmp Operations",
+ Units: "events/s",
+ Fam: "temporaries",
+ Ctx: "mysql.tmp",
+ Priority: prioTmpOperations,
+ Dims: module.Dims{
+ {ID: "created_tmp_disk_tables", Name: "disk tables", Algo: module.Incremental},
+ {ID: "created_tmp_files", Name: "files", Algo: module.Incremental},
+ {ID: "created_tmp_tables", Name: "tables", Algo: module.Incremental},
+ },
+ }
+ chartConnections = module.Chart{
+ ID: "connections",
+ Title: "Connections",
+ Units: "connections/s",
+ Fam: "connections",
+ Ctx: "mysql.connections",
+ Priority: prioConnections,
+ Dims: module.Dims{
+ {ID: "connections", Name: "all", Algo: module.Incremental},
+ {ID: "aborted_connects", Name: "aborted", Algo: module.Incremental},
+ },
+ }
+ chartActiveConnections = module.Chart{
+ ID: "connections_active",
+ Title: "Active Connections",
+ Units: "connections",
+ Fam: "connections",
+ Ctx: "mysql.connections_active",
+ Priority: prioActiveConnections,
+ Dims: module.Dims{
+ {ID: "threads_connected", Name: "active"},
+ {ID: "max_connections", Name: "limit"},
+ {ID: "max_used_connections", Name: "max active"},
+ },
+ }
+ chartThreads = module.Chart{
+ ID: "threads",
+ Title: "Threads",
+ Units: "threads",
+ Fam: "threads",
+ Ctx: "mysql.threads",
+ Priority: prioThreads,
+ Dims: module.Dims{
+ {ID: "threads_connected", Name: "connected"},
+ {ID: "threads_cached", Name: "cached", Mul: -1},
+ {ID: "threads_running", Name: "running"},
+ },
+ }
+ chartThreadCreationRate = module.Chart{
+ ID: "threads_creation_rate",
+ Title: "Threads Creation Rate",
+ Units: "threads/s",
+ Fam: "threads",
+ Ctx: "mysql.threads_created",
+ Priority: prioThreadsCreated,
+ Dims: module.Dims{
+ {ID: "threads_created", Name: "created", Algo: module.Incremental},
+ },
+ }
+ chartThreadsCacheMisses = module.Chart{
+ ID: "thread_cache_misses",
+ Title: "Threads Cache Misses",
+ Units: "misses",
+ Fam: "threads",
+ Ctx: "mysql.thread_cache_misses",
+ Type: module.Area,
+ Priority: prioThreadCacheMisses,
+ Dims: module.Dims{
+ {ID: "thread_cache_misses", Name: "misses", Div: 100},
+ },
+ }
+ chartInnoDBIO = module.Chart{
+ ID: "innodb_io",
+ Title: "InnoDB I/O Bandwidth",
+ Units: "KiB/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_io",
+ Type: module.Area,
+ Priority: prioInnoDBIO,
+ Dims: module.Dims{
+ {ID: "innodb_data_read", Name: "read", Algo: module.Incremental, Div: 1024},
+ {ID: "innodb_data_written", Name: "write", Algo: module.Incremental, Div: 1024},
+ },
+ }
+ chartInnoDBIOOperations = module.Chart{
+ ID: "innodb_io_ops",
+ Title: "InnoDB I/O Operations",
+ Units: "operations/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_io_ops",
+ Priority: prioInnoDBIOOperations,
+ Dims: module.Dims{
+ {ID: "innodb_data_reads", Name: "reads", Algo: module.Incremental},
+ {ID: "innodb_data_writes", Name: "writes", Algo: module.Incremental, Mul: -1},
+ {ID: "innodb_data_fsyncs", Name: "fsyncs", Algo: module.Incremental},
+ },
+ }
+ chartInnoDBPendingIOOperations = module.Chart{
+ ID: "innodb_io_pending_ops",
+ Title: "InnoDB Pending I/O Operations",
+ Units: "operations",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_io_pending_ops",
+ Priority: prioInnoDBIOPendingOperations,
+ Dims: module.Dims{
+ {ID: "innodb_data_pending_reads", Name: "reads"},
+ {ID: "innodb_data_pending_writes", Name: "writes", Mul: -1},
+ {ID: "innodb_data_pending_fsyncs", Name: "fsyncs"},
+ },
+ }
+ chartInnoDBLogOperations = module.Chart{
+ ID: "innodb_log",
+ Title: "InnoDB Log Operations",
+ Units: "operations/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_log",
+ Priority: prioInnoDBLog,
+ Dims: module.Dims{
+ {ID: "innodb_log_waits", Name: "waits", Algo: module.Incremental},
+ {ID: "innodb_log_write_requests", Name: "write requests", Algo: module.Incremental, Mul: -1},
+ {ID: "innodb_log_writes", Name: "writes", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartInnoDBCurrentRowLocks = module.Chart{
+ ID: "innodb_cur_row_lock",
+ Title: "InnoDB Current Row Locks",
+ Units: "operations",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_cur_row_lock",
+ Type: module.Area,
+ Priority: prioInnoDBCurRowLock,
+ Dims: module.Dims{
+ {ID: "innodb_row_lock_current_waits", Name: "current waits"},
+ },
+ }
+ chartInnoDBRowsOperations = module.Chart{
+ ID: "innodb_rows",
+ Title: "InnoDB Row Operations",
+ Units: "operations/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_rows",
+ Type: module.Area,
+ Priority: prioInnoDBRows,
+ Dims: module.Dims{
+ {ID: "innodb_rows_inserted", Name: "inserted", Algo: module.Incremental},
+ {ID: "innodb_rows_read", Name: "read", Algo: module.Incremental},
+ {ID: "innodb_rows_updated", Name: "updated", Algo: module.Incremental},
+ {ID: "innodb_rows_deleted", Name: "deleted", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartInnoDBBufferPoolPages = module.Chart{
+ ID: "innodb_buffer_pool_pages",
+ Title: "InnoDB Buffer Pool Pages",
+ Units: "pages",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_buffer_pool_pages",
+ Priority: prioInnoDBBufferPoolPages,
+ Dims: module.Dims{
+ {ID: "innodb_buffer_pool_pages_data", Name: "data"},
+ {ID: "innodb_buffer_pool_pages_dirty", Name: "dirty", Mul: -1},
+ {ID: "innodb_buffer_pool_pages_free", Name: "free"},
+ {ID: "innodb_buffer_pool_pages_misc", Name: "misc", Mul: -1},
+ {ID: "innodb_buffer_pool_pages_total", Name: "total"},
+ },
+ }
+ chartInnoDBBufferPoolPagesFlushed = module.Chart{
+ ID: "innodb_buffer_pool_flush_pages_requests",
+ Title: "InnoDB Buffer Pool Flush Pages Requests",
+ Units: "requests/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_buffer_pool_pages_flushed",
+ Priority: prioInnoDBBufferPoolPagesFlushed,
+ Dims: module.Dims{
+ {ID: "innodb_buffer_pool_pages_flushed", Name: "flush pages", Algo: module.Incremental},
+ },
+ }
+ chartInnoDBBufferPoolBytes = module.Chart{
+ ID: "innodb_buffer_pool_bytes",
+ Title: "InnoDB Buffer Pool Bytes",
+ Units: "MiB",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_buffer_pool_bytes",
+ Type: module.Area,
+ Priority: prioInnoDBBufferPoolBytes,
+ Dims: module.Dims{
+ {ID: "innodb_buffer_pool_bytes_data", Name: "data", Div: 1024 * 1024},
+ {ID: "innodb_buffer_pool_bytes_dirty", Name: "dirty", Mul: -1, Div: 1024 * 1024},
+ },
+ }
+ chartInnoDBBufferPoolReadAhead = module.Chart{
+ ID: "innodb_buffer_pool_read_ahead",
+ Title: "InnoDB Buffer Pool Read Pages",
+ Units: "pages/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_buffer_pool_read_ahead",
+ Type: module.Area,
+ Priority: prioInnoDBBufferPoolReadAhead,
+ Dims: module.Dims{
+ {ID: "innodb_buffer_pool_read_ahead", Name: "all", Algo: module.Incremental},
+ {ID: "innodb_buffer_pool_read_ahead_evicted", Name: "evicted", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartInnoDBBufferPoolReadAheadRnd = module.Chart{
+ ID: "innodb_buffer_pool_read_ahead_rnd",
+ Title: "InnoDB Buffer Pool Random Read-Aheads",
+ Units: "operations/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_buffer_pool_read_ahead_rnd",
+ Priority: prioInnoDBBufferPoolReadAheadRnd,
+ Dims: module.Dims{
+ {ID: "innodb_buffer_pool_read_ahead_rnd", Name: "read-ahead", Algo: module.Incremental},
+ },
+ }
+ chartInnoDBBufferPoolOperations = module.Chart{
+ ID: "innodb_buffer_pool_ops",
+ Title: "InnoDB Buffer Pool Operations",
+ Units: "operations/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_buffer_pool_ops",
+ Type: module.Area,
+ Priority: prioInnoDBBufferPoolOperations,
+ Dims: module.Dims{
+ {ID: "innodb_buffer_pool_reads", Name: "disk reads", Algo: module.Incremental},
+ {ID: "innodb_buffer_pool_wait_free", Name: "wait free", Algo: module.Incremental, Mul: -1, Div: 1},
+ },
+ }
+ chartOpenFiles = module.Chart{
+ ID: "files",
+ Title: "Open Files",
+ Units: "files",
+ Fam: "files",
+ Ctx: "mysql.files",
+ Priority: prioOpenFiles,
+ Dims: module.Dims{
+ {ID: "open_files", Name: "files"},
+ },
+ }
+ chartOpenedFilesRate = module.Chart{
+ ID: "files_rate",
+ Title: "Opened Files Rate",
+ Units: "files/s",
+ Fam: "files",
+ Ctx: "mysql.files_rate",
+ Priority: prioOpenFilesRate,
+ Dims: module.Dims{
+ {ID: "opened_files", Name: "files", Algo: module.Incremental},
+ },
+ }
+ chartConnectionErrors = module.Chart{
+ ID: "connection_errors",
+ Title: "Connection Errors",
+ Units: "errors/s",
+ Fam: "connections",
+ Ctx: "mysql.connection_errors",
+ Priority: prioConnectionErrors,
+ Dims: module.Dims{
+ {ID: "connection_errors_accept", Name: "accept", Algo: module.Incremental},
+ {ID: "connection_errors_internal", Name: "internal", Algo: module.Incremental},
+ {ID: "connection_errors_max_connections", Name: "max", Algo: module.Incremental},
+ {ID: "connection_errors_peer_address", Name: "peer addr", Algo: module.Incremental},
+ {ID: "connection_errors_select", Name: "select", Algo: module.Incremental},
+ {ID: "connection_errors_tcpwrap", Name: "tcpwrap", Algo: module.Incremental},
+ },
+ }
+ chartOpenedTables = module.Chart{
+ ID: "opened_tables",
+ Title: "Opened Tables",
+ Units: "tables/s",
+ Fam: "open tables",
+ Ctx: "mysql.opened_tables",
+ Priority: prioOpenedTables,
+ Dims: module.Dims{
+ {ID: "opened_tables", Name: "tables", Algo: module.Incremental},
+ },
+ }
+ chartOpenTables = module.Chart{
+ ID: "open_tables",
+ Title: "Open Tables",
+ Units: "tables",
+ Fam: "open tables",
+ Ctx: "mysql.open_tables",
+ Type: module.Area,
+ Priority: prioOpenTables,
+ Dims: module.Dims{
+ {ID: "table_open_cache", Name: "cache"},
+ {ID: "open_tables", Name: "tables"},
+ },
+ }
+ chartProcessListFetchQueryDuration = module.Chart{
+ ID: "process_list_fetch_duration",
+ Title: "Process List Fetch Duration",
+ Units: "milliseconds",
+ Fam: "process list",
+ Ctx: "mysql.process_list_fetch_query_duration",
+ Priority: prioProcessListFetchQueryDuration,
+ Dims: module.Dims{
+ {ID: "process_list_fetch_query_duration", Name: "duration"},
+ },
+ }
+ chartProcessListQueries = module.Chart{
+ ID: "process_list_queries_count",
+ Title: "Queries Count",
+ Units: "queries",
+ Fam: "process list",
+ Ctx: "mysql.process_list_queries_count",
+ Type: module.Stacked,
+ Priority: prioProcessListQueries,
+ Dims: module.Dims{
+ {ID: "process_list_queries_count_system", Name: "system"},
+ {ID: "process_list_queries_count_user", Name: "user"},
+ },
+ }
+ chartProcessListLongestQueryDuration = module.Chart{
+ ID: "process_list_longest_query_duration",
+ Title: "Longest Query Duration",
+ Units: "seconds",
+ Fam: "process list",
+ Ctx: "mysql.process_list_longest_query_duration",
+ Priority: prioProcessListLongestQueryDuration,
+ Dims: module.Dims{
+ {ID: "process_list_longest_query_duration", Name: "duration"},
+ },
+ }
+)
+
+var chartsInnoDBOSLog = module.Charts{
+ chartInnoDBOSLogPendingOperations.Copy(),
+ chartInnoDBOSLogOperations.Copy(),
+ chartInnoDBOSLogIO.Copy(),
+}
+
+var (
+ chartInnoDBOSLogPendingOperations = module.Chart{
+ ID: "innodb_os_log",
+ Title: "InnoDB OS Log Pending Operations",
+ Units: "operations",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_os_log",
+ Priority: prioInnoDBOSLog,
+ Dims: module.Dims{
+ {ID: "innodb_os_log_pending_fsyncs", Name: "fsyncs"},
+ {ID: "innodb_os_log_pending_writes", Name: "writes", Mul: -1},
+ },
+ }
+ chartInnoDBOSLogOperations = module.Chart{
+ ID: "innodb_os_log_fsync_writes",
+ Title: "InnoDB OS Log Operations",
+ Units: "operations/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_os_log_fsync_writes",
+ Priority: prioInnoDBOSLogFsyncWrites,
+ Dims: module.Dims{
+ {ID: "innodb_os_log_fsyncs", Name: "fsyncs", Algo: module.Incremental},
+ },
+ }
+ chartInnoDBOSLogIO = module.Chart{
+ ID: "innodb_os_log_io",
+ Title: "InnoDB OS Log Bandwidth",
+ Units: "KiB/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_os_log_io",
+ Type: module.Area,
+ Priority: prioInnoDBOSLogIO,
+ Dims: module.Dims{
+ {ID: "innodb_os_log_written", Name: "write", Algo: module.Incremental, Mul: -1, Div: 1024},
+ },
+ }
+)
+
+var chartInnoDBDeadlocks = module.Chart{
+ ID: "innodb_deadlocks",
+ Title: "InnoDB Deadlocks",
+ Units: "operations/s",
+ Fam: "innodb",
+ Ctx: "mysql.innodb_deadlocks",
+ Type: module.Area,
+ Priority: prioInnoDBDeadlocks,
+ Dims: module.Dims{
+ {ID: "innodb_deadlocks", Name: "deadlocks", Algo: module.Incremental},
+ },
+}
+
+var chartsQCache = module.Charts{
+ chartQCacheOperations.Copy(),
+ chartQCacheQueries.Copy(),
+ chartQCacheFreeMemory.Copy(),
+ chartQCacheMemoryBlocks.Copy(),
+}
+
+var (
+ chartQCacheOperations = module.Chart{
+ ID: "qcache_ops",
+ Title: "QCache Operations",
+ Units: "queries/s",
+ Fam: "qcache",
+ Ctx: "mysql.qcache_ops",
+ Priority: prioQCacheOperations,
+ Dims: module.Dims{
+ {ID: "qcache_hits", Name: "hits", Algo: module.Incremental},
+ {ID: "qcache_lowmem_prunes", Name: "lowmem prunes", Algo: module.Incremental, Mul: -1},
+ {ID: "qcache_inserts", Name: "inserts", Algo: module.Incremental},
+ {ID: "qcache_not_cached", Name: "not cached", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartQCacheQueries = module.Chart{
+ ID: "qcache",
+ Title: "QCache Queries in Cache",
+ Units: "queries",
+ Fam: "qcache",
+ Ctx: "mysql.qcache",
+ Priority: prioQCacheQueries,
+ Dims: module.Dims{
+ {ID: "qcache_queries_in_cache", Name: "queries", Algo: module.Absolute},
+ },
+ }
+ chartQCacheFreeMemory = module.Chart{
+ ID: "qcache_freemem",
+ Title: "QCache Free Memory",
+ Units: "MiB",
+ Fam: "qcache",
+ Ctx: "mysql.qcache_freemem",
+ Type: module.Area,
+ Priority: prioQCacheFreeMem,
+ Dims: module.Dims{
+ {ID: "qcache_free_memory", Name: "free", Div: 1024 * 1024},
+ },
+ }
+ chartQCacheMemoryBlocks = module.Chart{
+ ID: "qcache_memblocks",
+ Title: "QCache Memory Blocks",
+ Units: "blocks",
+ Fam: "qcache",
+ Ctx: "mysql.qcache_memblocks",
+ Priority: prioQCacheMemBlocks,
+ Dims: module.Dims{
+ {ID: "qcache_free_blocks", Name: "free"},
+ {ID: "qcache_total_blocks", Name: "total"},
+ },
+ }
+)
+
+var chartsGalera = module.Charts{
+ chartGaleraWriteSets.Copy(),
+ chartGaleraBytes.Copy(),
+ chartGaleraQueue.Copy(),
+ chartGaleraConflicts.Copy(),
+ chartGaleraFlowControl.Copy(),
+ chartGaleraClusterStatus.Copy(),
+ chartGaleraClusterState.Copy(),
+ chartGaleraClusterSize.Copy(),
+ chartGaleraClusterWeight.Copy(),
+ chartGaleraClusterConnectionStatus.Copy(),
+ chartGaleraReadinessState.Copy(),
+ chartGaleraOpenTransactions.Copy(),
+ chartGaleraThreads.Copy(),
+}
+var (
+ chartGaleraWriteSets = module.Chart{
+ ID: "galera_writesets",
+ Title: "Replicated Writesets",
+ Units: "writesets/s",
+ Fam: "galera",
+ Ctx: "mysql.galera_writesets",
+ Priority: prioGaleraWriteSets,
+ Dims: module.Dims{
+ {ID: "wsrep_received", Name: "rx", Algo: module.Incremental},
+ {ID: "wsrep_replicated", Name: "tx", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartGaleraBytes = module.Chart{
+ ID: "galera_bytes",
+ Title: "Replicated Bytes",
+ Units: "KiB/s",
+ Fam: "galera",
+ Ctx: "mysql.galera_bytes",
+ Type: module.Area,
+ Priority: prioGaleraBytes,
+ Dims: module.Dims{
+ {ID: "wsrep_received_bytes", Name: "rx", Algo: module.Incremental, Div: 1024},
+ {ID: "wsrep_replicated_bytes", Name: "tx", Algo: module.Incremental, Mul: -1, Div: 1024},
+ },
+ }
+ chartGaleraQueue = module.Chart{
+ ID: "galera_queue",
+ Title: "Galera Queue",
+ Units: "writesets",
+ Fam: "galera",
+ Ctx: "mysql.galera_queue",
+ Priority: prioGaleraQueue,
+ Dims: module.Dims{
+ {ID: "wsrep_local_recv_queue", Name: "rx"},
+ {ID: "wsrep_local_send_queue", Name: "tx", Mul: -1},
+ },
+ }
+ chartGaleraConflicts = module.Chart{
+ ID: "galera_conflicts",
+ Title: "Replication Conflicts",
+ Units: "transactions",
+ Fam: "galera",
+ Ctx: "mysql.galera_conflicts",
+ Type: module.Area,
+ Priority: prioGaleraConflicts,
+ Dims: module.Dims{
+ {ID: "wsrep_local_bf_aborts", Name: "bf aborts", Algo: module.Incremental},
+ {ID: "wsrep_local_cert_failures", Name: "cert fails", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartGaleraFlowControl = module.Chart{
+ ID: "galera_flow_control",
+ Title: "Flow Control",
+ Units: "ms",
+ Fam: "galera",
+ Ctx: "mysql.galera_flow_control",
+ Type: module.Area,
+ Priority: prioGaleraFlowControl,
+ Dims: module.Dims{
+ {ID: "wsrep_flow_control_paused_ns", Name: "paused", Algo: module.Incremental, Div: 1000000},
+ },
+ }
+ chartGaleraClusterStatus = module.Chart{
+ ID: "galera_cluster_status",
+ Title: "Cluster Component Status",
+ Units: "status",
+ Fam: "galera",
+ Ctx: "mysql.galera_cluster_status",
+ Priority: prioGaleraClusterStatus,
+ Dims: module.Dims{
+ {ID: "wsrep_cluster_status_primary", Name: "primary"},
+ {ID: "wsrep_cluster_status_non_primary", Name: "non_primary"},
+ {ID: "wsrep_cluster_status_disconnected", Name: "disconnected"},
+ },
+ }
+ chartGaleraClusterState = module.Chart{
+ ID: "galera_cluster_state",
+ Title: "Cluster Component State",
+ Units: "state",
+ Fam: "galera",
+ Ctx: "mysql.galera_cluster_state",
+ Priority: prioGaleraClusterState,
+ Dims: module.Dims{
+ {ID: "wsrep_local_state_undefined", Name: "undefined"},
+ {ID: "wsrep_local_state_joiner", Name: "joining"},
+ {ID: "wsrep_local_state_donor", Name: "donor"},
+ {ID: "wsrep_local_state_joined", Name: "joined"},
+ {ID: "wsrep_local_state_synced", Name: "synced"},
+ {ID: "wsrep_local_state_error", Name: "error"},
+ },
+ }
+ chartGaleraClusterSize = module.Chart{
+ ID: "galera_cluster_size",
+ Title: "Number of Nodes in the Cluster",
+ Units: "nodes",
+ Fam: "galera",
+ Ctx: "mysql.galera_cluster_size",
+ Priority: prioGaleraClusterSize,
+ Dims: module.Dims{
+ {ID: "wsrep_cluster_size", Name: "nodes"},
+ },
+ }
+ chartGaleraClusterWeight = module.Chart{
+ ID: "galera_cluster_weight",
+ Title: "The Total Weight of the Current Members in the Cluster",
+ Units: "weight",
+ Fam: "galera",
+ Ctx: "mysql.galera_cluster_weight",
+ Priority: prioGaleraClusterWeight,
+ Dims: module.Dims{
+ {ID: "wsrep_cluster_weight", Name: "weight"},
+ },
+ }
+ chartGaleraClusterConnectionStatus = module.Chart{
+ ID: "galera_connected",
+ Title: "Cluster Connection Status",
+ Units: "boolean",
+ Fam: "galera",
+ Ctx: "mysql.galera_connected",
+ Priority: prioGaleraClusterConnectionStatus,
+ Dims: module.Dims{
+ {ID: "wsrep_connected", Name: "connected"},
+ },
+ }
+ chartGaleraReadinessState = module.Chart{
+ ID: "galera_ready",
+ Title: "Accept Queries Readiness Status",
+ Units: "boolean",
+ Fam: "galera",
+ Ctx: "mysql.galera_ready",
+ Priority: prioGaleraReadinessState,
+ Dims: module.Dims{
+ {ID: "wsrep_ready", Name: "ready"},
+ },
+ }
+ chartGaleraOpenTransactions = module.Chart{
+ ID: "galera_open_transactions",
+ Title: "Open Transactions",
+ Units: "transactions",
+ Fam: "galera",
+ Ctx: "mysql.galera_open_transactions",
+ Priority: prioGaleraOpenTransactions,
+ Dims: module.Dims{
+ {ID: "wsrep_open_transactions", Name: "open"},
+ },
+ }
+ chartGaleraThreads = module.Chart{
+ ID: "galera_thread_count",
+ Title: "Total Number of WSRep (applier/rollbacker) Threads",
+ Units: "threads",
+ Fam: "galera",
+ Ctx: "mysql.galera_thread_count",
+ Priority: prioGaleraThreadCount,
+ Dims: module.Dims{
+ {ID: "wsrep_thread_count", Name: "threads"},
+ },
+ }
+)
+
+var chartsMyISAM = module.Charts{
+ chartMyISAMKeyCacheBlocks.Copy(),
+ chartMyISAMKeyCacheRequests.Copy(),
+ chartMyISAMKeyCacheDiskOperations.Copy(),
+}
+var (
+ chartMyISAMKeyCacheBlocks = module.Chart{
+ ID: "key_blocks",
+ Title: "MyISAM Key Cache Blocks",
+ Units: "blocks",
+ Fam: "myisam",
+ Ctx: "mysql.key_blocks",
+ Priority: prioMyISAMKeyBlocks,
+ Dims: module.Dims{
+ {ID: "key_blocks_unused", Name: "unused"},
+ {ID: "key_blocks_used", Name: "used", Mul: -1},
+ {ID: "key_blocks_not_flushed", Name: "not flushed"},
+ },
+ }
+ chartMyISAMKeyCacheRequests = module.Chart{
+ ID: "key_requests",
+ Title: "MyISAM Key Cache Requests",
+ Units: "requests/s",
+ Fam: "myisam",
+ Ctx: "mysql.key_requests",
+ Type: module.Area,
+ Priority: prioMyISAMKeyRequests,
+ Dims: module.Dims{
+ {ID: "key_read_requests", Name: "reads", Algo: module.Incremental},
+ {ID: "key_write_requests", Name: "writes", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMyISAMKeyCacheDiskOperations = module.Chart{
+ ID: "key_disk_ops",
+ Title: "MyISAM Key Cache Disk Operations",
+ Units: "operations/s",
+ Fam: "myisam",
+ Ctx: "mysql.key_disk_ops",
+ Priority: prioMyISAMKeyDiskOperations,
+ Type: module.Area,
+ Dims: module.Dims{
+ {ID: "key_reads", Name: "reads", Algo: module.Incremental},
+ {ID: "key_writes", Name: "writes", Algo: module.Incremental, Mul: -1},
+ },
+ }
+)
+
+var chartsBinlog = module.Charts{
+ chartBinlogCache.Copy(),
+ chartBinlogStatementCache.Copy(),
+}
+
+var (
+ chartBinlogCache = module.Chart{
+ ID: "binlog_cache",
+ Title: "Binlog Cache",
+ Units: "transactions/s",
+ Fam: "binlog",
+ Ctx: "mysql.binlog_cache",
+ Priority: prioBinlogCache,
+ Dims: module.Dims{
+ {ID: "binlog_cache_disk_use", Name: "disk", Algo: module.Incremental},
+ {ID: "binlog_cache_use", Name: "all", Algo: module.Incremental},
+ },
+ }
+ chartBinlogStatementCache = module.Chart{
+ ID: "binlog_stmt_cache",
+ Title: "Binlog Statement Cache",
+ Units: "statements/s",
+ Fam: "binlog",
+ Ctx: "mysql.binlog_stmt_cache",
+ Priority: prioBinlogStatementCache,
+ Dims: module.Dims{
+ {ID: "binlog_stmt_cache_disk_use", Name: "disk", Algo: module.Incremental},
+ {ID: "binlog_stmt_cache_use", Name: "all", Algo: module.Incremental},
+ },
+ }
+)
+
+var (
+ chartsSlaveReplication = module.Charts{
+ chartSlaveBehindSeconds.Copy(),
+ chartSlaveSQLIOThreadRunningState.Copy(),
+ }
+
+ chartSlaveBehindSeconds = module.Chart{
+ ID: "slave_behind",
+ Title: "Slave Behind Seconds",
+ Units: "seconds",
+ Fam: "slave",
+ Ctx: "mysql.slave_behind",
+ Priority: prioSlaveSecondsBehindMaster,
+ Dims: module.Dims{
+ {ID: "seconds_behind_master", Name: "seconds"},
+ },
+ }
+ chartSlaveSQLIOThreadRunningState = module.Chart{
+ ID: "slave_thread_running",
+ Title: "I/O / SQL Thread Running State",
+ Units: "boolean",
+ Fam: "slave",
+ Ctx: "mysql.slave_status",
+ Priority: prioSlaveSQLIOThreadRunningState,
+ Dims: module.Dims{
+ {ID: "slave_sql_running", Name: "sql_running"},
+ {ID: "slave_io_running", Name: "io_running"},
+ },
+ }
+)
+
+func newSlaveReplConnCharts(conn string) *module.Charts {
+ orig := conn
+ conn = strings.ToLower(conn)
+ cs := chartsSlaveReplication.Copy()
+ for _, chart := range *cs {
+ chart.ID += "_" + conn
+ chart.Title += " Connection " + orig
+ for _, dim := range chart.Dims {
+ dim.ID += "_" + conn
+ }
+ }
+ return cs
+}
+
+func newMariaDBUserStatisticsCharts(user string) *module.Charts {
+ lcUser := strings.ToLower(user)
+ charts := chartsTmplUserStats.Copy()
+ for _, c := range *charts {
+ c.ID = fmt.Sprintf(c.ID, lcUser)
+ c.Labels = []module.Label{
+ {Key: "user", Value: user},
+ }
+ for _, d := range c.Dims {
+ d.ID = fmt.Sprintf(d.ID, lcUser)
+ }
+ }
+ return charts
+}
+
+func newPerconaUserStatisticsCharts(user string) *module.Charts {
+ lcUser := strings.ToLower(user)
+ charts := chartsTmplPerconaUserStats.Copy()
+ for _, c := range *charts {
+ c.ID = fmt.Sprintf(c.ID, lcUser)
+ c.Labels = []module.Label{
+ {Key: "user", Value: user},
+ }
+ for _, d := range c.Dims {
+ d.ID = fmt.Sprintf(d.ID, lcUser)
+ }
+ }
+ return charts
+}
+
+var (
+ chartsTmplUserStats = module.Charts{
+ chartUserStatsCPU.Copy(),
+ chartTmplUserStatsRowsOperations.Copy(),
+ chartTmplUserStatsCommands.Copy(),
+ chartTmplUserStatsDeniedCommands.Copy(),
+ chartTmplUserStatsTransactions.Copy(),
+ chartTmplUserStatsBinlogWritten.Copy(),
+ chartTmplUserStatsEmptyQueries.Copy(),
+ chartTmplUserStatsCreatedConnections.Copy(),
+ chartTmplUserStatsLostConnections.Copy(),
+ chartTmplUserStatsDeniedConnections.Copy(),
+ }
+ chartsTmplPerconaUserStats = module.Charts{
+ chartUserStatsCPU.Copy(),
+ chartTmplPerconaUserStatsRowsOperations.Copy(),
+ chartTmplUserStatsCommands.Copy(),
+ chartTmplUserStatsDeniedCommands.Copy(),
+ chartTmplUserStatsTransactions.Copy(),
+ chartTmplUserStatsBinlogWritten.Copy(),
+ chartTmplUserStatsEmptyQueries.Copy(),
+ chartTmplUserStatsCreatedConnections.Copy(),
+ chartTmplUserStatsLostConnections.Copy(),
+ chartTmplUserStatsDeniedConnections.Copy(),
+ }
+
+ chartUserStatsCPU = module.Chart{
+ ID: "userstats_cpu_%s",
+ Title: "User CPU Time",
+ Units: "percentage",
+ Fam: "user cpu time",
+ Ctx: "mysql.userstats_cpu",
+ Priority: prioUserStatsCPUTime,
+ Dims: module.Dims{
+ {ID: "userstats_%s_cpu_time", Name: "used", Mul: 100, Div: 1000, Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsRowsOperations = module.Chart{
+ ID: "userstats_rows_%s",
+ Title: "User Rows Operations",
+ Units: "operations/s",
+ Fam: "user operations",
+ Ctx: "mysql.userstats_rows",
+ Type: module.Stacked,
+ Priority: prioUserStatsRows,
+ Dims: module.Dims{
+ {ID: "userstats_%s_rows_read", Name: "read", Algo: module.Incremental},
+ {ID: "userstats_%s_rows_sent", Name: "sent", Algo: module.Incremental},
+ {ID: "userstats_%s_rows_updated", Name: "updated", Algo: module.Incremental},
+ {ID: "userstats_%s_rows_inserted", Name: "inserted", Algo: module.Incremental},
+ {ID: "userstats_%s_rows_deleted", Name: "deleted", Algo: module.Incremental},
+ },
+ }
+ chartTmplPerconaUserStatsRowsOperations = module.Chart{
+ ID: "userstats_rows_%s",
+ Title: "User Rows Operations",
+ Units: "operations/s",
+ Fam: "user operations",
+ Ctx: "mysql.userstats_rows",
+ Type: module.Stacked,
+ Priority: prioUserStatsRows,
+ Dims: module.Dims{
+ {ID: "userstats_%s_rows_fetched", Name: "fetched", Algo: module.Incremental},
+ {ID: "userstats_%s_rows_updated", Name: "updated", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsCommands = module.Chart{
+ ID: "userstats_commands_%s",
+ Title: "User Commands",
+ Units: "commands/s",
+ Fam: "user commands",
+ Ctx: "mysql.userstats_commands",
+ Type: module.Stacked,
+ Priority: prioUserStatsCommands,
+ Dims: module.Dims{
+ {ID: "userstats_%s_select_commands", Name: "select", Algo: module.Incremental},
+ {ID: "userstats_%s_update_commands", Name: "update", Algo: module.Incremental},
+ {ID: "userstats_%s_other_commands", Name: "other", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsDeniedCommands = module.Chart{
+ ID: "userstats_denied_commands_%s",
+ Title: "User Denied Commands",
+ Units: "commands/s",
+ Fam: "user commands denied",
+ Ctx: "mysql.userstats_denied_commands",
+ Priority: prioUserStatsDeniedCommands,
+ Dims: module.Dims{
+ {ID: "userstats_%s_access_denied", Name: "denied", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsTransactions = module.Chart{
+ ID: "userstats_transactions_%s",
+ Title: "User Transactions",
+ Units: "transactions/s",
+ Fam: "user transactions",
+ Ctx: "mysql.userstats_created_transactions",
+ Type: module.Area,
+ Priority: prioUserStatsTransactions,
+ Dims: module.Dims{
+ {ID: "userstats_%s_commit_transactions", Name: "commit", Algo: module.Incremental},
+ {ID: "userstats_%s_rollback_transactions", Name: "rollback", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsBinlogWritten = module.Chart{
+ ID: "userstats_binlog_written_%s",
+ Title: "User Binlog Written",
+ Units: "B/s",
+ Fam: "user binlog written",
+ Ctx: "mysql.userstats_binlog_written",
+ Priority: prioUserStatsBinlogWritten,
+ Dims: module.Dims{
+ {ID: "userstats_%s_binlog_bytes_written", Name: "written", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsEmptyQueries = module.Chart{
+ ID: "userstats_empty_queries_%s",
+ Title: "User Empty Queries",
+ Units: "queries/s",
+ Fam: "user empty queries",
+ Ctx: "mysql.userstats_empty_queries",
+ Priority: prioUserStatsEmptyQueries,
+ Dims: module.Dims{
+ {ID: "userstats_%s_empty_queries", Name: "empty", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsCreatedConnections = module.Chart{
+ ID: "userstats_connections_%s",
+ Title: "User Created Connections",
+ Units: "connections/s",
+ Fam: "user connections created ",
+ Ctx: "mysql.userstats_connections",
+ Priority: prioUserStatsConnections,
+ Dims: module.Dims{
+ {ID: "userstats_%s_total_connections", Name: "created", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsLostConnections = module.Chart{
+ ID: "userstats_lost_connections_%s",
+ Title: "User Lost Connections",
+ Units: "connections/s",
+ Fam: "user connections lost",
+ Ctx: "mysql.userstats_lost_connections",
+ Priority: prioUserStatsLostConnections,
+ Dims: module.Dims{
+ {ID: "userstats_%s_lost_connections", Name: "lost", Algo: module.Incremental},
+ },
+ }
+ chartTmplUserStatsDeniedConnections = module.Chart{
+ ID: "userstats_denied_connections_%s",
+ Title: "User Denied Connections",
+ Units: "connections/s",
+ Fam: "user connections denied",
+ Ctx: "mysql.userstats_denied_connections",
+ Priority: prioUserStatsDeniedConnections,
+ Dims: module.Dims{
+ {ID: "userstats_%s_denied_connections", Name: "denied", Algo: module.Incremental},
+ },
+ }
+)
+
+func (m *MySQL) addSlaveReplicationConnCharts(conn string) {
+ var charts *module.Charts
+ if conn == "" {
+ charts = chartsSlaveReplication.Copy()
+ } else {
+ charts = newSlaveReplConnCharts(conn)
+ }
+ if err := m.Charts().Add(*charts...); err != nil {
+ m.Warning(err)
+ }
+}
+
+func (m *MySQL) addUserStatisticsCharts(user string) {
+ if m.isPercona {
+ if err := m.Charts().Add(*newPerconaUserStatisticsCharts(user)...); err != nil {
+ m.Warning(err)
+ }
+ } else {
+ if err := m.Charts().Add(*newMariaDBUserStatisticsCharts(user)...); err != nil {
+ m.Warning(err)
+ }
+ }
+}
+
+func (m *MySQL) addInnoDBOSLogCharts() {
+ if err := m.Charts().Add(*chartsInnoDBOSLog.Copy()...); err != nil {
+ m.Warning(err)
+ }
+}
+
+func (m *MySQL) addMyISAMCharts() {
+ if err := m.Charts().Add(*chartsMyISAM.Copy()...); err != nil {
+ m.Warning(err)
+ }
+}
+
+func (m *MySQL) addBinlogCharts() {
+ if err := m.Charts().Add(*chartsBinlog.Copy()...); err != nil {
+ m.Warning(err)
+ }
+}
+
+func (m *MySQL) addInnodbDeadlocksChart() {
+ if err := m.Charts().Add(chartInnoDBDeadlocks.Copy()); err != nil {
+ m.Warning(err)
+ }
+}
+
+func (m *MySQL) addQCacheCharts() {
+ if err := m.Charts().Add(*chartsQCache.Copy()...); err != nil {
+ m.Warning(err)
+ }
+}
+
+func (m *MySQL) addGaleraCharts() {
+ if err := m.Charts().Add(*chartsGalera.Copy()...); err != nil {
+ m.Warning(err)
+ }
+}
+
+func (m *MySQL) addTableOpenCacheOverflowChart() {
+ if err := m.Charts().Add(chartTableOpenCacheOverflows.Copy()); err != nil {
+ m.Warning(err)
+ }
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect.go b/src/go/collectors/go.d.plugin/modules/mysql/collect.go
new file mode 100644
index 000000000..5f28cd139
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/collect.go
@@ -0,0 +1,202 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "context"
+ "database/sql"
+ "errors"
+ "fmt"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/blang/semver/v4"
+)
+
+func (m *MySQL) collect() (map[string]int64, error) {
+ if m.db == nil {
+ if err := m.openConnection(); err != nil {
+ return nil, err
+ }
+ }
+ if m.version == nil {
+ if err := m.collectVersion(); err != nil {
+ return nil, fmt.Errorf("error on collecting version: %v", err)
+ }
+ // https://mariadb.com/kb/en/user-statistics/
+ m.doUserStatistics = m.isPercona || m.isMariaDB && m.version.GTE(semver.Version{Major: 10, Minor: 1, Patch: 1})
+ }
+
+ m.disableSessionQueryLog()
+
+ mx := make(map[string]int64)
+
+ if err := m.collectGlobalStatus(mx); err != nil {
+ return nil, fmt.Errorf("error on collecting global status: %v", err)
+ }
+
+ if hasInnodbOSLog(mx) {
+ m.addInnoDBOSLogOnce.Do(m.addInnoDBOSLogCharts)
+ }
+ if hasInnodbDeadlocks(mx) {
+ m.addInnodbDeadlocksOnce.Do(m.addInnodbDeadlocksChart)
+ }
+ if hasQCacheMetrics(mx) {
+ m.addQCacheOnce.Do(m.addQCacheCharts)
+ }
+ if hasGaleraMetrics(mx) {
+ m.addGaleraOnce.Do(m.addGaleraCharts)
+ }
+ if hasTableOpenCacheOverflowsMetrics(mx) {
+ m.addTableOpenCacheOverflowsOnce.Do(m.addTableOpenCacheOverflowChart)
+ }
+
+ now := time.Now()
+ if now.Sub(m.recheckGlobalVarsTime) > m.recheckGlobalVarsEvery {
+ if err := m.collectGlobalVariables(); err != nil {
+ return nil, fmt.Errorf("error on collecting global variables: %v", err)
+ }
+ }
+ mx["max_connections"] = m.varMaxConns
+ mx["table_open_cache"] = m.varTableOpenCache
+
+ if m.isMariaDB || !strings.Contains(m.varDisabledStorageEngine, "MyISAM") {
+ m.addMyISAMOnce.Do(m.addMyISAMCharts)
+ }
+ if m.varLogBin != "OFF" {
+ m.addBinlogOnce.Do(m.addBinlogCharts)
+ }
+
+ // TODO: perhaps make a decisions based on privileges? (SHOW GRANTS FOR CURRENT_USER();)
+ if m.doSlaveStatus {
+ if err := m.collectSlaveStatus(mx); err != nil {
+ m.Warningf("error on collecting slave status: %v", err)
+ m.doSlaveStatus = errors.Is(err, context.DeadlineExceeded)
+ }
+ }
+
+ if m.doUserStatistics {
+ if err := m.collectUserStatistics(mx); err != nil {
+ m.Warningf("error on collecting user statistics: %v", err)
+ m.doUserStatistics = errors.Is(err, context.DeadlineExceeded)
+ }
+ }
+
+ if err := m.collectProcessListStatistics(mx); err != nil {
+ m.Errorf("error on collecting process list statistics: %v", err)
+ }
+
+ calcThreadCacheMisses(mx)
+ return mx, nil
+}
+
+func (m *MySQL) openConnection() error {
+ db, err := sql.Open("mysql", m.DSN)
+ if err != nil {
+ return fmt.Errorf("error on opening a connection with the mysql database [%s]: %v", m.safeDSN, err)
+ }
+
+ db.SetConnMaxLifetime(10 * time.Minute)
+
+ ctx, cancel := context.WithTimeout(context.Background(), m.Timeout.Duration())
+ defer cancel()
+
+ if err := db.PingContext(ctx); err != nil {
+ _ = db.Close()
+ return fmt.Errorf("error on pinging the mysql database [%s]: %v", m.safeDSN, err)
+ }
+
+ m.db = db
+ return nil
+}
+
+func calcThreadCacheMisses(collected map[string]int64) {
+ threads, cons := collected["threads_created"], collected["connections"]
+ if threads == 0 || cons == 0 {
+ collected["thread_cache_misses"] = 0
+ } else {
+ collected["thread_cache_misses"] = int64(float64(threads) / float64(cons) * 10000)
+ }
+}
+
+func hasInnodbOSLog(collected map[string]int64) bool {
+ // removed in MariaDB 10.8 (https://mariadb.com/kb/en/innodb-status-variables/#innodb_os_log_fsyncs)
+ _, ok := collected["innodb_os_log_fsyncs"]
+ return ok
+}
+
+func hasInnodbDeadlocks(collected map[string]int64) bool {
+ _, ok := collected["innodb_deadlocks"]
+ return ok
+}
+
+func hasGaleraMetrics(collected map[string]int64) bool {
+ _, ok := collected["wsrep_received"]
+ return ok
+}
+
+func hasQCacheMetrics(collected map[string]int64) bool {
+ _, ok := collected["qcache_hits"]
+ return ok
+}
+
+func hasTableOpenCacheOverflowsMetrics(collected map[string]int64) bool {
+ _, ok := collected["table_open_cache_overflows"]
+ return ok
+}
+
+func (m *MySQL) collectQuery(query string, assign func(column, value string, lineEnd bool)) (duration int64, err error) {
+ ctx, cancel := context.WithTimeout(context.Background(), m.Timeout.Duration())
+ defer cancel()
+
+ s := time.Now()
+ rows, err := m.db.QueryContext(ctx, query)
+ if err != nil {
+ return 0, err
+ }
+ duration = time.Since(s).Milliseconds()
+ defer func() { _ = rows.Close() }()
+
+ columns, err := rows.Columns()
+ if err != nil {
+ return duration, err
+ }
+
+ vs := makeValues(len(columns))
+ for rows.Next() {
+ if err := rows.Scan(vs...); err != nil {
+ return duration, err
+ }
+ for i, l := 0, len(vs); i < l; i++ {
+ assign(columns[i], valueToString(vs[i]), i == l-1)
+ }
+ }
+ return duration, rows.Err()
+}
+
+func makeValues(size int) []any {
+ vs := make([]any, size)
+ for i := range vs {
+ vs[i] = &sql.NullString{}
+ }
+ return vs
+}
+
+func valueToString(value any) string {
+ v, ok := value.(*sql.NullString)
+ if !ok || !v.Valid {
+ return ""
+ }
+ return v.String
+}
+
+func parseInt(s string) int64 {
+ v, _ := strconv.ParseInt(s, 10, 64)
+ return v
+}
+
+func parseFloat(s string) float64 {
+ v, _ := strconv.ParseFloat(s, 64)
+ return v
+}
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,
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect_global_vars.go b/src/go/collectors/go.d.plugin/modules/mysql/collect_global_vars.go
new file mode 100644
index 000000000..ae6278088
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/collect_global_vars.go
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+const (
+ queryShowGlobalVariables = `
+SHOW GLOBAL VARIABLES
+WHERE
+ Variable_name LIKE 'max_connections'
+ OR Variable_name LIKE 'table_open_cache'
+ OR Variable_name LIKE 'disabled_storage_engines'
+ OR Variable_name LIKE 'log_bin'
+ OR Variable_name LIKE 'performance_schema';`
+)
+
+func (m *MySQL) collectGlobalVariables() error {
+ // MariaDB: https://mariadb.com/kb/en/server-system-variables/
+ // MySQL: https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html
+ q := queryShowGlobalVariables
+ 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":
+ switch name {
+ case "disabled_storage_engines":
+ m.varDisabledStorageEngine = value
+ case "log_bin":
+ m.varLogBin = value
+ case "max_connections":
+ m.varMaxConns = parseInt(value)
+ case "performance_schema":
+ m.varPerformanceSchema = value
+ case "table_open_cache":
+ m.varTableOpenCache = parseInt(value)
+ }
+ }
+ })
+ return err
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect_process_list.go b/src/go/collectors/go.d.plugin/modules/mysql/collect_process_list.go
new file mode 100644
index 000000000..08c08c6d5
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/collect_process_list.go
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "github.com/blang/semver/v4"
+)
+
+// Table Schema:
+// (MariaDB) https://mariadb.com/kb/en/information-schema-processlist-table/
+// (MySql) https://dev.mysql.com/doc/refman/5.7/en/information-schema-processlist-table.html
+const (
+ queryShowProcessList = `
+SELECT
+ time,
+ user
+FROM
+ information_schema.processlist
+WHERE
+ info IS NOT NULL
+ AND info NOT LIKE '%PROCESSLIST%'
+ORDER BY
+ time;`
+)
+
+// Performance Schema
+// (MySQL) https://dev.mysql.com/doc/refman/8.0/en/performance-schema-processlist-table.html
+const (
+ queryShowProcessListPS = `
+SELECT
+ time,
+ user
+FROM
+ performance_schema.processlist
+WHERE
+ info IS NOT NULL
+ AND info NOT LIKE '%PROCESSLIST%'
+ORDER BY
+ time;`
+)
+
+func (m *MySQL) collectProcessListStatistics(mx map[string]int64) error {
+ var q string
+ mysqlMinVer := semver.Version{Major: 8, Minor: 0, Patch: 22}
+ if !m.isMariaDB && m.version.GTE(mysqlMinVer) && m.varPerformanceSchema == "ON" {
+ q = queryShowProcessListPS
+ } else {
+ q = queryShowProcessList
+ }
+ m.Debugf("executing query: '%s'", q)
+
+ var maxTime int64 // slowest query milliseconds in process list
+
+ duration, err := m.collectQuery(q, func(column, value string, _ bool) {
+ switch column {
+ case "time":
+ maxTime = parseInt(value)
+ case "user":
+ // system user refers to non-client threads
+ // event_scheduler is the thread used to monitor scheduled events
+ // system user and event_scheduler threads are grouped as system/database threads
+ // authenticated and unauthenticated user are grouped as users
+ // please see USER section in
+ // https://dev.mysql.com/doc/refman/8.0/en/information-schema-processlist-table.html
+ switch value {
+ case "system user", "event_scheduler":
+ mx["process_list_queries_count_system"] += 1
+ default:
+ mx["process_list_queries_count_user"] += 1
+ }
+ }
+ })
+ if err != nil {
+ return err
+ }
+
+ if _, ok := mx["process_list_queries_count_system"]; !ok {
+ mx["process_list_queries_count_system"] = 0
+ }
+ if _, ok := mx["process_list_queries_count_user"]; !ok {
+ mx["process_list_queries_count_user"] = 0
+ }
+ mx["process_list_fetch_query_duration"] = duration
+ mx["process_list_longest_query_duration"] = maxTime
+
+ return nil
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go b/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go
new file mode 100644
index 000000000..37d4bf59b
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/collect_slave_status.go
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "strings"
+
+ "github.com/blang/semver/v4"
+)
+
+const (
+ queryShowReplicaStatus = "SHOW REPLICA STATUS;"
+ queryShowSlaveStatus = "SHOW SLAVE STATUS;"
+ queryShowAllSlavesStatus = "SHOW ALL SLAVES STATUS;"
+)
+
+func (m *MySQL) collectSlaveStatus(mx map[string]int64) error {
+ // https://mariadb.com/docs/reference/es/sql-statements/SHOW_ALL_SLAVES_STATUS/
+ mariaDBMinVer := semver.Version{Major: 10, Minor: 2, Patch: 0}
+ mysqlMinVer := semver.Version{Major: 8, Minor: 0, Patch: 22}
+ var q string
+ if m.isMariaDB && m.version.GTE(mariaDBMinVer) {
+ q = queryShowAllSlavesStatus
+ } else if !m.isMariaDB && m.version.GTE(mysqlMinVer) {
+ q = queryShowReplicaStatus
+ } else {
+ q = queryShowSlaveStatus
+ }
+ m.Debugf("executing query: '%s'", q)
+
+ v := struct {
+ name string
+ behindMaster int64
+ sqlRunning int64
+ ioRunning int64
+ }{}
+
+ _, err := m.collectQuery(q, func(column, value string, lineEnd bool) {
+ switch column {
+ case "Connection_name", "Channel_Name":
+ v.name = value
+ case "Seconds_Behind_Master", "Seconds_Behind_Source":
+ v.behindMaster = parseInt(value)
+ case "Slave_SQL_Running", "Replica_SQL_Running":
+ v.sqlRunning = parseInt(convertSlaveSQLRunning(value))
+ case "Slave_IO_Running", "Replica_IO_Running":
+ v.ioRunning = parseInt(convertSlaveIORunning(value))
+ }
+ if lineEnd {
+ if !m.collectedReplConns[v.name] {
+ m.collectedReplConns[v.name] = true
+ m.addSlaveReplicationConnCharts(v.name)
+ }
+ s := strings.ToLower(slaveMetricSuffix(v.name))
+ mx["seconds_behind_master"+s] = v.behindMaster
+ mx["slave_sql_running"+s] = v.sqlRunning
+ mx["slave_io_running"+s] = v.ioRunning
+ }
+ })
+ return err
+}
+
+func convertSlaveSQLRunning(value string) string {
+ switch value {
+ case "Yes":
+ return "1"
+ default:
+ return "0"
+ }
+}
+
+func convertSlaveIORunning(value string) string {
+ // NOTE: There is 'Connecting' state and probably others
+ switch value {
+ case "Yes":
+ return "1"
+ default:
+ return "0"
+ }
+}
+
+func slaveMetricSuffix(conn string) string {
+ if conn == "" {
+ return ""
+ }
+ return "_" + conn
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect_user_statistics.go b/src/go/collectors/go.d.plugin/modules/mysql/collect_user_statistics.go
new file mode 100644
index 000000000..b00703a46
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/collect_user_statistics.go
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "strings"
+)
+
+const queryShowUserStatistics = "SHOW USER_STATISTICS;"
+
+func (m *MySQL) collectUserStatistics(mx map[string]int64) error {
+ // https://mariadb.com/kb/en/user-statistics/
+ // https://mariadb.com/kb/en/information-schema-user_statistics-table/
+ q := queryShowUserStatistics
+ m.Debugf("executing query: '%s'", q)
+
+ var user, prefix string
+ _, err := m.collectQuery(q, func(column, value string, _ bool) {
+ switch column {
+ case "User":
+ user = value
+ prefix = "userstats_" + user + "_"
+ if !m.collectedUsers[user] {
+ m.collectedUsers[user] = true
+ m.addUserStatisticsCharts(user)
+ }
+ case "Cpu_time":
+ mx[strings.ToLower(prefix+column)] = int64(parseFloat(value) * 1000)
+ case
+ "Total_connections",
+ "Lost_connections",
+ "Denied_connections",
+ "Empty_queries",
+ "Binlog_bytes_written",
+ "Rows_read",
+ "Rows_sent",
+ "Rows_deleted",
+ "Rows_inserted",
+ "Rows_updated",
+ "Rows_fetched", // Percona
+ "Select_commands",
+ "Update_commands",
+ "Other_commands",
+ "Access_denied",
+ "Commit_transactions",
+ "Rollback_transactions":
+ mx[strings.ToLower(prefix+column)] = parseInt(value)
+ }
+ })
+ return err
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/collect_version.go b/src/go/collectors/go.d.plugin/modules/mysql/collect_version.go
new file mode 100644
index 000000000..b85922e2c
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/collect_version.go
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "fmt"
+ "regexp"
+ "strings"
+
+ "github.com/blang/semver/v4"
+)
+
+const queryShowVersion = `
+SHOW GLOBAL VARIABLES
+WHERE
+ Variable_name LIKE 'version'
+ OR Variable_name LIKE 'version_comment';`
+
+var reVersionCore = regexp.MustCompile(`^\d+\.\d+\.\d+`)
+
+func (m *MySQL) collectVersion() error {
+ // https://mariadb.com/kb/en/version/
+ q := queryShowVersion
+ m.Debugf("executing query: '%s'", queryShowVersion)
+
+ var name, version, versionComment string
+ _, err := m.collectQuery(q, func(column, value string, _ bool) {
+ switch column {
+ case "Variable_name":
+ name = value
+ case "Value":
+ switch name {
+ case "version":
+ version = value
+ case "version_comment":
+ versionComment = value
+ }
+ }
+ })
+ if err != nil {
+ return err
+ }
+
+ m.Infof("application version: '%s', version_comment: '%s'", version, versionComment)
+
+ // version string is not always valid semver (ex.: 8.0.22-0ubuntu0.20.04.2)
+ s := reVersionCore.FindString(version)
+ if s == "" {
+ return fmt.Errorf("couldn't parse version string '%s'", version)
+ }
+
+ ver, err := semver.New(s)
+ if err != nil {
+ return fmt.Errorf("couldn't parse version string '%s': %v", s, err)
+ }
+
+ m.version = ver
+ m.isMariaDB = strings.Contains(version, "MariaDB") || strings.Contains(versionComment, "mariadb")
+ m.isPercona = strings.Contains(versionComment, "Percona")
+
+ return nil
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/config_schema.json b/src/go/collectors/go.d.plugin/modules/mysql/config_schema.json
new file mode 100644
index 000000000..20bb265c0
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/config_schema.json
@@ -0,0 +1,52 @@
+{
+ "jsonSchema": {
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "MySQL collector configuration.",
+ "type": "object",
+ "properties": {
+ "update_every": {
+ "title": "Update every",
+ "description": "Data collection interval, measured in seconds.",
+ "type": "integer",
+ "minimum": 1,
+ "default": 1
+ },
+ "dsn": {
+ "title": "DSN",
+ "description": "MySQL server [Data Source Name (DSN)](https://github.com/go-sql-driver/mysql#dsn-data-source-name) specifying the connection details.",
+ "type": "string",
+ "default": "netdata@tcp(localhost:3306)/"
+ },
+ "timeout": {
+ "title": "Timeout",
+ "description": "Timeout for queries, in seconds.",
+ "type": "number",
+ "minimum": 0.5,
+ "default": 1
+ },
+ "my.cnf": {
+ "title": "my.cnf path",
+ "description": "Optional. Specifies the path to the my.cnf file containing connection settings under the [client] section.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "dsn"
+ ],
+ "additionalProperties": false,
+ "patternProperties": {
+ "^name$": {}
+ }
+ },
+ "uiSchema": {
+ "uiOptions": {
+ "fullPage": true
+ },
+ "dsn": {
+ "ui:placeholder": "username:password@protocol(address)/dbname"
+ },
+ "timeout": {
+ "ui:help": "Accepts decimals for precise control (e.g., type 1.5 for 1.5 seconds)."
+ }
+ }
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/disable_logging.go b/src/go/collectors/go.d.plugin/modules/mysql/disable_logging.go
new file mode 100644
index 000000000..3a2eea6a1
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/disable_logging.go
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+const (
+ queryShowSessionVariables = `
+SHOW SESSION VARIABLES
+WHERE
+ Variable_name LIKE 'sql_log_off'
+ OR Variable_name LIKE 'slow_query_log';`
+)
+
+const (
+ queryDisableSessionQueryLog = "SET SESSION sql_log_off='ON';"
+ queryDisableSessionSlowQueryLog = "SET SESSION slow_query_log='OFF';"
+)
+
+func (m *MySQL) disableSessionQueryLog() {
+ q := queryShowSessionVariables
+ m.Debugf("executing query: '%s'", q)
+
+ var sqlLogOff, slowQueryLog string
+ var name string
+ _, err := m.collectQuery(q, func(column, value string, _ bool) {
+ switch column {
+ case "Variable_name":
+ name = value
+ case "Value":
+ switch name {
+ case "sql_log_off":
+ sqlLogOff = value
+ case "slow_query_log":
+ slowQueryLog = value
+ }
+ }
+ })
+ if err != nil {
+ m.Debug(err)
+ return
+ }
+
+ if sqlLogOff == "OFF" && m.doDisableSessionQueryLog {
+ // requires SUPER privileges
+ q = queryDisableSessionQueryLog
+ m.Debugf("executing query: '%s'", q)
+ if _, err := m.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
+ m.Infof("failed to disable session query log (sql_log_off): %v", err)
+ m.doDisableSessionQueryLog = false
+ }
+ }
+ if slowQueryLog == "ON" {
+ q = queryDisableSessionSlowQueryLog
+ m.Debugf("executing query: '%s'", q)
+ if _, err := m.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
+ m.Debugf("failed to disable session slow query log (slow_query_log): %v", err)
+ }
+ }
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/integrations/mariadb.md b/src/go/collectors/go.d.plugin/modules/mysql/integrations/mariadb.md
new file mode 100644
index 000000000..8bd6b151c
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/integrations/mariadb.md
@@ -0,0 +1,370 @@
+<!--startmeta
+custom_edit_url: "https://github.com/netdata/netdata/edit/master/src/go/collectors/go.d.plugin/modules/mysql/integrations/mariadb.md"
+meta_yaml: "https://github.com/netdata/netdata/edit/master/src/go/collectors/go.d.plugin/modules/mysql/metadata.yaml"
+sidebar_label: "MariaDB"
+learn_status: "Published"
+learn_rel_path: "Collecting Metrics/Databases"
+most_popular: True
+message: "DO NOT EDIT THIS FILE DIRECTLY, IT IS GENERATED BY THE COLLECTOR'S metadata.yaml FILE"
+endmeta-->
+
+# MariaDB
+
+
+<img src="https://netdata.cloud/img/mariadb.svg" width="150"/>
+
+
+Plugin: go.d.plugin
+Module: mysql
+
+<img src="https://img.shields.io/badge/maintained%20by-Netdata-%2300ab44" />
+
+## Overview
+
+This collector monitors the health and performance of MySQL servers and collects general statistics, replication and user metrics.
+
+
+It connects to the MySQL instance via a TCP or UNIX socket and executes the following commands:
+
+Executed queries:
+
+- `SELECT VERSION();`
+- `SHOW GLOBAL STATUS;`
+- `SHOW GLOBAL VARIABLES;`
+- `SHOW SLAVE STATUS;` or `SHOW ALL SLAVES STATUS;` (MariaDBv10.2+) or `SHOW REPLICA STATUS;` (MySQL 8.0.22+)
+- `SHOW USER_STATISTICS;` (MariaDBv10.1.1+)
+- `SELECT TIME,USER FROM INFORMATION_SCHEMA.PROCESSLIST;`
+
+
+This collector is supported on all platforms.
+
+This collector supports collecting metrics from multiple instances of this integration, including remote instances.
+
+
+### Default Behavior
+
+#### Auto-Detection
+
+By default, it detects instances running on localhost by trying to connect as root and netdata using known MySQL TCP and UNIX sockets:
+
+- /var/run/mysqld/mysqld.sock
+- /var/run/mysqld/mysql.sock
+- /var/lib/mysql/mysql.sock
+- /tmp/mysql.sock
+- 127.0.0.1:3306
+- "[::1]:3306"
+
+
+#### Limits
+
+The default configuration for this integration does not impose any limits on data collection.
+
+#### Performance Impact
+
+The default configuration for this integration is not expected to impose a significant performance impact on the system.
+
+
+## Metrics
+
+Metrics grouped by *scope*.
+
+The scope defines the instance that the metric belongs to. An instance is uniquely identified by a set of labels.
+
+
+
+### Per MariaDB instance
+
+These metrics refer to the entire monitored application.
+
+This scope has no labels.
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.net | in, out | kilobits/s | • | • | • |
+| mysql.queries | queries, questions, slow_queries | queries/s | • | • | • |
+| mysql.queries_type | select, delete, update, insert, replace | queries/s | • | • | • |
+| mysql.handlers | commit, delete, prepare, read_first, read_key, read_next, read_prev, read_rnd, read_rnd_next, rollback, savepoint, savepointrollback, update, write | handlers/s | • | • | • |
+| mysql.table_open_cache_overflows | open_cache | overflows/s | • | • | • |
+| mysql.table_locks | immediate, waited | locks/s | • | • | • |
+| mysql.join_issues | full_join, full_range_join, range, range_check, scan | joins/s | • | • | • |
+| mysql.sort_issues | merge_passes, range, scan | issues/s | • | • | • |
+| mysql.tmp | disk_tables, files, tables | events/s | • | • | • |
+| mysql.connections | all, aborted | connections/s | • | • | • |
+| mysql.connections_active | active, limit, max_active | connections | • | • | • |
+| mysql.threads | connected, cached, running | threads | • | • | • |
+| mysql.threads_created | created | threads/s | • | • | • |
+| mysql.thread_cache_misses | misses | misses | • | • | • |
+| mysql.innodb_io | read, write | KiB/s | • | • | • |
+| mysql.innodb_io_ops | reads, writes, fsyncs | operations/s | • | • | • |
+| mysql.innodb_io_pending_ops | reads, writes, fsyncs | operations | • | • | • |
+| mysql.innodb_log | waits, write_requests, writes | operations/s | • | • | • |
+| mysql.innodb_cur_row_lock | current waits | operations | • | • | • |
+| mysql.innodb_rows | inserted, read, updated, deleted | operations/s | • | • | • |
+| mysql.innodb_buffer_pool_pages | data, dirty, free, misc, total | pages | • | • | • |
+| mysql.innodb_buffer_pool_pages_flushed | flush_pages | requests/s | • | • | • |
+| mysql.innodb_buffer_pool_bytes | data, dirty | MiB | • | • | • |
+| mysql.innodb_buffer_pool_read_ahead | all, evicted | pages/s | • | • | • |
+| mysql.innodb_buffer_pool_read_ahead_rnd | read-ahead | operations/s | • | • | • |
+| mysql.innodb_buffer_pool_ops | disk_reads, wait_free | operations/s | • | • | • |
+| mysql.innodb_os_log | fsyncs, writes | operations | • | • | • |
+| mysql.innodb_os_log_fsync_writes | fsyncs | operations/s | • | • | • |
+| mysql.innodb_os_log_io | write | KiB/s | • | • | • |
+| mysql.innodb_deadlocks | deadlocks | operations/s | • | • | • |
+| mysql.files | files | files | • | • | • |
+| mysql.files_rate | files | files/s | • | • | • |
+| mysql.connection_errors | accept, internal, max, peer_addr, select, tcpwrap | errors/s | • | • | • |
+| mysql.opened_tables | tables | tables/s | • | • | • |
+| mysql.open_tables | cache, tables | tables | • | • | • |
+| mysql.process_list_fetch_query_duration | duration | milliseconds | • | • | • |
+| mysql.process_list_queries_count | system, user | queries | • | • | • |
+| mysql.process_list_longest_query_duration | duration | seconds | • | • | • |
+| mysql.qcache_ops | hits, lowmem_prunes, inserts, not_cached | queries/s | • | • | • |
+| mysql.qcache | queries | queries | • | • | • |
+| mysql.qcache_freemem | free | MiB | • | • | • |
+| mysql.qcache_memblocks | free, total | blocks | • | • | • |
+| mysql.galera_writesets | rx, tx | writesets/s | • | • | • |
+| mysql.galera_bytes | rx, tx | KiB/s | • | • | • |
+| mysql.galera_queue | rx, tx | writesets | • | • | • |
+| mysql.galera_conflicts | bf_aborts, cert_fails | transactions | • | • | • |
+| mysql.galera_flow_control | paused | ms | • | • | • |
+| mysql.galera_cluster_status | primary, non_primary, disconnected | status | • | • | • |
+| mysql.galera_cluster_state | undefined, joining, donor, joined, synced, error | state | • | • | • |
+| mysql.galera_cluster_size | nodes | nodes | • | • | • |
+| mysql.galera_cluster_weight | weight | weight | • | • | • |
+| mysql.galera_connected | connected | boolean | • | • | • |
+| mysql.galera_ready | ready | boolean | • | • | • |
+| mysql.galera_open_transactions | open | transactions | • | • | • |
+| mysql.galera_thread_count | threads | threads | • | • | • |
+| mysql.key_blocks | unused, used, not_flushed | blocks | • | • | • |
+| mysql.key_requests | reads, writes | requests/s | • | • | • |
+| mysql.key_disk_ops | reads, writes | operations/s | • | • | • |
+| mysql.binlog_cache | disk, all | transactions/s | • | • | • |
+| mysql.binlog_stmt_cache | disk, all | statements/s | • | • | • |
+
+### Per connection
+
+These metrics refer to the replication connection.
+
+This scope has no labels.
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.slave_behind | seconds | seconds | • | • | • |
+| mysql.slave_status | sql_running, io_running | boolean | • | • | • |
+
+### Per user
+
+These metrics refer to the MySQL user.
+
+Labels:
+
+| Label | Description |
+|:-----------|:----------------|
+| user | username |
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.userstats_cpu | used | percentage | | • | • |
+| mysql.userstats_rows | read, sent, updated, inserted, deleted | operations/s | | • | • |
+| mysql.userstats_commands | select, update, other | commands/s | | • | • |
+| mysql.userstats_denied_commands | denied | commands/s | | • | • |
+| mysql.userstats_created_transactions | commit, rollback | transactions/s | | • | • |
+| mysql.userstats_binlog_written | written | B/s | | • | • |
+| mysql.userstats_empty_queries | empty | queries/s | | • | • |
+| mysql.userstats_connections | created | connections/s | | • | • |
+| mysql.userstats_lost_connections | lost | connections/s | | • | • |
+| mysql.userstats_denied_connections | denied | connections/s | | • | • |
+
+
+
+## Alerts
+
+
+The following alerts are available:
+
+| Alert name | On metric | Description |
+|:------------|:----------|:------------|
+| [ mysql_10s_slow_queries ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.queries | number of slow queries in the last 10 seconds |
+| [ mysql_10s_table_locks_immediate ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | number of table immediate locks in the last 10 seconds |
+| [ mysql_10s_table_locks_waited ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | number of table waited locks in the last 10 seconds |
+| [ mysql_10s_waited_locks_ratio ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | ratio of waited table locks over the last 10 seconds |
+| [ mysql_connections ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.connections_active | client connections utilization |
+| [ mysql_replication ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.slave_status | replication status (0: stopped, 1: working) |
+| [ mysql_replication_lag ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.slave_behind | difference between the timestamp of the latest transaction processed by the SQL thread and the timestamp of the same transaction when it was processed on the master |
+| [ mysql_galera_cluster_size_max_2m ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_size | maximum galera cluster size in the last 2 minutes starting one minute ago |
+| [ mysql_galera_cluster_size ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_size | current galera cluster size, compared to the maximum size in the last 2 minutes |
+| [ mysql_galera_cluster_state_warn ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_state | galera node state is either Donor/Desynced or Joined |
+| [ mysql_galera_cluster_state_crit ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_state | galera node state is either Undefined or Joining or Error |
+| [ mysql_galera_cluster_status ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_status | galera node is part of a nonoperational component. This occurs in cases of multiple membership changes that result in a loss of Quorum or in cases of split-brain situations. |
+
+
+## Setup
+
+### Prerequisites
+
+#### Create netdata user
+
+A user account should have the
+following [permissions](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html):
+
+- [`USAGE`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_usage)
+- [`REPLICATION CLIENT`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_replication-client)
+- [`PROCESS`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_process)
+
+To create the `netdata` user with these permissions, execute the following in the MySQL shell:
+
+```mysql
+CREATE USER 'netdata'@'localhost';
+GRANT USAGE, REPLICATION CLIENT, PROCESS ON *.* TO 'netdata'@'localhost';
+FLUSH PRIVILEGES;
+```
+
+The `netdata` user will have the ability to connect to the MySQL server on localhost without a password. It will only
+be able to gather statistics without being able to alter or affect operations in any way.
+
+
+
+### Configuration
+
+#### File
+
+The configuration file name for this integration is `go.d/mysql.conf`.
+
+
+You can edit the configuration file using the `edit-config` script from the
+Netdata [config directory](/docs/netdata-agent/configuration/README.md#the-netdata-config-directory).
+
+```bash
+cd /etc/netdata 2>/dev/null || cd /opt/netdata/etc/netdata
+sudo ./edit-config go.d/mysql.conf
+```
+#### Options
+
+The following options can be defined globally: update_every, autodetection_retry.
+
+
+<details open><summary>Config options</summary>
+
+| Name | Description | Default | Required |
+|:----|:-----------|:-------|:--------:|
+| update_every | Data collection frequency. | 5 | no |
+| autodetection_retry | Recheck interval in seconds. Zero means no recheck will be scheduled. | 0 | no |
+| dsn | MySQL server DSN (Data Source Name). See [DSN syntax](https://github.com/go-sql-driver/mysql#dsn-data-source-name). | root@tcp(localhost:3306)/ | yes |
+| my.cnf | Specifies the my.cnf file to read the connection settings from the [client] section. | | no |
+| timeout | Query timeout in seconds. | 1 | no |
+
+</details>
+
+#### Examples
+
+##### TCP socket
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+
+```
+</details>
+
+##### Unix socket
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@unix(/var/lib/mysql/mysql.sock)/
+
+```
+</details>
+
+##### Connection with password
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netconfig:password@tcp(127.0.0.1:3306)/
+
+```
+</details>
+
+##### my.cnf
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ my.cnf: '/etc/my.cnf'
+
+```
+</details>
+
+##### Multi-instance
+
+> **Note**: When you define multiple jobs, their names must be unique.
+
+Local and remote instances.
+
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+
+ - name: remote
+ dsn: netconfig:password@tcp(203.0.113.0:3306)/
+
+```
+</details>
+
+
+
+## Troubleshooting
+
+### Debug Mode
+
+To troubleshoot issues with the `mysql` collector, run the `go.d.plugin` with the debug option enabled. The output
+should give you clues as to why the collector isn't working.
+
+- Navigate to the `plugins.d` directory, usually at `/usr/libexec/netdata/plugins.d/`. If that's not the case on
+ your system, open `netdata.conf` and look for the `plugins` setting under `[directories]`.
+
+ ```bash
+ cd /usr/libexec/netdata/plugins.d/
+ ```
+
+- Switch to the `netdata` user.
+
+ ```bash
+ sudo -u netdata -s
+ ```
+
+- Run the `go.d.plugin` to debug the collector:
+
+ ```bash
+ ./go.d.plugin -d -m mysql
+ ```
+
+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/integrations/mysql.md b/src/go/collectors/go.d.plugin/modules/mysql/integrations/mysql.md
new file mode 100644
index 000000000..0acf6f881
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/integrations/mysql.md
@@ -0,0 +1,370 @@
+<!--startmeta
+custom_edit_url: "https://github.com/netdata/netdata/edit/master/src/go/collectors/go.d.plugin/modules/mysql/integrations/mysql.md"
+meta_yaml: "https://github.com/netdata/netdata/edit/master/src/go/collectors/go.d.plugin/modules/mysql/metadata.yaml"
+sidebar_label: "MySQL"
+learn_status: "Published"
+learn_rel_path: "Collecting Metrics/Databases"
+most_popular: True
+message: "DO NOT EDIT THIS FILE DIRECTLY, IT IS GENERATED BY THE COLLECTOR'S metadata.yaml FILE"
+endmeta-->
+
+# MySQL
+
+
+<img src="https://netdata.cloud/img/mysql.svg" width="150"/>
+
+
+Plugin: go.d.plugin
+Module: mysql
+
+<img src="https://img.shields.io/badge/maintained%20by-Netdata-%2300ab44" />
+
+## Overview
+
+This collector monitors the health and performance of MySQL servers and collects general statistics, replication and user metrics.
+
+
+It connects to the MySQL instance via a TCP or UNIX socket and executes the following commands:
+
+Executed queries:
+
+- `SELECT VERSION();`
+- `SHOW GLOBAL STATUS;`
+- `SHOW GLOBAL VARIABLES;`
+- `SHOW SLAVE STATUS;` or `SHOW ALL SLAVES STATUS;` (MariaDBv10.2+) or `SHOW REPLICA STATUS;` (MySQL 8.0.22+)
+- `SHOW USER_STATISTICS;` (MariaDBv10.1.1+)
+- `SELECT TIME,USER FROM INFORMATION_SCHEMA.PROCESSLIST;`
+
+
+This collector is supported on all platforms.
+
+This collector supports collecting metrics from multiple instances of this integration, including remote instances.
+
+
+### Default Behavior
+
+#### Auto-Detection
+
+By default, it detects instances running on localhost by trying to connect as root and netdata using known MySQL TCP and UNIX sockets:
+
+- /var/run/mysqld/mysqld.sock
+- /var/run/mysqld/mysql.sock
+- /var/lib/mysql/mysql.sock
+- /tmp/mysql.sock
+- 127.0.0.1:3306
+- "[::1]:3306"
+
+
+#### Limits
+
+The default configuration for this integration does not impose any limits on data collection.
+
+#### Performance Impact
+
+The default configuration for this integration is not expected to impose a significant performance impact on the system.
+
+
+## Metrics
+
+Metrics grouped by *scope*.
+
+The scope defines the instance that the metric belongs to. An instance is uniquely identified by a set of labels.
+
+
+
+### Per MariaDB instance
+
+These metrics refer to the entire monitored application.
+
+This scope has no labels.
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.net | in, out | kilobits/s | • | • | • |
+| mysql.queries | queries, questions, slow_queries | queries/s | • | • | • |
+| mysql.queries_type | select, delete, update, insert, replace | queries/s | • | • | • |
+| mysql.handlers | commit, delete, prepare, read_first, read_key, read_next, read_prev, read_rnd, read_rnd_next, rollback, savepoint, savepointrollback, update, write | handlers/s | • | • | • |
+| mysql.table_open_cache_overflows | open_cache | overflows/s | • | • | • |
+| mysql.table_locks | immediate, waited | locks/s | • | • | • |
+| mysql.join_issues | full_join, full_range_join, range, range_check, scan | joins/s | • | • | • |
+| mysql.sort_issues | merge_passes, range, scan | issues/s | • | • | • |
+| mysql.tmp | disk_tables, files, tables | events/s | • | • | • |
+| mysql.connections | all, aborted | connections/s | • | • | • |
+| mysql.connections_active | active, limit, max_active | connections | • | • | • |
+| mysql.threads | connected, cached, running | threads | • | • | • |
+| mysql.threads_created | created | threads/s | • | • | • |
+| mysql.thread_cache_misses | misses | misses | • | • | • |
+| mysql.innodb_io | read, write | KiB/s | • | • | • |
+| mysql.innodb_io_ops | reads, writes, fsyncs | operations/s | • | • | • |
+| mysql.innodb_io_pending_ops | reads, writes, fsyncs | operations | • | • | • |
+| mysql.innodb_log | waits, write_requests, writes | operations/s | • | • | • |
+| mysql.innodb_cur_row_lock | current waits | operations | • | • | • |
+| mysql.innodb_rows | inserted, read, updated, deleted | operations/s | • | • | • |
+| mysql.innodb_buffer_pool_pages | data, dirty, free, misc, total | pages | • | • | • |
+| mysql.innodb_buffer_pool_pages_flushed | flush_pages | requests/s | • | • | • |
+| mysql.innodb_buffer_pool_bytes | data, dirty | MiB | • | • | • |
+| mysql.innodb_buffer_pool_read_ahead | all, evicted | pages/s | • | • | • |
+| mysql.innodb_buffer_pool_read_ahead_rnd | read-ahead | operations/s | • | • | • |
+| mysql.innodb_buffer_pool_ops | disk_reads, wait_free | operations/s | • | • | • |
+| mysql.innodb_os_log | fsyncs, writes | operations | • | • | • |
+| mysql.innodb_os_log_fsync_writes | fsyncs | operations/s | • | • | • |
+| mysql.innodb_os_log_io | write | KiB/s | • | • | • |
+| mysql.innodb_deadlocks | deadlocks | operations/s | • | • | • |
+| mysql.files | files | files | • | • | • |
+| mysql.files_rate | files | files/s | • | • | • |
+| mysql.connection_errors | accept, internal, max, peer_addr, select, tcpwrap | errors/s | • | • | • |
+| mysql.opened_tables | tables | tables/s | • | • | • |
+| mysql.open_tables | cache, tables | tables | • | • | • |
+| mysql.process_list_fetch_query_duration | duration | milliseconds | • | • | • |
+| mysql.process_list_queries_count | system, user | queries | • | • | • |
+| mysql.process_list_longest_query_duration | duration | seconds | • | • | • |
+| mysql.qcache_ops | hits, lowmem_prunes, inserts, not_cached | queries/s | • | • | • |
+| mysql.qcache | queries | queries | • | • | • |
+| mysql.qcache_freemem | free | MiB | • | • | • |
+| mysql.qcache_memblocks | free, total | blocks | • | • | • |
+| mysql.galera_writesets | rx, tx | writesets/s | • | • | • |
+| mysql.galera_bytes | rx, tx | KiB/s | • | • | • |
+| mysql.galera_queue | rx, tx | writesets | • | • | • |
+| mysql.galera_conflicts | bf_aborts, cert_fails | transactions | • | • | • |
+| mysql.galera_flow_control | paused | ms | • | • | • |
+| mysql.galera_cluster_status | primary, non_primary, disconnected | status | • | • | • |
+| mysql.galera_cluster_state | undefined, joining, donor, joined, synced, error | state | • | • | • |
+| mysql.galera_cluster_size | nodes | nodes | • | • | • |
+| mysql.galera_cluster_weight | weight | weight | • | • | • |
+| mysql.galera_connected | connected | boolean | • | • | • |
+| mysql.galera_ready | ready | boolean | • | • | • |
+| mysql.galera_open_transactions | open | transactions | • | • | • |
+| mysql.galera_thread_count | threads | threads | • | • | • |
+| mysql.key_blocks | unused, used, not_flushed | blocks | • | • | • |
+| mysql.key_requests | reads, writes | requests/s | • | • | • |
+| mysql.key_disk_ops | reads, writes | operations/s | • | • | • |
+| mysql.binlog_cache | disk, all | transactions/s | • | • | • |
+| mysql.binlog_stmt_cache | disk, all | statements/s | • | • | • |
+
+### Per connection
+
+These metrics refer to the replication connection.
+
+This scope has no labels.
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.slave_behind | seconds | seconds | • | • | • |
+| mysql.slave_status | sql_running, io_running | boolean | • | • | • |
+
+### Per user
+
+These metrics refer to the MySQL user.
+
+Labels:
+
+| Label | Description |
+|:-----------|:----------------|
+| user | username |
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.userstats_cpu | used | percentage | | • | • |
+| mysql.userstats_rows | read, sent, updated, inserted, deleted | operations/s | | • | • |
+| mysql.userstats_commands | select, update, other | commands/s | | • | • |
+| mysql.userstats_denied_commands | denied | commands/s | | • | • |
+| mysql.userstats_created_transactions | commit, rollback | transactions/s | | • | • |
+| mysql.userstats_binlog_written | written | B/s | | • | • |
+| mysql.userstats_empty_queries | empty | queries/s | | • | • |
+| mysql.userstats_connections | created | connections/s | | • | • |
+| mysql.userstats_lost_connections | lost | connections/s | | • | • |
+| mysql.userstats_denied_connections | denied | connections/s | | • | • |
+
+
+
+## Alerts
+
+
+The following alerts are available:
+
+| Alert name | On metric | Description |
+|:------------|:----------|:------------|
+| [ mysql_10s_slow_queries ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.queries | number of slow queries in the last 10 seconds |
+| [ mysql_10s_table_locks_immediate ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | number of table immediate locks in the last 10 seconds |
+| [ mysql_10s_table_locks_waited ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | number of table waited locks in the last 10 seconds |
+| [ mysql_10s_waited_locks_ratio ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | ratio of waited table locks over the last 10 seconds |
+| [ mysql_connections ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.connections_active | client connections utilization |
+| [ mysql_replication ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.slave_status | replication status (0: stopped, 1: working) |
+| [ mysql_replication_lag ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.slave_behind | difference between the timestamp of the latest transaction processed by the SQL thread and the timestamp of the same transaction when it was processed on the master |
+| [ mysql_galera_cluster_size_max_2m ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_size | maximum galera cluster size in the last 2 minutes starting one minute ago |
+| [ mysql_galera_cluster_size ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_size | current galera cluster size, compared to the maximum size in the last 2 minutes |
+| [ mysql_galera_cluster_state_warn ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_state | galera node state is either Donor/Desynced or Joined |
+| [ mysql_galera_cluster_state_crit ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_state | galera node state is either Undefined or Joining or Error |
+| [ mysql_galera_cluster_status ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_status | galera node is part of a nonoperational component. This occurs in cases of multiple membership changes that result in a loss of Quorum or in cases of split-brain situations. |
+
+
+## Setup
+
+### Prerequisites
+
+#### Create netdata user
+
+A user account should have the
+following [permissions](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html):
+
+- [`USAGE`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_usage)
+- [`REPLICATION CLIENT`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_replication-client)
+- [`PROCESS`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_process)
+
+To create the `netdata` user with these permissions, execute the following in the MySQL shell:
+
+```mysql
+CREATE USER 'netdata'@'localhost';
+GRANT USAGE, REPLICATION CLIENT, PROCESS ON *.* TO 'netdata'@'localhost';
+FLUSH PRIVILEGES;
+```
+
+The `netdata` user will have the ability to connect to the MySQL server on localhost without a password. It will only
+be able to gather statistics without being able to alter or affect operations in any way.
+
+
+
+### Configuration
+
+#### File
+
+The configuration file name for this integration is `go.d/mysql.conf`.
+
+
+You can edit the configuration file using the `edit-config` script from the
+Netdata [config directory](/docs/netdata-agent/configuration/README.md#the-netdata-config-directory).
+
+```bash
+cd /etc/netdata 2>/dev/null || cd /opt/netdata/etc/netdata
+sudo ./edit-config go.d/mysql.conf
+```
+#### Options
+
+The following options can be defined globally: update_every, autodetection_retry.
+
+
+<details open><summary>Config options</summary>
+
+| Name | Description | Default | Required |
+|:----|:-----------|:-------|:--------:|
+| update_every | Data collection frequency. | 5 | no |
+| autodetection_retry | Recheck interval in seconds. Zero means no recheck will be scheduled. | 0 | no |
+| dsn | MySQL server DSN (Data Source Name). See [DSN syntax](https://github.com/go-sql-driver/mysql#dsn-data-source-name). | root@tcp(localhost:3306)/ | yes |
+| my.cnf | Specifies the my.cnf file to read the connection settings from the [client] section. | | no |
+| timeout | Query timeout in seconds. | 1 | no |
+
+</details>
+
+#### Examples
+
+##### TCP socket
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+
+```
+</details>
+
+##### Unix socket
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@unix(/var/lib/mysql/mysql.sock)/
+
+```
+</details>
+
+##### Connection with password
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netconfig:password@tcp(127.0.0.1:3306)/
+
+```
+</details>
+
+##### my.cnf
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ my.cnf: '/etc/my.cnf'
+
+```
+</details>
+
+##### Multi-instance
+
+> **Note**: When you define multiple jobs, their names must be unique.
+
+Local and remote instances.
+
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+
+ - name: remote
+ dsn: netconfig:password@tcp(203.0.113.0:3306)/
+
+```
+</details>
+
+
+
+## Troubleshooting
+
+### Debug Mode
+
+To troubleshoot issues with the `mysql` collector, run the `go.d.plugin` with the debug option enabled. The output
+should give you clues as to why the collector isn't working.
+
+- Navigate to the `plugins.d` directory, usually at `/usr/libexec/netdata/plugins.d/`. If that's not the case on
+ your system, open `netdata.conf` and look for the `plugins` setting under `[directories]`.
+
+ ```bash
+ cd /usr/libexec/netdata/plugins.d/
+ ```
+
+- Switch to the `netdata` user.
+
+ ```bash
+ sudo -u netdata -s
+ ```
+
+- Run the `go.d.plugin` to debug the collector:
+
+ ```bash
+ ./go.d.plugin -d -m mysql
+ ```
+
+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/integrations/percona_mysql.md b/src/go/collectors/go.d.plugin/modules/mysql/integrations/percona_mysql.md
new file mode 100644
index 000000000..1ea2ab21f
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/integrations/percona_mysql.md
@@ -0,0 +1,370 @@
+<!--startmeta
+custom_edit_url: "https://github.com/netdata/netdata/edit/master/src/go/collectors/go.d.plugin/modules/mysql/integrations/percona_mysql.md"
+meta_yaml: "https://github.com/netdata/netdata/edit/master/src/go/collectors/go.d.plugin/modules/mysql/metadata.yaml"
+sidebar_label: "Percona MySQL"
+learn_status: "Published"
+learn_rel_path: "Collecting Metrics/Databases"
+most_popular: False
+message: "DO NOT EDIT THIS FILE DIRECTLY, IT IS GENERATED BY THE COLLECTOR'S metadata.yaml FILE"
+endmeta-->
+
+# Percona MySQL
+
+
+<img src="https://netdata.cloud/img/percona.svg" width="150"/>
+
+
+Plugin: go.d.plugin
+Module: mysql
+
+<img src="https://img.shields.io/badge/maintained%20by-Netdata-%2300ab44" />
+
+## Overview
+
+This collector monitors the health and performance of MySQL servers and collects general statistics, replication and user metrics.
+
+
+It connects to the MySQL instance via a TCP or UNIX socket and executes the following commands:
+
+Executed queries:
+
+- `SELECT VERSION();`
+- `SHOW GLOBAL STATUS;`
+- `SHOW GLOBAL VARIABLES;`
+- `SHOW SLAVE STATUS;` or `SHOW ALL SLAVES STATUS;` (MariaDBv10.2+) or `SHOW REPLICA STATUS;` (MySQL 8.0.22+)
+- `SHOW USER_STATISTICS;` (MariaDBv10.1.1+)
+- `SELECT TIME,USER FROM INFORMATION_SCHEMA.PROCESSLIST;`
+
+
+This collector is supported on all platforms.
+
+This collector supports collecting metrics from multiple instances of this integration, including remote instances.
+
+
+### Default Behavior
+
+#### Auto-Detection
+
+By default, it detects instances running on localhost by trying to connect as root and netdata using known MySQL TCP and UNIX sockets:
+
+- /var/run/mysqld/mysqld.sock
+- /var/run/mysqld/mysql.sock
+- /var/lib/mysql/mysql.sock
+- /tmp/mysql.sock
+- 127.0.0.1:3306
+- "[::1]:3306"
+
+
+#### Limits
+
+The default configuration for this integration does not impose any limits on data collection.
+
+#### Performance Impact
+
+The default configuration for this integration is not expected to impose a significant performance impact on the system.
+
+
+## Metrics
+
+Metrics grouped by *scope*.
+
+The scope defines the instance that the metric belongs to. An instance is uniquely identified by a set of labels.
+
+
+
+### Per MariaDB instance
+
+These metrics refer to the entire monitored application.
+
+This scope has no labels.
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.net | in, out | kilobits/s | • | • | • |
+| mysql.queries | queries, questions, slow_queries | queries/s | • | • | • |
+| mysql.queries_type | select, delete, update, insert, replace | queries/s | • | • | • |
+| mysql.handlers | commit, delete, prepare, read_first, read_key, read_next, read_prev, read_rnd, read_rnd_next, rollback, savepoint, savepointrollback, update, write | handlers/s | • | • | • |
+| mysql.table_open_cache_overflows | open_cache | overflows/s | • | • | • |
+| mysql.table_locks | immediate, waited | locks/s | • | • | • |
+| mysql.join_issues | full_join, full_range_join, range, range_check, scan | joins/s | • | • | • |
+| mysql.sort_issues | merge_passes, range, scan | issues/s | • | • | • |
+| mysql.tmp | disk_tables, files, tables | events/s | • | • | • |
+| mysql.connections | all, aborted | connections/s | • | • | • |
+| mysql.connections_active | active, limit, max_active | connections | • | • | • |
+| mysql.threads | connected, cached, running | threads | • | • | • |
+| mysql.threads_created | created | threads/s | • | • | • |
+| mysql.thread_cache_misses | misses | misses | • | • | • |
+| mysql.innodb_io | read, write | KiB/s | • | • | • |
+| mysql.innodb_io_ops | reads, writes, fsyncs | operations/s | • | • | • |
+| mysql.innodb_io_pending_ops | reads, writes, fsyncs | operations | • | • | • |
+| mysql.innodb_log | waits, write_requests, writes | operations/s | • | • | • |
+| mysql.innodb_cur_row_lock | current waits | operations | • | • | • |
+| mysql.innodb_rows | inserted, read, updated, deleted | operations/s | • | • | • |
+| mysql.innodb_buffer_pool_pages | data, dirty, free, misc, total | pages | • | • | • |
+| mysql.innodb_buffer_pool_pages_flushed | flush_pages | requests/s | • | • | • |
+| mysql.innodb_buffer_pool_bytes | data, dirty | MiB | • | • | • |
+| mysql.innodb_buffer_pool_read_ahead | all, evicted | pages/s | • | • | • |
+| mysql.innodb_buffer_pool_read_ahead_rnd | read-ahead | operations/s | • | • | • |
+| mysql.innodb_buffer_pool_ops | disk_reads, wait_free | operations/s | • | • | • |
+| mysql.innodb_os_log | fsyncs, writes | operations | • | • | • |
+| mysql.innodb_os_log_fsync_writes | fsyncs | operations/s | • | • | • |
+| mysql.innodb_os_log_io | write | KiB/s | • | • | • |
+| mysql.innodb_deadlocks | deadlocks | operations/s | • | • | • |
+| mysql.files | files | files | • | • | • |
+| mysql.files_rate | files | files/s | • | • | • |
+| mysql.connection_errors | accept, internal, max, peer_addr, select, tcpwrap | errors/s | • | • | • |
+| mysql.opened_tables | tables | tables/s | • | • | • |
+| mysql.open_tables | cache, tables | tables | • | • | • |
+| mysql.process_list_fetch_query_duration | duration | milliseconds | • | • | • |
+| mysql.process_list_queries_count | system, user | queries | • | • | • |
+| mysql.process_list_longest_query_duration | duration | seconds | • | • | • |
+| mysql.qcache_ops | hits, lowmem_prunes, inserts, not_cached | queries/s | • | • | • |
+| mysql.qcache | queries | queries | • | • | • |
+| mysql.qcache_freemem | free | MiB | • | • | • |
+| mysql.qcache_memblocks | free, total | blocks | • | • | • |
+| mysql.galera_writesets | rx, tx | writesets/s | • | • | • |
+| mysql.galera_bytes | rx, tx | KiB/s | • | • | • |
+| mysql.galera_queue | rx, tx | writesets | • | • | • |
+| mysql.galera_conflicts | bf_aborts, cert_fails | transactions | • | • | • |
+| mysql.galera_flow_control | paused | ms | • | • | • |
+| mysql.galera_cluster_status | primary, non_primary, disconnected | status | • | • | • |
+| mysql.galera_cluster_state | undefined, joining, donor, joined, synced, error | state | • | • | • |
+| mysql.galera_cluster_size | nodes | nodes | • | • | • |
+| mysql.galera_cluster_weight | weight | weight | • | • | • |
+| mysql.galera_connected | connected | boolean | • | • | • |
+| mysql.galera_ready | ready | boolean | • | • | • |
+| mysql.galera_open_transactions | open | transactions | • | • | • |
+| mysql.galera_thread_count | threads | threads | • | • | • |
+| mysql.key_blocks | unused, used, not_flushed | blocks | • | • | • |
+| mysql.key_requests | reads, writes | requests/s | • | • | • |
+| mysql.key_disk_ops | reads, writes | operations/s | • | • | • |
+| mysql.binlog_cache | disk, all | transactions/s | • | • | • |
+| mysql.binlog_stmt_cache | disk, all | statements/s | • | • | • |
+
+### Per connection
+
+These metrics refer to the replication connection.
+
+This scope has no labels.
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.slave_behind | seconds | seconds | • | • | • |
+| mysql.slave_status | sql_running, io_running | boolean | • | • | • |
+
+### Per user
+
+These metrics refer to the MySQL user.
+
+Labels:
+
+| Label | Description |
+|:-----------|:----------------|
+| user | username |
+
+Metrics:
+
+| Metric | Dimensions | Unit | MySQL | MariaDB | Percona |
+|:------|:----------|:----|:---:|:---:|:---:|
+| mysql.userstats_cpu | used | percentage | | • | • |
+| mysql.userstats_rows | read, sent, updated, inserted, deleted | operations/s | | • | • |
+| mysql.userstats_commands | select, update, other | commands/s | | • | • |
+| mysql.userstats_denied_commands | denied | commands/s | | • | • |
+| mysql.userstats_created_transactions | commit, rollback | transactions/s | | • | • |
+| mysql.userstats_binlog_written | written | B/s | | • | • |
+| mysql.userstats_empty_queries | empty | queries/s | | • | • |
+| mysql.userstats_connections | created | connections/s | | • | • |
+| mysql.userstats_lost_connections | lost | connections/s | | • | • |
+| mysql.userstats_denied_connections | denied | connections/s | | • | • |
+
+
+
+## Alerts
+
+
+The following alerts are available:
+
+| Alert name | On metric | Description |
+|:------------|:----------|:------------|
+| [ mysql_10s_slow_queries ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.queries | number of slow queries in the last 10 seconds |
+| [ mysql_10s_table_locks_immediate ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | number of table immediate locks in the last 10 seconds |
+| [ mysql_10s_table_locks_waited ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | number of table waited locks in the last 10 seconds |
+| [ mysql_10s_waited_locks_ratio ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.table_locks | ratio of waited table locks over the last 10 seconds |
+| [ mysql_connections ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.connections_active | client connections utilization |
+| [ mysql_replication ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.slave_status | replication status (0: stopped, 1: working) |
+| [ mysql_replication_lag ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.slave_behind | difference between the timestamp of the latest transaction processed by the SQL thread and the timestamp of the same transaction when it was processed on the master |
+| [ mysql_galera_cluster_size_max_2m ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_size | maximum galera cluster size in the last 2 minutes starting one minute ago |
+| [ mysql_galera_cluster_size ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_size | current galera cluster size, compared to the maximum size in the last 2 minutes |
+| [ mysql_galera_cluster_state_warn ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_state | galera node state is either Donor/Desynced or Joined |
+| [ mysql_galera_cluster_state_crit ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_state | galera node state is either Undefined or Joining or Error |
+| [ mysql_galera_cluster_status ](https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf) | mysql.galera_cluster_status | galera node is part of a nonoperational component. This occurs in cases of multiple membership changes that result in a loss of Quorum or in cases of split-brain situations. |
+
+
+## Setup
+
+### Prerequisites
+
+#### Create netdata user
+
+A user account should have the
+following [permissions](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html):
+
+- [`USAGE`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_usage)
+- [`REPLICATION CLIENT`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_replication-client)
+- [`PROCESS`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_process)
+
+To create the `netdata` user with these permissions, execute the following in the MySQL shell:
+
+```mysql
+CREATE USER 'netdata'@'localhost';
+GRANT USAGE, REPLICATION CLIENT, PROCESS ON *.* TO 'netdata'@'localhost';
+FLUSH PRIVILEGES;
+```
+
+The `netdata` user will have the ability to connect to the MySQL server on localhost without a password. It will only
+be able to gather statistics without being able to alter or affect operations in any way.
+
+
+
+### Configuration
+
+#### File
+
+The configuration file name for this integration is `go.d/mysql.conf`.
+
+
+You can edit the configuration file using the `edit-config` script from the
+Netdata [config directory](/docs/netdata-agent/configuration/README.md#the-netdata-config-directory).
+
+```bash
+cd /etc/netdata 2>/dev/null || cd /opt/netdata/etc/netdata
+sudo ./edit-config go.d/mysql.conf
+```
+#### Options
+
+The following options can be defined globally: update_every, autodetection_retry.
+
+
+<details open><summary>Config options</summary>
+
+| Name | Description | Default | Required |
+|:----|:-----------|:-------|:--------:|
+| update_every | Data collection frequency. | 5 | no |
+| autodetection_retry | Recheck interval in seconds. Zero means no recheck will be scheduled. | 0 | no |
+| dsn | MySQL server DSN (Data Source Name). See [DSN syntax](https://github.com/go-sql-driver/mysql#dsn-data-source-name). | root@tcp(localhost:3306)/ | yes |
+| my.cnf | Specifies the my.cnf file to read the connection settings from the [client] section. | | no |
+| timeout | Query timeout in seconds. | 1 | no |
+
+</details>
+
+#### Examples
+
+##### TCP socket
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+
+```
+</details>
+
+##### Unix socket
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@unix(/var/lib/mysql/mysql.sock)/
+
+```
+</details>
+
+##### Connection with password
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netconfig:password@tcp(127.0.0.1:3306)/
+
+```
+</details>
+
+##### my.cnf
+
+An example configuration.
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ my.cnf: '/etc/my.cnf'
+
+```
+</details>
+
+##### Multi-instance
+
+> **Note**: When you define multiple jobs, their names must be unique.
+
+Local and remote instances.
+
+
+<details open><summary>Config</summary>
+
+```yaml
+jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+
+ - name: remote
+ dsn: netconfig:password@tcp(203.0.113.0:3306)/
+
+```
+</details>
+
+
+
+## Troubleshooting
+
+### Debug Mode
+
+To troubleshoot issues with the `mysql` collector, run the `go.d.plugin` with the debug option enabled. The output
+should give you clues as to why the collector isn't working.
+
+- Navigate to the `plugins.d` directory, usually at `/usr/libexec/netdata/plugins.d/`. If that's not the case on
+ your system, open `netdata.conf` and look for the `plugins` setting under `[directories]`.
+
+ ```bash
+ cd /usr/libexec/netdata/plugins.d/
+ ```
+
+- Switch to the `netdata` user.
+
+ ```bash
+ sudo -u netdata -s
+ ```
+
+- Run the `go.d.plugin` to debug the collector:
+
+ ```bash
+ ./go.d.plugin -d -m mysql
+ ```
+
+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/metadata.yaml b/src/go/collectors/go.d.plugin/modules/mysql/metadata.yaml
new file mode 100644
index 000000000..1bc133238
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/metadata.yaml
@@ -0,0 +1,806 @@
+plugin_name: go.d.plugin
+modules:
+ - &module
+ meta: &meta
+ id: collector-go.d.plugin-mysql
+ plugin_name: go.d.plugin
+ module_name: mysql
+ monitored_instance:
+ name: MySQL
+ link: https://www.mysql.com/
+ categories:
+ - data-collection.database-servers
+ icon_filename: mysql.svg
+ related_resources:
+ integrations:
+ list:
+ - plugin_name: apps.plugin
+ module_name: apps
+ - plugin_name: cgroups.plugin
+ module_name: cgroups
+ info_provided_to_referring_integrations:
+ description: ""
+ keywords:
+ - "db"
+ - "database"
+ - "mysql"
+ - "maria"
+ - "mariadb"
+ - "sql"
+ most_popular: true
+ overview:
+ multi_instance: true
+ data_collection:
+ metrics_description: |
+ This collector monitors the health and performance of MySQL servers and collects general statistics, replication and user metrics.
+ method_description: |
+ It connects to the MySQL instance via a TCP or UNIX socket and executes the following commands:
+
+ Executed queries:
+
+ - `SELECT VERSION();`
+ - `SHOW GLOBAL STATUS;`
+ - `SHOW GLOBAL VARIABLES;`
+ - `SHOW SLAVE STATUS;` or `SHOW ALL SLAVES STATUS;` (MariaDBv10.2+) or `SHOW REPLICA STATUS;` (MySQL 8.0.22+)
+ - `SHOW USER_STATISTICS;` (MariaDBv10.1.1+)
+ - `SELECT TIME,USER FROM INFORMATION_SCHEMA.PROCESSLIST;`
+ default_behavior:
+ auto_detection:
+ description: |
+ By default, it detects instances running on localhost by trying to connect as root and netdata using known MySQL TCP and UNIX sockets:
+
+ - /var/run/mysqld/mysqld.sock
+ - /var/run/mysqld/mysql.sock
+ - /var/lib/mysql/mysql.sock
+ - /tmp/mysql.sock
+ - 127.0.0.1:3306
+ - "[::1]:3306"
+ limits:
+ description: ""
+ performance_impact:
+ description: ""
+ additional_permissions:
+ description: ""
+ supported_platforms:
+ include: []
+ exclude: []
+ setup:
+ prerequisites:
+ list:
+ - title: Create netdata user
+ description: |
+ A user account should have the
+ following [permissions](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html):
+
+ - [`USAGE`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_usage)
+ - [`REPLICATION CLIENT`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_replication-client)
+ - [`PROCESS`](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_process)
+
+ To create the `netdata` user with these permissions, execute the following in the MySQL shell:
+
+ ```mysql
+ CREATE USER 'netdata'@'localhost';
+ GRANT USAGE, REPLICATION CLIENT, PROCESS ON *.* TO 'netdata'@'localhost';
+ FLUSH PRIVILEGES;
+ ```
+
+ The `netdata` user will have the ability to connect to the MySQL server on localhost without a password. It will only
+ be able to gather statistics without being able to alter or affect operations in any way.
+ configuration:
+ file:
+ name: go.d/mysql.conf
+ options:
+ description: |
+ The following options can be defined globally: update_every, autodetection_retry.
+ folding:
+ title: Config options
+ enabled: true
+ list:
+ - name: update_every
+ description: Data collection frequency.
+ default_value: 5
+ required: false
+ - name: autodetection_retry
+ description: Recheck interval in seconds. Zero means no recheck will be scheduled.
+ default_value: 0
+ required: false
+ - name: dsn
+ description: MySQL server DSN (Data Source Name). See [DSN syntax](https://github.com/go-sql-driver/mysql#dsn-data-source-name).
+ default_value: root@tcp(localhost:3306)/
+ required: true
+ - name: my.cnf
+ description: Specifies the my.cnf file to read the connection settings from the [client] section.
+ default_value: ""
+ required: false
+ - name: timeout
+ description: Query timeout in seconds.
+ default_value: 1
+ required: false
+ examples:
+ folding:
+ title: Config
+ enabled: true
+ list:
+ - name: TCP socket
+ description: An example configuration.
+ config: |
+ jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+ - name: Unix socket
+ description: An example configuration.
+ config: |
+ jobs:
+ - name: local
+ dsn: netdata@unix(/var/lib/mysql/mysql.sock)/
+ - name: Connection with password
+ description: An example configuration.
+ config: |
+ jobs:
+ - name: local
+ dsn: netconfig:password@tcp(127.0.0.1:3306)/
+ - name: my.cnf
+ description: An example configuration.
+ config: |
+ jobs:
+ - name: local
+ my.cnf: '/etc/my.cnf'
+ - name: Multi-instance
+ description: |
+ > **Note**: When you define multiple jobs, their names must be unique.
+
+ Local and remote instances.
+ config: |
+ jobs:
+ - name: local
+ dsn: netdata@tcp(127.0.0.1:3306)/
+
+ - name: remote
+ dsn: netconfig:password@tcp(203.0.113.0:3306)/
+ troubleshooting:
+ problems:
+ list: []
+ alerts:
+ - name: mysql_10s_slow_queries
+ metric: mysql.queries
+ info: number of slow queries in the last 10 seconds
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_10s_table_locks_immediate
+ metric: mysql.table_locks
+ info: number of table immediate locks in the last 10 seconds
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_10s_table_locks_waited
+ metric: mysql.table_locks
+ info: number of table waited locks in the last 10 seconds
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_10s_waited_locks_ratio
+ metric: mysql.table_locks
+ info: ratio of waited table locks over the last 10 seconds
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_connections
+ metric: mysql.connections_active
+ info: client connections utilization
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_replication
+ metric: mysql.slave_status
+ info: "replication status (0: stopped, 1: working)"
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_replication_lag
+ metric: mysql.slave_behind
+ info: difference between the timestamp of the latest transaction processed by the SQL thread and the timestamp of the same transaction when it was processed on the master
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_galera_cluster_size_max_2m
+ metric: mysql.galera_cluster_size
+ info: maximum galera cluster size in the last 2 minutes starting one minute ago
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_galera_cluster_size
+ metric: mysql.galera_cluster_size
+ info: current galera cluster size, compared to the maximum size in the last 2 minutes
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_galera_cluster_state_warn
+ metric: mysql.galera_cluster_state
+ info: galera node state is either Donor/Desynced or Joined
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_galera_cluster_state_crit
+ metric: mysql.galera_cluster_state
+ info: galera node state is either Undefined or Joining or Error
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ - name: mysql_galera_cluster_status
+ metric: mysql.galera_cluster_status
+ info: galera node is part of a nonoperational component. This occurs in cases of multiple membership changes that result in a loss of Quorum or in cases of split-brain situations.
+ link: https://github.com/netdata/netdata/blob/master/src/health/health.d/mysql.conf
+ metrics:
+ folding:
+ title: Metrics
+ enabled: false
+ description: ""
+ availability:
+ - MySQL
+ - MariaDB
+ - Percona
+ scopes:
+ - name: global
+ description: These metrics refer to the entire monitored application.
+ labels: []
+ metrics:
+ - name: mysql.net
+ description: Bandwidth
+ unit: kilobits/s
+ chart_type: area
+ dimensions:
+ - name: in
+ - name: out
+ - name: mysql.queries
+ description: Queries
+ unit: queries/s
+ chart_type: line
+ dimensions:
+ - name: queries
+ - name: questions
+ - name: slow_queries
+ - name: mysql.queries_type
+ description: Queries By Type
+ unit: queries/s
+ chart_type: stacked
+ dimensions:
+ - name: select
+ - name: delete
+ - name: update
+ - name: insert
+ - name: replace
+ - name: mysql.handlers
+ description: Handlers
+ unit: handlers/s
+ chart_type: line
+ dimensions:
+ - name: commit
+ - name: delete
+ - name: prepare
+ - name: read_first
+ - name: read_key
+ - name: read_next
+ - name: read_prev
+ - name: read_rnd
+ - name: read_rnd_next
+ - name: rollback
+ - name: savepoint
+ - name: savepointrollback
+ - name: update
+ - name: write
+ - name: mysql.table_open_cache_overflows
+ description: Table open cache overflows
+ unit: overflows/s
+ chart_type: line
+ dimensions:
+ - name: open_cache
+ - name: mysql.table_locks
+ description: Table Locks
+ unit: locks/s
+ chart_type: line
+ dimensions:
+ - name: immediate
+ - name: waited
+ - name: mysql.join_issues
+ description: Table Select Join Issues
+ unit: joins/s
+ chart_type: line
+ dimensions:
+ - name: full_join
+ - name: full_range_join
+ - name: range
+ - name: range_check
+ - name: scan
+ - name: mysql.sort_issues
+ description: Table Sort Issues
+ unit: issues/s
+ chart_type: line
+ dimensions:
+ - name: merge_passes
+ - name: range
+ - name: scan
+ - name: mysql.tmp
+ description: Tmp Operations
+ unit: events/s
+ chart_type: line
+ dimensions:
+ - name: disk_tables
+ - name: files
+ - name: tables
+ - name: mysql.connections
+ description: Connections
+ unit: connections/s
+ chart_type: line
+ dimensions:
+ - name: all
+ - name: aborted
+ - name: mysql.connections_active
+ description: Active Connections
+ unit: connections
+ chart_type: line
+ dimensions:
+ - name: active
+ - name: limit
+ - name: max_active
+ - name: mysql.threads
+ description: Threads
+ unit: threads
+ chart_type: line
+ dimensions:
+ - name: connected
+ - name: cached
+ - name: running
+ - name: mysql.threads_created
+ description: Threads Creation Rate
+ unit: threads/s
+ chart_type: line
+ dimensions:
+ - name: created
+ - name: mysql.thread_cache_misses
+ description: Threads Cache Misses
+ unit: misses
+ chart_type: line
+ dimensions:
+ - name: misses
+ - name: mysql.innodb_io
+ description: InnoDB I/O Bandwidth
+ unit: KiB/s
+ chart_type: line
+ dimensions:
+ - name: read
+ - name: write
+ - name: mysql.innodb_io_ops
+ description: InnoDB I/O Operations
+ unit: operations/s
+ chart_type: line
+ dimensions:
+ - name: reads
+ - name: writes
+ - name: fsyncs
+ - name: mysql.innodb_io_pending_ops
+ description: InnoDB Pending I/O Operations
+ unit: operations
+ chart_type: line
+ dimensions:
+ - name: reads
+ - name: writes
+ - name: fsyncs
+ - name: mysql.innodb_log
+ description: InnoDB Log Operations
+ unit: operations/s
+ chart_type: line
+ dimensions:
+ - name: waits
+ - name: write_requests
+ - name: writes
+ - name: mysql.innodb_cur_row_lock
+ description: InnoDB Current Row Locks
+ unit: operations
+ chart_type: line
+ dimensions:
+ - name: current waits
+ - name: mysql.innodb_rows
+ description: InnoDB Row Operations
+ unit: operations/s
+ chart_type: area
+ dimensions:
+ - name: inserted
+ - name: read
+ - name: updated
+ - name: deleted
+ - name: mysql.innodb_buffer_pool_pages
+ description: InnoDB Buffer Pool Pages
+ unit: pages
+ chart_type: line
+ dimensions:
+ - name: data
+ - name: dirty
+ - name: free
+ - name: misc
+ - name: total
+ - name: mysql.innodb_buffer_pool_pages_flushed
+ description: InnoDB Buffer Pool Flush Pages Requests
+ unit: requests/s
+ chart_type: line
+ dimensions:
+ - name: flush_pages
+ - name: mysql.innodb_buffer_pool_bytes
+ description: InnoDB Buffer Pool Bytes
+ unit: MiB
+ chart_type: line
+ dimensions:
+ - name: data
+ - name: dirty
+ - name: mysql.innodb_buffer_pool_read_ahead
+ description: InnoDB Buffer Pool Read Pages
+ unit: pages/s
+ chart_type: line
+ dimensions:
+ - name: all
+ - name: evicted
+ - name: mysql.innodb_buffer_pool_read_ahead_rnd
+ description: InnoDB Buffer Pool Random Read-Aheads
+ unit: operations/s
+ chart_type: line
+ dimensions:
+ - name: read-ahead
+ - name: mysql.innodb_buffer_pool_ops
+ description: InnoDB Buffer Pool Operations
+ unit: operations/s
+ chart_type: area
+ dimensions:
+ - name: disk_reads
+ - name: wait_free
+ - name: mysql.innodb_os_log
+ description: InnoDB OS Log Pending Operations
+ unit: operations
+ chart_type: line
+ dimensions:
+ - name: fsyncs
+ - name: writes
+ - name: mysql.innodb_os_log_fsync_writes
+ description: InnoDB OS Log Operations
+ unit: operations/s
+ chart_type: line
+ dimensions:
+ - name: fsyncs
+ - name: mysql.innodb_os_log_io
+ description: InnoDB OS Log Bandwidth
+ unit: KiB/s
+ chart_type: area
+ dimensions:
+ - name: write
+ - name: mysql.innodb_deadlocks
+ description: InnoDB Deadlocks
+ unit: operations/s
+ chart_type: area
+ dimensions:
+ - name: deadlocks
+ - name: mysql.files
+ description: Open Files
+ unit: files
+ chart_type: line
+ dimensions:
+ - name: files
+ - name: mysql.files_rate
+ description: Opened Files Rate
+ unit: files/s
+ chart_type: line
+ dimensions:
+ - name: files
+ - name: mysql.connection_errors
+ description: Connection Errors
+ unit: errors/s
+ chart_type: line
+ dimensions:
+ - name: accept
+ - name: internal
+ - name: max
+ - name: peer_addr
+ - name: select
+ - name: tcpwrap
+ - name: mysql.opened_tables
+ description: Opened Tables
+ unit: tables/s
+ chart_type: line
+ dimensions:
+ - name: tables
+ - name: mysql.open_tables
+ description: Open Tables
+ unit: tables
+ chart_type: area
+ dimensions:
+ - name: cache
+ - name: tables
+ - name: mysql.process_list_fetch_query_duration
+ description: Process List Fetch Duration
+ unit: milliseconds
+ chart_type: line
+ dimensions:
+ - name: duration
+ - name: mysql.process_list_queries_count
+ description: Queries Count
+ unit: queries
+ chart_type: stacked
+ dimensions:
+ - name: system
+ - name: user
+ - name: mysql.process_list_longest_query_duration
+ description: Longest Query Duration
+ unit: seconds
+ chart_type: line
+ dimensions:
+ - name: duration
+ - name: mysql.qcache_ops
+ description: QCache Operations
+ unit: queries/s
+ chart_type: line
+ dimensions:
+ - name: hits
+ - name: lowmem_prunes
+ - name: inserts
+ - name: not_cached
+ - name: mysql.qcache
+ description: QCache Queries in Cache
+ unit: queries
+ chart_type: line
+ dimensions:
+ - name: queries
+ - name: mysql.qcache_freemem
+ description: QCache Free Memory
+ unit: MiB
+ chart_type: area
+ dimensions:
+ - name: free
+ - name: mysql.qcache_memblocks
+ description: QCache Memory Blocks
+ unit: blocks
+ chart_type: line
+ dimensions:
+ - name: free
+ - name: total
+ - name: mysql.galera_writesets
+ description: Replicated Writesets
+ unit: writesets/s
+ chart_type: line
+ dimensions:
+ - name: rx
+ - name: tx
+ - name: mysql.galera_bytes
+ description: Replicated Bytes
+ unit: KiB/s
+ chart_type: area
+ dimensions:
+ - name: rx
+ - name: tx
+ - name: mysql.galera_queue
+ description: Galera Queue
+ unit: writesets
+ chart_type: line
+ dimensions:
+ - name: rx
+ - name: tx
+ - name: mysql.galera_conflicts
+ description: Replication Conflicts
+ unit: transactions
+ chart_type: area
+ dimensions:
+ - name: bf_aborts
+ - name: cert_fails
+ - name: mysql.galera_flow_control
+ description: Flow Control
+ unit: ms
+ chart_type: area
+ dimensions:
+ - name: paused
+ - name: mysql.galera_cluster_status
+ description: Cluster Component Status
+ unit: status
+ chart_type: line
+ dimensions:
+ - name: primary
+ - name: non_primary
+ - name: disconnected
+ - name: mysql.galera_cluster_state
+ description: Cluster Component State
+ unit: state
+ chart_type: line
+ dimensions:
+ - name: undefined
+ - name: joining
+ - name: donor
+ - name: joined
+ - name: synced
+ - name: error
+ - name: mysql.galera_cluster_size
+ description: Number of Nodes in the Cluster
+ unit: nodes
+ chart_type: line
+ dimensions:
+ - name: nodes
+ - name: mysql.galera_cluster_weight
+ description: The Total Weight of the Current Members in the Cluster
+ unit: weight
+ chart_type: line
+ dimensions:
+ - name: weight
+ - name: mysql.galera_connected
+ description: Cluster Connection Status
+ unit: boolean
+ chart_type: line
+ dimensions:
+ - name: connected
+ - name: mysql.galera_ready
+ description: Accept Queries Readiness Status
+ unit: boolean
+ chart_type: line
+ dimensions:
+ - name: ready
+ - name: mysql.galera_open_transactions
+ description: Open Transactions
+ unit: transactions
+ chart_type: line
+ dimensions:
+ - name: open
+ - name: mysql.galera_thread_count
+ description: Total Number of WSRep (applier/rollbacker) Threads
+ unit: threads
+ chart_type: line
+ dimensions:
+ - name: threads
+ - name: mysql.key_blocks
+ description: MyISAM Key Cache Blocks
+ unit: blocks
+ chart_type: line
+ dimensions:
+ - name: unused
+ - name: used
+ - name: not_flushed
+ - name: mysql.key_requests
+ description: MyISAM Key Cache Requests
+ unit: requests/s
+ chart_type: area
+ dimensions:
+ - name: reads
+ - name: writes
+ - name: mysql.key_disk_ops
+ description: MyISAM Key Cache Disk Operations
+ unit: operations/s
+ chart_type: area
+ dimensions:
+ - name: reads
+ - name: writes
+ - name: mysql.binlog_cache
+ description: Binlog Cache
+ unit: transactions/s
+ chart_type: line
+ dimensions:
+ - name: disk
+ - name: all
+ - name: mysql.binlog_stmt_cache
+ description: Binlog Statement Cache
+ unit: statements/s
+ chart_type: line
+ dimensions:
+ - name: disk
+ - name: all
+ - name: connection
+ description: These metrics refer to the replication connection.
+ labels: []
+ metrics:
+ - name: mysql.slave_behind
+ description: Slave Behind Seconds
+ unit: seconds
+ chart_type: line
+ dimensions:
+ - name: seconds
+ - name: mysql.slave_status
+ description: I/O / SQL Thread Running State
+ unit: boolean
+ chart_type: line
+ dimensions:
+ - name: sql_running
+ - name: io_running
+ - name: user
+ description: These metrics refer to the MySQL user.
+ labels:
+ - name: user
+ description: username
+ metrics:
+ - name: mysql.userstats_cpu
+ description: User CPU Time
+ unit: percentage
+ chart_type: line
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: used
+ - name: mysql.userstats_rows
+ description: User Rows Operations
+ unit: operations/s
+ chart_type: stacked
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: read
+ - name: sent
+ - name: updated
+ - name: inserted
+ - name: deleted
+ - name: mysql.userstats_commands
+ description: User Commands
+ unit: commands/s
+ chart_type: stacked
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: select
+ - name: update
+ - name: other
+ - name: mysql.userstats_denied_commands
+ description: User Denied Commands
+ unit: commands/s
+ chart_type: stacked
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: denied
+ - name: mysql.userstats_created_transactions
+ description: User Transactions
+ unit: transactions/s
+ chart_type: area
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: commit
+ - name: rollback
+ - name: mysql.userstats_binlog_written
+ description: User Binlog Written
+ unit: B/s
+ chart_type: line
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: written
+ - name: mysql.userstats_empty_queries
+ description: User Empty Queries
+ unit: queries/s
+ chart_type: line
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: empty
+ - name: mysql.userstats_connections
+ description: User Created Connections
+ unit: connections/s
+ chart_type: line
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: created
+ - name: mysql.userstats_lost_connections
+ description: User Lost Connections
+ unit: connections/s
+ chart_type: line
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: lost
+ - name: mysql.userstats_denied_connections
+ description: User Denied Connections
+ unit: connections/s
+ chart_type: line
+ availability:
+ - MariaDB
+ - Percona
+ dimensions:
+ - name: denied
+ - <<: *module
+ meta:
+ <<: *meta
+ id: collector-go.d.plugin-mariadb
+ monitored_instance:
+ name: MariaDB
+ link: https://mariadb.org/
+ icon_filename: mariadb.svg
+ categories:
+ - data-collection.database-servers
+ - <<: *module
+ meta:
+ <<: *meta
+ id: collector-go.d.plugin-percona_mysql
+ most_popular: false
+ monitored_instance:
+ name: Percona MySQL
+ link: https://www.percona.com/software/mysql-database/percona-server
+ icon_filename: percona.svg
+ categories:
+ - data-collection.database-servers
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/mycnf.go b/src/go/collectors/go.d.plugin/modules/mysql/mycnf.go
new file mode 100644
index 000000000..2069af80d
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/mycnf.go
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "fmt"
+ "os"
+
+ "gopkg.in/ini.v1"
+)
+
+func dsnFromFile(filename string) (string, error) {
+ f, err := ini.Load(filename)
+ if err != nil {
+ return "", err
+ }
+
+ section, err := f.GetSection("client")
+ if err != nil {
+ return "", err
+ }
+
+ defaultUser := getUser()
+ defaultHost := "localhost"
+ defaultPort := "3306"
+
+ user := section.Key("user").String()
+ password := section.Key("password").String()
+ socket := section.Key("socket").String()
+ host := section.Key("host").String()
+ port := section.Key("port").String()
+ database := section.Key("database").String()
+
+ var dsn string
+
+ if user != "" {
+ dsn = user
+ } else {
+ dsn = defaultUser
+ }
+
+ if password != "" {
+ dsn += ":" + password
+ }
+
+ switch {
+ case socket != "":
+ dsn += fmt.Sprintf("@unix(%s)/", socket)
+ case host != "" && port != "":
+ dsn += fmt.Sprintf("@tcp(%s:%s)/", host, port)
+ case host != "":
+ dsn += fmt.Sprintf("@tcp(%s:%s)/", host, defaultPort)
+ case port != "":
+ dsn += fmt.Sprintf("@tcp(%s:%s)/", defaultHost, port)
+ default:
+ dsn += "@/"
+ }
+
+ if database != "" {
+ dsn += database
+ }
+ return dsn, nil
+}
+
+func getUser() (user string) {
+ if user = os.Getenv("LOGNAME"); user != "" {
+ return user
+ }
+ if user = os.Getenv("USER"); user != "" {
+ return user
+ }
+ if user = os.Getenv("LNAME"); user != "" {
+ return user
+ }
+ if user = os.Getenv("USERNAME"); user != "" {
+ return user
+ }
+ return ""
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/mycnf_test.go b/src/go/collectors/go.d.plugin/modules/mysql/mycnf_test.go
new file mode 100644
index 000000000..f68680272
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/mycnf_test.go
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func Test_dsnFromFile(t *testing.T) {
+ user := getUser()
+ tests := map[string]struct {
+ config string
+ expectedDSN string
+ wantErr bool
+ }{
+ "socket": {
+ config: `
+[client]
+socket=/opt/bitnami/mariadb/tmp/mysql.sock
+`,
+ expectedDSN: user + "@unix(/opt/bitnami/mariadb/tmp/mysql.sock)/",
+ },
+ "socket, host, port": {
+ config: `
+[client]
+host=10.0.0.0
+port=3307
+socket=/opt/bitnami/mariadb/tmp/mysql.sock
+`,
+ expectedDSN: user + "@unix(/opt/bitnami/mariadb/tmp/mysql.sock)/",
+ },
+ "host, port": {
+ config: `
+[client]
+host=10.0.0.0
+port=3307
+`,
+ expectedDSN: user + "@tcp(10.0.0.0:3307)/",
+ },
+ "only host": {
+ config: `
+[client]
+host=10.0.0.0
+`,
+ expectedDSN: user + "@tcp(10.0.0.0:3306)/",
+ },
+ "only port": {
+ config: `
+[client]
+port=3307
+`,
+ expectedDSN: user + "@tcp(localhost:3307)/",
+ },
+ "user, password": {
+ config: `
+[client]
+user=user
+password=password
+`,
+ expectedDSN: "user:password@/",
+ },
+ "empty": {
+ config: `
+[client]
+`,
+ expectedDSN: user + "@/",
+ },
+ "no client section": {
+ config: `
+[no_client]
+`,
+ wantErr: true,
+ },
+ }
+ pattern := "netdata-godplugin-mysql-dsnFromFile-*"
+ dir, err := os.MkdirTemp(os.TempDir(), pattern)
+ require.NoError(t, err)
+ defer func() { _ = os.RemoveAll(dir) }()
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ f, err := os.CreateTemp(dir, name)
+ require.NoError(t, err)
+ _ = f.Close()
+ defer func() { _ = os.Remove(f.Name()) }()
+ _ = os.WriteFile(f.Name(), []byte(test.config), 0644)
+
+ if dsn, err := dsnFromFile(f.Name()); test.wantErr {
+ assert.Error(t, err)
+ } else {
+ assert.NoError(t, err)
+ assert.Equal(t, test.expectedDSN, dsn)
+ }
+ })
+ }
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/mysql.go b/src/go/collectors/go.d.plugin/modules/mysql/mysql.go
new file mode 100644
index 000000000..f970395e2
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/mysql.go
@@ -0,0 +1,169 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "database/sql"
+ _ "embed"
+ "errors"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/netdata/netdata/go/go.d.plugin/agent/module"
+ "github.com/netdata/netdata/go/go.d.plugin/pkg/web"
+
+ "github.com/blang/semver/v4"
+ "github.com/go-sql-driver/mysql"
+ _ "github.com/go-sql-driver/mysql"
+)
+
+//go:embed "config_schema.json"
+var configSchema string
+
+func init() {
+ module.Register("mysql", module.Creator{
+ JobConfigSchema: configSchema,
+ Create: func() module.Module { return New() },
+ Config: func() any { return &Config{} },
+ })
+}
+
+func New() *MySQL {
+ return &MySQL{
+ Config: Config{
+ DSN: "root@tcp(localhost:3306)/",
+ Timeout: web.Duration(time.Second),
+ },
+
+ charts: baseCharts.Copy(),
+ addInnoDBOSLogOnce: &sync.Once{},
+ addBinlogOnce: &sync.Once{},
+ addMyISAMOnce: &sync.Once{},
+ addInnodbDeadlocksOnce: &sync.Once{},
+ addGaleraOnce: &sync.Once{},
+ addQCacheOnce: &sync.Once{},
+ addTableOpenCacheOverflowsOnce: &sync.Once{},
+ doDisableSessionQueryLog: true,
+ doSlaveStatus: true,
+ doUserStatistics: true,
+ collectedReplConns: make(map[string]bool),
+ collectedUsers: make(map[string]bool),
+
+ recheckGlobalVarsEvery: time.Minute * 10,
+ }
+}
+
+type Config struct {
+ UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
+ DSN string `yaml:"dsn" json:"dsn"`
+ MyCNF string `yaml:"my.cnf,omitempty" json:"my.cnf"`
+ Timeout web.Duration `yaml:"timeout,omitempty" json:"timeout"`
+}
+
+type MySQL struct {
+ module.Base
+ Config `yaml:",inline" json:""`
+
+ charts *module.Charts
+ addInnoDBOSLogOnce *sync.Once
+ addBinlogOnce *sync.Once
+ addMyISAMOnce *sync.Once
+ addInnodbDeadlocksOnce *sync.Once
+ addGaleraOnce *sync.Once
+ addQCacheOnce *sync.Once
+ addTableOpenCacheOverflowsOnce *sync.Once
+
+ db *sql.DB
+
+ safeDSN string
+ version *semver.Version
+ isMariaDB bool
+ isPercona bool
+
+ doDisableSessionQueryLog bool
+
+ doSlaveStatus bool
+ collectedReplConns map[string]bool
+ doUserStatistics bool
+ collectedUsers map[string]bool
+
+ recheckGlobalVarsTime time.Time
+ recheckGlobalVarsEvery time.Duration
+ varMaxConns int64
+ varTableOpenCache int64
+ varDisabledStorageEngine string
+ varLogBin string
+ varPerformanceSchema string
+}
+
+func (m *MySQL) Configuration() any {
+ return m.Config
+}
+
+func (m *MySQL) Init() error {
+ if m.MyCNF != "" {
+ dsn, err := dsnFromFile(m.MyCNF)
+ if err != nil {
+ m.Error(err)
+ return err
+ }
+ m.DSN = dsn
+ }
+
+ if m.DSN == "" {
+ m.Error("dsn not set")
+ return errors.New("dsn not set")
+ }
+
+ cfg, err := mysql.ParseDSN(m.DSN)
+ if err != nil {
+ m.Errorf("error on parsing DSN: %v", err)
+ return err
+ }
+
+ cfg.Passwd = strings.Repeat("*", len(cfg.Passwd))
+ m.safeDSN = cfg.FormatDSN()
+
+ m.Debugf("using DSN [%s]", m.DSN)
+
+ return nil
+}
+
+func (m *MySQL) Check() error {
+ mx, err := m.collect()
+ if err != nil {
+ m.Error(err)
+ return err
+ }
+ if len(mx) == 0 {
+ return errors.New("no metrics collected")
+ }
+ return nil
+}
+
+func (m *MySQL) Charts() *module.Charts {
+ return m.charts
+}
+
+func (m *MySQL) Collect() map[string]int64 {
+ mx, err := m.collect()
+ if err != nil {
+ m.Error(err)
+ }
+
+ if len(mx) == 0 {
+ return nil
+ }
+ return mx
+}
+
+func (m *MySQL) Cleanup() {
+ if m.db == nil {
+ return
+ }
+ if err := m.db.Close(); err != nil {
+ m.Errorf("cleanup: error on closing the mysql database [%s]: %v", m.safeDSN, err)
+ }
+ m.db = nil
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/mysql_test.go b/src/go/collectors/go.d.plugin/modules/mysql/mysql_test.go
new file mode 100644
index 000000000..da64507e4
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/mysql_test.go
@@ -0,0 +1,1759 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package mysql
+
+import (
+ "bufio"
+ "bytes"
+ "database/sql/driver"
+ "errors"
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/netdata/netdata/go/go.d.plugin/agent/module"
+
+ "github.com/DATA-DOG/go-sqlmock"
+ "github.com/blang/semver/v4"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+var (
+ dataConfigJSON, _ = os.ReadFile("testdata/config.json")
+ dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
+
+ dataSessionVariables, _ = os.ReadFile("testdata/session_variables.txt")
+
+ dataMySQLVer8030Version, _ = os.ReadFile("testdata/mysql/v8.0.30/version.txt")
+ dataMySQLVer8030GlobalStatus, _ = os.ReadFile("testdata/mysql/v8.0.30/global_status.txt")
+ dataMySQLVer8030GlobalVariables, _ = os.ReadFile("testdata/mysql/v8.0.30/global_variables.txt")
+ dataMySQLVer8030ReplicaStatusMultiSource, _ = os.ReadFile("testdata/mysql/v8.0.30/replica_status_multi_source.txt")
+ dataMySQLVer8030ProcessList, _ = os.ReadFile("testdata/mysql/v8.0.30/process_list.txt")
+
+ dataPerconaVer8029Version, _ = os.ReadFile("testdata/percona/v8.0.29/version.txt")
+ dataPerconaVer8029GlobalStatus, _ = os.ReadFile("testdata/percona/v8.0.29/global_status.txt")
+ dataPerconaVer8029GlobalVariables, _ = os.ReadFile("testdata/percona/v8.0.29/global_variables.txt")
+ dataPerconaVer8029UserStatistics, _ = os.ReadFile("testdata/percona/v8.0.29/user_statistics.txt")
+ dataPerconaV8029ProcessList, _ = os.ReadFile("testdata/percona/v8.0.29/process_list.txt")
+
+ dataMariaVer5564Version, _ = os.ReadFile("testdata/mariadb/v5.5.64/version.txt")
+ dataMariaVer5564GlobalStatus, _ = os.ReadFile("testdata/mariadb/v5.5.64/global_status.txt")
+ dataMariaVer5564GlobalVariables, _ = os.ReadFile("testdata/mariadb/v5.5.64/global_variables.txt")
+ dataMariaVer5564ProcessList, _ = os.ReadFile("testdata/mariadb/v5.5.64/process_list.txt")
+
+ dataMariaVer1084Version, _ = os.ReadFile("testdata/mariadb/v10.8.4/version.txt")
+ dataMariaVer1084GlobalStatus, _ = os.ReadFile("testdata/mariadb/v10.8.4/global_status.txt")
+ dataMariaVer1084GlobalVariables, _ = os.ReadFile("testdata/mariadb/v10.8.4/global_variables.txt")
+ dataMariaVer1084AllSlavesStatusSingleSource, _ = os.ReadFile("testdata/mariadb/v10.8.4/all_slaves_status_single_source.txt")
+ dataMariaVer1084AllSlavesStatusMultiSource, _ = os.ReadFile("testdata/mariadb/v10.8.4/all_slaves_status_multi_source.txt")
+ dataMariaVer1084UserStatistics, _ = os.ReadFile("testdata/mariadb/v10.8.4/user_statistics.txt")
+ dataMariaVer1084ProcessList, _ = os.ReadFile("testdata/mariadb/v10.8.4/process_list.txt")
+
+ dataMariaGaleraClusterVer1084Version, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/version.txt")
+ dataMariaGaleraClusterVer1084GlobalStatus, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/global_status.txt")
+ dataMariaGaleraClusterVer1084GlobalVariables, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/global_variables.txt")
+ dataMariaGaleraClusterVer1084UserStatistics, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/user_statistics.txt")
+ dataMariaGaleraClusterVer1084ProcessList, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/process_list.txt")
+)
+
+func Test_testDataIsValid(t *testing.T) {
+ for name, data := range map[string][]byte{
+ "dataConfigJSON": dataConfigJSON,
+ "dataConfigYAML": dataConfigYAML,
+ "dataSessionVariables": dataSessionVariables,
+ "dataMySQLVer8030Version": dataMySQLVer8030Version,
+ "dataMySQLVer8030GlobalStatus": dataMySQLVer8030GlobalStatus,
+ "dataMySQLVer8030GlobalVariables": dataMySQLVer8030GlobalVariables,
+ "dataMySQLVer8030ReplicaStatusMultiSource": dataMySQLVer8030ReplicaStatusMultiSource,
+ "dataMySQLVer8030ProcessList": dataMySQLVer8030ProcessList,
+ "dataPerconaVer8029Version": dataPerconaVer8029Version,
+ "dataPerconaVer8029GlobalStatus": dataPerconaVer8029GlobalStatus,
+ "dataPerconaVer8029GlobalVariables": dataPerconaVer8029GlobalVariables,
+ "dataPerconaVer8029UserStatistics": dataPerconaVer8029UserStatistics,
+ "dataPerconaV8029ProcessList": dataPerconaV8029ProcessList,
+ "dataMariaVer5564Version": dataMariaVer5564Version,
+ "dataMariaVer5564GlobalStatus": dataMariaVer5564GlobalStatus,
+ "dataMariaVer5564GlobalVariables": dataMariaVer5564GlobalVariables,
+ "dataMariaVer5564ProcessList": dataMariaVer5564ProcessList,
+ "dataMariaVer1084Version": dataMariaVer1084Version,
+ "dataMariaVer1084GlobalStatus": dataMariaVer1084GlobalStatus,
+ "dataMariaVer1084GlobalVariables": dataMariaVer1084GlobalVariables,
+ "dataMariaVer1084AllSlavesStatusSingleSource": dataMariaVer1084AllSlavesStatusSingleSource,
+ "dataMariaVer1084AllSlavesStatusMultiSource": dataMariaVer1084AllSlavesStatusMultiSource,
+ "dataMariaVer1084UserStatistics": dataMariaVer1084UserStatistics,
+ "dataMariaVer1084ProcessList": dataMariaVer1084ProcessList,
+ "dataMariaGaleraClusterVer1084Version": dataMariaGaleraClusterVer1084Version,
+ "dataMariaGaleraClusterVer1084GlobalStatus": dataMariaGaleraClusterVer1084GlobalStatus,
+ "dataMariaGaleraClusterVer1084GlobalVariables": dataMariaGaleraClusterVer1084GlobalVariables,
+ "dataMariaGaleraClusterVer1084UserStatistics": dataMariaGaleraClusterVer1084UserStatistics,
+ "dataMariaGaleraClusterVer1084ProcessList": dataMariaGaleraClusterVer1084ProcessList,
+ } {
+ require.NotNil(t, data, fmt.Sprintf("read data: %s", name))
+ _, err := prepareMockRows(data)
+ require.NoError(t, err, fmt.Sprintf("prepare mock rows: %s", name))
+ }
+}
+
+func TestMySQL_ConfigurationSerialize(t *testing.T) {
+ module.TestConfigurationSerialize(t, &MySQL{}, dataConfigJSON, dataConfigYAML)
+}
+
+func TestMySQL_Init(t *testing.T) {
+ tests := map[string]struct {
+ config Config
+ wantFail bool
+ }{
+ "empty DSN": {
+ config: Config{DSN: ""},
+ wantFail: true,
+ },
+ }
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ mySQL := New()
+ mySQL.Config = test.config
+
+ if test.wantFail {
+ assert.Error(t, mySQL.Init())
+ } else {
+ assert.NoError(t, mySQL.Init())
+ }
+ })
+ }
+}
+
+func TestMySQL_Cleanup(t *testing.T) {
+ tests := map[string]func(t *testing.T) (mySQL *MySQL, cleanup func()){
+ "db connection not initialized": func(t *testing.T) (mySQL *MySQL, cleanup func()) {
+ return New(), func() {}
+ },
+ "db connection initialized": func(t *testing.T) (mySQL *MySQL, cleanup func()) {
+ db, mock, err := sqlmock.New()
+ require.NoError(t, err)
+
+ mock.ExpectClose()
+ mySQL = New()
+ mySQL.db = db
+ cleanup = func() { _ = db.Close() }
+
+ return mySQL, cleanup
+ },
+ }
+
+ for name, prepare := range tests {
+ t.Run(name, func(t *testing.T) {
+ mySQL, cleanup := prepare(t)
+ defer cleanup()
+
+ assert.NotPanics(t, mySQL.Cleanup)
+ assert.Nil(t, mySQL.db)
+ })
+ }
+}
+
+func TestMySQL_Charts(t *testing.T) {
+ assert.NotNil(t, New().Charts())
+}
+
+func TestMySQL_Check(t *testing.T) {
+ tests := map[string]struct {
+ prepareMock func(t *testing.T, m sqlmock.Sqlmock)
+ wantFail bool
+ }{
+ "success on all queries": {
+ wantFail: false,
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
+ },
+ },
+ "fails when error on querying version": {
+ wantFail: true,
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpectErr(m, queryShowVersion)
+ },
+ },
+ "fails when error on querying global status": {
+ wantFail: true,
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpectErr(m, queryShowGlobalStatus)
+ },
+ },
+ "fails when error on querying global variables": {
+ wantFail: true,
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpectErr(m, queryShowGlobalStatus)
+ },
+ },
+ "success when error on querying slave status": {
+ wantFail: false,
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpectErr(m, queryShowAllSlavesStatus)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
+ },
+ },
+ "success when error on querying user statistics": {
+ wantFail: false,
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
+ mockExpectErr(m, queryShowUserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
+ },
+ },
+ "success when error on querying process list": {
+ wantFail: false,
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
+ mockExpectErr(m, queryShowProcessList)
+ },
+ },
+ }
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ db, mock, err := sqlmock.New(
+ sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
+ )
+ require.NoError(t, err)
+ my := New()
+ my.db = db
+ defer func() { _ = db.Close() }()
+
+ require.NoError(t, my.Init())
+
+ test.prepareMock(t, mock)
+
+ if test.wantFail {
+ assert.Error(t, my.Check())
+ } else {
+ assert.NoError(t, my.Check())
+ }
+ assert.NoError(t, mock.ExpectationsWereMet())
+ })
+ }
+}
+
+func TestMySQL_Collect(t *testing.T) {
+ type testCaseStep struct {
+ prepareMock func(t *testing.T, m sqlmock.Sqlmock)
+ check func(t *testing.T, my *MySQL)
+ }
+ tests := map[string][]testCaseStep{
+ "MariaDB-Standalone[v5.5.46]: success on all queries": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer5564Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer5564GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer5564GlobalVariables)
+ mockExpect(t, m, queryShowSlaveStatus, nil)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer5564ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+ "aborted_connects": 0,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 0,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 639,
+ "bytes_sent": 41620,
+ "com_delete": 0,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 4,
+ "com_update": 0,
+ "connections": 4,
+ "created_tmp_disk_tables": 0,
+ "created_tmp_files": 6,
+ "created_tmp_tables": 5,
+ "handler_commit": 0,
+ "handler_delete": 0,
+ "handler_prepare": 0,
+ "handler_read_first": 0,
+ "handler_read_key": 0,
+ "handler_read_next": 0,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 1264,
+ "handler_rollback": 0,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 0,
+ "handler_write": 0,
+ "innodb_buffer_pool_bytes_data": 2342912,
+ "innodb_buffer_pool_bytes_dirty": 0,
+ "innodb_buffer_pool_pages_data": 143,
+ "innodb_buffer_pool_pages_dirty": 0,
+ "innodb_buffer_pool_pages_flushed": 0,
+ "innodb_buffer_pool_pages_free": 16240,
+ "innodb_buffer_pool_pages_misc": 0,
+ "innodb_buffer_pool_pages_total": 16383,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 459,
+ "innodb_buffer_pool_reads": 144,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 0,
+ "innodb_data_fsyncs": 3,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 4542976,
+ "innodb_data_reads": 155,
+ "innodb_data_writes": 3,
+ "innodb_data_written": 1536,
+ "innodb_deadlocks": 0,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 0,
+ "innodb_log_writes": 1,
+ "innodb_os_log_fsyncs": 3,
+ "innodb_os_log_pending_fsyncs": 0,
+ "innodb_os_log_pending_writes": 0,
+ "innodb_os_log_written": 512,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 0,
+ "innodb_rows_read": 0,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 107171,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 100,
+ "max_used_connections": 1,
+ "open_files": 21,
+ "open_tables": 26,
+ "opened_files": 84,
+ "opened_tables": 0,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "qcache_free_blocks": 1,
+ "qcache_free_memory": 67091120,
+ "qcache_hits": 0,
+ "qcache_inserts": 0,
+ "qcache_lowmem_prunes": 0,
+ "qcache_not_cached": 4,
+ "qcache_queries_in_cache": 0,
+ "qcache_total_blocks": 1,
+ "queries": 12,
+ "questions": 11,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 5,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 0,
+ "table_locks_immediate": 36,
+ "table_locks_waited": 0,
+ "table_open_cache": 400,
+ "thread_cache_misses": 2500,
+ "threads_cached": 0,
+ "threads_connected": 1,
+ "threads_created": 1,
+ "threads_running": 1,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ "MariaDB-Standalone[v10.8.4]: success on all queries": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpect(t, m, queryShowAllSlavesStatus, nil)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+
+ "aborted_connects": 2,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 0,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 81392,
+ "bytes_sent": 56794,
+ "com_delete": 0,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 6,
+ "com_update": 0,
+ "connection_errors_accept": 0,
+ "connection_errors_internal": 0,
+ "connection_errors_max_connections": 0,
+ "connection_errors_peer_address": 0,
+ "connection_errors_select": 0,
+ "connection_errors_tcpwrap": 0,
+ "connections": 12,
+ "created_tmp_disk_tables": 0,
+ "created_tmp_files": 5,
+ "created_tmp_tables": 2,
+ "handler_commit": 30,
+ "handler_delete": 0,
+ "handler_prepare": 0,
+ "handler_read_first": 7,
+ "handler_read_key": 7,
+ "handler_read_next": 3,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 626,
+ "handler_rollback": 0,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 3,
+ "handler_write": 13,
+ "innodb_buffer_pool_bytes_data": 5062656,
+ "innodb_buffer_pool_bytes_dirty": 475136,
+ "innodb_buffer_pool_pages_data": 309,
+ "innodb_buffer_pool_pages_dirty": 29,
+ "innodb_buffer_pool_pages_flushed": 0,
+ "innodb_buffer_pool_pages_free": 7755,
+ "innodb_buffer_pool_pages_misc": 0,
+ "innodb_buffer_pool_pages_total": 8064,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 1911,
+ "innodb_buffer_pool_reads": 171,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 148,
+ "innodb_data_fsyncs": 17,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 2801664,
+ "innodb_data_reads": 185,
+ "innodb_data_writes": 16,
+ "innodb_data_written": 0,
+ "innodb_deadlocks": 0,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 109,
+ "innodb_log_writes": 15,
+ "innodb_os_log_written": 6097,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 0,
+ "innodb_rows_read": 0,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 107163,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 151,
+ "max_used_connections": 1,
+ "open_files": 29,
+ "open_tables": 10,
+ "opened_files": 100,
+ "opened_tables": 16,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "qcache_free_blocks": 1,
+ "qcache_free_memory": 1031272,
+ "qcache_hits": 0,
+ "qcache_inserts": 0,
+ "qcache_lowmem_prunes": 0,
+ "qcache_not_cached": 0,
+ "qcache_queries_in_cache": 0,
+ "qcache_total_blocks": 1,
+ "queries": 33,
+ "questions": 24,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 2,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 0,
+ "table_locks_immediate": 60,
+ "table_locks_waited": 0,
+ "table_open_cache": 2000,
+ "table_open_cache_overflows": 0,
+ "thread_cache_misses": 1666,
+ "threads_cached": 0,
+ "threads_connected": 1,
+ "threads_created": 2,
+ "threads_running": 3,
+ "userstats_netdata_access_denied": 33,
+ "userstats_netdata_binlog_bytes_written": 0,
+ "userstats_netdata_commit_transactions": 0,
+ "userstats_netdata_cpu_time": 77,
+ "userstats_netdata_denied_connections": 49698,
+ "userstats_netdata_empty_queries": 66,
+ "userstats_netdata_lost_connections": 0,
+ "userstats_netdata_other_commands": 0,
+ "userstats_netdata_rollback_transactions": 0,
+ "userstats_netdata_rows_deleted": 0,
+ "userstats_netdata_rows_inserted": 0,
+ "userstats_netdata_rows_read": 0,
+ "userstats_netdata_rows_sent": 99,
+ "userstats_netdata_rows_updated": 0,
+ "userstats_netdata_select_commands": 33,
+ "userstats_netdata_total_connections": 1,
+ "userstats_netdata_update_commands": 0,
+ "userstats_root_access_denied": 0,
+ "userstats_root_binlog_bytes_written": 0,
+ "userstats_root_commit_transactions": 0,
+ "userstats_root_cpu_time": 0,
+ "userstats_root_denied_connections": 0,
+ "userstats_root_empty_queries": 0,
+ "userstats_root_lost_connections": 0,
+ "userstats_root_other_commands": 0,
+ "userstats_root_rollback_transactions": 0,
+ "userstats_root_rows_deleted": 0,
+ "userstats_root_rows_inserted": 0,
+ "userstats_root_rows_read": 0,
+ "userstats_root_rows_sent": 2,
+ "userstats_root_rows_updated": 0,
+ "userstats_root_select_commands": 0,
+ "userstats_root_total_connections": 1,
+ "userstats_root_update_commands": 0,
+ "wsrep_cluster_size": 0,
+ "wsrep_cluster_status_disconnected": 1,
+ "wsrep_cluster_status_non_primary": 0,
+ "wsrep_cluster_status_primary": 0,
+ "wsrep_connected": 0,
+ "wsrep_local_bf_aborts": 0,
+ "wsrep_ready": 0,
+ "wsrep_thread_count": 0,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ "MariaDB-SingleSourceReplication[v10.8.4]: success on all queries": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusSingleSource)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+ "aborted_connects": 2,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 0,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 81392,
+ "bytes_sent": 56794,
+ "com_delete": 0,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 6,
+ "com_update": 0,
+ "connection_errors_accept": 0,
+ "connection_errors_internal": 0,
+ "connection_errors_max_connections": 0,
+ "connection_errors_peer_address": 0,
+ "connection_errors_select": 0,
+ "connection_errors_tcpwrap": 0,
+ "connections": 12,
+ "created_tmp_disk_tables": 0,
+ "created_tmp_files": 5,
+ "created_tmp_tables": 2,
+ "handler_commit": 30,
+ "handler_delete": 0,
+ "handler_prepare": 0,
+ "handler_read_first": 7,
+ "handler_read_key": 7,
+ "handler_read_next": 3,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 626,
+ "handler_rollback": 0,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 3,
+ "handler_write": 13,
+ "innodb_buffer_pool_bytes_data": 5062656,
+ "innodb_buffer_pool_bytes_dirty": 475136,
+ "innodb_buffer_pool_pages_data": 309,
+ "innodb_buffer_pool_pages_dirty": 29,
+ "innodb_buffer_pool_pages_flushed": 0,
+ "innodb_buffer_pool_pages_free": 7755,
+ "innodb_buffer_pool_pages_misc": 0,
+ "innodb_buffer_pool_pages_total": 8064,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 1911,
+ "innodb_buffer_pool_reads": 171,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 148,
+ "innodb_data_fsyncs": 17,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 2801664,
+ "innodb_data_reads": 185,
+ "innodb_data_writes": 16,
+ "innodb_data_written": 0,
+ "innodb_deadlocks": 0,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 109,
+ "innodb_log_writes": 15,
+ "innodb_os_log_written": 6097,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 0,
+ "innodb_rows_read": 0,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 107163,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 151,
+ "max_used_connections": 1,
+ "open_files": 29,
+ "open_tables": 10,
+ "opened_files": 100,
+ "opened_tables": 16,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "qcache_free_blocks": 1,
+ "qcache_free_memory": 1031272,
+ "qcache_hits": 0,
+ "qcache_inserts": 0,
+ "qcache_lowmem_prunes": 0,
+ "qcache_not_cached": 0,
+ "qcache_queries_in_cache": 0,
+ "qcache_total_blocks": 1,
+ "queries": 33,
+ "questions": 24,
+ "seconds_behind_master": 0,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 2,
+ "slave_io_running": 1,
+ "slave_sql_running": 1,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 0,
+ "table_locks_immediate": 60,
+ "table_locks_waited": 0,
+ "table_open_cache": 2000,
+ "table_open_cache_overflows": 0,
+ "thread_cache_misses": 1666,
+ "threads_cached": 0,
+ "threads_connected": 1,
+ "threads_created": 2,
+ "threads_running": 3,
+ "userstats_netdata_access_denied": 33,
+ "userstats_netdata_binlog_bytes_written": 0,
+ "userstats_netdata_commit_transactions": 0,
+ "userstats_netdata_cpu_time": 77,
+ "userstats_netdata_denied_connections": 49698,
+ "userstats_netdata_empty_queries": 66,
+ "userstats_netdata_lost_connections": 0,
+ "userstats_netdata_other_commands": 0,
+ "userstats_netdata_rollback_transactions": 0,
+ "userstats_netdata_rows_deleted": 0,
+ "userstats_netdata_rows_inserted": 0,
+ "userstats_netdata_rows_read": 0,
+ "userstats_netdata_rows_sent": 99,
+ "userstats_netdata_rows_updated": 0,
+ "userstats_netdata_select_commands": 33,
+ "userstats_netdata_total_connections": 1,
+ "userstats_netdata_update_commands": 0,
+ "userstats_root_access_denied": 0,
+ "userstats_root_binlog_bytes_written": 0,
+ "userstats_root_commit_transactions": 0,
+ "userstats_root_cpu_time": 0,
+ "userstats_root_denied_connections": 0,
+ "userstats_root_empty_queries": 0,
+ "userstats_root_lost_connections": 0,
+ "userstats_root_other_commands": 0,
+ "userstats_root_rollback_transactions": 0,
+ "userstats_root_rows_deleted": 0,
+ "userstats_root_rows_inserted": 0,
+ "userstats_root_rows_read": 0,
+ "userstats_root_rows_sent": 2,
+ "userstats_root_rows_updated": 0,
+ "userstats_root_select_commands": 0,
+ "userstats_root_total_connections": 1,
+ "userstats_root_update_commands": 0,
+ "wsrep_cluster_size": 0,
+ "wsrep_cluster_status_disconnected": 1,
+ "wsrep_cluster_status_non_primary": 0,
+ "wsrep_cluster_status_primary": 0,
+ "wsrep_connected": 0,
+ "wsrep_local_bf_aborts": 0,
+ "wsrep_ready": 0,
+ "wsrep_thread_count": 0,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ "MariaDB-MultiSourceReplication[v10.8.4]: success on all queries": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+ "aborted_connects": 2,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 0,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 81392,
+ "bytes_sent": 56794,
+ "com_delete": 0,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 6,
+ "com_update": 0,
+ "connection_errors_accept": 0,
+ "connection_errors_internal": 0,
+ "connection_errors_max_connections": 0,
+ "connection_errors_peer_address": 0,
+ "connection_errors_select": 0,
+ "connection_errors_tcpwrap": 0,
+ "connections": 12,
+ "created_tmp_disk_tables": 0,
+ "created_tmp_files": 5,
+ "created_tmp_tables": 2,
+ "handler_commit": 30,
+ "handler_delete": 0,
+ "handler_prepare": 0,
+ "handler_read_first": 7,
+ "handler_read_key": 7,
+ "handler_read_next": 3,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 626,
+ "handler_rollback": 0,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 3,
+ "handler_write": 13,
+ "innodb_buffer_pool_bytes_data": 5062656,
+ "innodb_buffer_pool_bytes_dirty": 475136,
+ "innodb_buffer_pool_pages_data": 309,
+ "innodb_buffer_pool_pages_dirty": 29,
+ "innodb_buffer_pool_pages_flushed": 0,
+ "innodb_buffer_pool_pages_free": 7755,
+ "innodb_buffer_pool_pages_misc": 0,
+ "innodb_buffer_pool_pages_total": 8064,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 1911,
+ "innodb_buffer_pool_reads": 171,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 148,
+ "innodb_data_fsyncs": 17,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 2801664,
+ "innodb_data_reads": 185,
+ "innodb_data_writes": 16,
+ "innodb_data_written": 0,
+ "innodb_deadlocks": 0,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 109,
+ "innodb_log_writes": 15,
+ "innodb_os_log_written": 6097,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 0,
+ "innodb_rows_read": 0,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 107163,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 151,
+ "max_used_connections": 1,
+ "open_files": 29,
+ "open_tables": 10,
+ "opened_files": 100,
+ "opened_tables": 16,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "qcache_free_blocks": 1,
+ "qcache_free_memory": 1031272,
+ "qcache_hits": 0,
+ "qcache_inserts": 0,
+ "qcache_lowmem_prunes": 0,
+ "qcache_not_cached": 0,
+ "qcache_queries_in_cache": 0,
+ "qcache_total_blocks": 1,
+ "queries": 33,
+ "questions": 24,
+ "seconds_behind_master_master1": 0,
+ "seconds_behind_master_master2": 0,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 2,
+ "slave_io_running_master1": 1,
+ "slave_io_running_master2": 1,
+ "slave_sql_running_master1": 1,
+ "slave_sql_running_master2": 1,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 0,
+ "table_locks_immediate": 60,
+ "table_locks_waited": 0,
+ "table_open_cache": 2000,
+ "table_open_cache_overflows": 0,
+ "thread_cache_misses": 1666,
+ "threads_cached": 0,
+ "threads_connected": 1,
+ "threads_created": 2,
+ "threads_running": 3,
+ "userstats_netdata_access_denied": 33,
+ "userstats_netdata_binlog_bytes_written": 0,
+ "userstats_netdata_commit_transactions": 0,
+ "userstats_netdata_cpu_time": 77,
+ "userstats_netdata_denied_connections": 49698,
+ "userstats_netdata_empty_queries": 66,
+ "userstats_netdata_lost_connections": 0,
+ "userstats_netdata_other_commands": 0,
+ "userstats_netdata_rollback_transactions": 0,
+ "userstats_netdata_rows_deleted": 0,
+ "userstats_netdata_rows_inserted": 0,
+ "userstats_netdata_rows_read": 0,
+ "userstats_netdata_rows_sent": 99,
+ "userstats_netdata_rows_updated": 0,
+ "userstats_netdata_select_commands": 33,
+ "userstats_netdata_total_connections": 1,
+ "userstats_netdata_update_commands": 0,
+ "userstats_root_access_denied": 0,
+ "userstats_root_binlog_bytes_written": 0,
+ "userstats_root_commit_transactions": 0,
+ "userstats_root_cpu_time": 0,
+ "userstats_root_denied_connections": 0,
+ "userstats_root_empty_queries": 0,
+ "userstats_root_lost_connections": 0,
+ "userstats_root_other_commands": 0,
+ "userstats_root_rollback_transactions": 0,
+ "userstats_root_rows_deleted": 0,
+ "userstats_root_rows_inserted": 0,
+ "userstats_root_rows_read": 0,
+ "userstats_root_rows_sent": 2,
+ "userstats_root_rows_updated": 0,
+ "userstats_root_select_commands": 0,
+ "userstats_root_total_connections": 1,
+ "userstats_root_update_commands": 0,
+ "wsrep_cluster_size": 0,
+ "wsrep_cluster_status_disconnected": 1,
+ "wsrep_cluster_status_non_primary": 0,
+ "wsrep_cluster_status_primary": 0,
+ "wsrep_connected": 0,
+ "wsrep_local_bf_aborts": 0,
+ "wsrep_ready": 0,
+ "wsrep_thread_count": 0,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ "MariaDB-MultiSourceReplication[v10.8.4]: error on slaves status (no permissions)": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
+ mockExpectErr(m, queryShowAllSlavesStatus)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1084UserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+ "aborted_connects": 2,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 0,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 81392,
+ "bytes_sent": 56794,
+ "com_delete": 0,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 6,
+ "com_update": 0,
+ "connection_errors_accept": 0,
+ "connection_errors_internal": 0,
+ "connection_errors_max_connections": 0,
+ "connection_errors_peer_address": 0,
+ "connection_errors_select": 0,
+ "connection_errors_tcpwrap": 0,
+ "connections": 12,
+ "created_tmp_disk_tables": 0,
+ "created_tmp_files": 5,
+ "created_tmp_tables": 2,
+ "handler_commit": 30,
+ "handler_delete": 0,
+ "handler_prepare": 0,
+ "handler_read_first": 7,
+ "handler_read_key": 7,
+ "handler_read_next": 3,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 626,
+ "handler_rollback": 0,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 3,
+ "handler_write": 13,
+ "innodb_buffer_pool_bytes_data": 5062656,
+ "innodb_buffer_pool_bytes_dirty": 475136,
+ "innodb_buffer_pool_pages_data": 309,
+ "innodb_buffer_pool_pages_dirty": 29,
+ "innodb_buffer_pool_pages_flushed": 0,
+ "innodb_buffer_pool_pages_free": 7755,
+ "innodb_buffer_pool_pages_misc": 0,
+ "innodb_buffer_pool_pages_total": 8064,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 1911,
+ "innodb_buffer_pool_reads": 171,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 148,
+ "innodb_data_fsyncs": 17,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 2801664,
+ "innodb_data_reads": 185,
+ "innodb_data_writes": 16,
+ "innodb_data_written": 0,
+ "innodb_deadlocks": 0,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 109,
+ "innodb_log_writes": 15,
+ "innodb_os_log_written": 6097,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 0,
+ "innodb_rows_read": 0,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 107163,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 151,
+ "max_used_connections": 1,
+ "open_files": 29,
+ "open_tables": 10,
+ "opened_files": 100,
+ "opened_tables": 16,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "qcache_free_blocks": 1,
+ "qcache_free_memory": 1031272,
+ "qcache_hits": 0,
+ "qcache_inserts": 0,
+ "qcache_lowmem_prunes": 0,
+ "qcache_not_cached": 0,
+ "qcache_queries_in_cache": 0,
+ "qcache_total_blocks": 1,
+ "queries": 33,
+ "questions": 24,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 2,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 0,
+ "table_locks_immediate": 60,
+ "table_locks_waited": 0,
+ "table_open_cache": 2000,
+ "table_open_cache_overflows": 0,
+ "thread_cache_misses": 1666,
+ "threads_cached": 0,
+ "threads_connected": 1,
+ "threads_created": 2,
+ "threads_running": 3,
+ "userstats_netdata_access_denied": 33,
+ "userstats_netdata_binlog_bytes_written": 0,
+ "userstats_netdata_commit_transactions": 0,
+ "userstats_netdata_cpu_time": 77,
+ "userstats_netdata_denied_connections": 49698,
+ "userstats_netdata_empty_queries": 66,
+ "userstats_netdata_lost_connections": 0,
+ "userstats_netdata_other_commands": 0,
+ "userstats_netdata_rollback_transactions": 0,
+ "userstats_netdata_rows_deleted": 0,
+ "userstats_netdata_rows_inserted": 0,
+ "userstats_netdata_rows_read": 0,
+ "userstats_netdata_rows_sent": 99,
+ "userstats_netdata_rows_updated": 0,
+ "userstats_netdata_select_commands": 33,
+ "userstats_netdata_total_connections": 1,
+ "userstats_netdata_update_commands": 0,
+ "userstats_root_access_denied": 0,
+ "userstats_root_binlog_bytes_written": 0,
+ "userstats_root_commit_transactions": 0,
+ "userstats_root_cpu_time": 0,
+ "userstats_root_denied_connections": 0,
+ "userstats_root_empty_queries": 0,
+ "userstats_root_lost_connections": 0,
+ "userstats_root_other_commands": 0,
+ "userstats_root_rollback_transactions": 0,
+ "userstats_root_rows_deleted": 0,
+ "userstats_root_rows_inserted": 0,
+ "userstats_root_rows_read": 0,
+ "userstats_root_rows_sent": 2,
+ "userstats_root_rows_updated": 0,
+ "userstats_root_select_commands": 0,
+ "userstats_root_total_connections": 1,
+ "userstats_root_update_commands": 0,
+ "wsrep_cluster_size": 0,
+ "wsrep_cluster_status_disconnected": 1,
+ "wsrep_cluster_status_non_primary": 0,
+ "wsrep_cluster_status_primary": 0,
+ "wsrep_connected": 0,
+ "wsrep_local_bf_aborts": 0,
+ "wsrep_ready": 0,
+ "wsrep_thread_count": 0,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ "MariaDB-GaleraCluster[v10.8.4]: success on all queries": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMariaGaleraClusterVer1084Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaGaleraClusterVer1084GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaGaleraClusterVer1084GlobalVariables)
+ mockExpect(t, m, queryShowAllSlavesStatus, nil)
+ mockExpect(t, m, queryShowUserStatistics, dataMariaGaleraClusterVer1084UserStatistics)
+ mockExpect(t, m, queryShowProcessList, dataMariaGaleraClusterVer1084ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+ "aborted_connects": 0,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 0,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 3009,
+ "bytes_sent": 228856,
+ "com_delete": 6,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 12,
+ "com_update": 0,
+ "connection_errors_accept": 0,
+ "connection_errors_internal": 0,
+ "connection_errors_max_connections": 0,
+ "connection_errors_peer_address": 0,
+ "connection_errors_select": 0,
+ "connection_errors_tcpwrap": 0,
+ "connections": 15,
+ "created_tmp_disk_tables": 4,
+ "created_tmp_files": 5,
+ "created_tmp_tables": 17,
+ "handler_commit": 37,
+ "handler_delete": 7,
+ "handler_prepare": 0,
+ "handler_read_first": 3,
+ "handler_read_key": 9,
+ "handler_read_next": 1,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 6222,
+ "handler_rollback": 0,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 0,
+ "handler_write": 9,
+ "innodb_buffer_pool_bytes_data": 5193728,
+ "innodb_buffer_pool_bytes_dirty": 2260992,
+ "innodb_buffer_pool_pages_data": 317,
+ "innodb_buffer_pool_pages_dirty": 138,
+ "innodb_buffer_pool_pages_flushed": 0,
+ "innodb_buffer_pool_pages_free": 7747,
+ "innodb_buffer_pool_pages_misc": 0,
+ "innodb_buffer_pool_pages_total": 8064,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 2298,
+ "innodb_buffer_pool_reads": 184,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 203,
+ "innodb_data_fsyncs": 15,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 3014656,
+ "innodb_data_reads": 201,
+ "innodb_data_writes": 14,
+ "innodb_data_written": 0,
+ "innodb_deadlocks": 0,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 65,
+ "innodb_log_writes": 13,
+ "innodb_os_log_written": 4785,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 0,
+ "innodb_rows_read": 0,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 107163,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 151,
+ "max_used_connections": 1,
+ "open_files": 7,
+ "open_tables": 0,
+ "opened_files": 125,
+ "opened_tables": 24,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "qcache_free_blocks": 1,
+ "qcache_free_memory": 1031272,
+ "qcache_hits": 0,
+ "qcache_inserts": 0,
+ "qcache_lowmem_prunes": 0,
+ "qcache_not_cached": 0,
+ "qcache_queries_in_cache": 0,
+ "qcache_total_blocks": 1,
+ "queries": 75,
+ "questions": 62,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 17,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 0,
+ "table_locks_immediate": 17,
+ "table_locks_waited": 0,
+ "table_open_cache": 2000,
+ "table_open_cache_overflows": 0,
+ "thread_cache_misses": 4000,
+ "threads_cached": 0,
+ "threads_connected": 1,
+ "threads_created": 6,
+ "threads_running": 1,
+ "userstats_netdata_access_denied": 33,
+ "userstats_netdata_binlog_bytes_written": 0,
+ "userstats_netdata_commit_transactions": 0,
+ "userstats_netdata_cpu_time": 77,
+ "userstats_netdata_denied_connections": 49698,
+ "userstats_netdata_empty_queries": 66,
+ "userstats_netdata_lost_connections": 0,
+ "userstats_netdata_other_commands": 0,
+ "userstats_netdata_rollback_transactions": 0,
+ "userstats_netdata_rows_deleted": 0,
+ "userstats_netdata_rows_inserted": 0,
+ "userstats_netdata_rows_read": 0,
+ "userstats_netdata_rows_sent": 99,
+ "userstats_netdata_rows_updated": 0,
+ "userstats_netdata_select_commands": 33,
+ "userstats_netdata_total_connections": 1,
+ "userstats_netdata_update_commands": 0,
+ "userstats_root_access_denied": 0,
+ "userstats_root_binlog_bytes_written": 0,
+ "userstats_root_commit_transactions": 0,
+ "userstats_root_cpu_time": 0,
+ "userstats_root_denied_connections": 0,
+ "userstats_root_empty_queries": 0,
+ "userstats_root_lost_connections": 0,
+ "userstats_root_other_commands": 0,
+ "userstats_root_rollback_transactions": 0,
+ "userstats_root_rows_deleted": 0,
+ "userstats_root_rows_inserted": 0,
+ "userstats_root_rows_read": 0,
+ "userstats_root_rows_sent": 2,
+ "userstats_root_rows_updated": 0,
+ "userstats_root_select_commands": 0,
+ "userstats_root_total_connections": 1,
+ "userstats_root_update_commands": 0,
+ "wsrep_cluster_size": 3,
+ "wsrep_cluster_status_disconnected": 0,
+ "wsrep_cluster_status_non_primary": 0,
+ "wsrep_cluster_status_primary": 1,
+ "wsrep_cluster_weight": 3,
+ "wsrep_connected": 1,
+ "wsrep_flow_control_paused_ns": 0,
+ "wsrep_local_bf_aborts": 0,
+ "wsrep_local_cert_failures": 0,
+ "wsrep_local_recv_queue": 0,
+ "wsrep_local_send_queue": 0,
+ "wsrep_local_state_donor": 0,
+ "wsrep_local_state_error": 0,
+ "wsrep_local_state_joined": 0,
+ "wsrep_local_state_joiner": 0,
+ "wsrep_local_state_synced": 1,
+ "wsrep_local_state_undefined": 0,
+ "wsrep_open_transactions": 0,
+ "wsrep_ready": 1,
+ "wsrep_received": 11,
+ "wsrep_received_bytes": 1410,
+ "wsrep_replicated": 0,
+ "wsrep_replicated_bytes": 0,
+ "wsrep_thread_count": 5,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ "MySQL-MultiSourceReplication[v8.0.30]: success on all queries": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataMySQLVer8030Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataMySQLVer8030GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataMySQLVer8030GlobalVariables)
+ mockExpect(t, m, queryShowReplicaStatus, dataMySQLVer8030ReplicaStatusMultiSource)
+ mockExpect(t, m, queryShowProcessListPS, dataMySQLVer8030ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+ "aborted_connects": 0,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 6,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 5584,
+ "bytes_sent": 70700,
+ "com_delete": 0,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 2,
+ "com_update": 0,
+ "connection_errors_accept": 0,
+ "connection_errors_internal": 0,
+ "connection_errors_max_connections": 0,
+ "connection_errors_peer_address": 0,
+ "connection_errors_select": 0,
+ "connection_errors_tcpwrap": 0,
+ "connections": 25,
+ "created_tmp_disk_tables": 0,
+ "created_tmp_files": 5,
+ "created_tmp_tables": 6,
+ "handler_commit": 720,
+ "handler_delete": 8,
+ "handler_prepare": 24,
+ "handler_read_first": 50,
+ "handler_read_key": 1914,
+ "handler_read_next": 4303,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 4723,
+ "handler_rollback": 1,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 373,
+ "handler_write": 1966,
+ "innodb_buffer_pool_bytes_data": 17121280,
+ "innodb_buffer_pool_bytes_dirty": 0,
+ "innodb_buffer_pool_pages_data": 1045,
+ "innodb_buffer_pool_pages_dirty": 0,
+ "innodb_buffer_pool_pages_flushed": 361,
+ "innodb_buffer_pool_pages_free": 7143,
+ "innodb_buffer_pool_pages_misc": 4,
+ "innodb_buffer_pool_pages_total": 8192,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 16723,
+ "innodb_buffer_pool_reads": 878,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 2377,
+ "innodb_data_fsyncs": 255,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 14453760,
+ "innodb_data_reads": 899,
+ "innodb_data_writes": 561,
+ "innodb_data_written": 6128128,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 1062,
+ "innodb_log_writes": 116,
+ "innodb_os_log_fsyncs": 69,
+ "innodb_os_log_pending_fsyncs": 0,
+ "innodb_os_log_pending_writes": 0,
+ "innodb_os_log_written": 147968,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 0,
+ "innodb_rows_read": 0,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 6698,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 151,
+ "max_used_connections": 2,
+ "open_files": 8,
+ "open_tables": 127,
+ "opened_files": 8,
+ "opened_tables": 208,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "queries": 27,
+ "questions": 15,
+ "seconds_behind_master_master1": 0,
+ "seconds_behind_master_master2": 0,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 12,
+ "slave_io_running_master1": 1,
+ "slave_io_running_master2": 1,
+ "slave_sql_running_master1": 1,
+ "slave_sql_running_master2": 1,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 0,
+ "table_locks_immediate": 6,
+ "table_locks_waited": 0,
+ "table_open_cache": 4000,
+ "table_open_cache_overflows": 0,
+ "thread_cache_misses": 800,
+ "threads_cached": 1,
+ "threads_connected": 1,
+ "threads_created": 2,
+ "threads_running": 2,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ "Percona-Standalone[v8.0.29]: success on all queries": {
+ {
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
+ mockExpect(t, m, queryShowVersion, dataPerconaVer8029Version)
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
+ mockExpect(t, m, queryShowGlobalStatus, dataPerconaVer8029GlobalStatus)
+ mockExpect(t, m, queryShowGlobalVariables, dataPerconaVer8029GlobalVariables)
+ mockExpect(t, m, queryShowReplicaStatus, nil)
+ mockExpect(t, m, queryShowUserStatistics, dataPerconaVer8029UserStatistics)
+ mockExpect(t, m, queryShowProcessListPS, dataPerconaV8029ProcessList)
+ },
+ check: func(t *testing.T, my *MySQL) {
+ mx := my.Collect()
+
+ expected := map[string]int64{
+ "aborted_connects": 1,
+ "binlog_cache_disk_use": 0,
+ "binlog_cache_use": 0,
+ "binlog_stmt_cache_disk_use": 0,
+ "binlog_stmt_cache_use": 0,
+ "bytes_received": 682970,
+ "bytes_sent": 33668405,
+ "com_delete": 0,
+ "com_insert": 0,
+ "com_replace": 0,
+ "com_select": 1687,
+ "com_update": 0,
+ "connection_errors_accept": 0,
+ "connection_errors_internal": 0,
+ "connection_errors_max_connections": 0,
+ "connection_errors_peer_address": 0,
+ "connection_errors_select": 0,
+ "connection_errors_tcpwrap": 0,
+ "connections": 13,
+ "created_tmp_disk_tables": 1683,
+ "created_tmp_files": 5,
+ "created_tmp_tables": 5054,
+ "handler_commit": 576,
+ "handler_delete": 0,
+ "handler_prepare": 0,
+ "handler_read_first": 1724,
+ "handler_read_key": 3439,
+ "handler_read_next": 4147,
+ "handler_read_prev": 0,
+ "handler_read_rnd": 0,
+ "handler_read_rnd_next": 2983285,
+ "handler_rollback": 0,
+ "handler_savepoint": 0,
+ "handler_savepoint_rollback": 0,
+ "handler_update": 317,
+ "handler_write": 906501,
+ "innodb_buffer_pool_bytes_data": 18399232,
+ "innodb_buffer_pool_bytes_dirty": 49152,
+ "innodb_buffer_pool_pages_data": 1123,
+ "innodb_buffer_pool_pages_dirty": 3,
+ "innodb_buffer_pool_pages_flushed": 205,
+ "innodb_buffer_pool_pages_free": 7064,
+ "innodb_buffer_pool_pages_misc": 5,
+ "innodb_buffer_pool_pages_total": 8192,
+ "innodb_buffer_pool_read_ahead": 0,
+ "innodb_buffer_pool_read_ahead_evicted": 0,
+ "innodb_buffer_pool_read_ahead_rnd": 0,
+ "innodb_buffer_pool_read_requests": 109817,
+ "innodb_buffer_pool_reads": 978,
+ "innodb_buffer_pool_wait_free": 0,
+ "innodb_buffer_pool_write_requests": 77412,
+ "innodb_data_fsyncs": 50,
+ "innodb_data_pending_fsyncs": 0,
+ "innodb_data_pending_reads": 0,
+ "innodb_data_pending_writes": 0,
+ "innodb_data_read": 16094208,
+ "innodb_data_reads": 1002,
+ "innodb_data_writes": 288,
+ "innodb_data_written": 3420160,
+ "innodb_log_waits": 0,
+ "innodb_log_write_requests": 651,
+ "innodb_log_writes": 47,
+ "innodb_os_log_fsyncs": 13,
+ "innodb_os_log_pending_fsyncs": 0,
+ "innodb_os_log_pending_writes": 0,
+ "innodb_os_log_written": 45568,
+ "innodb_row_lock_current_waits": 0,
+ "innodb_rows_deleted": 0,
+ "innodb_rows_inserted": 5055,
+ "innodb_rows_read": 5055,
+ "innodb_rows_updated": 0,
+ "key_blocks_not_flushed": 0,
+ "key_blocks_unused": 6698,
+ "key_blocks_used": 0,
+ "key_read_requests": 0,
+ "key_reads": 0,
+ "key_write_requests": 0,
+ "key_writes": 0,
+ "max_connections": 151,
+ "max_used_connections": 3,
+ "open_files": 2,
+ "open_tables": 77,
+ "opened_files": 2,
+ "opened_tables": 158,
+ "process_list_fetch_query_duration": 0,
+ "process_list_longest_query_duration": 9,
+ "process_list_queries_count_system": 0,
+ "process_list_queries_count_user": 2,
+ "queries": 6748,
+ "questions": 6746,
+ "select_full_join": 0,
+ "select_full_range_join": 0,
+ "select_range": 0,
+ "select_range_check": 0,
+ "select_scan": 8425,
+ "slow_queries": 0,
+ "sort_merge_passes": 0,
+ "sort_range": 0,
+ "sort_scan": 1681,
+ "table_locks_immediate": 3371,
+ "table_locks_waited": 0,
+ "table_open_cache": 4000,
+ "table_open_cache_overflows": 0,
+ "thread_cache_misses": 2307,
+ "threads_cached": 1,
+ "threads_connected": 2,
+ "threads_created": 3,
+ "threads_running": 2,
+ "userstats_netdata_access_denied": 0,
+ "userstats_netdata_binlog_bytes_written": 0,
+ "userstats_netdata_commit_transactions": 0,
+ "userstats_netdata_cpu_time": 0,
+ "userstats_netdata_denied_connections": 0,
+ "userstats_netdata_empty_queries": 0,
+ "userstats_netdata_lost_connections": 0,
+ "userstats_netdata_other_commands": 1,
+ "userstats_netdata_rollback_transactions": 0,
+ "userstats_netdata_rows_fetched": 1,
+ "userstats_netdata_rows_updated": 0,
+ "userstats_netdata_select_commands": 1,
+ "userstats_netdata_total_connections": 1,
+ "userstats_netdata_update_commands": 0,
+ "userstats_root_access_denied": 0,
+ "userstats_root_binlog_bytes_written": 0,
+ "userstats_root_commit_transactions": 0,
+ "userstats_root_cpu_time": 151,
+ "userstats_root_denied_connections": 1,
+ "userstats_root_empty_queries": 36,
+ "userstats_root_lost_connections": 0,
+ "userstats_root_other_commands": 110,
+ "userstats_root_rollback_transactions": 0,
+ "userstats_root_rows_fetched": 1,
+ "userstats_root_rows_updated": 0,
+ "userstats_root_select_commands": 37,
+ "userstats_root_total_connections": 2,
+ "userstats_root_update_commands": 0,
+ }
+
+ copyProcessListQueryDuration(mx, expected)
+ require.Equal(t, expected, mx)
+ ensureCollectedHasAllChartsDimsVarsIDs(t, my, mx)
+ },
+ },
+ },
+ }
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ db, mock, err := sqlmock.New(
+ sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual),
+ )
+ require.NoError(t, err)
+ my := New()
+ my.db = db
+ defer func() { _ = db.Close() }()
+
+ require.NoError(t, my.Init())
+
+ for i, step := range test {
+ t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) {
+ step.prepareMock(t, mock)
+ step.check(t, my)
+ })
+ }
+ assert.NoError(t, mock.ExpectationsWereMet())
+ })
+ }
+}
+
+func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, mySQL *MySQL, collected map[string]int64) {
+ for _, chart := range *mySQL.Charts() {
+ if mySQL.isMariaDB {
+ // https://mariadb.com/kb/en/server-status-variables/#connection_errors_accept
+ if mySQL.version.LT(semver.Version{Major: 10, Minor: 0, Patch: 4}) && chart.ID == "connection_errors" {
+ continue
+ }
+ }
+ for _, dim := range chart.Dims {
+ _, ok := collected[dim.ID]
+ assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID)
+ }
+ for _, v := range chart.Vars {
+ _, ok := collected[v.ID]
+ assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID)
+ }
+ }
+}
+
+func copyProcessListQueryDuration(dst, src map[string]int64) {
+ if _, ok := dst["process_list_fetch_query_duration"]; !ok {
+ return
+ }
+ if _, ok := src["process_list_fetch_query_duration"]; !ok {
+ return
+ }
+ dst["process_list_fetch_query_duration"] = src["process_list_fetch_query_duration"]
+}
+
+func mustMockRows(t *testing.T, data []byte) *sqlmock.Rows {
+ rows, err := prepareMockRows(data)
+ require.NoError(t, err)
+ return rows
+}
+
+func mockExpect(t *testing.T, mock sqlmock.Sqlmock, query string, rows []byte) {
+ mock.ExpectQuery(query).WillReturnRows(mustMockRows(t, rows)).RowsWillBeClosed()
+}
+
+func mockExpectErr(mock sqlmock.Sqlmock, query string) {
+ mock.ExpectQuery(query).WillReturnError(fmt.Errorf("mock error (%s)", query))
+}
+
+func prepareMockRows(data []byte) (*sqlmock.Rows, error) {
+ if len(data) == 0 {
+ return sqlmock.NewRows(nil), nil
+ }
+
+ r := bytes.NewReader(data)
+ sc := bufio.NewScanner(r)
+
+ var numColumns int
+ var rows *sqlmock.Rows
+
+ for sc.Scan() {
+ s := strings.TrimSpace(strings.Trim(sc.Text(), "|"))
+ switch {
+ case s == "",
+ strings.HasPrefix(s, "+"),
+ strings.HasPrefix(s, "ft_boolean_syntax"):
+ continue
+ }
+
+ parts := strings.Split(s, "|")
+ for i, v := range parts {
+ parts[i] = strings.TrimSpace(v)
+ }
+
+ if rows == nil {
+ numColumns = len(parts)
+ rows = sqlmock.NewRows(parts)
+ continue
+ }
+
+ if len(parts) != numColumns {
+ return nil, fmt.Errorf("prepareMockRows(): columns != values (%d/%d)", numColumns, len(parts))
+ }
+
+ values := make([]driver.Value, len(parts))
+ for i, v := range parts {
+ values[i] = v
+ }
+ rows.AddRow(values...)
+ }
+
+ if rows == nil {
+ return nil, errors.New("prepareMockRows(): nil rows result")
+ }
+
+ return rows, sc.Err()
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/config.json b/src/go/collectors/go.d.plugin/modules/mysql/testdata/config.json
new file mode 100644
index 000000000..92a65cb5c
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/config.json
@@ -0,0 +1,6 @@
+{
+ "update_every": 123,
+ "dsn": "ok",
+ "my.cnf": "ok",
+ "timeout": 123.123
+}
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/config.yaml b/src/go/collectors/go.d.plugin/modules/mysql/testdata/config.yaml
new file mode 100644
index 000000000..9bb474b94
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/config.yaml
@@ -0,0 +1,4 @@
+update_every: 123
+dsn: "ok"
+my.cnf: "ok"
+timeout: 123.123
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_status.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_status.txt
new file mode 100644
index 000000000..8a6b691cd
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_status.txt
@@ -0,0 +1,621 @@
++--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
+| Variable_name | Value |
++--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
+| Aborted_clients | 0 |
+| Aborted_connects | 0 |
+| Aborted_connects_preauth | 0 |
+| Access_denied_errors | 0 |
+| Acl_column_grants | 0 |
+| Acl_database_grants | 3 |
+| Acl_function_grants | 0 |
+| Acl_procedure_grants | 0 |
+| Acl_package_spec_grants | 0 |
+| Acl_package_body_grants | 0 |
+| Acl_proxy_users | 1 |
+| Acl_role_grants | 0 |
+| Acl_roles | 0 |
+| Acl_table_grants | 1 |
+| Acl_users | 6 |
+| Aria_pagecache_blocks_not_flushed | 0 |
+| Aria_pagecache_blocks_unused | 15647 |
+| Aria_pagecache_blocks_used | 13 |
+| Aria_pagecache_read_requests | 306 |
+| Aria_pagecache_reads | 17 |
+| Aria_pagecache_write_requests | 8 |
+| Aria_pagecache_writes | 8 |
+| Aria_transaction_log_syncs | 0 |
+| Binlog_commits | 0 |
+| Binlog_group_commits | 0 |
+| Binlog_group_commit_trigger_count | 0 |
+| Binlog_group_commit_trigger_lock_wait | 0 |
+| Binlog_group_commit_trigger_timeout | 0 |
+| Binlog_snapshot_file | mysql-bin.000005 |
+| Binlog_snapshot_position | 385 |
+| Binlog_bytes_written | 183 |
+| Binlog_cache_disk_use | 0 |
+| Binlog_cache_use | 0 |
+| Binlog_stmt_cache_disk_use | 0 |
+| Binlog_stmt_cache_use | 0 |
+| Busy_time | 0.000000 |
+| Bytes_received | 3009 |
+| Bytes_sent | 228856 |
+| Column_compressions | 0 |
+| Column_decompressions | 0 |
+| Com_admin_commands | 0 |
+| Com_alter_db | 0 |
+| Com_alter_db_upgrade | 0 |
+| Com_alter_event | 0 |
+| Com_alter_function | 0 |
+| Com_alter_procedure | 0 |
+| Com_alter_server | 0 |
+| Com_alter_sequence | 0 |
+| Com_alter_table | 3 |
+| Com_alter_user | 0 |
+| Com_analyze | 0 |
+| Com_assign_to_keycache | 0 |
+| Com_backup | 6 |
+| Com_backup_lock | 0 |
+| Com_begin | 0 |
+| Com_binlog | 0 |
+| Com_call_procedure | 0 |
+| Com_change_db | 0 |
+| Com_change_master | 0 |
+| Com_check | 0 |
+| Com_checksum | 0 |
+| Com_commit | 0 |
+| Com_compound_sql | 0 |
+| Com_create_db | 1 |
+| Com_create_event | 0 |
+| Com_create_function | 0 |
+| Com_create_index | 0 |
+| Com_create_package | 0 |
+| Com_create_package_body | 0 |
+| Com_create_procedure | 0 |
+| Com_create_role | 0 |
+| Com_create_sequence | 0 |
+| Com_create_server | 0 |
+| Com_create_table | 3 |
+| Com_create_temporary_table | 0 |
+| Com_create_trigger | 0 |
+| Com_create_udf | 0 |
+| Com_create_user | 0 |
+| Com_create_view | 0 |
+| Com_dealloc_sql | 0 |
+| Com_delete | 6 |
+| Com_delete_multi | 0 |
+| Com_do | 0 |
+| Com_drop_db | 0 |
+| Com_drop_event | 0 |
+| Com_drop_function | 0 |
+| Com_drop_index | 0 |
+| Com_drop_procedure | 0 |
+| Com_drop_package | 0 |
+| Com_drop_package_body | 0 |
+| Com_drop_role | 0 |
+| Com_drop_server | 0 |
+| Com_drop_sequence | 0 |
+| Com_drop_table | 0 |
+| Com_drop_temporary_table | 0 |
+| Com_drop_trigger | 0 |
+| Com_drop_user | 0 |
+| Com_drop_view | 0 |
+| Com_empty_query | 0 |
+| Com_execute_immediate | 0 |
+| Com_execute_sql | 0 |
+| Com_flush | 4 |
+| Com_get_diagnostics | 0 |
+| Com_grant | 0 |
+| Com_grant_role | 0 |
+| Com_ha_close | 0 |
+| Com_ha_open | 0 |
+| Com_ha_read | 0 |
+| Com_help | 0 |
+| Com_insert | 0 |
+| Com_insert_select | 0 |
+| Com_install_plugin | 0 |
+| Com_kill | 0 |
+| Com_load | 0 |
+| Com_lock_tables | 0 |
+| Com_optimize | 0 |
+| Com_preload_keys | 0 |
+| Com_prepare_sql | 0 |
+| Com_purge | 0 |
+| Com_purge_before_date | 0 |
+| Com_release_savepoint | 0 |
+| Com_rename_table | 0 |
+| Com_rename_user | 0 |
+| Com_repair | 0 |
+| Com_replace | 0 |
+| Com_replace_select | 0 |
+| Com_reset | 0 |
+| Com_resignal | 0 |
+| Com_revoke | 0 |
+| Com_revoke_all | 0 |
+| Com_revoke_role | 0 |
+| Com_rollback | 0 |
+| Com_rollback_to_savepoint | 0 |
+| Com_savepoint | 0 |
+| Com_select | 12 |
+| Com_set_option | 6 |
+| Com_show_authors | 0 |
+| Com_show_binlog_events | 0 |
+| Com_show_binlogs | 0 |
+| Com_show_charsets | 0 |
+| Com_show_collations | 0 |
+| Com_show_contributors | 0 |
+| Com_show_create_db | 0 |
+| Com_show_create_event | 0 |
+| Com_show_create_func | 0 |
+| Com_show_create_package | 0 |
+| Com_show_create_package_body | 0 |
+| Com_show_create_proc | 0 |
+| Com_show_create_table | 0 |
+| Com_show_create_trigger | 0 |
+| Com_show_create_user | 0 |
+| Com_show_databases | 1 |
+| Com_show_engine_logs | 0 |
+| Com_show_engine_mutex | 0 |
+| Com_show_engine_status | 2 |
+| Com_show_errors | 0 |
+| Com_show_events | 0 |
+| Com_show_explain | 0 |
+| Com_show_fields | 0 |
+| Com_show_function_status | 0 |
+| Com_show_generic | 0 |
+| Com_show_grants | 2 |
+| Com_show_keys | 0 |
+| Com_show_binlog_status | 6 |
+| Com_show_open_tables | 0 |
+| Com_show_package_status | 0 |
+| Com_show_package_body_status | 0 |
+| Com_show_plugins | 0 |
+| Com_show_privileges | 0 |
+| Com_show_procedure_status | 0 |
+| Com_show_processlist | 0 |
+| Com_show_profile | 0 |
+| Com_show_profiles | 0 |
+| Com_show_relaylog_events | 0 |
+| Com_show_slave_hosts | 0 |
+| Com_show_slave_status | 6 |
+| Com_show_status | 6 |
+| Com_show_storage_engines | 0 |
+| Com_show_table_status | 0 |
+| Com_show_tables | 0 |
+| Com_show_triggers | 0 |
+| Com_show_variables | 6 |
+| Com_show_warnings | 0 |
+| Com_shutdown | 0 |
+| Com_signal | 0 |
+| Com_start_all_slaves | 0 |
+| Com_start_slave | 0 |
+| Com_stmt_close | 0 |
+| Com_stmt_execute | 0 |
+| Com_stmt_fetch | 0 |
+| Com_stmt_prepare | 0 |
+| Com_stmt_reprepare | 0 |
+| Com_stmt_reset | 0 |
+| Com_stmt_send_long_data | 0 |
+| Com_stop_all_slaves | 0 |
+| Com_stop_slave | 0 |
+| Com_truncate | 0 |
+| Com_uninstall_plugin | 0 |
+| Com_unlock_tables | 0 |
+| Com_update | 0 |
+| Com_update_multi | 0 |
+| Com_xa_commit | 0 |
+| Com_xa_end | 0 |
+| Com_xa_prepare | 0 |
+| Com_xa_recover | 0 |
+| Com_xa_rollback | 0 |
+| Com_xa_start | 0 |
+| Compression | OFF |
+| Connection_errors_accept | 0 |
+| Connection_errors_internal | 0 |
+| Connection_errors_max_connections | 0 |
+| Connection_errors_peer_address | 0 |
+| Connection_errors_select | 0 |
+| Connection_errors_tcpwrap | 0 |
+| Connections | 15 |
+| Cpu_time | 0.000000 |
+| Created_tmp_disk_tables | 4 |
+| Created_tmp_files | 5 |
+| Created_tmp_tables | 17 |
+| Delayed_errors | 0 |
+| Delayed_insert_threads | 0 |
+| Delayed_writes | 0 |
+| Delete_scan | 6 |
+| Empty_queries | 2 |
+| Executed_events | 0 |
+| Executed_triggers | 0 |
+| Feature_application_time_periods | 0 |
+| Feature_check_constraint | 1 |
+| Feature_custom_aggregate_functions | 0 |
+| Feature_delay_key_write | 0 |
+| Feature_dynamic_columns | 0 |
+| Feature_fulltext | 0 |
+| Feature_gis | 0 |
+| Feature_insert_returning | 0 |
+| Feature_invisible_columns | 0 |
+| Feature_json | 1 |
+| Feature_locale | 0 |
+| Feature_subquery | 0 |
+| Feature_system_versioning | 0 |
+| Feature_timezone | 0 |
+| Feature_trigger | 0 |
+| Feature_window_functions | 0 |
+| Feature_xml | 0 |
+| Handler_commit | 37 |
+| Handler_delete | 7 |
+| Handler_discover | 0 |
+| Handler_external_lock | 0 |
+| Handler_icp_attempts | 0 |
+| Handler_icp_match | 0 |
+| Handler_mrr_init | 0 |
+| Handler_mrr_key_refills | 0 |
+| Handler_mrr_rowid_refills | 0 |
+| Handler_prepare | 0 |
+| Handler_read_first | 3 |
+| Handler_read_key | 9 |
+| Handler_read_last | 0 |
+| Handler_read_next | 1 |
+| Handler_read_prev | 0 |
+| Handler_read_retry | 0 |
+| Handler_read_rnd | 0 |
+| Handler_read_rnd_deleted | 0 |
+| Handler_read_rnd_next | 6222 |
+| Handler_rollback | 0 |
+| Handler_savepoint | 0 |
+| Handler_savepoint_rollback | 0 |
+| Handler_tmp_delete | 0 |
+| Handler_tmp_update | 0 |
+| Handler_tmp_write | 6165 |
+| Handler_update | 0 |
+| Handler_write | 9 |
+| Innodb_adaptive_hash_hash_searches | 0 |
+| Innodb_adaptive_hash_non_hash_searches | 0 |
+| Innodb_background_log_sync | 896 |
+| Innodb_buffer_pool_dump_status | |
+| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 220817 19:46:29 |
+| Innodb_buffer_pool_resize_status | |
+| Innodb_buffer_pool_load_incomplete | OFF |
+| Innodb_buffer_pool_pages_data | 317 |
+| Innodb_buffer_pool_bytes_data | 5193728 |
+| Innodb_buffer_pool_pages_dirty | 138 |
+| Innodb_buffer_pool_bytes_dirty | 2260992 |
+| Innodb_buffer_pool_pages_flushed | 0 |
+| Innodb_buffer_pool_pages_free | 7747 |
+| Innodb_buffer_pool_pages_made_not_young | 0 |
+| Innodb_buffer_pool_pages_made_young | 0 |
+| Innodb_buffer_pool_pages_misc | 0 |
+| Innodb_buffer_pool_pages_old | 0 |
+| Innodb_buffer_pool_pages_total | 8064 |
+| Innodb_buffer_pool_pages_lru_flushed | 0 |
+| Innodb_buffer_pool_pages_lru_freed | 0 |
+| Innodb_buffer_pool_read_ahead_rnd | 0 |
+| Innodb_buffer_pool_read_ahead | 0 |
+| Innodb_buffer_pool_read_ahead_evicted | 0 |
+| Innodb_buffer_pool_read_requests | 2298 |
+| Innodb_buffer_pool_reads | 184 |
+| Innodb_buffer_pool_wait_free | 0 |
+| Innodb_buffer_pool_write_requests | 203 |
+| Innodb_checkpoint_age | 4785 |
+| Innodb_checkpoint_max_age | 80819529 |
+| Innodb_data_fsyncs | 15 |
+| Innodb_data_pending_fsyncs | 0 |
+| Innodb_data_pending_reads | 0 |
+| Innodb_data_pending_writes | 0 |
+| Innodb_data_read | 3014656 |
+| Innodb_data_reads | 201 |
+| Innodb_data_writes | 14 |
+| Innodb_data_written | 0 |
+| Innodb_dblwr_pages_written | 0 |
+| Innodb_dblwr_writes | 0 |
+| Innodb_deadlocks | 0 |
+| Innodb_history_list_length | 1 |
+| Innodb_ibuf_discarded_delete_marks | 0 |
+| Innodb_ibuf_discarded_deletes | 0 |
+| Innodb_ibuf_discarded_inserts | 0 |
+| Innodb_ibuf_free_list | 0 |
+| Innodb_ibuf_merged_delete_marks | 0 |
+| Innodb_ibuf_merged_deletes | 0 |
+| Innodb_ibuf_merged_inserts | 0 |
+| Innodb_ibuf_merges | 0 |
+| Innodb_ibuf_segment_size | 2 |
+| Innodb_ibuf_size | 1 |
+| Innodb_log_waits | 0 |
+| Innodb_log_write_requests | 65 |
+| Innodb_log_writes | 13 |
+| Innodb_lsn_current | 73172 |
+| Innodb_lsn_flushed | 73172 |
+| Innodb_lsn_last_checkpoint | 68387 |
+| Innodb_master_thread_active_loops | 0 |
+| Innodb_master_thread_idle_loops | 896 |
+| Innodb_max_trx_id | 38 |
+| Innodb_mem_adaptive_hash | 0 |
+| Innodb_mem_dictionary | 862248 |
+| Innodb_os_log_written | 4785 |
+| Innodb_page_size | 16384 |
+| Innodb_pages_created | 133 |
+| Innodb_pages_read | 184 |
+| Innodb_pages_written | 0 |
+| Innodb_row_lock_current_waits | 0 |
+| Innodb_row_lock_time | 0 |
+| Innodb_row_lock_time_avg | 0 |
+| Innodb_row_lock_time_max | 0 |
+| Innodb_row_lock_waits | 0 |
+| Innodb_rows_deleted | 0 |
+| Innodb_rows_inserted | 0 |
+| Innodb_rows_read | 0 |
+| Innodb_rows_updated | 0 |
+| Innodb_system_rows_deleted | 7 |
+| Innodb_system_rows_inserted | 9 |
+| Innodb_system_rows_read | 15 |
+| Innodb_system_rows_updated | 0 |
+| Innodb_num_open_files | 9 |
+| Innodb_truncated_status_writes | 0 |
+| Innodb_available_undo_logs | 128 |
+| Innodb_undo_truncations | 0 |
+| Innodb_page_compression_saved | 0 |
+| Innodb_num_pages_page_compressed | 0 |
+| Innodb_num_page_compressed_trim_op | 0 |
+| Innodb_num_pages_page_decompressed | 0 |
+| Innodb_num_pages_page_compression_error | 0 |
+| Innodb_num_pages_encrypted | 0 |
+| Innodb_num_pages_decrypted | 0 |
+| Innodb_have_lz4 | OFF |
+| Innodb_have_lzo | OFF |
+| Innodb_have_lzma | OFF |
+| Innodb_have_bzip2 | OFF |
+| Innodb_have_snappy | OFF |
+| Innodb_have_punch_hole | ON |
+| Innodb_defragment_compression_failures | 0 |
+| Innodb_defragment_failures | 0 |
+| Innodb_defragment_count | 0 |
+| Innodb_instant_alter_column | 0 |
+| Innodb_onlineddl_rowlog_rows | 0 |
+| Innodb_onlineddl_rowlog_pct_used | 0 |
+| Innodb_onlineddl_pct_progress | 0 |
+| Innodb_secondary_index_triggered_cluster_reads | 0 |
+| Innodb_secondary_index_triggered_cluster_reads_avoided | 0 |
+| Innodb_encryption_rotation_pages_read_from_cache | 0 |
+| Innodb_encryption_rotation_pages_read_from_disk | 0 |
+| Innodb_encryption_rotation_pages_modified | 0 |
+| Innodb_encryption_rotation_pages_flushed | 0 |
+| Innodb_encryption_rotation_estimated_iops | 0 |
+| Innodb_encryption_n_merge_blocks_encrypted | 0 |
+| Innodb_encryption_n_merge_blocks_decrypted | 0 |
+| Innodb_encryption_n_rowlog_blocks_encrypted | 0 |
+| Innodb_encryption_n_rowlog_blocks_decrypted | 0 |
+| Innodb_encryption_n_temp_blocks_encrypted | 0 |
+| Innodb_encryption_n_temp_blocks_decrypted | 0 |
+| Innodb_encryption_num_key_requests | 0 |
+| Key_blocks_not_flushed | 0 |
+| Key_blocks_unused | 107163 |
+| Key_blocks_used | 0 |
+| Key_blocks_warm | 0 |
+| Key_read_requests | 0 |
+| Key_reads | 0 |
+| Key_write_requests | 0 |
+| Key_writes | 0 |
+| Last_query_cost | 0.000000 |
+| Master_gtid_wait_count | 0 |
+| Master_gtid_wait_time | 0 |
+| Master_gtid_wait_timeouts | 0 |
+| Max_statement_time_exceeded | 0 |
+| Max_used_connections | 1 |
+| Memory_used | 35590104 |
+| Memory_used_initial | 35583712 |
+| Not_flushed_delayed_rows | 0 |
+| Open_files | 7 |
+| Open_streams | 4 |
+| Open_table_definitions | 0 |
+| Open_tables | 0 |
+| Opened_files | 125 |
+| Opened_plugin_libraries | 1 |
+| Opened_table_definitions | 27 |
+| Opened_tables | 24 |
+| Opened_views | 0 |
+| Performance_schema_accounts_lost | 0 |
+| Performance_schema_cond_classes_lost | 0 |
+| Performance_schema_cond_instances_lost | 0 |
+| Performance_schema_digest_lost | 0 |
+| Performance_schema_file_classes_lost | 0 |
+| Performance_schema_file_handles_lost | 0 |
+| Performance_schema_file_instances_lost | 0 |
+| Performance_schema_hosts_lost | 0 |
+| Performance_schema_index_stat_lost | 0 |
+| Performance_schema_locker_lost | 0 |
+| Performance_schema_memory_classes_lost | 0 |
+| Performance_schema_metadata_lock_lost | 0 |
+| Performance_schema_mutex_classes_lost | 0 |
+| Performance_schema_mutex_instances_lost | 0 |
+| Performance_schema_nested_statement_lost | 0 |
+| Performance_schema_prepared_statements_lost | 0 |
+| Performance_schema_program_lost | 0 |
+| Performance_schema_rwlock_classes_lost | 0 |
+| Performance_schema_rwlock_instances_lost | 0 |
+| Performance_schema_session_connect_attrs_lost | 0 |
+| Performance_schema_socket_classes_lost | 0 |
+| Performance_schema_socket_instances_lost | 0 |
+| Performance_schema_stage_classes_lost | 0 |
+| Performance_schema_statement_classes_lost | 0 |
+| Performance_schema_table_handles_lost | 0 |
+| Performance_schema_table_instances_lost | 0 |
+| Performance_schema_table_lock_stat_lost | 0 |
+| Performance_schema_thread_classes_lost | 0 |
+| Performance_schema_thread_instances_lost | 0 |
+| Performance_schema_users_lost | 0 |
+| Prepared_stmt_count | 0 |
+| Qcache_free_blocks | 1 |
+| Qcache_free_memory | 1031272 |
+| Qcache_hits | 0 |
+| Qcache_inserts | 0 |
+| Qcache_lowmem_prunes | 0 |
+| Qcache_not_cached | 0 |
+| Qcache_queries_in_cache | 0 |
+| Qcache_total_blocks | 1 |
+| Queries | 75 |
+| Questions | 62 |
+| Resultset_metadata_skipped | 0 |
+| Rows_read | 27 |
+| Rows_sent | 5888 |
+| Rows_tmp_read | 6162 |
+| Rpl_semi_sync_master_clients | 0 |
+| Rpl_semi_sync_master_get_ack | 0 |
+| Rpl_semi_sync_master_net_avg_wait_time | 0 |
+| Rpl_semi_sync_master_net_wait_time | 0 |
+| Rpl_semi_sync_master_net_waits | 0 |
+| Rpl_semi_sync_master_no_times | 0 |
+| Rpl_semi_sync_master_no_tx | 0 |
+| Rpl_semi_sync_master_request_ack | 0 |
+| Rpl_semi_sync_master_status | OFF |
+| Rpl_semi_sync_master_timefunc_failures | 0 |
+| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
+| Rpl_semi_sync_master_tx_wait_time | 0 |
+| Rpl_semi_sync_master_tx_waits | 0 |
+| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
+| Rpl_semi_sync_master_wait_sessions | 0 |
+| Rpl_semi_sync_master_yes_tx | 0 |
+| Rpl_semi_sync_slave_send_ack | 0 |
+| Rpl_semi_sync_slave_status | OFF |
+| Rpl_status | AUTH_MASTER |
+| Rpl_transactions_multi_engine | 0 |
+| Select_full_join | 0 |
+| Select_full_range_join | 0 |
+| Select_range | 0 |
+| Select_range_check | 0 |
+| Select_scan | 17 |
+| Slave_connections | 0 |
+| Slave_heartbeat_period | 0.000 |
+| Slave_open_temp_tables | 0 |
+| Slave_received_heartbeats | 0 |
+| Slave_retried_transactions | 0 |
+| Slave_running | OFF |
+| Slave_skipped_errors | 0 |
+| Slaves_connected | 0 |
+| Slaves_running | 0 |
+| Slow_launch_threads | 0 |
+| Slow_queries | 0 |
+| Sort_merge_passes | 0 |
+| Sort_priority_queue_sorts | 0 |
+| Sort_range | 0 |
+| Sort_rows | 0 |
+| Sort_scan | 0 |
+| Ssl_accept_renegotiates | 0 |
+| Ssl_accepts | 0 |
+| Ssl_callback_cache_hits | 0 |
+| Ssl_cipher | |
+| Ssl_cipher_list | |
+| Ssl_client_connects | 0 |
+| Ssl_connect_renegotiates | 0 |
+| Ssl_ctx_verify_depth | 0 |
+| Ssl_ctx_verify_mode | 0 |
+| Ssl_default_timeout | 0 |
+| Ssl_finished_accepts | 0 |
+| Ssl_finished_connects | 0 |
+| Ssl_server_not_after | |
+| Ssl_server_not_before | |
+| Ssl_session_cache_hits | 0 |
+| Ssl_session_cache_misses | 0 |
+| Ssl_session_cache_mode | NONE |
+| Ssl_session_cache_overflows | 0 |
+| Ssl_session_cache_size | 0 |
+| Ssl_session_cache_timeouts | 0 |
+| Ssl_sessions_reused | 0 |
+| Ssl_used_session_cache_entries | 0 |
+| Ssl_verify_depth | 0 |
+| Ssl_verify_mode | 0 |
+| Ssl_version | |
+| Subquery_cache_hit | 0 |
+| Subquery_cache_miss | 0 |
+| Syncs | 87 |
+| Table_locks_immediate | 17 |
+| Table_locks_waited | 0 |
+| Table_open_cache_active_instances | 1 |
+| Table_open_cache_hits | 16 |
+| Table_open_cache_misses | 24 |
+| Table_open_cache_overflows | 0 |
+| Tc_log_max_pages_used | 0 |
+| Tc_log_page_size | 0 |
+| Tc_log_page_waits | 0 |
+| Threadpool_idle_threads | 0 |
+| Threadpool_threads | 0 |
+| Threads_cached | 0 |
+| Threads_connected | 1 |
+| Threads_created | 6 |
+| Threads_running | 1 |
+| Transactions_gtid_foreign_engine | 0 |
+| Transactions_multi_engine | 0 |
+| Update_scan | 0 |
+| Uptime | 895 |
+| Uptime_since_flush_status | 895 |
+| wsrep_local_state_uuid | 479ce105-1e65-11ed-b2c3-8ac44f1dd1c9 |
+| wsrep_protocol_version | 10 |
+| wsrep_last_committed | 18 |
+| wsrep_replicated | 0 |
+| wsrep_replicated_bytes | 0 |
+| wsrep_repl_keys | 0 |
+| wsrep_repl_keys_bytes | 0 |
+| wsrep_repl_data_bytes | 0 |
+| wsrep_repl_other_bytes | 0 |
+| wsrep_received | 11 |
+| wsrep_received_bytes | 1410 |
+| wsrep_local_commits | 0 |
+| wsrep_local_cert_failures | 0 |
+| wsrep_local_replays | 0 |
+| wsrep_local_send_queue | 0 |
+| wsrep_local_send_queue_max | 2 |
+| wsrep_local_send_queue_min | 0 |
+| wsrep_local_send_queue_avg | 0.25 |
+| wsrep_local_recv_queue | 0 |
+| wsrep_local_recv_queue_max | 1 |
+| wsrep_local_recv_queue_min | 0 |
+| wsrep_local_recv_queue_avg | 0 |
+| wsrep_local_cached_downto | 1 |
+| wsrep_flow_control_paused_ns | 0 |
+| wsrep_flow_control_paused | 0 |
+| wsrep_flow_control_sent | 0 |
+| wsrep_flow_control_recv | 0 |
+| wsrep_flow_control_active | false |
+| wsrep_flow_control_requested | false |
+| wsrep_cert_deps_distance | 1 |
+| wsrep_apply_oooe | 0 |
+| wsrep_apply_oool | 0 |
+| wsrep_apply_window | 1 |
+| wsrep_apply_waits | 0 |
+| wsrep_commit_oooe | 0 |
+| wsrep_commit_oool | 0 |
+| wsrep_commit_window | 1 |
+| wsrep_local_state | 4 |
+| wsrep_local_state_comment | Synced |
+| wsrep_cert_index_size | 1 |
+| wsrep_causal_reads | 0 |
+| wsrep_cert_interval | 0 |
+| wsrep_open_transactions | 0 |
+| wsrep_open_connections | 0 |
+| wsrep_incoming_addresses | 172.17.0.2:3306,172.17.0.4:3306,172.17.0.3:3306 |
+| wsrep_cluster_weight | 3 |
+| wsrep_desync_count | 0 |
+| wsrep_evs_delayed | |
+| wsrep_evs_evict_list | |
+| wsrep_evs_repl_latency | 0.000200973/0.125339/1.00029/0.330702/8 |
+| wsrep_evs_state | OPERATIONAL |
+| wsrep_gcomm_uuid | 49826f19-1e65-11ed-8435-a308cd7c3ccc |
+| wsrep_gmcast_segment | 0 |
+| wsrep_applier_thread_count | 4 |
+| wsrep_cluster_capabilities | |
+| wsrep_cluster_conf_id | 3 |
+| wsrep_cluster_size | 3 |
+| wsrep_cluster_state_uuid | 479ce105-1e65-11ed-b2c3-8ac44f1dd1c9 |
+| wsrep_cluster_status | Primary |
+| wsrep_connected | ON |
+| wsrep_local_bf_aborts | 0 |
+| wsrep_local_index | 0 |
+| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
+| wsrep_provider_name | Galera |
+| wsrep_provider_vendor | Codership Oy <info@codership.com> |
+| wsrep_provider_version | 4.12(r6311685) |
+| wsrep_ready | ON |
+| wsrep_rollbacker_thread_count | 1 |
+| wsrep_thread_count | 5 |
++--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_variables.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_variables.txt
new file mode 100644
index 000000000..96591afdf
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/global_variables.txt
@@ -0,0 +1,8 @@
++--------------------+-------+
+| Variable_name | Value |
++--------------------+-------+
+| log_bin | ON |
+| max_connections | 151 |
+| performance_schema | ON |
+| table_open_cache | 2000 |
++--------------------+-------+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/process_list.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/process_list.txt
new file mode 100644
index 000000000..a44ce5e70
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/process_list.txt
@@ -0,0 +1,6 @@
++------+---------+
+| time | user |
++------+---------+
+| 1 | netdata |
+| 9 | root |
++------+---------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/user_statistics.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/user_statistics.txt
new file mode 100644
index 000000000..7a44b8b5a
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/user_statistics.txt
@@ -0,0 +1,6 @@
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+
+| User | Total_connections | Concurrent_connections | Connected_time | Busy_time | Cpu_time | Bytes_received | Bytes_sent | Binlog_bytes_written | Rows_read | Rows_sent | Rows_deleted | Rows_inserted | Rows_updated | Select_commands | Update_commands | Other_commands | Commit_transactions | Rollback_transactions | Denied_connections | Lost_connections | Access_denied | Empty_queries | Total_ssl_connections | Max_statement_time_exceeded |
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+
+| root | 1 | 0 | 9 | 0.000156 | 0.0001541 | 25 | 2799 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+| netdata | 1 | 0 | 32 | 0.09262200000000004 | 0.07723410000000001 | 13440 | 105432 | 0 | 0 | 99 | 0 | 0 | 0 | 33 | 0 | 0 | 0 | 0 | 49698 | 0 | 33 | 66 | 0 | 0 |
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/version.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/version.txt
new file mode 100644
index 000000000..ee5e77d9a
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4-galera-cluster/version.txt
@@ -0,0 +1,6 @@
++-----------------+---------------------+
+| Variable_name | Value |
++-----------------+---------------------+
+| version | 10.8.4-MariaDB-log |
+| version_comment | Source distribution |
++-----------------+---------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_multi_source.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_multi_source.txt
new file mode 100644
index 000000000..b117cb6c7
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_multi_source.txt
@@ -0,0 +1,6 @@
++-----------------+--------------------------------------------------------+----------------------------------+-------------+--------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+----------------+--------------------+------------+-------------+-------------------------+-----------------------------+---------------+-----------+---------------------+--------------------------------------------------------+------------------+--------------------------------+----------------------------+----------------------+--------------------+----------------------+---------------------------+------------------------+----------------+
+| Connection_name | Slave_SQL_State | Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Master_Server_Id | Master_SSL_Crl | Master_SSL_Crlpath | Using_Gtid | Gtid_IO_Pos | Replicate_Do_Domain_Ids | Replicate_Ignore_Domain_Ids | Parallel_Mode | SQL_Delay | SQL_Remaining_Delay | Slave_SQL_Running_State | Slave_DDL_Groups | Slave_Non_Transactional_Groups | Slave_Transactional_Groups | Retried_transactions | Max_relay_log_size | Executed_log_entries | Slave_received_heartbeats | Slave_heartbeat_period | Gtid_Slave_Pos |
++-----------------+--------------------------------------------------------+----------------------------------+-------------+--------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+----------------+--------------------+------------+-------------+-------------------------+-----------------------------+---------------+-----------+---------------------+--------------------------------------------------------+------------------+--------------------------------+----------------------------+----------------------+--------------------+----------------------+---------------------------+------------------------+----------------+
+| Master1 | Slave has read all relay log; waiting for more updates | Waiting for master to send event | master | my_repl_user | 3306 | 10 | mysql-bin.000002 | 342 | mysql-relay-bin.000004 | 641 | mysql-bin.000002 | Yes | Yes | | | | | | | 0 | | 0 | 342 | 2785 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 765 | | | No | | | | optimistic | 0 | NULL | Slave has read all relay log; waiting for more updates | 7 | 2 | 0 | 0 | 1073741824 | 34 | 1767 | 30.000 | 0-308-9 |
+| Master2 | Slave has read all relay log; waiting for more updates | Waiting for master to send event | master | my_repl_user | 3306 | 10 | mysql-bin.000002 | 342 | mysql-relay-bin.000004 | 641 | mysql-bin.000002 | Yes | Yes | | | | | | | 0 | | 0 | 342 | 2785 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 765 | | | No | | | | optimistic | 0 | NULL | Slave has read all relay log; waiting for more updates | 7 | 2 | 0 | 0 | 1073741824 | 34 | 1767 | 30.000 | 0-308-9 |
++-----------------+--------------------------------------------------------+----------------------------------+-------------+--------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+----------------+--------------------+------------+-------------+-------------------------+-----------------------------+---------------+-----------+---------------------+--------------------------------------------------------+------------------+--------------------------------+----------------------------+----------------------+--------------------+----------------------+---------------------------+------------------------+----------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_single_source.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_single_source.txt
new file mode 100644
index 000000000..61428f084
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/all_slaves_status_single_source.txt
@@ -0,0 +1,5 @@
++-----------------+--------------------------------------------------------+----------------------------------+-------------+--------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+----------------+--------------------+------------+-------------+-------------------------+-----------------------------+---------------+-----------+---------------------+--------------------------------------------------------+------------------+--------------------------------+----------------------------+----------------------+--------------------+----------------------+---------------------------+------------------------+----------------+
+| Connection_name | Slave_SQL_State | Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Master_Server_Id | Master_SSL_Crl | Master_SSL_Crlpath | Using_Gtid | Gtid_IO_Pos | Replicate_Do_Domain_Ids | Replicate_Ignore_Domain_Ids | Parallel_Mode | SQL_Delay | SQL_Remaining_Delay | Slave_SQL_Running_State | Slave_DDL_Groups | Slave_Non_Transactional_Groups | Slave_Transactional_Groups | Retried_transactions | Max_relay_log_size | Executed_log_entries | Slave_received_heartbeats | Slave_heartbeat_period | Gtid_Slave_Pos |
++-----------------+--------------------------------------------------------+----------------------------------+-------------+--------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+----------------+--------------------+------------+-------------+-------------------------+-----------------------------+---------------+-----------+---------------------+--------------------------------------------------------+------------------+--------------------------------+----------------------------+----------------------+--------------------+----------------------+---------------------------+------------------------+----------------+
+| | Slave has read all relay log; waiting for more updates | Waiting for master to send event | master | my_repl_user | 3306 | 10 | mysql-bin.000002 | 342 | mysql-relay-bin.000004 | 641 | mysql-bin.000002 | Yes | Yes | | | | | | | 0 | | 0 | 342 | 2785 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 765 | | | No | | | | optimistic | 0 | NULL | Slave has read all relay log; waiting for more updates | 7 | 2 | 0 | 0 | 1073741824 | 34 | 1767 | 30.000 | 0-308-9 |
++-----------------+--------------------------------------------------------+----------------------------------+-------------+--------------+-------------+---------------+------------------+---------------------+------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+----------------+--------------------+------------+-------------+-------------------------+-----------------------------+---------------+-----------+---------------------+--------------------------------------------------------+------------------+--------------------------------+----------------------------+----------------------+--------------------+----------------------+---------------------------+------------------------+----------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_status.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_status.txt
new file mode 100644
index 000000000..c82531c74
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_status.txt
@@ -0,0 +1,569 @@
++--------------------------------------------------------+--------------------------------------------------+
+| Variable_name | Value |
++--------------------------------------------------------+--------------------------------------------------+
+| Aborted_clients | 1 |
+| Aborted_connects | 2 |
+| Aborted_connects_preauth | 0 |
+| Access_denied_errors | 2 |
+| Acl_column_grants | 0 |
+| Acl_database_grants | 3 |
+| Acl_function_grants | 0 |
+| Acl_procedure_grants | 0 |
+| Acl_package_spec_grants | 0 |
+| Acl_package_body_grants | 0 |
+| Acl_proxy_users | 1 |
+| Acl_role_grants | 0 |
+| Acl_roles | 0 |
+| Acl_table_grants | 1 |
+| Acl_users | 4 |
+| Aria_pagecache_blocks_not_flushed | 7 |
+| Aria_pagecache_blocks_unused | 15630 |
+| Aria_pagecache_blocks_used | 17 |
+| Aria_pagecache_read_requests | 78 |
+| Aria_pagecache_reads | 19 |
+| Aria_pagecache_write_requests | 8 |
+| Aria_pagecache_writes | 0 |
+| Aria_transaction_log_syncs | 6 |
+| Binlog_commits | 0 |
+| Binlog_group_commits | 0 |
+| Binlog_group_commit_trigger_count | 0 |
+| Binlog_group_commit_trigger_lock_wait | 0 |
+| Binlog_group_commit_trigger_timeout | 0 |
+| Binlog_snapshot_file | mysql-bin.000002 |
+| Binlog_snapshot_position | 1806 |
+| Binlog_bytes_written | 1842 |
+| Binlog_cache_disk_use | 0 |
+| Binlog_cache_use | 0 |
+| Binlog_stmt_cache_disk_use | 0 |
+| Binlog_stmt_cache_use | 0 |
+| Busy_time | 0.000000 |
+| Bytes_received | 81392 |
+| Bytes_sent | 56794 |
+| Column_compressions | 0 |
+| Column_decompressions | 0 |
+| Com_admin_commands | 0 |
+| Com_alter_db | 0 |
+| Com_alter_db_upgrade | 0 |
+| Com_alter_event | 0 |
+| Com_alter_function | 0 |
+| Com_alter_procedure | 0 |
+| Com_alter_server | 0 |
+| Com_alter_sequence | 0 |
+| Com_alter_table | 0 |
+| Com_alter_user | 0 |
+| Com_analyze | 0 |
+| Com_assign_to_keycache | 0 |
+| Com_backup | 0 |
+| Com_backup_lock | 0 |
+| Com_begin | 0 |
+| Com_binlog | 0 |
+| Com_call_procedure | 0 |
+| Com_change_db | 0 |
+| Com_change_master | 0 |
+| Com_check | 0 |
+| Com_checksum | 0 |
+| Com_commit | 0 |
+| Com_compound_sql | 0 |
+| Com_create_db | 1 |
+| Com_create_event | 0 |
+| Com_create_function | 0 |
+| Com_create_index | 0 |
+| Com_create_package | 0 |
+| Com_create_package_body | 0 |
+| Com_create_procedure | 0 |
+| Com_create_role | 0 |
+| Com_create_sequence | 0 |
+| Com_create_server | 0 |
+| Com_create_table | 0 |
+| Com_create_temporary_table | 0 |
+| Com_create_trigger | 0 |
+| Com_create_udf | 0 |
+| Com_create_user | 3 |
+| Com_create_view | 0 |
+| Com_dealloc_sql | 0 |
+| Com_delete | 0 |
+| Com_delete_multi | 0 |
+| Com_do | 0 |
+| Com_drop_db | 0 |
+| Com_drop_event | 0 |
+| Com_drop_function | 0 |
+| Com_drop_index | 0 |
+| Com_drop_procedure | 0 |
+| Com_drop_package | 0 |
+| Com_drop_package_body | 0 |
+| Com_drop_role | 0 |
+| Com_drop_server | 0 |
+| Com_drop_sequence | 0 |
+| Com_drop_table | 0 |
+| Com_drop_temporary_table | 0 |
+| Com_drop_trigger | 0 |
+| Com_drop_user | 0 |
+| Com_drop_view | 0 |
+| Com_empty_query | 0 |
+| Com_execute_immediate | 0 |
+| Com_execute_sql | 0 |
+| Com_flush | 2 |
+| Com_get_diagnostics | 0 |
+| Com_grant | 3 |
+| Com_grant_role | 0 |
+| Com_ha_close | 0 |
+| Com_ha_open | 0 |
+| Com_ha_read | 0 |
+| Com_help | 0 |
+| Com_insert | 0 |
+| Com_insert_select | 0 |
+| Com_install_plugin | 0 |
+| Com_kill | 0 |
+| Com_load | 0 |
+| Com_lock_tables | 0 |
+| Com_optimize | 0 |
+| Com_preload_keys | 0 |
+| Com_prepare_sql | 0 |
+| Com_purge | 0 |
+| Com_purge_before_date | 0 |
+| Com_release_savepoint | 0 |
+| Com_rename_table | 0 |
+| Com_rename_user | 0 |
+| Com_repair | 0 |
+| Com_replace | 0 |
+| Com_replace_select | 0 |
+| Com_reset | 0 |
+| Com_resignal | 0 |
+| Com_revoke | 0 |
+| Com_revoke_all | 0 |
+| Com_revoke_role | 0 |
+| Com_rollback | 0 |
+| Com_rollback_to_savepoint | 0 |
+| Com_savepoint | 0 |
+| Com_select | 6 |
+| Com_set_option | 0 |
+| Com_show_authors | 0 |
+| Com_show_binlog_events | 0 |
+| Com_show_binlogs | 0 |
+| Com_show_charsets | 0 |
+| Com_show_collations | 0 |
+| Com_show_contributors | 0 |
+| Com_show_create_db | 0 |
+| Com_show_create_event | 0 |
+| Com_show_create_func | 0 |
+| Com_show_create_package | 0 |
+| Com_show_create_package_body | 0 |
+| Com_show_create_proc | 0 |
+| Com_show_create_table | 0 |
+| Com_show_create_trigger | 0 |
+| Com_show_create_user | 0 |
+| Com_show_databases | 0 |
+| Com_show_engine_logs | 0 |
+| Com_show_engine_mutex | 0 |
+| Com_show_engine_status | 0 |
+| Com_show_errors | 0 |
+| Com_show_events | 0 |
+| Com_show_explain | 0 |
+| Com_show_fields | 0 |
+| Com_show_function_status | 0 |
+| Com_show_generic | 0 |
+| Com_show_grants | 0 |
+| Com_show_keys | 0 |
+| Com_show_binlog_status | 0 |
+| Com_show_open_tables | 0 |
+| Com_show_package_status | 0 |
+| Com_show_package_body_status | 0 |
+| Com_show_plugins | 0 |
+| Com_show_privileges | 0 |
+| Com_show_procedure_status | 0 |
+| Com_show_processlist | 0 |
+| Com_show_profile | 0 |
+| Com_show_profiles | 0 |
+| Com_show_relaylog_events | 0 |
+| Com_show_slave_hosts | 0 |
+| Com_show_slave_status | 14 |
+| Com_show_status | 2 |
+| Com_show_storage_engines | 0 |
+| Com_show_table_status | 0 |
+| Com_show_tables | 0 |
+| Com_show_triggers | 0 |
+| Com_show_variables | 0 |
+| Com_show_warnings | 0 |
+| Com_shutdown | 0 |
+| Com_signal | 0 |
+| Com_start_all_slaves | 0 |
+| Com_start_slave | 0 |
+| Com_stmt_close | 0 |
+| Com_stmt_execute | 0 |
+| Com_stmt_fetch | 0 |
+| Com_stmt_prepare | 0 |
+| Com_stmt_reprepare | 0 |
+| Com_stmt_reset | 0 |
+| Com_stmt_send_long_data | 0 |
+| Com_stop_all_slaves | 0 |
+| Com_stop_slave | 0 |
+| Com_truncate | 0 |
+| Com_uninstall_plugin | 0 |
+| Com_unlock_tables | 0 |
+| Com_update | 0 |
+| Com_update_multi | 0 |
+| Com_xa_commit | 0 |
+| Com_xa_end | 0 |
+| Com_xa_prepare | 0 |
+| Com_xa_recover | 0 |
+| Com_xa_rollback | 0 |
+| Com_xa_start | 0 |
+| Compression | OFF |
+| Connection_errors_accept | 0 |
+| Connection_errors_internal | 0 |
+| Connection_errors_max_connections | 0 |
+| Connection_errors_peer_address | 0 |
+| Connection_errors_select | 0 |
+| Connection_errors_tcpwrap | 0 |
+| Connections | 12 |
+| Cpu_time | 0.000000 |
+| Created_tmp_disk_tables | 0 |
+| Created_tmp_files | 5 |
+| Created_tmp_tables | 2 |
+| Delayed_errors | 0 |
+| Delayed_insert_threads | 0 |
+| Delayed_writes | 0 |
+| Delete_scan | 0 |
+| Empty_queries | 0 |
+| Executed_events | 0 |
+| Executed_triggers | 0 |
+| Feature_application_time_periods | 0 |
+| Feature_check_constraint | 1 |
+| Feature_custom_aggregate_functions | 0 |
+| Feature_delay_key_write | 0 |
+| Feature_dynamic_columns | 0 |
+| Feature_fulltext | 0 |
+| Feature_gis | 0 |
+| Feature_insert_returning | 0 |
+| Feature_invisible_columns | 0 |
+| Feature_json | 1 |
+| Feature_locale | 0 |
+| Feature_subquery | 0 |
+| Feature_system_versioning | 0 |
+| Feature_timezone | 0 |
+| Feature_trigger | 0 |
+| Feature_window_functions | 0 |
+| Feature_xml | 0 |
+| Handler_commit | 30 |
+| Handler_delete | 0 |
+| Handler_discover | 0 |
+| Handler_external_lock | 0 |
+| Handler_icp_attempts | 0 |
+| Handler_icp_match | 0 |
+| Handler_mrr_init | 0 |
+| Handler_mrr_key_refills | 0 |
+| Handler_mrr_rowid_refills | 0 |
+| Handler_prepare | 0 |
+| Handler_read_first | 7 |
+| Handler_read_key | 7 |
+| Handler_read_last | 0 |
+| Handler_read_next | 3 |
+| Handler_read_prev | 0 |
+| Handler_read_retry | 0 |
+| Handler_read_rnd | 0 |
+| Handler_read_rnd_deleted | 0 |
+| Handler_read_rnd_next | 626 |
+| Handler_rollback | 0 |
+| Handler_savepoint | 0 |
+| Handler_savepoint_rollback | 0 |
+| Handler_tmp_delete | 0 |
+| Handler_tmp_update | 0 |
+| Handler_tmp_write | 568 |
+| Handler_update | 3 |
+| Handler_write | 13 |
+| Innodb_adaptive_hash_hash_searches | 0 |
+| Innodb_adaptive_hash_non_hash_searches | 0 |
+| Innodb_background_log_sync | 52300 |
+| Innodb_buffer_pool_dump_status | |
+| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 220817 21:14:57 |
+| Innodb_buffer_pool_resize_status | |
+| Innodb_buffer_pool_load_incomplete | OFF |
+| Innodb_buffer_pool_pages_data | 309 |
+| Innodb_buffer_pool_bytes_data | 5062656 |
+| Innodb_buffer_pool_pages_dirty | 29 |
+| Innodb_buffer_pool_bytes_dirty | 475136 |
+| Innodb_buffer_pool_pages_flushed | 0 |
+| Innodb_buffer_pool_pages_free | 7755 |
+| Innodb_buffer_pool_pages_made_not_young | 0 |
+| Innodb_buffer_pool_pages_made_young | 0 |
+| Innodb_buffer_pool_pages_misc | 0 |
+| Innodb_buffer_pool_pages_old | 0 |
+| Innodb_buffer_pool_pages_total | 8064 |
+| Innodb_buffer_pool_pages_lru_flushed | 0 |
+| Innodb_buffer_pool_pages_lru_freed | 0 |
+| Innodb_buffer_pool_read_ahead_rnd | 0 |
+| Innodb_buffer_pool_read_ahead | 0 |
+| Innodb_buffer_pool_read_ahead_evicted | 0 |
+| Innodb_buffer_pool_read_requests | 1911 |
+| Innodb_buffer_pool_reads | 171 |
+| Innodb_buffer_pool_wait_free | 0 |
+| Innodb_buffer_pool_write_requests | 148 |
+| Innodb_checkpoint_age | 6097 |
+| Innodb_checkpoint_max_age | 80819529 |
+| Innodb_data_fsyncs | 17 |
+| Innodb_data_pending_fsyncs | 0 |
+| Innodb_data_pending_reads | 0 |
+| Innodb_data_pending_writes | 0 |
+| Innodb_data_read | 2801664 |
+| Innodb_data_reads | 185 |
+| Innodb_data_writes | 16 |
+| Innodb_data_written | 0 |
+| Innodb_dblwr_pages_written | 0 |
+| Innodb_dblwr_writes | 0 |
+| Innodb_deadlocks | 0 |
+| Innodb_history_list_length | 0 |
+| Innodb_ibuf_discarded_delete_marks | 0 |
+| Innodb_ibuf_discarded_deletes | 0 |
+| Innodb_ibuf_discarded_inserts | 0 |
+| Innodb_ibuf_free_list | 0 |
+| Innodb_ibuf_merged_delete_marks | 0 |
+| Innodb_ibuf_merged_deletes | 0 |
+| Innodb_ibuf_merged_inserts | 0 |
+| Innodb_ibuf_merges | 0 |
+| Innodb_ibuf_segment_size | 2 |
+| Innodb_ibuf_size | 1 |
+| Innodb_log_waits | 0 |
+| Innodb_log_write_requests | 109 |
+| Innodb_log_writes | 15 |
+| Innodb_lsn_current | 52826 |
+| Innodb_lsn_flushed | 52826 |
+| Innodb_lsn_last_checkpoint | 46729 |
+| Innodb_master_thread_active_loops | 0 |
+| Innodb_master_thread_idle_loops | 52301 |
+| Innodb_max_trx_id | 37 |
+| Innodb_mem_adaptive_hash | 0 |
+| Innodb_mem_dictionary | 855336 |
+| Innodb_os_log_written | 6097 |
+| Innodb_page_size | 16384 |
+| Innodb_pages_created | 138 |
+| Innodb_pages_read | 171 |
+| Innodb_pages_written | 0 |
+| Innodb_row_lock_current_waits | 0 |
+| Innodb_row_lock_time | 0 |
+| Innodb_row_lock_time_avg | 0 |
+| Innodb_row_lock_time_max | 0 |
+| Innodb_row_lock_waits | 0 |
+| Innodb_rows_deleted | 0 |
+| Innodb_rows_inserted | 0 |
+| Innodb_rows_read | 0 |
+| Innodb_rows_updated | 0 |
+| Innodb_system_rows_deleted | 0 |
+| Innodb_system_rows_inserted | 9 |
+| Innodb_system_rows_read | 0 |
+| Innodb_system_rows_updated | 0 |
+| Innodb_num_open_files | 6 |
+| Innodb_truncated_status_writes | 0 |
+| Innodb_available_undo_logs | 128 |
+| Innodb_undo_truncations | 0 |
+| Innodb_page_compression_saved | 0 |
+| Innodb_num_pages_page_compressed | 0 |
+| Innodb_num_page_compressed_trim_op | 0 |
+| Innodb_num_pages_page_decompressed | 0 |
+| Innodb_num_pages_page_compression_error | 0 |
+| Innodb_num_pages_encrypted | 0 |
+| Innodb_num_pages_decrypted | 0 |
+| Innodb_have_lz4 | OFF |
+| Innodb_have_lzo | OFF |
+| Innodb_have_lzma | OFF |
+| Innodb_have_bzip2 | OFF |
+| Innodb_have_snappy | OFF |
+| Innodb_have_punch_hole | ON |
+| Innodb_defragment_compression_failures | 0 |
+| Innodb_defragment_failures | 0 |
+| Innodb_defragment_count | 0 |
+| Innodb_instant_alter_column | 0 |
+| Innodb_onlineddl_rowlog_rows | 0 |
+| Innodb_onlineddl_rowlog_pct_used | 0 |
+| Innodb_onlineddl_pct_progress | 0 |
+| Innodb_secondary_index_triggered_cluster_reads | 0 |
+| Innodb_secondary_index_triggered_cluster_reads_avoided | 0 |
+| Innodb_encryption_rotation_pages_read_from_cache | 0 |
+| Innodb_encryption_rotation_pages_read_from_disk | 0 |
+| Innodb_encryption_rotation_pages_modified | 0 |
+| Innodb_encryption_rotation_pages_flushed | 0 |
+| Innodb_encryption_rotation_estimated_iops | 0 |
+| Innodb_encryption_n_merge_blocks_encrypted | 0 |
+| Innodb_encryption_n_merge_blocks_decrypted | 0 |
+| Innodb_encryption_n_rowlog_blocks_encrypted | 0 |
+| Innodb_encryption_n_rowlog_blocks_decrypted | 0 |
+| Innodb_encryption_n_temp_blocks_encrypted | 0 |
+| Innodb_encryption_n_temp_blocks_decrypted | 0 |
+| Innodb_encryption_num_key_requests | 0 |
+| Key_blocks_not_flushed | 0 |
+| Key_blocks_unused | 107163 |
+| Key_blocks_used | 0 |
+| Key_blocks_warm | 0 |
+| Key_read_requests | 0 |
+| Key_reads | 0 |
+| Key_write_requests | 0 |
+| Key_writes | 0 |
+| Last_query_cost | 0.000000 |
+| Master_gtid_wait_count | 0 |
+| Master_gtid_wait_time | 0 |
+| Master_gtid_wait_timeouts | 0 |
+| Max_statement_time_exceeded | 0 |
+| Max_used_connections | 1 |
+| Memory_used | 35982280 |
+| Memory_used_initial | 35441456 |
+| Not_flushed_delayed_rows | 0 |
+| Open_files | 29 |
+| Open_streams | 4 |
+| Open_table_definitions | 17 |
+| Open_tables | 10 |
+| Opened_files | 100 |
+| Opened_plugin_libraries | 0 |
+| Opened_table_definitions | 16 |
+| Opened_tables | 16 |
+| Opened_views | 0 |
+| Performance_schema_accounts_lost | 0 |
+| Performance_schema_cond_classes_lost | 0 |
+| Performance_schema_cond_instances_lost | 0 |
+| Performance_schema_digest_lost | 0 |
+| Performance_schema_file_classes_lost | 0 |
+| Performance_schema_file_handles_lost | 0 |
+| Performance_schema_file_instances_lost | 0 |
+| Performance_schema_hosts_lost | 0 |
+| Performance_schema_index_stat_lost | 0 |
+| Performance_schema_locker_lost | 0 |
+| Performance_schema_memory_classes_lost | 0 |
+| Performance_schema_metadata_lock_lost | 0 |
+| Performance_schema_mutex_classes_lost | 0 |
+| Performance_schema_mutex_instances_lost | 0 |
+| Performance_schema_nested_statement_lost | 0 |
+| Performance_schema_prepared_statements_lost | 0 |
+| Performance_schema_program_lost | 0 |
+| Performance_schema_rwlock_classes_lost | 0 |
+| Performance_schema_rwlock_instances_lost | 0 |
+| Performance_schema_session_connect_attrs_lost | 0 |
+| Performance_schema_socket_classes_lost | 0 |
+| Performance_schema_socket_instances_lost | 0 |
+| Performance_schema_stage_classes_lost | 0 |
+| Performance_schema_statement_classes_lost | 0 |
+| Performance_schema_table_handles_lost | 0 |
+| Performance_schema_table_instances_lost | 0 |
+| Performance_schema_table_lock_stat_lost | 0 |
+| Performance_schema_thread_classes_lost | 0 |
+| Performance_schema_thread_instances_lost | 0 |
+| Performance_schema_users_lost | 0 |
+| Prepared_stmt_count | 0 |
+| Qcache_free_blocks | 1 |
+| Qcache_free_memory | 1031272 |
+| Qcache_hits | 0 |
+| Qcache_inserts | 0 |
+| Qcache_lowmem_prunes | 0 |
+| Qcache_not_cached | 0 |
+| Qcache_queries_in_cache | 0 |
+| Qcache_total_blocks | 1 |
+| Queries | 33 |
+| Questions | 24 |
+| Resultset_metadata_skipped | 0 |
+| Rows_read | 36 |
+| Rows_sent | 571 |
+| Rows_tmp_read | 565 |
+| Rpl_semi_sync_master_clients | 0 |
+| Rpl_semi_sync_master_get_ack | 0 |
+| Rpl_semi_sync_master_net_avg_wait_time | 0 |
+| Rpl_semi_sync_master_net_wait_time | 0 |
+| Rpl_semi_sync_master_net_waits | 0 |
+| Rpl_semi_sync_master_no_times | 0 |
+| Rpl_semi_sync_master_no_tx | 0 |
+| Rpl_semi_sync_master_request_ack | 0 |
+| Rpl_semi_sync_master_status | OFF |
+| Rpl_semi_sync_master_timefunc_failures | 0 |
+| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
+| Rpl_semi_sync_master_tx_wait_time | 0 |
+| Rpl_semi_sync_master_tx_waits | 0 |
+| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
+| Rpl_semi_sync_master_wait_sessions | 0 |
+| Rpl_semi_sync_master_yes_tx | 0 |
+| Rpl_semi_sync_slave_send_ack | 0 |
+| Rpl_semi_sync_slave_status | OFF |
+| Rpl_status | AUTH_MASTER |
+| Rpl_transactions_multi_engine | 0 |
+| Select_full_join | 0 |
+| Select_full_range_join | 0 |
+| Select_range | 0 |
+| Select_range_check | 0 |
+| Select_scan | 2 |
+| Slave_connections | 0 |
+| Slave_heartbeat_period | 30.000 |
+| Slave_open_temp_tables | 0 |
+| Slave_received_heartbeats | 1743 |
+| Slave_retried_transactions | 0 |
+| Slave_running | ON |
+| Slave_skipped_errors | 0 |
+| Slaves_connected | 0 |
+| Slaves_running | 1 |
+| Slow_launch_threads | 0 |
+| Slow_queries | 0 |
+| Sort_merge_passes | 0 |
+| Sort_priority_queue_sorts | 0 |
+| Sort_range | 0 |
+| Sort_rows | 0 |
+| Sort_scan | 0 |
+| Ssl_accept_renegotiates | 0 |
+| Ssl_accepts | 0 |
+| Ssl_callback_cache_hits | 0 |
+| Ssl_cipher | |
+| Ssl_cipher_list | |
+| Ssl_client_connects | 0 |
+| Ssl_connect_renegotiates | 0 |
+| Ssl_ctx_verify_depth | 0 |
+| Ssl_ctx_verify_mode | 0 |
+| Ssl_default_timeout | 0 |
+| Ssl_finished_accepts | 0 |
+| Ssl_finished_connects | 0 |
+| Ssl_server_not_after | |
+| Ssl_server_not_before | |
+| Ssl_session_cache_hits | 0 |
+| Ssl_session_cache_misses | 0 |
+| Ssl_session_cache_mode | NONE |
+| Ssl_session_cache_overflows | 0 |
+| Ssl_session_cache_size | 0 |
+| Ssl_session_cache_timeouts | 0 |
+| Ssl_sessions_reused | 0 |
+| Ssl_used_session_cache_entries | 0 |
+| Ssl_verify_depth | 0 |
+| Ssl_verify_mode | 0 |
+| Ssl_version | |
+| Subquery_cache_hit | 0 |
+| Subquery_cache_miss | 0 |
+| Syncs | 56 |
+| Table_locks_immediate | 60 |
+| Table_locks_waited | 0 |
+| Table_open_cache_active_instances | 1 |
+| Table_open_cache_hits | 54 |
+| Table_open_cache_misses | 16 |
+| Table_open_cache_overflows | 0 |
+| Tc_log_max_pages_used | 0 |
+| Tc_log_page_size | 0 |
+| Tc_log_page_waits | 0 |
+| Threadpool_idle_threads | 0 |
+| Threadpool_threads | 0 |
+| Threads_cached | 0 |
+| Threads_connected | 1 |
+| Threads_created | 2 |
+| Threads_running | 3 |
+| Transactions_gtid_foreign_engine | 0 |
+| Transactions_multi_engine | 0 |
+| Update_scan | 0 |
+| Uptime | 52310 |
+| Uptime_since_flush_status | 52310 |
+| wsrep | 0 |
+| wsrep_applier_thread_count | 0 |
+| wsrep_cluster_capabilities | |
+| wsrep_cluster_conf_id | 18446744073709551615 |
+| wsrep_cluster_size | 0 |
+| wsrep_cluster_state_uuid | |
+| wsrep_cluster_status | Disconnected |
+| wsrep_connected | OFF |
+| wsrep_local_bf_aborts | 0 |
+| wsrep_local_index | 18446744073709551615 |
+| wsrep_provider_capabilities | |
+| wsrep_provider_name | |
+| wsrep_provider_vendor | |
+| wsrep_provider_version | |
+| wsrep_ready | OFF |
+| wsrep_rollbacker_thread_count | 0 |
+| wsrep_thread_count | 0 |
++--------------------------------------------------------+--------------------------------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_variables.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_variables.txt
new file mode 100644
index 000000000..96591afdf
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/global_variables.txt
@@ -0,0 +1,8 @@
++--------------------+-------+
+| Variable_name | Value |
++--------------------+-------+
+| log_bin | ON |
+| max_connections | 151 |
+| performance_schema | ON |
+| table_open_cache | 2000 |
++--------------------+-------+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/process_list.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/process_list.txt
new file mode 100644
index 000000000..a44ce5e70
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/process_list.txt
@@ -0,0 +1,6 @@
++------+---------+
+| time | user |
++------+---------+
+| 1 | netdata |
+| 9 | root |
++------+---------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/user_statistics.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/user_statistics.txt
new file mode 100644
index 000000000..7a44b8b5a
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/user_statistics.txt
@@ -0,0 +1,6 @@
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+
+| User | Total_connections | Concurrent_connections | Connected_time | Busy_time | Cpu_time | Bytes_received | Bytes_sent | Binlog_bytes_written | Rows_read | Rows_sent | Rows_deleted | Rows_inserted | Rows_updated | Select_commands | Update_commands | Other_commands | Commit_transactions | Rollback_transactions | Denied_connections | Lost_connections | Access_denied | Empty_queries | Total_ssl_connections | Max_statement_time_exceeded |
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+
+| root | 1 | 0 | 9 | 0.000156 | 0.0001541 | 25 | 2799 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+| netdata | 1 | 0 | 32 | 0.09262200000000004 | 0.07723410000000001 | 13440 | 105432 | 0 | 0 | 99 | 0 | 0 | 0 | 33 | 0 | 0 | 0 | 0 | 49698 | 0 | 33 | 66 | 0 | 0 |
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/version.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/version.txt
new file mode 100644
index 000000000..2e7ca5b02
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v10.8.4/version.txt
@@ -0,0 +1,6 @@
++-----------------+---------------------+
+| Variable_name | Value |
++-----------------+---------------------+
+| version | 10.8.4-MariaDB |
+| version_comment | Source distribution |
++-----------------+---------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_status.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_status.txt
new file mode 100644
index 000000000..7c75f0619
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_status.txt
@@ -0,0 +1,423 @@
++------------------------------------------+-------------+
+| Variable_name | Value |
++------------------------------------------+-------------+
+| Aborted_clients | 0 |
+| Aborted_connects | 0 |
+| Access_denied_errors | 0 |
+| Aria_pagecache_blocks_not_flushed | 0 |
+| Aria_pagecache_blocks_unused | 15737 |
+| Aria_pagecache_blocks_used | 0 |
+| Aria_pagecache_read_requests | 0 |
+| Aria_pagecache_reads | 0 |
+| Aria_pagecache_write_requests | 0 |
+| Aria_pagecache_writes | 0 |
+| Aria_transaction_log_syncs | 0 |
+| Binlog_commits | 0 |
+| Binlog_group_commits | 0 |
+| Binlog_snapshot_file | |
+| Binlog_snapshot_position | 0 |
+| Binlog_bytes_written | 0 |
+| Binlog_cache_disk_use | 0 |
+| Binlog_cache_use | 0 |
+| Binlog_stmt_cache_disk_use | 0 |
+| Binlog_stmt_cache_use | 0 |
+| Busy_time | 0.000000 |
+| Bytes_received | 639 |
+| Bytes_sent | 41620 |
+| Com_admin_commands | 0 |
+| Com_alter_db | 0 |
+| Com_alter_db_upgrade | 0 |
+| Com_alter_event | 0 |
+| Com_alter_function | 0 |
+| Com_alter_procedure | 0 |
+| Com_alter_server | 0 |
+| Com_alter_table | 0 |
+| Com_alter_tablespace | 0 |
+| Com_analyze | 0 |
+| Com_assign_to_keycache | 0 |
+| Com_begin | 0 |
+| Com_binlog | 0 |
+| Com_call_procedure | 0 |
+| Com_change_db | 0 |
+| Com_change_master | 0 |
+| Com_check | 0 |
+| Com_checksum | 0 |
+| Com_commit | 0 |
+| Com_create_db | 0 |
+| Com_create_event | 0 |
+| Com_create_function | 0 |
+| Com_create_index | 0 |
+| Com_create_procedure | 0 |
+| Com_create_server | 0 |
+| Com_create_table | 0 |
+| Com_create_trigger | 0 |
+| Com_create_udf | 0 |
+| Com_create_user | 0 |
+| Com_create_view | 0 |
+| Com_dealloc_sql | 0 |
+| Com_delete | 0 |
+| Com_delete_multi | 0 |
+| Com_do | 0 |
+| Com_drop_db | 0 |
+| Com_drop_event | 0 |
+| Com_drop_function | 0 |
+| Com_drop_index | 0 |
+| Com_drop_procedure | 0 |
+| Com_drop_server | 0 |
+| Com_drop_table | 0 |
+| Com_drop_trigger | 0 |
+| Com_drop_user | 0 |
+| Com_drop_view | 0 |
+| Com_empty_query | 0 |
+| Com_execute_sql | 0 |
+| Com_flush | 0 |
+| Com_grant | 0 |
+| Com_ha_close | 0 |
+| Com_ha_open | 0 |
+| Com_ha_read | 0 |
+| Com_help | 0 |
+| Com_insert | 0 |
+| Com_insert_select | 0 |
+| Com_install_plugin | 0 |
+| Com_kill | 0 |
+| Com_load | 0 |
+| Com_lock_tables | 0 |
+| Com_optimize | 0 |
+| Com_preload_keys | 0 |
+| Com_prepare_sql | 0 |
+| Com_purge | 0 |
+| Com_purge_before_date | 0 |
+| Com_release_savepoint | 0 |
+| Com_rename_table | 0 |
+| Com_rename_user | 0 |
+| Com_repair | 0 |
+| Com_replace | 0 |
+| Com_replace_select | 0 |
+| Com_reset | 0 |
+| Com_resignal | 0 |
+| Com_revoke | 0 |
+| Com_revoke_all | 0 |
+| Com_rollback | 0 |
+| Com_rollback_to_savepoint | 0 |
+| Com_savepoint | 0 |
+| Com_select | 4 |
+| Com_set_option | 0 |
+| Com_show_authors | 0 |
+| Com_show_binlog_events | 0 |
+| Com_show_binlogs | 0 |
+| Com_show_charsets | 0 |
+| Com_show_client_statistics | 0 |
+| Com_show_collations | 0 |
+| Com_show_contributors | 0 |
+| Com_show_create_db | 0 |
+| Com_show_create_event | 0 |
+| Com_show_create_func | 0 |
+| Com_show_create_proc | 0 |
+| Com_show_create_table | 0 |
+| Com_show_create_trigger | 0 |
+| Com_show_databases | 0 |
+| Com_show_engine_logs | 0 |
+| Com_show_engine_mutex | 0 |
+| Com_show_engine_status | 0 |
+| Com_show_errors | 0 |
+| Com_show_events | 0 |
+| Com_show_fields | 0 |
+| Com_show_function_status | 0 |
+| Com_show_grants | 0 |
+| Com_show_index_statistics | 0 |
+| Com_show_keys | 0 |
+| Com_show_master_status | 0 |
+| Com_show_open_tables | 0 |
+| Com_show_plugins | 0 |
+| Com_show_privileges | 0 |
+| Com_show_procedure_status | 0 |
+| Com_show_processlist | 0 |
+| Com_show_profile | 0 |
+| Com_show_profiles | 0 |
+| Com_show_relaylog_events | 0 |
+| Com_show_slave_hosts | 0 |
+| Com_show_slave_status | 0 |
+| Com_show_status | 1 |
+| Com_show_storage_engines | 0 |
+| Com_show_table_statistics | 0 |
+| Com_show_table_status | 0 |
+| Com_show_tables | 0 |
+| Com_show_triggers | 0 |
+| Com_show_user_statistics | 0 |
+| Com_show_variables | 4 |
+| Com_show_warnings | 0 |
+| Com_signal | 0 |
+| Com_slave_start | 0 |
+| Com_slave_stop | 0 |
+| Com_stmt_close | 0 |
+| Com_stmt_execute | 0 |
+| Com_stmt_fetch | 0 |
+| Com_stmt_prepare | 0 |
+| Com_stmt_reprepare | 0 |
+| Com_stmt_reset | 0 |
+| Com_stmt_send_long_data | 0 |
+| Com_truncate | 0 |
+| Com_uninstall_plugin | 0 |
+| Com_unlock_tables | 0 |
+| Com_update | 0 |
+| Com_update_multi | 0 |
+| Com_xa_commit | 0 |
+| Com_xa_end | 0 |
+| Com_xa_prepare | 0 |
+| Com_xa_recover | 0 |
+| Com_xa_rollback | 0 |
+| Com_xa_start | 0 |
+| Compression | OFF |
+| Connections | 4 |
+| Cpu_time | 0.000000 |
+| Created_tmp_disk_tables | 0 |
+| Created_tmp_files | 6 |
+| Created_tmp_tables | 5 |
+| Delayed_errors | 0 |
+| Delayed_insert_threads | 0 |
+| Delayed_writes | 0 |
+| Empty_queries | 0 |
+| Executed_events | 0 |
+| Executed_triggers | 0 |
+| Feature_dynamic_columns | 0 |
+| Feature_fulltext | 0 |
+| Feature_gis | 0 |
+| Feature_locale | 0 |
+| Feature_subquery | 0 |
+| Feature_timezone | 0 |
+| Feature_trigger | 0 |
+| Feature_xml | 0 |
+| Flush_commands | 2 |
+| Handler_commit | 0 |
+| Handler_delete | 0 |
+| Handler_discover | 0 |
+| Handler_icp_attempts | 0 |
+| Handler_icp_match | 0 |
+| Handler_mrr_init | 0 |
+| Handler_mrr_key_refills | 0 |
+| Handler_mrr_rowid_refills | 0 |
+| Handler_prepare | 0 |
+| Handler_read_first | 0 |
+| Handler_read_key | 0 |
+| Handler_read_last | 0 |
+| Handler_read_next | 0 |
+| Handler_read_prev | 0 |
+| Handler_read_rnd | 0 |
+| Handler_read_rnd_deleted | 0 |
+| Handler_read_rnd_next | 1264 |
+| Handler_rollback | 0 |
+| Handler_savepoint | 0 |
+| Handler_savepoint_rollback | 0 |
+| Handler_tmp_update | 0 |
+| Handler_tmp_write | 1260 |
+| Handler_update | 0 |
+| Handler_write | 0 |
+| Innodb_adaptive_hash_cells | 553229 |
+| Innodb_adaptive_hash_hash_searches | 0 |
+| Innodb_adaptive_hash_heap_buffers | 0 |
+| Innodb_adaptive_hash_non_hash_searches | 19 |
+| Innodb_background_log_sync | 1 |
+| Innodb_buffer_pool_bytes_data | 2342912 |
+| Innodb_buffer_pool_bytes_dirty | 0 |
+| Innodb_buffer_pool_pages_data | 143 |
+| Innodb_buffer_pool_pages_dirty | 0 |
+| Innodb_buffer_pool_pages_flushed | 0 |
+| Innodb_buffer_pool_pages_free | 16240 |
+| Innodb_buffer_pool_pages_LRU_flushed | 0 |
+| Innodb_buffer_pool_pages_made_not_young | 0 |
+| Innodb_buffer_pool_pages_made_young | 0 |
+| Innodb_buffer_pool_pages_misc | 0 |
+| Innodb_buffer_pool_pages_old | 0 |
+| Innodb_buffer_pool_pages_total | 16383 |
+| Innodb_buffer_pool_read_ahead | 0 |
+| Innodb_buffer_pool_read_ahead_evicted | 0 |
+| Innodb_buffer_pool_read_ahead_rnd | 0 |
+| Innodb_buffer_pool_read_requests | 459 |
+| Innodb_buffer_pool_reads | 144 |
+| Innodb_buffer_pool_wait_free | 0 |
+| Innodb_buffer_pool_write_requests | 0 |
+| Innodb_checkpoint_age | 0 |
+| Innodb_checkpoint_max_age | 7782360 |
+| Innodb_checkpoint_target_age | 7539162 |
+| Innodb_current_row_locks | 0 |
+| Innodb_data_fsyncs | 3 |
+| Innodb_data_pending_fsyncs | 0 |
+| Innodb_data_pending_reads | 0 |
+| Innodb_data_pending_writes | 0 |
+| Innodb_data_read | 4542976 |
+| Innodb_data_reads | 155 |
+| Innodb_data_writes | 3 |
+| Innodb_data_written | 1536 |
+| Innodb_dblwr_pages_written | 0 |
+| Innodb_dblwr_writes | 0 |
+| Innodb_deadlocks | 0 |
+| Innodb_descriptors_memory | 8000 |
+| Innodb_dict_tables | 8 |
+| Innodb_have_atomic_builtins | ON |
+| Innodb_history_list_length | 0 |
+| Innodb_ibuf_discarded_delete_marks | 0 |
+| Innodb_ibuf_discarded_deletes | 0 |
+| Innodb_ibuf_discarded_inserts | 0 |
+| Innodb_ibuf_free_list | 0 |
+| Innodb_ibuf_merged_delete_marks | 0 |
+| Innodb_ibuf_merged_deletes | 0 |
+| Innodb_ibuf_merged_inserts | 0 |
+| Innodb_ibuf_merges | 0 |
+| Innodb_ibuf_segment_size | 2 |
+| Innodb_ibuf_size | 1 |
+| Innodb_log_waits | 0 |
+| Innodb_log_write_requests | 0 |
+| Innodb_log_writes | 1 |
+| Innodb_lsn_current | 1597945 |
+| Innodb_lsn_flushed | 1597945 |
+| Innodb_lsn_last_checkpoint | 1597945 |
+| Innodb_master_thread_1_second_loops | 1 |
+| Innodb_master_thread_10_second_loops | 0 |
+| Innodb_master_thread_background_loops | 1 |
+| Innodb_master_thread_main_flush_loops | 1 |
+| Innodb_master_thread_sleeps | 1 |
+| Innodb_max_trx_id | 1280 |
+| Innodb_mem_adaptive_hash | 4430048 |
+| Innodb_mem_dictionary | 1146964 |
+| Innodb_mem_total | 275513344 |
+| Innodb_mutex_os_waits | 0 |
+| Innodb_mutex_spin_rounds | 2 |
+| Innodb_mutex_spin_waits | 1 |
+| Innodb_oldest_view_low_limit_trx_id | 1280 |
+| Innodb_os_log_fsyncs | 3 |
+| Innodb_os_log_pending_fsyncs | 0 |
+| Innodb_os_log_pending_writes | 0 |
+| Innodb_os_log_written | 512 |
+| Innodb_page_size | 16384 |
+| Innodb_pages_created | 0 |
+| Innodb_pages_read | 143 |
+| Innodb_pages_written | 0 |
+| Innodb_purge_trx_id | 0 |
+| Innodb_purge_undo_no | 0 |
+| Innodb_read_views_memory | 88 |
+| Innodb_row_lock_current_waits | 0 |
+| Innodb_row_lock_time | 0 |
+| Innodb_row_lock_time_avg | 0 |
+| Innodb_row_lock_time_max | 0 |
+| Innodb_row_lock_waits | 0 |
+| Innodb_rows_deleted | 0 |
+| Innodb_rows_inserted | 0 |
+| Innodb_rows_read | 0 |
+| Innodb_rows_updated | 0 |
+| Innodb_s_lock_os_waits | 2 |
+| Innodb_s_lock_spin_rounds | 60 |
+| Innodb_s_lock_spin_waits | 2 |
+| Innodb_truncated_status_writes | 0 |
+| Innodb_x_lock_os_waits | 0 |
+| Innodb_x_lock_spin_rounds | 0 |
+| Innodb_x_lock_spin_waits | 0 |
+| Key_blocks_not_flushed | 0 |
+| Key_blocks_unused | 107171 |
+| Key_blocks_used | 0 |
+| Key_blocks_warm | 0 |
+| Key_read_requests | 0 |
+| Key_reads | 0 |
+| Key_write_requests | 0 |
+| Key_writes | 0 |
+| Last_query_cost | 0.000000 |
+| Max_used_connections | 1 |
+| Not_flushed_delayed_rows | 0 |
+| Open_files | 21 |
+| Open_streams | 0 |
+| Open_table_definitions | 33 |
+| Open_tables | 26 |
+| Opened_files | 84 |
+| Opened_table_definitions | 0 |
+| Opened_tables | 0 |
+| Opened_views | 0 |
+| Performance_schema_cond_classes_lost | 0 |
+| Performance_schema_cond_instances_lost | 0 |
+| Performance_schema_file_classes_lost | 0 |
+| Performance_schema_file_handles_lost | 0 |
+| Performance_schema_file_instances_lost | 0 |
+| Performance_schema_locker_lost | 0 |
+| Performance_schema_mutex_classes_lost | 0 |
+| Performance_schema_mutex_instances_lost | 0 |
+| Performance_schema_rwlock_classes_lost | 0 |
+| Performance_schema_rwlock_instances_lost | 0 |
+| Performance_schema_table_handles_lost | 0 |
+| Performance_schema_table_instances_lost | 0 |
+| Performance_schema_thread_classes_lost | 0 |
+| Performance_schema_thread_instances_lost | 0 |
+| Prepared_stmt_count | 0 |
+| Qcache_free_blocks | 1 |
+| Qcache_free_memory | 67091120 |
+| Qcache_hits | 0 |
+| Qcache_inserts | 0 |
+| Qcache_lowmem_prunes | 0 |
+| Qcache_not_cached | 4 |
+| Qcache_queries_in_cache | 0 |
+| Qcache_total_blocks | 1 |
+| Queries | 12 |
+| Questions | 11 |
+| Rows_read | 0 |
+| Rows_sent | 1264 |
+| Rows_tmp_read | 1260 |
+| Rpl_status | AUTH_MASTER |
+| Select_full_join | 0 |
+| Select_full_range_join | 0 |
+| Select_range | 0 |
+| Select_range_check | 0 |
+| Select_scan | 5 |
+| Slave_heartbeat_period | 0.000 |
+| Slave_open_temp_tables | 0 |
+| Slave_received_heartbeats | 0 |
+| Slave_retried_transactions | 0 |
+| Slave_running | OFF |
+| Slow_launch_threads | 0 |
+| Slow_queries | 0 |
+| Sort_merge_passes | 0 |
+| Sort_range | 0 |
+| Sort_rows | 0 |
+| Sort_scan | 0 |
+| Sphinx_error | |
+| Sphinx_time | |
+| Sphinx_total | |
+| Sphinx_total_found | |
+| Sphinx_word_count | |
+| Sphinx_words | |
+| Ssl_accept_renegotiates | 0 |
+| Ssl_accepts | 0 |
+| Ssl_callback_cache_hits | 0 |
+| Ssl_cipher | |
+| Ssl_cipher_list | |
+| Ssl_client_connects | 0 |
+| Ssl_connect_renegotiates | 0 |
+| Ssl_ctx_verify_depth | 0 |
+| Ssl_ctx_verify_mode | 0 |
+| Ssl_default_timeout | 0 |
+| Ssl_finished_accepts | 0 |
+| Ssl_finished_connects | 0 |
+| Ssl_session_cache_hits | 0 |
+| Ssl_session_cache_misses | 0 |
+| Ssl_session_cache_mode | NONE |
+| Ssl_session_cache_overflows | 0 |
+| Ssl_session_cache_size | 0 |
+| Ssl_session_cache_timeouts | 0 |
+| Ssl_sessions_reused | 0 |
+| Ssl_used_session_cache_entries | 0 |
+| Ssl_verify_depth | 0 |
+| Ssl_verify_mode | 0 |
+| Ssl_version | |
+| Subquery_cache_hit | 0 |
+| Subquery_cache_miss | 0 |
+| Syncs | 0 |
+| Table_locks_immediate | 36 |
+| Table_locks_waited | 0 |
+| Tc_log_max_pages_used | 0 |
+| Tc_log_page_size | 0 |
+| Tc_log_page_waits | 0 |
+| Threadpool_idle_threads | 0 |
+| Threadpool_threads | 0 |
+| Threads_cached | 0 |
+| Threads_connected | 1 |
+| Threads_created | 1 |
+| Threads_running | 1 |
+| Uptime | 113 |
+| Uptime_since_flush_status | 113 |
++------------------------------------------+-------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_variables.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_variables.txt
new file mode 100644
index 000000000..5f0906eed
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/global_variables.txt
@@ -0,0 +1,7 @@
++------------------+-------+
+| Variable_name | Value |
++------------------+-------+
+| log_bin | OFF |
+| max_connections | 100 |
+| table_open_cache | 400 |
++------------------+-------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/process_list.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/process_list.txt
new file mode 100644
index 000000000..a44ce5e70
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/process_list.txt
@@ -0,0 +1,6 @@
++------+---------+
+| time | user |
++------+---------+
+| 1 | netdata |
+| 9 | root |
++------+---------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/version.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/version.txt
new file mode 100644
index 000000000..de684279d
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mariadb/v5.5.64/version.txt
@@ -0,0 +1,6 @@
++-----------------+---------------------------------+
+| Variable_name | Value |
++-----------------+---------------------------------+
+| version | 5.5.64-MariaDB-1~trusty |
+| version_comment | mariadb.org binary distribution |
++-----------------+---------------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_status.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_status.txt
new file mode 100644
index 000000000..a4b2f2f93
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_status.txt
@@ -0,0 +1,490 @@
++-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Variable_name | Value |
++-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Aborted_clients | 0 |
+| Aborted_connects | 0 |
+| Acl_cache_items_count | 0 |
+| Binlog_cache_disk_use | 0 |
+| Binlog_cache_use | 6 |
+| Binlog_stmt_cache_disk_use | 0 |
+| Binlog_stmt_cache_use | 0 |
+| Bytes_received | 5584 |
+| Bytes_sent | 70700 |
+| Com_admin_commands | 5 |
+| Com_assign_to_keycache | 0 |
+| Com_alter_db | 0 |
+| Com_alter_event | 0 |
+| Com_alter_function | 0 |
+| Com_alter_instance | 0 |
+| Com_alter_procedure | 0 |
+| Com_alter_resource_group | 0 |
+| Com_alter_server | 0 |
+| Com_alter_table | 0 |
+| Com_alter_tablespace | 0 |
+| Com_alter_user | 2 |
+| Com_alter_user_default_role | 0 |
+| Com_analyze | 0 |
+| Com_begin | 0 |
+| Com_binlog | 0 |
+| Com_call_procedure | 0 |
+| Com_change_db | 1 |
+| Com_change_master | 0 |
+| Com_change_repl_filter | 0 |
+| Com_change_replication_source | 0 |
+| Com_check | 0 |
+| Com_checksum | 0 |
+| Com_clone | 0 |
+| Com_commit | 0 |
+| Com_create_db | 1 |
+| Com_create_event | 0 |
+| Com_create_function | 0 |
+| Com_create_index | 0 |
+| Com_create_procedure | 0 |
+| Com_create_role | 0 |
+| Com_create_server | 0 |
+| Com_create_table | 35 |
+| Com_create_resource_group | 0 |
+| Com_create_trigger | 0 |
+| Com_create_udf | 0 |
+| Com_create_user | 2 |
+| Com_create_view | 0 |
+| Com_create_spatial_reference_system | 0 |
+| Com_dealloc_sql | 0 |
+| Com_delete | 0 |
+| Com_delete_multi | 0 |
+| Com_do | 0 |
+| Com_drop_db | 0 |
+| Com_drop_event | 0 |
+| Com_drop_function | 0 |
+| Com_drop_index | 0 |
+| Com_drop_procedure | 0 |
+| Com_drop_resource_group | 0 |
+| Com_drop_role | 0 |
+| Com_drop_server | 0 |
+| Com_drop_spatial_reference_system | 0 |
+| Com_drop_table | 0 |
+| Com_drop_trigger | 0 |
+| Com_drop_user | 0 |
+| Com_drop_view | 0 |
+| Com_empty_query | 0 |
+| Com_execute_sql | 0 |
+| Com_explain_other | 0 |
+| Com_flush | 1 |
+| Com_get_diagnostics | 0 |
+| Com_grant | 2 |
+| Com_grant_roles | 0 |
+| Com_ha_close | 0 |
+| Com_ha_open | 0 |
+| Com_ha_read | 0 |
+| Com_help | 0 |
+| Com_import | 0 |
+| Com_insert | 0 |
+| Com_insert_select | 0 |
+| Com_install_component | 0 |
+| Com_install_plugin | 0 |
+| Com_kill | 0 |
+| Com_load | 0 |
+| Com_lock_instance | 0 |
+| Com_lock_tables | 0 |
+| Com_optimize | 0 |
+| Com_preload_keys | 0 |
+| Com_prepare_sql | 0 |
+| Com_purge | 0 |
+| Com_purge_before_date | 0 |
+| Com_release_savepoint | 0 |
+| Com_rename_table | 0 |
+| Com_rename_user | 0 |
+| Com_repair | 0 |
+| Com_replace | 0 |
+| Com_replace_select | 0 |
+| Com_reset | 0 |
+| Com_resignal | 0 |
+| Com_restart | 0 |
+| Com_revoke | 0 |
+| Com_revoke_all | 0 |
+| Com_revoke_roles | 0 |
+| Com_rollback | 0 |
+| Com_rollback_to_savepoint | 0 |
+| Com_savepoint | 0 |
+| Com_select | 2 |
+| Com_set_option | 4 |
+| Com_set_password | 0 |
+| Com_set_resource_group | 0 |
+| Com_set_role | 0 |
+| Com_signal | 0 |
+| Com_show_binlog_events | 0 |
+| Com_show_binlogs | 0 |
+| Com_show_charsets | 0 |
+| Com_show_collations | 0 |
+| Com_show_create_db | 0 |
+| Com_show_create_event | 0 |
+| Com_show_create_func | 0 |
+| Com_show_create_proc | 0 |
+| Com_show_create_table | 0 |
+| Com_show_create_trigger | 0 |
+| Com_show_databases | 0 |
+| Com_show_engine_logs | 0 |
+| Com_show_engine_mutex | 0 |
+| Com_show_engine_status | 0 |
+| Com_show_events | 0 |
+| Com_show_errors | 0 |
+| Com_show_fields | 0 |
+| Com_show_function_code | 0 |
+| Com_show_function_status | 0 |
+| Com_show_grants | 0 |
+| Com_show_keys | 0 |
+| Com_show_master_status | 0 |
+| Com_show_open_tables | 0 |
+| Com_show_plugins | 0 |
+| Com_show_privileges | 0 |
+| Com_show_procedure_code | 0 |
+| Com_show_procedure_status | 0 |
+| Com_show_processlist | 0 |
+| Com_show_profile | 0 |
+| Com_show_profiles | 0 |
+| Com_show_relaylog_events | 0 |
+| Com_show_replicas | 0 |
+| Com_show_slave_hosts | 0 |
+| Com_show_replica_status | 2 |
+| Com_show_slave_status | 2 |
+| Com_show_status | 5 |
+| Com_show_storage_engines | 0 |
+| Com_show_table_status | 0 |
+| Com_show_tables | 0 |
+| Com_show_triggers | 0 |
+| Com_show_variables | 1 |
+| Com_show_warnings | 0 |
+| Com_show_create_user | 0 |
+| Com_shutdown | 0 |
+| Com_replica_start | 0 |
+| Com_slave_start | 0 |
+| Com_replica_stop | 0 |
+| Com_slave_stop | 0 |
+| Com_group_replication_start | 0 |
+| Com_group_replication_stop | 0 |
+| Com_stmt_execute | 0 |
+| Com_stmt_close | 0 |
+| Com_stmt_fetch | 0 |
+| Com_stmt_prepare | 0 |
+| Com_stmt_reset | 0 |
+| Com_stmt_send_long_data | 0 |
+| Com_truncate | 0 |
+| Com_uninstall_component | 0 |
+| Com_uninstall_plugin | 0 |
+| Com_unlock_instance | 0 |
+| Com_unlock_tables | 0 |
+| Com_update | 0 |
+| Com_update_multi | 0 |
+| Com_xa_commit | 0 |
+| Com_xa_end | 0 |
+| Com_xa_prepare | 0 |
+| Com_xa_recover | 0 |
+| Com_xa_rollback | 0 |
+| Com_xa_start | 0 |
+| Com_stmt_reprepare | 0 |
+| Connection_errors_accept | 0 |
+| Connection_errors_internal | 0 |
+| Connection_errors_max_connections | 0 |
+| Connection_errors_peer_address | 0 |
+| Connection_errors_select | 0 |
+| Connection_errors_tcpwrap | 0 |
+| Connections | 25 |
+| Created_tmp_disk_tables | 0 |
+| Created_tmp_files | 5 |
+| Created_tmp_tables | 6 |
+| Current_tls_ca | ca.pem |
+| Current_tls_capath | |
+| Current_tls_cert | server-cert.pem |
+| Current_tls_cipher | |
+| Current_tls_ciphersuites | |
+| Current_tls_crl | |
+| Current_tls_crlpath | |
+| Current_tls_key | server-key.pem |
+| Current_tls_version | TLSv1.2,TLSv1.3 |
+| Delayed_errors | 0 |
+| Delayed_insert_threads | 0 |
+| Delayed_writes | 0 |
+| Error_log_buffered_bytes | 2752 |
+| Error_log_buffered_events | 15 |
+| Error_log_expired_events | 0 |
+| Error_log_latest_write | 1660827046947930 |
+| Flush_commands | 3 |
+| Global_connection_memory | 0 |
+| Handler_commit | 720 |
+| Handler_delete | 8 |
+| Handler_discover | 0 |
+| Handler_external_lock | 6779 |
+| Handler_mrr_init | 0 |
+| Handler_prepare | 24 |
+| Handler_read_first | 50 |
+| Handler_read_key | 1914 |
+| Handler_read_last | 0 |
+| Handler_read_next | 4303 |
+| Handler_read_prev | 0 |
+| Handler_read_rnd | 0 |
+| Handler_read_rnd_next | 4723 |
+| Handler_rollback | 1 |
+| Handler_savepoint | 0 |
+| Handler_savepoint_rollback | 0 |
+| Handler_update | 373 |
+| Handler_write | 1966 |
+| Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
+| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 220818 12:50:46 |
+| Innodb_buffer_pool_resize_status | |
+| Innodb_buffer_pool_pages_data | 1045 |
+| Innodb_buffer_pool_bytes_data | 17121280 |
+| Innodb_buffer_pool_pages_dirty | 0 |
+| Innodb_buffer_pool_bytes_dirty | 0 |
+| Innodb_buffer_pool_pages_flushed | 361 |
+| Innodb_buffer_pool_pages_free | 7143 |
+| Innodb_buffer_pool_pages_misc | 4 |
+| Innodb_buffer_pool_pages_total | 8192 |
+| Innodb_buffer_pool_read_ahead_rnd | 0 |
+| Innodb_buffer_pool_read_ahead | 0 |
+| Innodb_buffer_pool_read_ahead_evicted | 0 |
+| Innodb_buffer_pool_read_requests | 16723 |
+| Innodb_buffer_pool_reads | 878 |
+| Innodb_buffer_pool_wait_free | 0 |
+| Innodb_buffer_pool_write_requests | 2377 |
+| Innodb_data_fsyncs | 255 |
+| Innodb_data_pending_fsyncs | 0 |
+| Innodb_data_pending_reads | 0 |
+| Innodb_data_pending_writes | 0 |
+| Innodb_data_read | 14453760 |
+| Innodb_data_reads | 899 |
+| Innodb_data_writes | 561 |
+| Innodb_data_written | 6128128 |
+| Innodb_dblwr_pages_written | 220 |
+| Innodb_dblwr_writes | 58 |
+| Innodb_redo_log_read_only | OFF |
+| Innodb_redo_log_uuid | 1075899837 |
+| Innodb_redo_log_checkpoint_lsn | 31758453 |
+| Innodb_redo_log_current_lsn | 31758453 |
+| Innodb_redo_log_flushed_to_disk_lsn | 31758453 |
+| Innodb_redo_log_logical_size | 512 |
+| Innodb_redo_log_physical_size | 3276800 |
+| Innodb_redo_log_capacity_resized | 104857600 |
+| Innodb_redo_log_resize_status | OK |
+| Innodb_log_waits | 0 |
+| Innodb_log_write_requests | 1062 |
+| Innodb_log_writes | 116 |
+| Innodb_os_log_fsyncs | 69 |
+| Innodb_os_log_pending_fsyncs | 0 |
+| Innodb_os_log_pending_writes | 0 |
+| Innodb_os_log_written | 147968 |
+| Innodb_page_size | 16384 |
+| Innodb_pages_created | 168 |
+| Innodb_pages_read | 877 |
+| Innodb_pages_written | 361 |
+| Innodb_redo_log_enabled | ON |
+| Innodb_row_lock_current_waits | 0 |
+| Innodb_row_lock_time | 0 |
+| Innodb_row_lock_time_avg | 0 |
+| Innodb_row_lock_time_max | 0 |
+| Innodb_row_lock_waits | 0 |
+| Innodb_rows_deleted | 0 |
+| Innodb_rows_inserted | 0 |
+| Innodb_rows_read | 0 |
+| Innodb_rows_updated | 0 |
+| Innodb_system_rows_deleted | 8 |
+| Innodb_system_rows_inserted | 12 |
+| Innodb_system_rows_read | 5134 |
+| Innodb_system_rows_updated | 373 |
+| Innodb_sampled_pages_read | 0 |
+| Innodb_sampled_pages_skipped | 0 |
+| Innodb_num_open_files | 15 |
+| Innodb_truncated_status_writes | 0 |
+| Innodb_undo_tablespaces_total | 2 |
+| Innodb_undo_tablespaces_implicit | 2 |
+| Innodb_undo_tablespaces_explicit | 0 |
+| Innodb_undo_tablespaces_active | 2 |
+| Key_blocks_not_flushed | 0 |
+| Key_blocks_unused | 6698 |
+| Key_blocks_used | 0 |
+| Key_read_requests | 0 |
+| Key_reads | 0 |
+| Key_write_requests | 0 |
+| Key_writes | 0 |
+| Locked_connects | 0 |
+| Max_execution_time_exceeded | 0 |
+| Max_execution_time_set | 0 |
+| Max_execution_time_set_failed | 0 |
+| Max_used_connections | 2 |
+| Max_used_connections_time | 2022-08-18 12:51:46 |
+| Mysqlx_aborted_clients | 0 |
+| Mysqlx_address | :: |
+| Mysqlx_bytes_received | 0 |
+| Mysqlx_bytes_received_compressed_payload | 0 |
+| Mysqlx_bytes_received_uncompressed_frame | 0 |
+| Mysqlx_bytes_sent | 0 |
+| Mysqlx_bytes_sent_compressed_payload | 0 |
+| Mysqlx_bytes_sent_uncompressed_frame | 0 |
+| Mysqlx_compression_algorithm | |
+| Mysqlx_compression_level | |
+| Mysqlx_connection_accept_errors | 0 |
+| Mysqlx_connection_errors | 0 |
+| Mysqlx_connections_accepted | 0 |
+| Mysqlx_connections_closed | 0 |
+| Mysqlx_connections_rejected | 0 |
+| Mysqlx_crud_create_view | 0 |
+| Mysqlx_crud_delete | 0 |
+| Mysqlx_crud_drop_view | 0 |
+| Mysqlx_crud_find | 0 |
+| Mysqlx_crud_insert | 0 |
+| Mysqlx_crud_modify_view | 0 |
+| Mysqlx_crud_update | 0 |
+| Mysqlx_cursor_close | 0 |
+| Mysqlx_cursor_fetch | 0 |
+| Mysqlx_cursor_open | 0 |
+| Mysqlx_errors_sent | 0 |
+| Mysqlx_errors_unknown_message_type | 0 |
+| Mysqlx_expect_close | 0 |
+| Mysqlx_expect_open | 0 |
+| Mysqlx_init_error | 0 |
+| Mysqlx_messages_sent | 0 |
+| Mysqlx_notice_global_sent | 0 |
+| Mysqlx_notice_other_sent | 0 |
+| Mysqlx_notice_warning_sent | 0 |
+| Mysqlx_notified_by_group_replication | 0 |
+| Mysqlx_port | 33060 |
+| Mysqlx_prep_deallocate | 0 |
+| Mysqlx_prep_execute | 0 |
+| Mysqlx_prep_prepare | 0 |
+| Mysqlx_rows_sent | 0 |
+| Mysqlx_sessions | 0 |
+| Mysqlx_sessions_accepted | 0 |
+| Mysqlx_sessions_closed | 0 |
+| Mysqlx_sessions_fatal_error | 0 |
+| Mysqlx_sessions_killed | 0 |
+| Mysqlx_sessions_rejected | 0 |
+| Mysqlx_socket | /var/run/mysqld/mysqlx.sock |
+| Mysqlx_ssl_accepts | 0 |
+| Mysqlx_ssl_active | |
+| Mysqlx_ssl_cipher | |
+| Mysqlx_ssl_cipher_list | |
+| Mysqlx_ssl_ctx_verify_depth | 18446744073709551615 |
+| Mysqlx_ssl_ctx_verify_mode | 5 |
+| Mysqlx_ssl_finished_accepts | 0 |
+| Mysqlx_ssl_server_not_after | Aug 15 12:43:39 2032 GMT |
+| Mysqlx_ssl_server_not_before | Aug 18 12:43:39 2022 GMT |
+| Mysqlx_ssl_verify_depth | |
+| Mysqlx_ssl_verify_mode | |
+| Mysqlx_ssl_version | |
+| Mysqlx_stmt_create_collection | 0 |
+| Mysqlx_stmt_create_collection_index | 0 |
+| Mysqlx_stmt_disable_notices | 0 |
+| Mysqlx_stmt_drop_collection | 0 |
+| Mysqlx_stmt_drop_collection_index | 0 |
+| Mysqlx_stmt_enable_notices | 0 |
+| Mysqlx_stmt_ensure_collection | 0 |
+| Mysqlx_stmt_execute_mysqlx | 0 |
+| Mysqlx_stmt_execute_sql | 0 |
+| Mysqlx_stmt_execute_xplugin | 0 |
+| Mysqlx_stmt_get_collection_options | 0 |
+| Mysqlx_stmt_kill_client | 0 |
+| Mysqlx_stmt_list_clients | 0 |
+| Mysqlx_stmt_list_notices | 0 |
+| Mysqlx_stmt_list_objects | 0 |
+| Mysqlx_stmt_modify_collection_options | 0 |
+| Mysqlx_stmt_ping | 0 |
+| Mysqlx_worker_threads | 2 |
+| Mysqlx_worker_threads_active | 0 |
+| Not_flushed_delayed_rows | 0 |
+| Ongoing_anonymous_transaction_count | 0 |
+| Open_files | 8 |
+| Open_streams | 0 |
+| Open_table_definitions | 48 |
+| Open_tables | 127 |
+| Opened_files | 8 |
+| Opened_table_definitions | 77 |
+| Opened_tables | 208 |
+| Performance_schema_accounts_lost | 0 |
+| Performance_schema_cond_classes_lost | 0 |
+| Performance_schema_cond_instances_lost | 0 |
+| Performance_schema_digest_lost | 0 |
+| Performance_schema_file_classes_lost | 0 |
+| Performance_schema_file_handles_lost | 0 |
+| Performance_schema_file_instances_lost | 0 |
+| Performance_schema_hosts_lost | 0 |
+| Performance_schema_index_stat_lost | 0 |
+| Performance_schema_locker_lost | 0 |
+| Performance_schema_memory_classes_lost | 0 |
+| Performance_schema_metadata_lock_lost | 0 |
+| Performance_schema_mutex_classes_lost | 0 |
+| Performance_schema_mutex_instances_lost | 0 |
+| Performance_schema_nested_statement_lost | 0 |
+| Performance_schema_prepared_statements_lost | 0 |
+| Performance_schema_program_lost | 0 |
+| Performance_schema_rwlock_classes_lost | 0 |
+| Performance_schema_rwlock_instances_lost | 0 |
+| Performance_schema_session_connect_attrs_longest_seen | 112 |
+| Performance_schema_session_connect_attrs_lost | 0 |
+| Performance_schema_socket_classes_lost | 0 |
+| Performance_schema_socket_instances_lost | 0 |
+| Performance_schema_stage_classes_lost | 0 |
+| Performance_schema_statement_classes_lost | 0 |
+| Performance_schema_table_handles_lost | 0 |
+| Performance_schema_table_instances_lost | 0 |
+| Performance_schema_table_lock_stat_lost | 0 |
+| Performance_schema_thread_classes_lost | 0 |
+| Performance_schema_thread_instances_lost | 0 |
+| Performance_schema_users_lost | 0 |
+| Prepared_stmt_count | 0 |
+| Queries | 27 |
+| Questions | 15 |
+| Replica_open_temp_tables | 0 |
+| Secondary_engine_execution_count | 0 |
+| Select_full_join | 0 |
+| Select_full_range_join | 0 |
+| Select_range | 0 |
+| Select_range_check | 0 |
+| Select_scan | 12 |
+| Slave_open_temp_tables | 0 |
+| Slow_launch_threads | 0 |
+| Slow_queries | 0 |
+| Sort_merge_passes | 0 |
+| Sort_range | 0 |
+| Sort_rows | 0 |
+| Sort_scan | 0 |
+| Ssl_accept_renegotiates | 0 |
+| Ssl_accepts | 0 |
+| Ssl_callback_cache_hits | 0 |
+| Ssl_cipher | |
+| Ssl_cipher_list | |
+| Ssl_client_connects | 0 |
+| Ssl_connect_renegotiates | 0 |
+| Ssl_ctx_verify_depth | 18446744073709551615 |
+| Ssl_ctx_verify_mode | 5 |
+| Ssl_default_timeout | 0 |
+| Ssl_finished_accepts | 0 |
+| Ssl_finished_connects | 0 |
+| Ssl_server_not_after | Aug 15 12:43:39 2032 GMT |
+| Ssl_server_not_before | Aug 18 12:43:39 2022 GMT |
+| Ssl_session_cache_hits | 0 |
+| Ssl_session_cache_misses | 0 |
+| Ssl_session_cache_mode | SERVER |
+| Ssl_session_cache_overflows | 0 |
+| Ssl_session_cache_size | 128 |
+| Ssl_session_cache_timeout | 300 |
+| Ssl_session_cache_timeouts | 0 |
+| Ssl_sessions_reused | 0 |
+| Ssl_used_session_cache_entries | 0 |
+| Ssl_verify_depth | 0 |
+| Ssl_verify_mode | 0 |
+| Ssl_version | |
+| Table_locks_immediate | 6 |
+| Table_locks_waited | 0 |
+| Table_open_cache_hits | 3182 |
+| Table_open_cache_misses | 208 |
+| Table_open_cache_overflows | 0 |
+| Tc_log_max_pages_used | 0 |
+| Tc_log_page_size | 0 |
+| Tc_log_page_waits | 0 |
+| Threads_cached | 1 |
+| Threads_connected | 1 |
+| Threads_created | 2 |
+| Threads_running | 2 |
+| Tls_library_version | OpenSSL 1.1.1k FIPS 25 Mar 2021 |
+| Uptime | 152 |
+| Uptime_since_flush_status | 152 |
++-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_variables.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_variables.txt
new file mode 100644
index 000000000..02be0ae8e
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/global_variables.txt
@@ -0,0 +1,9 @@
++--------------------------+-------+
+| Variable_name | Value |
++--------------------------+-------+
+| disabled_storage_engines | |
+| log_bin | ON |
+| max_connections | 151 |
+| performance_schema | ON |
+| table_open_cache | 4000 |
++--------------------------+-------+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/process_list.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/process_list.txt
new file mode 100644
index 000000000..a44ce5e70
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/process_list.txt
@@ -0,0 +1,6 @@
++------+---------+
+| time | user |
++------+---------+
+| 1 | netdata |
+| 9 | root |
++------+---------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/replica_status_multi_source.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/replica_status_multi_source.txt
new file mode 100644
index 000000000..8a5e06836
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/replica_status_multi_source.txt
@@ -0,0 +1,6 @@
++----------------------------------+---------------+-------------+-------------+---------------+--------------------+---------------------+--------------------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+------------------------------------------+-----------------------------------------------------------------------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+
+| Replica_IO_State | Source_Host | Source_User | Source_Port | Connect_Retry | Source_Log_File | Read_Source_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Source_Log_File | Replica_IO_Running | Replica_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Source_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Source_SSL_Allowed | Source_SSL_CA_File | Source_SSL_CA_Path | Source_SSL_Cert | Source_SSL_Cipher | Source_SSL_Key | Seconds_Behind_Source | Source_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Source_Server_Id | Master_UUID | Source_Info_File | SQL_Delay | SQL_Remaining_Delay | Replica_SQL_Running_State | Source_Retry_Count | Source_Bind | Last_IO_Error_Timestamp | Last_SQL_Error_Timestamp | Source_SSL_Crl | Source_SSL_Crlpath | Retrieved_Gtid_Set | Executed_Gtid_Set | Auto_Position | Replicate_Rewrite_DB | Channel_Name | Source_TLS_Version | Source_public_key_path | Get_Source_public_key | Network_Namespace |
++----------------------------------+---------------+-------------+-------------+---------------+--------------------+---------------------+--------------------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+------------------------------------------+-----------------------------------------------------------------------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+
+| Waiting for source to send event | mysql-master1 | repl1 | 3306 | 60 | mysql-bin-1.000003 | 975 | mysql-slave-relay-bin-master1.000003 | 1195 | mysql-bin-1.000003 | Yes | Yes | | | | | | | 0 | | 0 | 975 | 1599 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 1 | 61221e31-1ef3-11ed-a56a-0242ac120002 | mysql.slave_master_info | 0 | NULL | Replica has read all relay log; waiting for more updates | 86400 | | | | | | 61221e31-1ef3-11ed-a56a-0242ac120002:1-3 | 61221e31-1ef3-11ed-a56a-0242ac120002:1-3,6151d979-1ef3-11ed-a509-0242ac120003:1-3 | 1 | | master1 | | | 0 | |
+| Waiting for source to send event | mysql-master2 | repl2 | 3306 | 60 | mysql-bin-1.000003 | 974 | mysql-slave-relay-bin-master2.000003 | 1194 | mysql-bin-1.000003 | Yes | Yes | | | | | | | 0 | | 0 | 974 | 1598 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 2 | 6151d979-1ef3-11ed-a509-0242ac120003 | mysql.slave_master_info | 0 | NULL | Replica has read all relay log; waiting for more updates | 86400 | | | | | | 6151d979-1ef3-11ed-a509-0242ac120003:1-3 | 61221e31-1ef3-11ed-a56a-0242ac120002:1-3,6151d979-1ef3-11ed-a509-0242ac120003:1-3 | 1 | | master2 | | | 0 | |
++----------------------------------+---------------+-------------+-------------+---------------+--------------------+---------------------+--------------------------------------+---------------+-----------------------+--------------------+---------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+--------------------------------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+------------------------------------------+-----------------------------------------------------------------------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/version.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/version.txt
new file mode 100644
index 000000000..5c553b1ad
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/mysql/v8.0.30/version.txt
@@ -0,0 +1,6 @@
++-----------------+------------------------------+
+| Variable_name | Value |
++-----------------+------------------------------+
+| version | 8.0.30 |
+| version_comment | MySQL Community Server - GPL |
++-----------------+------------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_status.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_status.txt
new file mode 100644
index 000000000..d7ee5741a
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_status.txt
@@ -0,0 +1,533 @@
++--------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Variable_name | Value |
++--------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Aborted_clients | 0 |
+| Aborted_connects | 1 |
+| Acl_cache_items_count | 0 |
+| Binlog_snapshot_file | |
+| Binlog_snapshot_position | 0 |
+| Binlog_cache_disk_use | 0 |
+| Binlog_cache_use | 0 |
+| Binlog_snapshot_gtid_executed | not-in-consistent-snapshot |
+| Binlog_stmt_cache_disk_use | 0 |
+| Binlog_stmt_cache_use | 0 |
+| Bytes_received | 682970 |
+| Bytes_sent | 33668405 |
+| Com_admin_commands | 1 |
+| Com_assign_to_keycache | 0 |
+| Com_alter_db | 0 |
+| Com_alter_event | 0 |
+| Com_alter_function | 0 |
+| Com_alter_instance | 0 |
+| Com_alter_procedure | 0 |
+| Com_alter_resource_group | 0 |
+| Com_alter_server | 0 |
+| Com_alter_table | 0 |
+| Com_alter_tablespace | 0 |
+| Com_alter_user | 0 |
+| Com_alter_user_default_role | 0 |
+| Com_analyze | 0 |
+| Com_begin | 0 |
+| Com_binlog | 0 |
+| Com_call_procedure | 0 |
+| Com_change_db | 1 |
+| Com_change_master | 0 |
+| Com_change_repl_filter | 0 |
+| Com_change_replication_source | 0 |
+| Com_check | 0 |
+| Com_checksum | 0 |
+| Com_clone | 0 |
+| Com_commit | 0 |
+| Com_create_compression_dictionary | 0 |
+| Com_create_db | 1 |
+| Com_create_event | 0 |
+| Com_create_function | 0 |
+| Com_create_index | 0 |
+| Com_create_procedure | 0 |
+| Com_create_role | 0 |
+| Com_create_server | 0 |
+| Com_create_table | 34 |
+| Com_create_resource_group | 0 |
+| Com_create_trigger | 0 |
+| Com_create_udf | 0 |
+| Com_create_user | 0 |
+| Com_create_view | 0 |
+| Com_create_spatial_reference_system | 0 |
+| Com_dealloc_sql | 0 |
+| Com_delete | 0 |
+| Com_delete_multi | 0 |
+| Com_do | 0 |
+| Com_drop_compression_dictionary | 0 |
+| Com_drop_db | 0 |
+| Com_drop_event | 0 |
+| Com_drop_function | 0 |
+| Com_drop_index | 0 |
+| Com_drop_procedure | 0 |
+| Com_drop_resource_group | 0 |
+| Com_drop_role | 0 |
+| Com_drop_server | 0 |
+| Com_drop_spatial_reference_system | 0 |
+| Com_drop_table | 0 |
+| Com_drop_trigger | 0 |
+| Com_drop_user | 0 |
+| Com_drop_view | 0 |
+| Com_empty_query | 0 |
+| Com_execute_sql | 0 |
+| Com_explain_other | 0 |
+| Com_flush | 1 |
+| Com_get_diagnostics | 0 |
+| Com_grant | 0 |
+| Com_grant_roles | 0 |
+| Com_ha_close | 0 |
+| Com_ha_open | 0 |
+| Com_ha_read | 0 |
+| Com_help | 0 |
+| Com_import | 0 |
+| Com_insert | 0 |
+| Com_insert_select | 0 |
+| Com_install_component | 0 |
+| Com_install_plugin | 0 |
+| Com_kill | 0 |
+| Com_load | 0 |
+| Com_lock_instance | 0 |
+| Com_lock_tables | 0 |
+| Com_lock_tables_for_backup | 0 |
+| Com_optimize | 0 |
+| Com_preload_keys | 0 |
+| Com_prepare_sql | 0 |
+| Com_purge | 0 |
+| Com_purge_before_date | 0 |
+| Com_release_savepoint | 0 |
+| Com_rename_table | 0 |
+| Com_rename_user | 0 |
+| Com_repair | 0 |
+| Com_replace | 0 |
+| Com_replace_select | 0 |
+| Com_reset | 0 |
+| Com_resignal | 0 |
+| Com_restart | 0 |
+| Com_revoke | 0 |
+| Com_revoke_all | 0 |
+| Com_revoke_roles | 0 |
+| Com_rollback | 0 |
+| Com_rollback_to_savepoint | 0 |
+| Com_savepoint | 0 |
+| Com_select | 1687 |
+| Com_set_option | 4 |
+| Com_set_password | 0 |
+| Com_set_resource_group | 0 |
+| Com_set_role | 0 |
+| Com_signal | 0 |
+| Com_show_binlog_events | 0 |
+| Com_show_binlogs | 0 |
+| Com_show_charsets | 0 |
+| Com_show_client_statistics | 0 |
+| Com_show_collations | 0 |
+| Com_show_create_db | 0 |
+| Com_show_create_event | 0 |
+| Com_show_create_func | 0 |
+| Com_show_create_proc | 0 |
+| Com_show_create_table | 0 |
+| Com_show_create_trigger | 0 |
+| Com_show_databases | 0 |
+| Com_show_engine_logs | 0 |
+| Com_show_engine_mutex | 0 |
+| Com_show_engine_status | 0 |
+| Com_show_events | 0 |
+| Com_show_errors | 0 |
+| Com_show_fields | 0 |
+| Com_show_function_code | 0 |
+| Com_show_function_status | 0 |
+| Com_show_grants | 0 |
+| Com_show_index_statistics | 0 |
+| Com_show_keys | 0 |
+| Com_show_master_status | 0 |
+| Com_show_open_tables | 0 |
+| Com_show_plugins | 2 |
+| Com_show_privileges | 0 |
+| Com_show_procedure_code | 0 |
+| Com_show_procedure_status | 0 |
+| Com_show_processlist | 0 |
+| Com_show_profile | 0 |
+| Com_show_profiles | 0 |
+| Com_show_relaylog_events | 0 |
+| Com_show_replicas | 0 |
+| Com_show_slave_hosts | 0 |
+| Com_show_replica_status | 1681 |
+| Com_show_slave_status | 1681 |
+| Com_show_status | 1682 |
+| Com_show_storage_engines | 0 |
+| Com_show_table_statistics | 0 |
+| Com_show_table_status | 0 |
+| Com_show_tables | 0 |
+| Com_show_thread_statistics | 0 |
+| Com_show_triggers | 0 |
+| Com_show_user_statistics | 0 |
+| Com_show_variables | 1689 |
+| Com_show_warnings | 0 |
+| Com_show_create_user | 0 |
+| Com_shutdown | 0 |
+| Com_replica_start | 0 |
+| Com_slave_start | 0 |
+| Com_replica_stop | 0 |
+| Com_slave_stop | 0 |
+| Com_group_replication_start | 0 |
+| Com_group_replication_stop | 0 |
+| Com_stmt_execute | 0 |
+| Com_stmt_close | 0 |
+| Com_stmt_fetch | 0 |
+| Com_stmt_prepare | 0 |
+| Com_stmt_reset | 0 |
+| Com_stmt_send_long_data | 0 |
+| Com_truncate | 0 |
+| Com_uninstall_component | 0 |
+| Com_uninstall_plugin | 0 |
+| Com_unlock_instance | 0 |
+| Com_unlock_tables | 0 |
+| Com_update | 0 |
+| Com_update_multi | 0 |
+| Com_xa_commit | 0 |
+| Com_xa_end | 0 |
+| Com_xa_prepare | 0 |
+| Com_xa_recover | 0 |
+| Com_xa_rollback | 0 |
+| Com_xa_start | 0 |
+| Com_stmt_reprepare | 0 |
+| Connection_errors_accept | 0 |
+| Connection_errors_internal | 0 |
+| Connection_errors_max_connections | 0 |
+| Connection_errors_peer_address | 0 |
+| Connection_errors_select | 0 |
+| Connection_errors_tcpwrap | 0 |
+| Connections | 13 |
+| Created_tmp_disk_tables | 1683 |
+| Created_tmp_files | 5 |
+| Created_tmp_tables | 5054 |
+| Current_tls_ca | ca.pem |
+| Current_tls_capath | |
+| Current_tls_cert | server-cert.pem |
+| Current_tls_cipher | |
+| Current_tls_ciphersuites | |
+| Current_tls_crl | |
+| Current_tls_crlpath | |
+| Current_tls_key | server-key.pem |
+| Current_tls_version | TLSv1.2,TLSv1.3 |
+| Delayed_errors | 0 |
+| Delayed_insert_threads | 0 |
+| Delayed_writes | 0 |
+| Error_log_buffered_bytes | 1304 |
+| Error_log_buffered_events | 9 |
+| Error_log_expired_events | 0 |
+| Error_log_latest_write | 1660920303043759 |
+| Flush_commands | 3 |
+| Global_connection_memory | 0 |
+| Handler_commit | 576 |
+| Handler_delete | 0 |
+| Handler_discover | 0 |
+| Handler_external_lock | 13215 |
+| Handler_mrr_init | 0 |
+| Handler_prepare | 0 |
+| Handler_read_first | 1724 |
+| Handler_read_key | 3439 |
+| Handler_read_last | 0 |
+| Handler_read_next | 4147 |
+| Handler_read_prev | 0 |
+| Handler_read_rnd | 0 |
+| Handler_read_rnd_next | 2983285 |
+| Handler_rollback | 0 |
+| Handler_savepoint | 0 |
+| Handler_savepoint_rollback | 0 |
+| Handler_update | 317 |
+| Handler_write | 906501 |
+| Innodb_background_log_sync | 0 |
+| Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
+| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 220819 14:45:02 |
+| Innodb_buffer_pool_resize_status | |
+| Innodb_buffer_pool_pages_data | 1123 |
+| Innodb_buffer_pool_bytes_data | 18399232 |
+| Innodb_buffer_pool_pages_dirty | 3 |
+| Innodb_buffer_pool_bytes_dirty | 49152 |
+| Innodb_buffer_pool_pages_flushed | 205 |
+| Innodb_buffer_pool_pages_free | 7064 |
+| Innodb_buffer_pool_pages_LRU_flushed | 0 |
+| Innodb_buffer_pool_pages_made_not_young | 27 |
+| Innodb_buffer_pool_pages_made_young | 6342 |
+| Innodb_buffer_pool_pages_misc | 5 |
+| Innodb_buffer_pool_pages_old | 421 |
+| Innodb_buffer_pool_pages_total | 8192 |
+| Innodb_buffer_pool_read_ahead_rnd | 0 |
+| Innodb_buffer_pool_read_ahead | 0 |
+| Innodb_buffer_pool_read_ahead_evicted | 0 |
+| Innodb_buffer_pool_read_requests | 109817 |
+| Innodb_buffer_pool_reads | 978 |
+| Innodb_buffer_pool_wait_free | 0 |
+| Innodb_buffer_pool_write_requests | 77412 |
+| Innodb_checkpoint_age | 0 |
+| Innodb_checkpoint_max_age | 80576000 |
+| Innodb_data_fsyncs | 50 |
+| Innodb_data_pending_fsyncs | 0 |
+| Innodb_data_pending_reads | 0 |
+| Innodb_data_pending_writes | 0 |
+| Innodb_data_read | 16094208 |
+| Innodb_data_reads | 1002 |
+| Innodb_data_writes | 288 |
+| Innodb_data_written | 3420160 |
+| Innodb_dblwr_pages_written | 30 |
+| Innodb_dblwr_writes | 8 |
+| Innodb_ibuf_free_list | 0 |
+| Innodb_ibuf_segment_size | 2 |
+| Innodb_log_waits | 0 |
+| Innodb_log_write_requests | 651 |
+| Innodb_log_writes | 47 |
+| Innodb_lsn_current | 31778525 |
+| Innodb_lsn_flushed | 31778525 |
+| Innodb_lsn_last_checkpoint | 31778525 |
+| Innodb_master_thread_active_loops | 1674 |
+| Innodb_master_thread_idle_loops | 36 |
+| Innodb_max_trx_id | 1803 |
+| Innodb_oldest_view_low_limit_trx_id | 0 |
+| Innodb_os_log_fsyncs | 13 |
+| Innodb_os_log_pending_fsyncs | 0 |
+| Innodb_os_log_pending_writes | 0 |
+| Innodb_os_log_written | 45568 |
+| Innodb_page_size | 16384 |
+| Innodb_pages_created | 155 |
+| Innodb_pages_read | 977 |
+| Innodb_pages0_read | 7 |
+| Innodb_pages_written | 205 |
+| Innodb_purge_trx_id | 1801 |
+| Innodb_purge_undo_no | 0 |
+| Innodb_redo_log_enabled | ON |
+| Innodb_row_lock_current_waits | 0 |
+| Innodb_row_lock_time | 0 |
+| Innodb_row_lock_time_avg | 0 |
+| Innodb_row_lock_time_max | 0 |
+| Innodb_row_lock_waits | 0 |
+| Innodb_rows_deleted | 0 |
+| Innodb_rows_inserted | 5055 |
+| Innodb_rows_read | 5055 |
+| Innodb_rows_updated | 0 |
+| Innodb_system_rows_deleted | 0 |
+| Innodb_system_rows_inserted | 0 |
+| Innodb_system_rows_read | 4881 |
+| Innodb_system_rows_updated | 317 |
+| Innodb_sampled_pages_read | 0 |
+| Innodb_sampled_pages_skipped | 0 |
+| Innodb_num_open_files | 17 |
+| Innodb_truncated_status_writes | 0 |
+| Innodb_undo_tablespaces_total | 2 |
+| Innodb_undo_tablespaces_implicit | 2 |
+| Innodb_undo_tablespaces_explicit | 0 |
+| Innodb_undo_tablespaces_active | 2 |
+| Innodb_secondary_index_triggered_cluster_reads | 2098 |
+| Innodb_secondary_index_triggered_cluster_reads_avoided | 0 |
+| Innodb_buffered_aio_submitted | 0 |
+| Innodb_scan_pages_contiguous | 0 |
+| Innodb_scan_pages_disjointed | 0 |
+| Innodb_scan_pages_total_seek_distance | 0 |
+| Innodb_scan_data_size | 0 |
+| Innodb_scan_deleted_recs_size | 0 |
+| Innodb_scrub_log | 0 |
+| Innodb_scrub_background_page_reorganizations | 0 |
+| Innodb_scrub_background_page_splits | 0 |
+| Innodb_scrub_background_page_split_failures_underflow | 0 |
+| Innodb_scrub_background_page_split_failures_out_of_filespace | 0 |
+| Innodb_scrub_background_page_split_failures_missing_index | 0 |
+| Innodb_scrub_background_page_split_failures_unknown | 0 |
+| Innodb_encryption_n_merge_blocks_encrypted | 0 |
+| Innodb_encryption_n_merge_blocks_decrypted | 0 |
+| Innodb_encryption_n_rowlog_blocks_encrypted | 0 |
+| Innodb_encryption_n_rowlog_blocks_decrypted | 0 |
+| Innodb_encryption_redo_key_version | 0 |
+| Key_blocks_not_flushed | 0 |
+| Key_blocks_unused | 6698 |
+| Key_blocks_used | 0 |
+| Key_read_requests | 0 |
+| Key_reads | 0 |
+| Key_write_requests | 0 |
+| Key_writes | 0 |
+| Locked_connects | 0 |
+| Max_execution_time_exceeded | 0 |
+| Max_execution_time_set | 0 |
+| Max_execution_time_set_failed | 0 |
+| Max_used_connections | 3 |
+| Max_used_connections_time | 2022-08-19 15:05:34 |
+| Mysqlx_aborted_clients | 0 |
+| Mysqlx_address | :: |
+| Mysqlx_bytes_received | 0 |
+| Mysqlx_bytes_received_compressed_payload | 0 |
+| Mysqlx_bytes_received_uncompressed_frame | 0 |
+| Mysqlx_bytes_sent | 0 |
+| Mysqlx_bytes_sent_compressed_payload | 0 |
+| Mysqlx_bytes_sent_uncompressed_frame | 0 |
+| Mysqlx_compression_algorithm | |
+| Mysqlx_compression_level | |
+| Mysqlx_connection_accept_errors | 0 |
+| Mysqlx_connection_errors | 0 |
+| Mysqlx_connections_accepted | 0 |
+| Mysqlx_connections_closed | 0 |
+| Mysqlx_connections_rejected | 0 |
+| Mysqlx_crud_create_view | 0 |
+| Mysqlx_crud_delete | 0 |
+| Mysqlx_crud_drop_view | 0 |
+| Mysqlx_crud_find | 0 |
+| Mysqlx_crud_insert | 0 |
+| Mysqlx_crud_modify_view | 0 |
+| Mysqlx_crud_update | 0 |
+| Mysqlx_cursor_close | 0 |
+| Mysqlx_cursor_fetch | 0 |
+| Mysqlx_cursor_open | 0 |
+| Mysqlx_errors_sent | 0 |
+| Mysqlx_errors_unknown_message_type | 0 |
+| Mysqlx_expect_close | 0 |
+| Mysqlx_expect_open | 0 |
+| Mysqlx_init_error | 0 |
+| Mysqlx_messages_sent | 0 |
+| Mysqlx_notice_global_sent | 0 |
+| Mysqlx_notice_other_sent | 0 |
+| Mysqlx_notice_warning_sent | 0 |
+| Mysqlx_notified_by_group_replication | 0 |
+| Mysqlx_port | 33060 |
+| Mysqlx_prep_deallocate | 0 |
+| Mysqlx_prep_execute | 0 |
+| Mysqlx_prep_prepare | 0 |
+| Mysqlx_rows_sent | 0 |
+| Mysqlx_sessions | 0 |
+| Mysqlx_sessions_accepted | 0 |
+| Mysqlx_sessions_closed | 0 |
+| Mysqlx_sessions_fatal_error | 0 |
+| Mysqlx_sessions_killed | 0 |
+| Mysqlx_sessions_rejected | 0 |
+| Mysqlx_socket | /var/lib/mysql/mysqlx.sock |
+| Mysqlx_ssl_accepts | 0 |
+| Mysqlx_ssl_active | |
+| Mysqlx_ssl_cipher | |
+| Mysqlx_ssl_cipher_list | |
+| Mysqlx_ssl_ctx_verify_depth | 18446744073709551615 |
+| Mysqlx_ssl_ctx_verify_mode | 5 |
+| Mysqlx_ssl_finished_accepts | 0 |
+| Mysqlx_ssl_server_not_after | Aug 16 14:44:56 2032 GMT |
+| Mysqlx_ssl_server_not_before | Aug 19 14:44:56 2022 GMT |
+| Mysqlx_ssl_verify_depth | |
+| Mysqlx_ssl_verify_mode | |
+| Mysqlx_ssl_version | |
+| Mysqlx_stmt_create_collection | 0 |
+| Mysqlx_stmt_create_collection_index | 0 |
+| Mysqlx_stmt_disable_notices | 0 |
+| Mysqlx_stmt_drop_collection | 0 |
+| Mysqlx_stmt_drop_collection_index | 0 |
+| Mysqlx_stmt_enable_notices | 0 |
+| Mysqlx_stmt_ensure_collection | 0 |
+| Mysqlx_stmt_execute_mysqlx | 0 |
+| Mysqlx_stmt_execute_sql | 0 |
+| Mysqlx_stmt_execute_xplugin | 0 |
+| Mysqlx_stmt_get_collection_options | 0 |
+| Mysqlx_stmt_kill_client | 0 |
+| Mysqlx_stmt_list_clients | 0 |
+| Mysqlx_stmt_list_notices | 0 |
+| Mysqlx_stmt_list_objects | 0 |
+| Mysqlx_stmt_modify_collection_options | 0 |
+| Mysqlx_stmt_ping | 0 |
+| Mysqlx_worker_threads | 2 |
+| Mysqlx_worker_threads_active | 0 |
+| Net_buffer_length | 32768 |
+| Not_flushed_delayed_rows | 0 |
+| Ongoing_anonymous_transaction_count | 0 |
+| Open_files | 2 |
+| Open_streams | 0 |
+| Open_table_definitions | 44 |
+| Open_tables | 77 |
+| Opened_files | 2 |
+| Opened_table_definitions | 73 |
+| Opened_tables | 158 |
+| Performance_schema_accounts_lost | 0 |
+| Performance_schema_cond_classes_lost | 0 |
+| Performance_schema_cond_instances_lost | 0 |
+| Performance_schema_digest_lost | 0 |
+| Performance_schema_file_classes_lost | 0 |
+| Performance_schema_file_handles_lost | 0 |
+| Performance_schema_file_instances_lost | 0 |
+| Performance_schema_hosts_lost | 0 |
+| Performance_schema_index_stat_lost | 0 |
+| Performance_schema_locker_lost | 0 |
+| Performance_schema_memory_classes_lost | 0 |
+| Performance_schema_metadata_lock_lost | 0 |
+| Performance_schema_mutex_classes_lost | 0 |
+| Performance_schema_mutex_instances_lost | 0 |
+| Performance_schema_nested_statement_lost | 0 |
+| Performance_schema_prepared_statements_lost | 0 |
+| Performance_schema_program_lost | 0 |
+| Performance_schema_rwlock_classes_lost | 0 |
+| Performance_schema_rwlock_instances_lost | 0 |
+| Performance_schema_session_connect_attrs_longest_seen | 117 |
+| Performance_schema_session_connect_attrs_lost | 0 |
+| Performance_schema_socket_classes_lost | 0 |
+| Performance_schema_socket_instances_lost | 0 |
+| Performance_schema_stage_classes_lost | 0 |
+| Performance_schema_statement_classes_lost | 0 |
+| Performance_schema_table_handles_lost | 0 |
+| Performance_schema_table_instances_lost | 0 |
+| Performance_schema_table_lock_stat_lost | 0 |
+| Performance_schema_thread_classes_lost | 0 |
+| Performance_schema_thread_instances_lost | 0 |
+| Performance_schema_users_lost | 0 |
+| Prepared_stmt_count | 0 |
+| Queries | 6748 |
+| Questions | 6746 |
+| Replica_open_temp_tables | 0 |
+| Secondary_engine_execution_count | 0 |
+| Select_full_join | 0 |
+| Select_full_range_join | 0 |
+| Select_range | 0 |
+| Select_range_check | 0 |
+| Select_scan | 8425 |
+| Slave_open_temp_tables | 0 |
+| Slow_launch_threads | 0 |
+| Slow_queries | 0 |
+| Sort_merge_passes | 0 |
+| Sort_range | 0 |
+| Sort_rows | 0 |
+| Sort_scan | 1681 |
+| Ssl_accept_renegotiates | 0 |
+| Ssl_accepts | 0 |
+| Ssl_callback_cache_hits | 0 |
+| Ssl_cipher | |
+| Ssl_cipher_list | |
+| Ssl_client_connects | 0 |
+| Ssl_connect_renegotiates | 0 |
+| Ssl_ctx_verify_depth | 18446744073709551615 |
+| Ssl_ctx_verify_mode | 5 |
+| Ssl_default_timeout | 0 |
+| Ssl_finished_accepts | 0 |
+| Ssl_finished_connects | 0 |
+| Ssl_server_not_after | Aug 16 14:44:56 2032 GMT |
+| Ssl_server_not_before | Aug 19 14:44:56 2022 GMT |
+| Ssl_session_cache_hits | 0 |
+| Ssl_session_cache_misses | 0 |
+| Ssl_session_cache_mode | SERVER |
+| Ssl_session_cache_overflows | 0 |
+| Ssl_session_cache_size | 128 |
+| Ssl_session_cache_timeout | 300 |
+| Ssl_session_cache_timeouts | 0 |
+| Ssl_sessions_reused | 0 |
+| Ssl_used_session_cache_entries | 0 |
+| Ssl_verify_depth | 0 |
+| Ssl_verify_mode | 0 |
+| Ssl_version | |
+| Table_locks_immediate | 3371 |
+| Table_locks_waited | 0 |
+| Table_open_cache_hits | 6450 |
+| Table_open_cache_misses | 158 |
+| Table_open_cache_overflows | 0 |
+| Tc_log_max_pages_used | 0 |
+| Tc_log_page_size | 0 |
+| Tc_log_page_waits | 0 |
+| Threadpool_idle_threads | 0 |
+| Threadpool_threads | 0 |
+| Threads_cached | 1 |
+| Threads_connected | 2 |
+| Threads_created | 3 |
+| Threads_running | 2 |
+| Uptime | 1711 |
+| Uptime_since_flush_status | 1711 |
++--------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_variables.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_variables.txt
new file mode 100644
index 000000000..02be0ae8e
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/global_variables.txt
@@ -0,0 +1,9 @@
++--------------------------+-------+
+| Variable_name | Value |
++--------------------------+-------+
+| disabled_storage_engines | |
+| log_bin | ON |
+| max_connections | 151 |
+| performance_schema | ON |
+| table_open_cache | 4000 |
++--------------------------+-------+
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/process_list.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/process_list.txt
new file mode 100644
index 000000000..a44ce5e70
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/process_list.txt
@@ -0,0 +1,6 @@
++------+---------+
+| time | user |
++------+---------+
+| 1 | netdata |
+| 9 | root |
++------+---------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/user_statistics.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/user_statistics.txt
new file mode 100644
index 000000000..d7c206e47
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/user_statistics.txt
@@ -0,0 +1,6 @@
++---------+-------------------+------------------------+--------------------+---------------------+---------------------+----------------+------------+----------------------+--------------+--------------+-----------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+
+| User | Total_connections | Concurrent_connections | Connected_time | Busy_time | Cpu_time | Bytes_received | Bytes_sent | Binlog_bytes_written | Rows_fetched | Rows_updated | Table_rows_read | Select_commands | Update_commands | Other_commands | Commit_transactions | Rollback_transactions | Denied_connections | Lost_connections | Access_denied | Empty_queries | Total_ssl_connections |
++---------+-------------------+------------------------+--------------------+---------------------+---------------------+----------------+------------+----------------------+--------------+--------------+-----------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+
+| netdata | 1 | 0 | 7.6873109 | 0.000136 | 0.000141228 | 71 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+| root | 2 | 0 | 1843013485340.5564 | 0.15132199999999996 | 0.15179981700000006 | 14681 | 573440 | 0 | 1 | 0 | 114633 | 37 | 0 | 110 | 0 | 0 | 1 | 0 | 0 | 36 | 0 |
++---------+-------------------+------------------------+--------------------+---------------------+---------------------+----------------+------------+----------------------+--------------+--------------+-----------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/version.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/version.txt
new file mode 100644
index 000000000..dede361ef
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/percona/v8.0.29/version.txt
@@ -0,0 +1,6 @@
++-----------------+--------------------------------------------------------+
+| Variable_name | Value |
++-----------------+--------------------------------------------------------+
+| version | 8.0.29-21 |
+| version_comment | Percona Server (GPL), Release 21, Revision c59f87d2854 |
++-----------------+--------------------------------------------------------+ \ No newline at end of file
diff --git a/src/go/collectors/go.d.plugin/modules/mysql/testdata/session_variables.txt b/src/go/collectors/go.d.plugin/modules/mysql/testdata/session_variables.txt
new file mode 100644
index 000000000..358750607
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/mysql/testdata/session_variables.txt
@@ -0,0 +1,6 @@
++----------------+-------+
+| Variable_name | Value |
++----------------+-------+
+| sql_log_off | OFF |
+| slow_query_log | ON |
++----------------+-------+ \ No newline at end of file