diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-05 11:19:16 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-07-24 09:53:24 +0000 |
commit | b5f8ee61a7f7e9bd291dd26b0585d03eb686c941 (patch) | |
tree | d4d31289c39fc00da064a825df13a0b98ce95b10 /src/go/collectors/go.d.plugin/modules/proxysql/proxysql_test.go | |
parent | Adding upstream version 1.44.3. (diff) | |
download | netdata-b5f8ee61a7f7e9bd291dd26b0585d03eb686c941.tar.xz netdata-b5f8ee61a7f7e9bd291dd26b0585d03eb686c941.zip |
Adding upstream version 1.46.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/proxysql/proxysql_test.go | 1240 |
1 files changed, 1240 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/proxysql/proxysql_test.go b/src/go/collectors/go.d.plugin/modules/proxysql/proxysql_test.go new file mode 100644 index 000000000..3dfaf1bf3 --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/proxysql/proxysql_test.go @@ -0,0 +1,1240 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package proxysql + +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/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + dataConfigJSON, _ = os.ReadFile("testdata/config.json") + dataConfigYAML, _ = os.ReadFile("testdata/config.yaml") + + dataVer2010Version, _ = os.ReadFile("testdata/v2.0.10/version.txt") + dataVer2010StatsMySQLGlobal, _ = os.ReadFile("testdata/v2.0.10/stats_mysql_global.txt") + dataVer2010StatsMemoryMetrics, _ = os.ReadFile("testdata/v2.0.10/stats_memory_metrics.txt") + dataVer2010StatsMySQLCommandsCounters, _ = os.ReadFile("testdata/v2.0.10/stats_mysql_commands_counters.txt") + dataVer2010StatsMySQLUsers, _ = os.ReadFile("testdata/v2.0.10/stats_mysql_users.txt") + dataVer2010StatsMySQLConnectionPool, _ = os.ReadFile("testdata/v2.0.10/stats_mysql_connection_pool .txt") +) + +func Test_testDataIsValid(t *testing.T) { + for name, data := range map[string][]byte{ + "dataConfigJSON": dataConfigJSON, + "dataConfigYAML": dataConfigYAML, + "dataVer2010Version": dataVer2010Version, + "dataVer2010StatsMySQLGlobal": dataVer2010StatsMySQLGlobal, + "dataVer2010StatsMemoryMetrics": dataVer2010StatsMemoryMetrics, + "dataVer2010StatsMySQLCommandsCounters": dataVer2010StatsMySQLCommandsCounters, + "dataVer2010StatsMySQLUsers": dataVer2010StatsMySQLUsers, + "dataVer2010StatsMySQLConnectionPool": dataVer2010StatsMySQLConnectionPool, + } { + require.NotNil(t, data, name) + _, err := prepareMockRows(data) + require.NoError(t, err, name) + } +} + +func TestProxySQL_ConfigurationSerialize(t *testing.T) { + module.TestConfigurationSerialize(t, &ProxySQL{}, dataConfigJSON, dataConfigYAML) +} + +func TestProxySQL_Init(t *testing.T) { + tests := map[string]struct { + config Config + wantFail bool + }{ + "default": { + wantFail: false, + config: New().Config, + }, + "empty DSN": { + wantFail: true, + config: Config{DSN: ""}, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + proxySQL := New() + proxySQL.Config = test.config + + if test.wantFail { + assert.Error(t, proxySQL.Init()) + } else { + assert.NoError(t, proxySQL.Init()) + } + }) + } +} + +func TestProxySQL_Cleanup(t *testing.T) { + tests := map[string]func(t *testing.T) (proxySQL *ProxySQL, cleanup func()){ + "db connection not initialized": func(t *testing.T) (proxySQL *ProxySQL, cleanup func()) { + return New(), func() {} + }, + "db connection initialized": func(t *testing.T) (proxySQL *ProxySQL, cleanup func()) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + + mock.ExpectClose() + proxySQL = New() + proxySQL.db = db + cleanup = func() { _ = db.Close() } + + return proxySQL, cleanup + }, + } + + for name, prepare := range tests { + t.Run(name, func(t *testing.T) { + proxySQL, cleanup := prepare(t) + defer cleanup() + + assert.NotPanics(t, proxySQL.Cleanup) + assert.Nil(t, proxySQL.db) + }) + } +} + +func TestProxySQL_Charts(t *testing.T) { + assert.NotNil(t, New().Charts()) +} + +func TestProxySQL_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, queryVersion, dataVer2010Version) + mockExpect(t, m, queryStatsMySQLGlobal, dataVer2010StatsMySQLGlobal) + mockExpect(t, m, queryStatsMySQLMemoryMetrics, dataVer2010StatsMemoryMetrics) + mockExpect(t, m, queryStatsMySQLCommandsCounters, dataVer2010StatsMySQLCommandsCounters) + mockExpect(t, m, queryStatsMySQLUsers, dataVer2010StatsMySQLUsers) + mockExpect(t, m, queryStatsMySQLConnectionPool, dataVer2010StatsMySQLConnectionPool) + }, + }, + "fails when error on querying global stats": { + wantFail: true, + prepareMock: func(t *testing.T, m sqlmock.Sqlmock) { + mockExpect(t, m, queryVersion, dataVer2010Version) + mockExpectErr(m, queryStatsMySQLGlobal) + }, + }, + "fails when error on querying memory metrics": { + wantFail: true, + prepareMock: func(t *testing.T, m sqlmock.Sqlmock) { + mockExpect(t, m, queryVersion, dataVer2010Version) + mockExpect(t, m, queryStatsMySQLGlobal, dataVer2010StatsMySQLGlobal) + mockExpectErr(m, queryStatsMySQLMemoryMetrics) + }, + }, + "fails when error on querying mysql command counters": { + wantFail: true, + prepareMock: func(t *testing.T, m sqlmock.Sqlmock) { + mockExpect(t, m, queryVersion, dataVer2010Version) + mockExpect(t, m, queryStatsMySQLGlobal, dataVer2010StatsMySQLGlobal) + mockExpect(t, m, queryStatsMySQLMemoryMetrics, dataVer2010StatsMemoryMetrics) + mockExpectErr(m, queryStatsMySQLCommandsCounters) + }, + }, + "fails when error on querying mysql users": { + wantFail: true, + prepareMock: func(t *testing.T, m sqlmock.Sqlmock) { + mockExpect(t, m, queryVersion, dataVer2010Version) + mockExpect(t, m, queryStatsMySQLGlobal, dataVer2010StatsMySQLGlobal) + mockExpect(t, m, queryStatsMySQLMemoryMetrics, dataVer2010StatsMemoryMetrics) + mockExpect(t, m, queryStatsMySQLCommandsCounters, dataVer2010StatsMySQLCommandsCounters) + mockExpectErr(m, queryStatsMySQLUsers) + }, + }, + } + + 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) + proxySQL := New() + proxySQL.db = db + defer func() { _ = db.Close() }() + + require.NoError(t, proxySQL.Init()) + + test.prepareMock(t, mock) + + if test.wantFail { + assert.Error(t, proxySQL.Check()) + } else { + assert.NoError(t, proxySQL.Check()) + } + assert.NoError(t, mock.ExpectationsWereMet()) + }) + } +} + +func TestProxySQL_Collect(t *testing.T) { + type testCaseStep struct { + prepareMock func(t *testing.T, m sqlmock.Sqlmock) + check func(t *testing.T, my *ProxySQL) + } + tests := map[string][]testCaseStep{ + + "success on all queries (v2.0.10)": { + { + prepareMock: func(t *testing.T, m sqlmock.Sqlmock) { + mockExpect(t, m, queryVersion, dataVer2010Version) + mockExpect(t, m, queryStatsMySQLGlobal, dataVer2010StatsMySQLGlobal) + mockExpect(t, m, queryStatsMySQLMemoryMetrics, dataVer2010StatsMemoryMetrics) + mockExpect(t, m, queryStatsMySQLCommandsCounters, dataVer2010StatsMySQLCommandsCounters) + mockExpect(t, m, queryStatsMySQLUsers, dataVer2010StatsMySQLUsers) + mockExpect(t, m, queryStatsMySQLConnectionPool, dataVer2010StatsMySQLConnectionPool) + }, + check: func(t *testing.T, my *ProxySQL) { + mx := my.Collect() + + expected := map[string]int64{ + "Access_Denied_Max_Connections": 0, + "Access_Denied_Max_User_Connections": 0, + "Access_Denied_Wrong_Password": 2, + "Active_Transactions": 0, + "Auth_memory": 1044, + "Backend_query_time_nsec": 0, + "Client_Connections_aborted": 2, + "Client_Connections_connected": 3, + "Client_Connections_created": 5458991, + "Client_Connections_hostgroup_locked": 0, + "Client_Connections_non_idle": 3, + "Com_autocommit": 0, + "Com_autocommit_filtered": 0, + "Com_backend_change_user": 188694, + "Com_backend_init_db": 0, + "Com_backend_set_names": 1517893, + "Com_backend_stmt_close": 0, + "Com_backend_stmt_execute": 36303146, + "Com_backend_stmt_prepare": 16858208, + "Com_commit": 0, + "Com_commit_filtered": 0, + "Com_frontend_init_db": 2, + "Com_frontend_set_names": 0, + "Com_frontend_stmt_close": 32137933, + "Com_frontend_stmt_execute": 36314138, + "Com_frontend_stmt_prepare": 32185987, + "Com_frontend_use_db": 0, + "Com_rollback": 0, + "Com_rollback_filtered": 0, + "ConnPool_get_conn_failure": 212943, + "ConnPool_get_conn_immediate": 13361, + "ConnPool_get_conn_latency_awareness": 0, + "ConnPool_get_conn_success": 36319474, + "ConnPool_memory_bytes": 932248, + "GTID_consistent_queries": 0, + "GTID_session_collected": 0, + "Mirror_concurrency": 0, + "Mirror_queue_length": 0, + "MyHGM_myconnpoll_destroy": 15150, + "MyHGM_myconnpoll_get": 36519056, + "MyHGM_myconnpoll_get_ok": 36306113, + "MyHGM_myconnpoll_push": 37358734, + "MyHGM_myconnpoll_reset": 2, + "MySQL_Monitor_Workers": 10, + "MySQL_Monitor_Workers_Aux": 0, + "MySQL_Monitor_Workers_Started": 10, + "MySQL_Monitor_connect_check_ERR": 130, + "MySQL_Monitor_connect_check_OK": 3548306, + "MySQL_Monitor_ping_check_ERR": 108271, + "MySQL_Monitor_ping_check_OK": 21289849, + "MySQL_Monitor_read_only_check_ERR": 19610, + "MySQL_Monitor_read_only_check_OK": 106246409, + "MySQL_Monitor_replication_lag_check_ERR": 482, + "MySQL_Monitor_replication_lag_check_OK": 28702388, + "MySQL_Thread_Workers": 4, + "ProxySQL_Uptime": 26748286, + "Queries_backends_bytes_recv": 5896210168, + "Queries_backends_bytes_sent": 4329581500, + "Queries_frontends_bytes_recv": 7434816962, + "Queries_frontends_bytes_sent": 11643634097, + "Query_Cache_Entries": 0, + "Query_Cache_Memory_bytes": 0, + "Query_Cache_Purged": 0, + "Query_Cache_bytes_IN": 0, + "Query_Cache_bytes_OUT": 0, + "Query_Cache_count_GET": 0, + "Query_Cache_count_GET_OK": 0, + "Query_Cache_count_SET": 0, + "Query_Processor_time_nsec": 0, + "Questions": 100638067, + "SQLite3_memory_bytes": 6017144, + "Selects_for_update__autocommit0": 0, + "Server_Connections_aborted": 9979, + "Server_Connections_connected": 13, + "Server_Connections_created": 2122254, + "Server_Connections_delayed": 0, + "Servers_table_version": 37, + "Slow_queries": 405818, + "Stmt_Cached": 65, + "Stmt_Client_Active_Total": 18, + "Stmt_Client_Active_Unique": 18, + "Stmt_Max_Stmt_id": 66, + "Stmt_Server_Active_Total": 101, + "Stmt_Server_Active_Unique": 39, + "automatic_detected_sql_injection": 0, + "aws_aurora_replicas_skipped_during_query": 0, + "backend_10_back001-db-master_6001_Bytes_data_recv": 145193069937, + "backend_10_back001-db-master_6001_Bytes_data_sent": 9858463664, + "backend_10_back001-db-master_6001_ConnERR": 0, + "backend_10_back001-db-master_6001_ConnFree": 423, + "backend_10_back001-db-master_6001_ConnOK": 524, + "backend_10_back001-db-master_6001_ConnUsed": 69, + "backend_10_back001-db-master_6001_Latency_us": 17684, + "backend_10_back001-db-master_6001_Queries": 8970367, + "backend_10_back001-db-master_6001_status_OFFLINE_HARD": 0, + "backend_10_back001-db-master_6001_status_OFFLINE_SOFT": 0, + "backend_10_back001-db-master_6001_status_ONLINE": 0, + "backend_10_back001-db-master_6001_status_SHUNNED": 0, + "backend_11_back001-db-master_6002_Bytes_data_recv": 2903, + "backend_11_back001-db-master_6002_Bytes_data_sent": 187675, + "backend_11_back001-db-master_6002_ConnERR": 0, + "backend_11_back001-db-master_6002_ConnFree": 1, + "backend_11_back001-db-master_6002_ConnOK": 1, + "backend_11_back001-db-master_6002_ConnUsed": 0, + "backend_11_back001-db-master_6002_Latency_us": 17684, + "backend_11_back001-db-master_6002_Queries": 69, + "backend_11_back001-db-master_6002_status_OFFLINE_HARD": 0, + "backend_11_back001-db-master_6002_status_OFFLINE_SOFT": 0, + "backend_11_back001-db-master_6002_status_ONLINE": 0, + "backend_11_back001-db-master_6002_status_SHUNNED": 0, + "backend_11_back001-db-reader_6003_Bytes_data_recv": 4994101, + "backend_11_back001-db-reader_6003_Bytes_data_sent": 163690013, + "backend_11_back001-db-reader_6003_ConnERR": 0, + "backend_11_back001-db-reader_6003_ConnFree": 11, + "backend_11_back001-db-reader_6003_ConnOK": 11, + "backend_11_back001-db-reader_6003_ConnUsed": 0, + "backend_11_back001-db-reader_6003_Latency_us": 113, + "backend_11_back001-db-reader_6003_Queries": 63488, + "backend_11_back001-db-reader_6003_status_OFFLINE_HARD": 0, + "backend_11_back001-db-reader_6003_status_OFFLINE_SOFT": 0, + "backend_11_back001-db-reader_6003_status_ONLINE": 0, + "backend_11_back001-db-reader_6003_status_SHUNNED": 0, + "backend_20_back002-db-master_6004_Bytes_data_recv": 266034339, + "backend_20_back002-db-master_6004_Bytes_data_sent": 1086994186, + "backend_20_back002-db-master_6004_ConnERR": 2, + "backend_20_back002-db-master_6004_ConnFree": 188, + "backend_20_back002-db-master_6004_ConnOK": 197, + "backend_20_back002-db-master_6004_ConnUsed": 9, + "backend_20_back002-db-master_6004_Latency_us": 101981, + "backend_20_back002-db-master_6004_Queries": 849461, + "backend_20_back002-db-master_6004_status_OFFLINE_HARD": 0, + "backend_20_back002-db-master_6004_status_OFFLINE_SOFT": 0, + "backend_20_back002-db-master_6004_status_ONLINE": 0, + "backend_20_back002-db-master_6004_status_SHUNNED": 0, + "backend_21_back002-db-reader_6005_Bytes_data_recv": 984, + "backend_21_back002-db-reader_6005_Bytes_data_sent": 6992, + "backend_21_back002-db-reader_6005_ConnERR": 0, + "backend_21_back002-db-reader_6005_ConnFree": 1, + "backend_21_back002-db-reader_6005_ConnOK": 1, + "backend_21_back002-db-reader_6005_ConnUsed": 0, + "backend_21_back002-db-reader_6005_Latency_us": 230, + "backend_21_back002-db-reader_6005_Queries": 8, + "backend_21_back002-db-reader_6005_status_OFFLINE_HARD": 0, + "backend_21_back002-db-reader_6005_status_OFFLINE_SOFT": 0, + "backend_21_back002-db-reader_6005_status_ONLINE": 0, + "backend_21_back002-db-reader_6005_status_SHUNNED": 0, + "backend_31_back003-db-master_6006_Bytes_data_recv": 81438709, + "backend_31_back003-db-master_6006_Bytes_data_sent": 712803, + "backend_31_back003-db-master_6006_ConnERR": 0, + "backend_31_back003-db-master_6006_ConnFree": 3, + "backend_31_back003-db-master_6006_ConnOK": 3, + "backend_31_back003-db-master_6006_ConnUsed": 0, + "backend_31_back003-db-master_6006_Latency_us": 231, + "backend_31_back003-db-master_6006_Queries": 3276, + "backend_31_back003-db-master_6006_status_OFFLINE_HARD": 0, + "backend_31_back003-db-master_6006_status_OFFLINE_SOFT": 0, + "backend_31_back003-db-master_6006_status_ONLINE": 0, + "backend_31_back003-db-master_6006_status_SHUNNED": 0, + "backend_31_back003-db-reader_6007_Bytes_data_recv": 115810708275, + "backend_31_back003-db-reader_6007_Bytes_data_sent": 411900849, + "backend_31_back003-db-reader_6007_ConnERR": 0, + "backend_31_back003-db-reader_6007_ConnFree": 70, + "backend_31_back003-db-reader_6007_ConnOK": 71, + "backend_31_back003-db-reader_6007_ConnUsed": 1, + "backend_31_back003-db-reader_6007_Latency_us": 230, + "backend_31_back003-db-reader_6007_Queries": 2356904, + "backend_31_back003-db-reader_6007_status_OFFLINE_HARD": 0, + "backend_31_back003-db-reader_6007_status_OFFLINE_SOFT": 0, + "backend_31_back003-db-reader_6007_status_ONLINE": 0, + "backend_31_back003-db-reader_6007_status_SHUNNED": 0, + "backend_lagging_during_query": 8880, + "backend_offline_during_query": 8, + "generated_error_packets": 231, + "hostgroup_locked_queries": 0, + "hostgroup_locked_set_cmds": 0, + "jemalloc_active": 385101824, + "jemalloc_allocated": 379402432, + "jemalloc_mapped": 430993408, + "jemalloc_metadata": 17418872, + "jemalloc_resident": 403759104, + "jemalloc_retained": 260542464, + "max_connect_timeouts": 227, + "mysql_backend_buffers_bytes": 0, + "mysql_command_ALTER_TABLE_Total_Time_us": 0, + "mysql_command_ALTER_TABLE_Total_cnt": 0, + "mysql_command_ALTER_TABLE_cnt_100ms": 0, + "mysql_command_ALTER_TABLE_cnt_100us": 0, + "mysql_command_ALTER_TABLE_cnt_10ms": 0, + "mysql_command_ALTER_TABLE_cnt_10s": 0, + "mysql_command_ALTER_TABLE_cnt_1ms": 0, + "mysql_command_ALTER_TABLE_cnt_1s": 0, + "mysql_command_ALTER_TABLE_cnt_500ms": 0, + "mysql_command_ALTER_TABLE_cnt_500us": 0, + "mysql_command_ALTER_TABLE_cnt_50ms": 0, + "mysql_command_ALTER_TABLE_cnt_5ms": 0, + "mysql_command_ALTER_TABLE_cnt_5s": 0, + "mysql_command_ALTER_TABLE_cnt_INFs": 0, + "mysql_command_ALTER_VIEW_Total_Time_us": 0, + "mysql_command_ALTER_VIEW_Total_cnt": 0, + "mysql_command_ALTER_VIEW_cnt_100ms": 0, + "mysql_command_ALTER_VIEW_cnt_100us": 0, + "mysql_command_ALTER_VIEW_cnt_10ms": 0, + "mysql_command_ALTER_VIEW_cnt_10s": 0, + "mysql_command_ALTER_VIEW_cnt_1ms": 0, + "mysql_command_ALTER_VIEW_cnt_1s": 0, + "mysql_command_ALTER_VIEW_cnt_500ms": 0, + "mysql_command_ALTER_VIEW_cnt_500us": 0, + "mysql_command_ALTER_VIEW_cnt_50ms": 0, + "mysql_command_ALTER_VIEW_cnt_5ms": 0, + "mysql_command_ALTER_VIEW_cnt_5s": 0, + "mysql_command_ALTER_VIEW_cnt_INFs": 0, + "mysql_command_ANALYZE_TABLE_Total_Time_us": 0, + "mysql_command_ANALYZE_TABLE_Total_cnt": 0, + "mysql_command_ANALYZE_TABLE_cnt_100ms": 0, + "mysql_command_ANALYZE_TABLE_cnt_100us": 0, + "mysql_command_ANALYZE_TABLE_cnt_10ms": 0, + "mysql_command_ANALYZE_TABLE_cnt_10s": 0, + "mysql_command_ANALYZE_TABLE_cnt_1ms": 0, + "mysql_command_ANALYZE_TABLE_cnt_1s": 0, + "mysql_command_ANALYZE_TABLE_cnt_500ms": 0, + "mysql_command_ANALYZE_TABLE_cnt_500us": 0, + "mysql_command_ANALYZE_TABLE_cnt_50ms": 0, + "mysql_command_ANALYZE_TABLE_cnt_5ms": 0, + "mysql_command_ANALYZE_TABLE_cnt_5s": 0, + "mysql_command_ANALYZE_TABLE_cnt_INFs": 0, + "mysql_command_BEGIN_Total_Time_us": 0, + "mysql_command_BEGIN_Total_cnt": 0, + "mysql_command_BEGIN_cnt_100ms": 0, + "mysql_command_BEGIN_cnt_100us": 0, + "mysql_command_BEGIN_cnt_10ms": 0, + "mysql_command_BEGIN_cnt_10s": 0, + "mysql_command_BEGIN_cnt_1ms": 0, + "mysql_command_BEGIN_cnt_1s": 0, + "mysql_command_BEGIN_cnt_500ms": 0, + "mysql_command_BEGIN_cnt_500us": 0, + "mysql_command_BEGIN_cnt_50ms": 0, + "mysql_command_BEGIN_cnt_5ms": 0, + "mysql_command_BEGIN_cnt_5s": 0, + "mysql_command_BEGIN_cnt_INFs": 0, + "mysql_command_CALL_Total_Time_us": 0, + "mysql_command_CALL_Total_cnt": 0, + "mysql_command_CALL_cnt_100ms": 0, + "mysql_command_CALL_cnt_100us": 0, + "mysql_command_CALL_cnt_10ms": 0, + "mysql_command_CALL_cnt_10s": 0, + "mysql_command_CALL_cnt_1ms": 0, + "mysql_command_CALL_cnt_1s": 0, + "mysql_command_CALL_cnt_500ms": 0, + "mysql_command_CALL_cnt_500us": 0, + "mysql_command_CALL_cnt_50ms": 0, + "mysql_command_CALL_cnt_5ms": 0, + "mysql_command_CALL_cnt_5s": 0, + "mysql_command_CALL_cnt_INFs": 0, + "mysql_command_CHANGE_MASTER_Total_Time_us": 0, + "mysql_command_CHANGE_MASTER_Total_cnt": 0, + "mysql_command_CHANGE_MASTER_cnt_100ms": 0, + "mysql_command_CHANGE_MASTER_cnt_100us": 0, + "mysql_command_CHANGE_MASTER_cnt_10ms": 0, + "mysql_command_CHANGE_MASTER_cnt_10s": 0, + "mysql_command_CHANGE_MASTER_cnt_1ms": 0, + "mysql_command_CHANGE_MASTER_cnt_1s": 0, + "mysql_command_CHANGE_MASTER_cnt_500ms": 0, + "mysql_command_CHANGE_MASTER_cnt_500us": 0, + "mysql_command_CHANGE_MASTER_cnt_50ms": 0, + "mysql_command_CHANGE_MASTER_cnt_5ms": 0, + "mysql_command_CHANGE_MASTER_cnt_5s": 0, + "mysql_command_CHANGE_MASTER_cnt_INFs": 0, + "mysql_command_COMMIT_Total_Time_us": 0, + "mysql_command_COMMIT_Total_cnt": 0, + "mysql_command_COMMIT_cnt_100ms": 0, + "mysql_command_COMMIT_cnt_100us": 0, + "mysql_command_COMMIT_cnt_10ms": 0, + "mysql_command_COMMIT_cnt_10s": 0, + "mysql_command_COMMIT_cnt_1ms": 0, + "mysql_command_COMMIT_cnt_1s": 0, + "mysql_command_COMMIT_cnt_500ms": 0, + "mysql_command_COMMIT_cnt_500us": 0, + "mysql_command_COMMIT_cnt_50ms": 0, + "mysql_command_COMMIT_cnt_5ms": 0, + "mysql_command_COMMIT_cnt_5s": 0, + "mysql_command_COMMIT_cnt_INFs": 0, + "mysql_command_CREATE_DATABASE_Total_Time_us": 0, + "mysql_command_CREATE_DATABASE_Total_cnt": 0, + "mysql_command_CREATE_DATABASE_cnt_100ms": 0, + "mysql_command_CREATE_DATABASE_cnt_100us": 0, + "mysql_command_CREATE_DATABASE_cnt_10ms": 0, + "mysql_command_CREATE_DATABASE_cnt_10s": 0, + "mysql_command_CREATE_DATABASE_cnt_1ms": 0, + "mysql_command_CREATE_DATABASE_cnt_1s": 0, + "mysql_command_CREATE_DATABASE_cnt_500ms": 0, + "mysql_command_CREATE_DATABASE_cnt_500us": 0, + "mysql_command_CREATE_DATABASE_cnt_50ms": 0, + "mysql_command_CREATE_DATABASE_cnt_5ms": 0, + "mysql_command_CREATE_DATABASE_cnt_5s": 0, + "mysql_command_CREATE_DATABASE_cnt_INFs": 0, + "mysql_command_CREATE_INDEX_Total_Time_us": 0, + "mysql_command_CREATE_INDEX_Total_cnt": 0, + "mysql_command_CREATE_INDEX_cnt_100ms": 0, + "mysql_command_CREATE_INDEX_cnt_100us": 0, + "mysql_command_CREATE_INDEX_cnt_10ms": 0, + "mysql_command_CREATE_INDEX_cnt_10s": 0, + "mysql_command_CREATE_INDEX_cnt_1ms": 0, + "mysql_command_CREATE_INDEX_cnt_1s": 0, + "mysql_command_CREATE_INDEX_cnt_500ms": 0, + "mysql_command_CREATE_INDEX_cnt_500us": 0, + "mysql_command_CREATE_INDEX_cnt_50ms": 0, + "mysql_command_CREATE_INDEX_cnt_5ms": 0, + "mysql_command_CREATE_INDEX_cnt_5s": 0, + "mysql_command_CREATE_INDEX_cnt_INFs": 0, + "mysql_command_CREATE_TABLE_Total_Time_us": 0, + "mysql_command_CREATE_TABLE_Total_cnt": 0, + "mysql_command_CREATE_TABLE_cnt_100ms": 0, + "mysql_command_CREATE_TABLE_cnt_100us": 0, + "mysql_command_CREATE_TABLE_cnt_10ms": 0, + "mysql_command_CREATE_TABLE_cnt_10s": 0, + "mysql_command_CREATE_TABLE_cnt_1ms": 0, + "mysql_command_CREATE_TABLE_cnt_1s": 0, + "mysql_command_CREATE_TABLE_cnt_500ms": 0, + "mysql_command_CREATE_TABLE_cnt_500us": 0, + "mysql_command_CREATE_TABLE_cnt_50ms": 0, + "mysql_command_CREATE_TABLE_cnt_5ms": 0, + "mysql_command_CREATE_TABLE_cnt_5s": 0, + "mysql_command_CREATE_TABLE_cnt_INFs": 0, + "mysql_command_CREATE_TEMPORARY_Total_Time_us": 0, + "mysql_command_CREATE_TEMPORARY_Total_cnt": 0, + "mysql_command_CREATE_TEMPORARY_cnt_100ms": 0, + "mysql_command_CREATE_TEMPORARY_cnt_100us": 0, + "mysql_command_CREATE_TEMPORARY_cnt_10ms": 0, + "mysql_command_CREATE_TEMPORARY_cnt_10s": 0, + "mysql_command_CREATE_TEMPORARY_cnt_1ms": 0, + "mysql_command_CREATE_TEMPORARY_cnt_1s": 0, + "mysql_command_CREATE_TEMPORARY_cnt_500ms": 0, + "mysql_command_CREATE_TEMPORARY_cnt_500us": 0, + "mysql_command_CREATE_TEMPORARY_cnt_50ms": 0, + "mysql_command_CREATE_TEMPORARY_cnt_5ms": 0, + "mysql_command_CREATE_TEMPORARY_cnt_5s": 0, + "mysql_command_CREATE_TEMPORARY_cnt_INFs": 0, + "mysql_command_CREATE_TRIGGER_Total_Time_us": 0, + "mysql_command_CREATE_TRIGGER_Total_cnt": 0, + "mysql_command_CREATE_TRIGGER_cnt_100ms": 0, + "mysql_command_CREATE_TRIGGER_cnt_100us": 0, + "mysql_command_CREATE_TRIGGER_cnt_10ms": 0, + "mysql_command_CREATE_TRIGGER_cnt_10s": 0, + "mysql_command_CREATE_TRIGGER_cnt_1ms": 0, + "mysql_command_CREATE_TRIGGER_cnt_1s": 0, + "mysql_command_CREATE_TRIGGER_cnt_500ms": 0, + "mysql_command_CREATE_TRIGGER_cnt_500us": 0, + "mysql_command_CREATE_TRIGGER_cnt_50ms": 0, + "mysql_command_CREATE_TRIGGER_cnt_5ms": 0, + "mysql_command_CREATE_TRIGGER_cnt_5s": 0, + "mysql_command_CREATE_TRIGGER_cnt_INFs": 0, + "mysql_command_CREATE_USER_Total_Time_us": 0, + "mysql_command_CREATE_USER_Total_cnt": 0, + "mysql_command_CREATE_USER_cnt_100ms": 0, + "mysql_command_CREATE_USER_cnt_100us": 0, + "mysql_command_CREATE_USER_cnt_10ms": 0, + "mysql_command_CREATE_USER_cnt_10s": 0, + "mysql_command_CREATE_USER_cnt_1ms": 0, + "mysql_command_CREATE_USER_cnt_1s": 0, + "mysql_command_CREATE_USER_cnt_500ms": 0, + "mysql_command_CREATE_USER_cnt_500us": 0, + "mysql_command_CREATE_USER_cnt_50ms": 0, + "mysql_command_CREATE_USER_cnt_5ms": 0, + "mysql_command_CREATE_USER_cnt_5s": 0, + "mysql_command_CREATE_USER_cnt_INFs": 0, + "mysql_command_CREATE_VIEW_Total_Time_us": 0, + "mysql_command_CREATE_VIEW_Total_cnt": 0, + "mysql_command_CREATE_VIEW_cnt_100ms": 0, + "mysql_command_CREATE_VIEW_cnt_100us": 0, + "mysql_command_CREATE_VIEW_cnt_10ms": 0, + "mysql_command_CREATE_VIEW_cnt_10s": 0, + "mysql_command_CREATE_VIEW_cnt_1ms": 0, + "mysql_command_CREATE_VIEW_cnt_1s": 0, + "mysql_command_CREATE_VIEW_cnt_500ms": 0, + "mysql_command_CREATE_VIEW_cnt_500us": 0, + "mysql_command_CREATE_VIEW_cnt_50ms": 0, + "mysql_command_CREATE_VIEW_cnt_5ms": 0, + "mysql_command_CREATE_VIEW_cnt_5s": 0, + "mysql_command_CREATE_VIEW_cnt_INFs": 0, + "mysql_command_DEALLOCATE_Total_Time_us": 0, + "mysql_command_DEALLOCATE_Total_cnt": 0, + "mysql_command_DEALLOCATE_cnt_100ms": 0, + "mysql_command_DEALLOCATE_cnt_100us": 0, + "mysql_command_DEALLOCATE_cnt_10ms": 0, + "mysql_command_DEALLOCATE_cnt_10s": 0, + "mysql_command_DEALLOCATE_cnt_1ms": 0, + "mysql_command_DEALLOCATE_cnt_1s": 0, + "mysql_command_DEALLOCATE_cnt_500ms": 0, + "mysql_command_DEALLOCATE_cnt_500us": 0, + "mysql_command_DEALLOCATE_cnt_50ms": 0, + "mysql_command_DEALLOCATE_cnt_5ms": 0, + "mysql_command_DEALLOCATE_cnt_5s": 0, + "mysql_command_DEALLOCATE_cnt_INFs": 0, + "mysql_command_DELETE_Total_Time_us": 0, + "mysql_command_DELETE_Total_cnt": 0, + "mysql_command_DELETE_cnt_100ms": 0, + "mysql_command_DELETE_cnt_100us": 0, + "mysql_command_DELETE_cnt_10ms": 0, + "mysql_command_DELETE_cnt_10s": 0, + "mysql_command_DELETE_cnt_1ms": 0, + "mysql_command_DELETE_cnt_1s": 0, + "mysql_command_DELETE_cnt_500ms": 0, + "mysql_command_DELETE_cnt_500us": 0, + "mysql_command_DELETE_cnt_50ms": 0, + "mysql_command_DELETE_cnt_5ms": 0, + "mysql_command_DELETE_cnt_5s": 0, + "mysql_command_DELETE_cnt_INFs": 0, + "mysql_command_DESCRIBE_Total_Time_us": 0, + "mysql_command_DESCRIBE_Total_cnt": 0, + "mysql_command_DESCRIBE_cnt_100ms": 0, + "mysql_command_DESCRIBE_cnt_100us": 0, + "mysql_command_DESCRIBE_cnt_10ms": 0, + "mysql_command_DESCRIBE_cnt_10s": 0, + "mysql_command_DESCRIBE_cnt_1ms": 0, + "mysql_command_DESCRIBE_cnt_1s": 0, + "mysql_command_DESCRIBE_cnt_500ms": 0, + "mysql_command_DESCRIBE_cnt_500us": 0, + "mysql_command_DESCRIBE_cnt_50ms": 0, + "mysql_command_DESCRIBE_cnt_5ms": 0, + "mysql_command_DESCRIBE_cnt_5s": 0, + "mysql_command_DESCRIBE_cnt_INFs": 0, + "mysql_command_DROP_DATABASE_Total_Time_us": 0, + "mysql_command_DROP_DATABASE_Total_cnt": 0, + "mysql_command_DROP_DATABASE_cnt_100ms": 0, + "mysql_command_DROP_DATABASE_cnt_100us": 0, + "mysql_command_DROP_DATABASE_cnt_10ms": 0, + "mysql_command_DROP_DATABASE_cnt_10s": 0, + "mysql_command_DROP_DATABASE_cnt_1ms": 0, + "mysql_command_DROP_DATABASE_cnt_1s": 0, + "mysql_command_DROP_DATABASE_cnt_500ms": 0, + "mysql_command_DROP_DATABASE_cnt_500us": 0, + "mysql_command_DROP_DATABASE_cnt_50ms": 0, + "mysql_command_DROP_DATABASE_cnt_5ms": 0, + "mysql_command_DROP_DATABASE_cnt_5s": 0, + "mysql_command_DROP_DATABASE_cnt_INFs": 0, + "mysql_command_DROP_INDEX_Total_Time_us": 0, + "mysql_command_DROP_INDEX_Total_cnt": 0, + "mysql_command_DROP_INDEX_cnt_100ms": 0, + "mysql_command_DROP_INDEX_cnt_100us": 0, + "mysql_command_DROP_INDEX_cnt_10ms": 0, + "mysql_command_DROP_INDEX_cnt_10s": 0, + "mysql_command_DROP_INDEX_cnt_1ms": 0, + "mysql_command_DROP_INDEX_cnt_1s": 0, + "mysql_command_DROP_INDEX_cnt_500ms": 0, + "mysql_command_DROP_INDEX_cnt_500us": 0, + "mysql_command_DROP_INDEX_cnt_50ms": 0, + "mysql_command_DROP_INDEX_cnt_5ms": 0, + "mysql_command_DROP_INDEX_cnt_5s": 0, + "mysql_command_DROP_INDEX_cnt_INFs": 0, + "mysql_command_DROP_TABLE_Total_Time_us": 0, + "mysql_command_DROP_TABLE_Total_cnt": 0, + "mysql_command_DROP_TABLE_cnt_100ms": 0, + "mysql_command_DROP_TABLE_cnt_100us": 0, + "mysql_command_DROP_TABLE_cnt_10ms": 0, + "mysql_command_DROP_TABLE_cnt_10s": 0, + "mysql_command_DROP_TABLE_cnt_1ms": 0, + "mysql_command_DROP_TABLE_cnt_1s": 0, + "mysql_command_DROP_TABLE_cnt_500ms": 0, + "mysql_command_DROP_TABLE_cnt_500us": 0, + "mysql_command_DROP_TABLE_cnt_50ms": 0, + "mysql_command_DROP_TABLE_cnt_5ms": 0, + "mysql_command_DROP_TABLE_cnt_5s": 0, + "mysql_command_DROP_TABLE_cnt_INFs": 0, + "mysql_command_DROP_TRIGGER_Total_Time_us": 0, + "mysql_command_DROP_TRIGGER_Total_cnt": 0, + "mysql_command_DROP_TRIGGER_cnt_100ms": 0, + "mysql_command_DROP_TRIGGER_cnt_100us": 0, + "mysql_command_DROP_TRIGGER_cnt_10ms": 0, + "mysql_command_DROP_TRIGGER_cnt_10s": 0, + "mysql_command_DROP_TRIGGER_cnt_1ms": 0, + "mysql_command_DROP_TRIGGER_cnt_1s": 0, + "mysql_command_DROP_TRIGGER_cnt_500ms": 0, + "mysql_command_DROP_TRIGGER_cnt_500us": 0, + "mysql_command_DROP_TRIGGER_cnt_50ms": 0, + "mysql_command_DROP_TRIGGER_cnt_5ms": 0, + "mysql_command_DROP_TRIGGER_cnt_5s": 0, + "mysql_command_DROP_TRIGGER_cnt_INFs": 0, + "mysql_command_DROP_USER_Total_Time_us": 0, + "mysql_command_DROP_USER_Total_cnt": 0, + "mysql_command_DROP_USER_cnt_100ms": 0, + "mysql_command_DROP_USER_cnt_100us": 0, + "mysql_command_DROP_USER_cnt_10ms": 0, + "mysql_command_DROP_USER_cnt_10s": 0, + "mysql_command_DROP_USER_cnt_1ms": 0, + "mysql_command_DROP_USER_cnt_1s": 0, + "mysql_command_DROP_USER_cnt_500ms": 0, + "mysql_command_DROP_USER_cnt_500us": 0, + "mysql_command_DROP_USER_cnt_50ms": 0, + "mysql_command_DROP_USER_cnt_5ms": 0, + "mysql_command_DROP_USER_cnt_5s": 0, + "mysql_command_DROP_USER_cnt_INFs": 0, + "mysql_command_DROP_VIEW_Total_Time_us": 0, + "mysql_command_DROP_VIEW_Total_cnt": 0, + "mysql_command_DROP_VIEW_cnt_100ms": 0, + "mysql_command_DROP_VIEW_cnt_100us": 0, + "mysql_command_DROP_VIEW_cnt_10ms": 0, + "mysql_command_DROP_VIEW_cnt_10s": 0, + "mysql_command_DROP_VIEW_cnt_1ms": 0, + "mysql_command_DROP_VIEW_cnt_1s": 0, + "mysql_command_DROP_VIEW_cnt_500ms": 0, + "mysql_command_DROP_VIEW_cnt_500us": 0, + "mysql_command_DROP_VIEW_cnt_50ms": 0, + "mysql_command_DROP_VIEW_cnt_5ms": 0, + "mysql_command_DROP_VIEW_cnt_5s": 0, + "mysql_command_DROP_VIEW_cnt_INFs": 0, + "mysql_command_EXECUTE_Total_Time_us": 0, + "mysql_command_EXECUTE_Total_cnt": 0, + "mysql_command_EXECUTE_cnt_100ms": 0, + "mysql_command_EXECUTE_cnt_100us": 0, + "mysql_command_EXECUTE_cnt_10ms": 0, + "mysql_command_EXECUTE_cnt_10s": 0, + "mysql_command_EXECUTE_cnt_1ms": 0, + "mysql_command_EXECUTE_cnt_1s": 0, + "mysql_command_EXECUTE_cnt_500ms": 0, + "mysql_command_EXECUTE_cnt_500us": 0, + "mysql_command_EXECUTE_cnt_50ms": 0, + "mysql_command_EXECUTE_cnt_5ms": 0, + "mysql_command_EXECUTE_cnt_5s": 0, + "mysql_command_EXECUTE_cnt_INFs": 0, + "mysql_command_EXPLAIN_Total_Time_us": 0, + "mysql_command_EXPLAIN_Total_cnt": 0, + "mysql_command_EXPLAIN_cnt_100ms": 0, + "mysql_command_EXPLAIN_cnt_100us": 0, + "mysql_command_EXPLAIN_cnt_10ms": 0, + "mysql_command_EXPLAIN_cnt_10s": 0, + "mysql_command_EXPLAIN_cnt_1ms": 0, + "mysql_command_EXPLAIN_cnt_1s": 0, + "mysql_command_EXPLAIN_cnt_500ms": 0, + "mysql_command_EXPLAIN_cnt_500us": 0, + "mysql_command_EXPLAIN_cnt_50ms": 0, + "mysql_command_EXPLAIN_cnt_5ms": 0, + "mysql_command_EXPLAIN_cnt_5s": 0, + "mysql_command_EXPLAIN_cnt_INFs": 0, + "mysql_command_FLUSH_Total_Time_us": 0, + "mysql_command_FLUSH_Total_cnt": 0, + "mysql_command_FLUSH_cnt_100ms": 0, + "mysql_command_FLUSH_cnt_100us": 0, + "mysql_command_FLUSH_cnt_10ms": 0, + "mysql_command_FLUSH_cnt_10s": 0, + "mysql_command_FLUSH_cnt_1ms": 0, + "mysql_command_FLUSH_cnt_1s": 0, + "mysql_command_FLUSH_cnt_500ms": 0, + "mysql_command_FLUSH_cnt_500us": 0, + "mysql_command_FLUSH_cnt_50ms": 0, + "mysql_command_FLUSH_cnt_5ms": 0, + "mysql_command_FLUSH_cnt_5s": 0, + "mysql_command_FLUSH_cnt_INFs": 0, + "mysql_command_GRANT_Total_Time_us": 0, + "mysql_command_GRANT_Total_cnt": 0, + "mysql_command_GRANT_cnt_100ms": 0, + "mysql_command_GRANT_cnt_100us": 0, + "mysql_command_GRANT_cnt_10ms": 0, + "mysql_command_GRANT_cnt_10s": 0, + "mysql_command_GRANT_cnt_1ms": 0, + "mysql_command_GRANT_cnt_1s": 0, + "mysql_command_GRANT_cnt_500ms": 0, + "mysql_command_GRANT_cnt_500us": 0, + "mysql_command_GRANT_cnt_50ms": 0, + "mysql_command_GRANT_cnt_5ms": 0, + "mysql_command_GRANT_cnt_5s": 0, + "mysql_command_GRANT_cnt_INFs": 0, + "mysql_command_INSERT_Total_Time_us": 0, + "mysql_command_INSERT_Total_cnt": 0, + "mysql_command_INSERT_cnt_100ms": 0, + "mysql_command_INSERT_cnt_100us": 0, + "mysql_command_INSERT_cnt_10ms": 0, + "mysql_command_INSERT_cnt_10s": 0, + "mysql_command_INSERT_cnt_1ms": 0, + "mysql_command_INSERT_cnt_1s": 0, + "mysql_command_INSERT_cnt_500ms": 0, + "mysql_command_INSERT_cnt_500us": 0, + "mysql_command_INSERT_cnt_50ms": 0, + "mysql_command_INSERT_cnt_5ms": 0, + "mysql_command_INSERT_cnt_5s": 0, + "mysql_command_INSERT_cnt_INFs": 0, + "mysql_command_KILL_Total_Time_us": 0, + "mysql_command_KILL_Total_cnt": 0, + "mysql_command_KILL_cnt_100ms": 0, + "mysql_command_KILL_cnt_100us": 0, + "mysql_command_KILL_cnt_10ms": 0, + "mysql_command_KILL_cnt_10s": 0, + "mysql_command_KILL_cnt_1ms": 0, + "mysql_command_KILL_cnt_1s": 0, + "mysql_command_KILL_cnt_500ms": 0, + "mysql_command_KILL_cnt_500us": 0, + "mysql_command_KILL_cnt_50ms": 0, + "mysql_command_KILL_cnt_5ms": 0, + "mysql_command_KILL_cnt_5s": 0, + "mysql_command_KILL_cnt_INFs": 0, + "mysql_command_LOAD_Total_Time_us": 0, + "mysql_command_LOAD_Total_cnt": 0, + "mysql_command_LOAD_cnt_100ms": 0, + "mysql_command_LOAD_cnt_100us": 0, + "mysql_command_LOAD_cnt_10ms": 0, + "mysql_command_LOAD_cnt_10s": 0, + "mysql_command_LOAD_cnt_1ms": 0, + "mysql_command_LOAD_cnt_1s": 0, + "mysql_command_LOAD_cnt_500ms": 0, + "mysql_command_LOAD_cnt_500us": 0, + "mysql_command_LOAD_cnt_50ms": 0, + "mysql_command_LOAD_cnt_5ms": 0, + "mysql_command_LOAD_cnt_5s": 0, + "mysql_command_LOAD_cnt_INFs": 0, + "mysql_command_LOCK_TABLE_Total_Time_us": 0, + "mysql_command_LOCK_TABLE_Total_cnt": 0, + "mysql_command_LOCK_TABLE_cnt_100ms": 0, + "mysql_command_LOCK_TABLE_cnt_100us": 0, + "mysql_command_LOCK_TABLE_cnt_10ms": 0, + "mysql_command_LOCK_TABLE_cnt_10s": 0, + "mysql_command_LOCK_TABLE_cnt_1ms": 0, + "mysql_command_LOCK_TABLE_cnt_1s": 0, + "mysql_command_LOCK_TABLE_cnt_500ms": 0, + "mysql_command_LOCK_TABLE_cnt_500us": 0, + "mysql_command_LOCK_TABLE_cnt_50ms": 0, + "mysql_command_LOCK_TABLE_cnt_5ms": 0, + "mysql_command_LOCK_TABLE_cnt_5s": 0, + "mysql_command_LOCK_TABLE_cnt_INFs": 0, + "mysql_command_OPTIMIZE_Total_Time_us": 0, + "mysql_command_OPTIMIZE_Total_cnt": 0, + "mysql_command_OPTIMIZE_cnt_100ms": 0, + "mysql_command_OPTIMIZE_cnt_100us": 0, + "mysql_command_OPTIMIZE_cnt_10ms": 0, + "mysql_command_OPTIMIZE_cnt_10s": 0, + "mysql_command_OPTIMIZE_cnt_1ms": 0, + "mysql_command_OPTIMIZE_cnt_1s": 0, + "mysql_command_OPTIMIZE_cnt_500ms": 0, + "mysql_command_OPTIMIZE_cnt_500us": 0, + "mysql_command_OPTIMIZE_cnt_50ms": 0, + "mysql_command_OPTIMIZE_cnt_5ms": 0, + "mysql_command_OPTIMIZE_cnt_5s": 0, + "mysql_command_OPTIMIZE_cnt_INFs": 0, + "mysql_command_PREPARE_Total_Time_us": 0, + "mysql_command_PREPARE_Total_cnt": 0, + "mysql_command_PREPARE_cnt_100ms": 0, + "mysql_command_PREPARE_cnt_100us": 0, + "mysql_command_PREPARE_cnt_10ms": 0, + "mysql_command_PREPARE_cnt_10s": 0, + "mysql_command_PREPARE_cnt_1ms": 0, + "mysql_command_PREPARE_cnt_1s": 0, + "mysql_command_PREPARE_cnt_500ms": 0, + "mysql_command_PREPARE_cnt_500us": 0, + "mysql_command_PREPARE_cnt_50ms": 0, + "mysql_command_PREPARE_cnt_5ms": 0, + "mysql_command_PREPARE_cnt_5s": 0, + "mysql_command_PREPARE_cnt_INFs": 0, + "mysql_command_PURGE_Total_Time_us": 0, + "mysql_command_PURGE_Total_cnt": 0, + "mysql_command_PURGE_cnt_100ms": 0, + "mysql_command_PURGE_cnt_100us": 0, + "mysql_command_PURGE_cnt_10ms": 0, + "mysql_command_PURGE_cnt_10s": 0, + "mysql_command_PURGE_cnt_1ms": 0, + "mysql_command_PURGE_cnt_1s": 0, + "mysql_command_PURGE_cnt_500ms": 0, + "mysql_command_PURGE_cnt_500us": 0, + "mysql_command_PURGE_cnt_50ms": 0, + "mysql_command_PURGE_cnt_5ms": 0, + "mysql_command_PURGE_cnt_5s": 0, + "mysql_command_PURGE_cnt_INFs": 0, + "mysql_command_RENAME_TABLE_Total_Time_us": 0, + "mysql_command_RENAME_TABLE_Total_cnt": 0, + "mysql_command_RENAME_TABLE_cnt_100ms": 0, + "mysql_command_RENAME_TABLE_cnt_100us": 0, + "mysql_command_RENAME_TABLE_cnt_10ms": 0, + "mysql_command_RENAME_TABLE_cnt_10s": 0, + "mysql_command_RENAME_TABLE_cnt_1ms": 0, + "mysql_command_RENAME_TABLE_cnt_1s": 0, + "mysql_command_RENAME_TABLE_cnt_500ms": 0, + "mysql_command_RENAME_TABLE_cnt_500us": 0, + "mysql_command_RENAME_TABLE_cnt_50ms": 0, + "mysql_command_RENAME_TABLE_cnt_5ms": 0, + "mysql_command_RENAME_TABLE_cnt_5s": 0, + "mysql_command_RENAME_TABLE_cnt_INFs": 0, + "mysql_command_REPLACE_Total_Time_us": 0, + "mysql_command_REPLACE_Total_cnt": 0, + "mysql_command_REPLACE_cnt_100ms": 0, + "mysql_command_REPLACE_cnt_100us": 0, + "mysql_command_REPLACE_cnt_10ms": 0, + "mysql_command_REPLACE_cnt_10s": 0, + "mysql_command_REPLACE_cnt_1ms": 0, + "mysql_command_REPLACE_cnt_1s": 0, + "mysql_command_REPLACE_cnt_500ms": 0, + "mysql_command_REPLACE_cnt_500us": 0, + "mysql_command_REPLACE_cnt_50ms": 0, + "mysql_command_REPLACE_cnt_5ms": 0, + "mysql_command_REPLACE_cnt_5s": 0, + "mysql_command_REPLACE_cnt_INFs": 0, + "mysql_command_RESET_MASTER_Total_Time_us": 0, + "mysql_command_RESET_MASTER_Total_cnt": 0, + "mysql_command_RESET_MASTER_cnt_100ms": 0, + "mysql_command_RESET_MASTER_cnt_100us": 0, + "mysql_command_RESET_MASTER_cnt_10ms": 0, + "mysql_command_RESET_MASTER_cnt_10s": 0, + "mysql_command_RESET_MASTER_cnt_1ms": 0, + "mysql_command_RESET_MASTER_cnt_1s": 0, + "mysql_command_RESET_MASTER_cnt_500ms": 0, + "mysql_command_RESET_MASTER_cnt_500us": 0, + "mysql_command_RESET_MASTER_cnt_50ms": 0, + "mysql_command_RESET_MASTER_cnt_5ms": 0, + "mysql_command_RESET_MASTER_cnt_5s": 0, + "mysql_command_RESET_MASTER_cnt_INFs": 0, + "mysql_command_RESET_SLAVE_Total_Time_us": 0, + "mysql_command_RESET_SLAVE_Total_cnt": 0, + "mysql_command_RESET_SLAVE_cnt_100ms": 0, + "mysql_command_RESET_SLAVE_cnt_100us": 0, + "mysql_command_RESET_SLAVE_cnt_10ms": 0, + "mysql_command_RESET_SLAVE_cnt_10s": 0, + "mysql_command_RESET_SLAVE_cnt_1ms": 0, + "mysql_command_RESET_SLAVE_cnt_1s": 0, + "mysql_command_RESET_SLAVE_cnt_500ms": 0, + "mysql_command_RESET_SLAVE_cnt_500us": 0, + "mysql_command_RESET_SLAVE_cnt_50ms": 0, + "mysql_command_RESET_SLAVE_cnt_5ms": 0, + "mysql_command_RESET_SLAVE_cnt_5s": 0, + "mysql_command_RESET_SLAVE_cnt_INFs": 0, + "mysql_command_REVOKE_Total_Time_us": 0, + "mysql_command_REVOKE_Total_cnt": 0, + "mysql_command_REVOKE_cnt_100ms": 0, + "mysql_command_REVOKE_cnt_100us": 0, + "mysql_command_REVOKE_cnt_10ms": 0, + "mysql_command_REVOKE_cnt_10s": 0, + "mysql_command_REVOKE_cnt_1ms": 0, + "mysql_command_REVOKE_cnt_1s": 0, + "mysql_command_REVOKE_cnt_500ms": 0, + "mysql_command_REVOKE_cnt_500us": 0, + "mysql_command_REVOKE_cnt_50ms": 0, + "mysql_command_REVOKE_cnt_5ms": 0, + "mysql_command_REVOKE_cnt_5s": 0, + "mysql_command_REVOKE_cnt_INFs": 0, + "mysql_command_ROLLBACK_Total_Time_us": 0, + "mysql_command_ROLLBACK_Total_cnt": 0, + "mysql_command_ROLLBACK_cnt_100ms": 0, + "mysql_command_ROLLBACK_cnt_100us": 0, + "mysql_command_ROLLBACK_cnt_10ms": 0, + "mysql_command_ROLLBACK_cnt_10s": 0, + "mysql_command_ROLLBACK_cnt_1ms": 0, + "mysql_command_ROLLBACK_cnt_1s": 0, + "mysql_command_ROLLBACK_cnt_500ms": 0, + "mysql_command_ROLLBACK_cnt_500us": 0, + "mysql_command_ROLLBACK_cnt_50ms": 0, + "mysql_command_ROLLBACK_cnt_5ms": 0, + "mysql_command_ROLLBACK_cnt_5s": 0, + "mysql_command_ROLLBACK_cnt_INFs": 0, + "mysql_command_SAVEPOINT_Total_Time_us": 0, + "mysql_command_SAVEPOINT_Total_cnt": 0, + "mysql_command_SAVEPOINT_cnt_100ms": 0, + "mysql_command_SAVEPOINT_cnt_100us": 0, + "mysql_command_SAVEPOINT_cnt_10ms": 0, + "mysql_command_SAVEPOINT_cnt_10s": 0, + "mysql_command_SAVEPOINT_cnt_1ms": 0, + "mysql_command_SAVEPOINT_cnt_1s": 0, + "mysql_command_SAVEPOINT_cnt_500ms": 0, + "mysql_command_SAVEPOINT_cnt_500us": 0, + "mysql_command_SAVEPOINT_cnt_50ms": 0, + "mysql_command_SAVEPOINT_cnt_5ms": 0, + "mysql_command_SAVEPOINT_cnt_5s": 0, + "mysql_command_SAVEPOINT_cnt_INFs": 0, + "mysql_command_SELECT_FOR_UPDATE_Total_Time_us": 0, + "mysql_command_SELECT_FOR_UPDATE_Total_cnt": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_100ms": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_100us": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_10ms": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_10s": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_1ms": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_1s": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_500ms": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_500us": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_50ms": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_5ms": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_5s": 0, + "mysql_command_SELECT_FOR_UPDATE_cnt_INFs": 0, + "mysql_command_SELECT_Total_Time_us": 4673958076637, + "mysql_command_SELECT_Total_cnt": 68490650, + "mysql_command_SELECT_cnt_100ms": 4909816, + "mysql_command_SELECT_cnt_100us": 32185976, + "mysql_command_SELECT_cnt_10ms": 2955830, + "mysql_command_SELECT_cnt_10s": 497, + "mysql_command_SELECT_cnt_1ms": 481335, + "mysql_command_SELECT_cnt_1s": 1321917, + "mysql_command_SELECT_cnt_500ms": 11123900, + "mysql_command_SELECT_cnt_500us": 36650, + "mysql_command_SELECT_cnt_50ms": 10468460, + "mysql_command_SELECT_cnt_5ms": 4600948, + "mysql_command_SELECT_cnt_5s": 403451, + "mysql_command_SELECT_cnt_INFs": 1870, + "mysql_command_SET_Total_Time_us": 0, + "mysql_command_SET_Total_cnt": 0, + "mysql_command_SET_cnt_100ms": 0, + "mysql_command_SET_cnt_100us": 0, + "mysql_command_SET_cnt_10ms": 0, + "mysql_command_SET_cnt_10s": 0, + "mysql_command_SET_cnt_1ms": 0, + "mysql_command_SET_cnt_1s": 0, + "mysql_command_SET_cnt_500ms": 0, + "mysql_command_SET_cnt_500us": 0, + "mysql_command_SET_cnt_50ms": 0, + "mysql_command_SET_cnt_5ms": 0, + "mysql_command_SET_cnt_5s": 0, + "mysql_command_SET_cnt_INFs": 0, + "mysql_command_SHOW_TABLE_STATUS_Total_Time_us": 0, + "mysql_command_SHOW_TABLE_STATUS_Total_cnt": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_100ms": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_100us": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_10ms": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_10s": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_1ms": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_1s": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_500ms": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_500us": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_50ms": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_5ms": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_5s": 0, + "mysql_command_SHOW_TABLE_STATUS_cnt_INFs": 0, + "mysql_command_SHOW_Total_Time_us": 2158, + "mysql_command_SHOW_Total_cnt": 1, + "mysql_command_SHOW_cnt_100ms": 0, + "mysql_command_SHOW_cnt_100us": 0, + "mysql_command_SHOW_cnt_10ms": 0, + "mysql_command_SHOW_cnt_10s": 0, + "mysql_command_SHOW_cnt_1ms": 0, + "mysql_command_SHOW_cnt_1s": 0, + "mysql_command_SHOW_cnt_500ms": 0, + "mysql_command_SHOW_cnt_500us": 0, + "mysql_command_SHOW_cnt_50ms": 0, + "mysql_command_SHOW_cnt_5ms": 1, + "mysql_command_SHOW_cnt_5s": 0, + "mysql_command_SHOW_cnt_INFs": 0, + "mysql_command_START_TRANSACTION_Total_Time_us": 0, + "mysql_command_START_TRANSACTION_Total_cnt": 0, + "mysql_command_START_TRANSACTION_cnt_100ms": 0, + "mysql_command_START_TRANSACTION_cnt_100us": 0, + "mysql_command_START_TRANSACTION_cnt_10ms": 0, + "mysql_command_START_TRANSACTION_cnt_10s": 0, + "mysql_command_START_TRANSACTION_cnt_1ms": 0, + "mysql_command_START_TRANSACTION_cnt_1s": 0, + "mysql_command_START_TRANSACTION_cnt_500ms": 0, + "mysql_command_START_TRANSACTION_cnt_500us": 0, + "mysql_command_START_TRANSACTION_cnt_50ms": 0, + "mysql_command_START_TRANSACTION_cnt_5ms": 0, + "mysql_command_START_TRANSACTION_cnt_5s": 0, + "mysql_command_START_TRANSACTION_cnt_INFs": 0, + "mysql_command_TRUNCATE_TABLE_Total_Time_us": 0, + "mysql_command_TRUNCATE_TABLE_Total_cnt": 0, + "mysql_command_TRUNCATE_TABLE_cnt_100ms": 0, + "mysql_command_TRUNCATE_TABLE_cnt_100us": 0, + "mysql_command_TRUNCATE_TABLE_cnt_10ms": 0, + "mysql_command_TRUNCATE_TABLE_cnt_10s": 0, + "mysql_command_TRUNCATE_TABLE_cnt_1ms": 0, + "mysql_command_TRUNCATE_TABLE_cnt_1s": 0, + "mysql_command_TRUNCATE_TABLE_cnt_500ms": 0, + "mysql_command_TRUNCATE_TABLE_cnt_500us": 0, + "mysql_command_TRUNCATE_TABLE_cnt_50ms": 0, + "mysql_command_TRUNCATE_TABLE_cnt_5ms": 0, + "mysql_command_TRUNCATE_TABLE_cnt_5s": 0, + "mysql_command_TRUNCATE_TABLE_cnt_INFs": 0, + "mysql_command_UNKNOWN_Total_Time_us": 0, + "mysql_command_UNKNOWN_Total_cnt": 0, + "mysql_command_UNKNOWN_cnt_100ms": 0, + "mysql_command_UNKNOWN_cnt_100us": 0, + "mysql_command_UNKNOWN_cnt_10ms": 0, + "mysql_command_UNKNOWN_cnt_10s": 0, + "mysql_command_UNKNOWN_cnt_1ms": 0, + "mysql_command_UNKNOWN_cnt_1s": 0, + "mysql_command_UNKNOWN_cnt_500ms": 0, + "mysql_command_UNKNOWN_cnt_500us": 0, + "mysql_command_UNKNOWN_cnt_50ms": 0, + "mysql_command_UNKNOWN_cnt_5ms": 0, + "mysql_command_UNKNOWN_cnt_5s": 0, + "mysql_command_UNKNOWN_cnt_INFs": 0, + "mysql_command_UNLOCK_TABLES_Total_Time_us": 0, + "mysql_command_UNLOCK_TABLES_Total_cnt": 0, + "mysql_command_UNLOCK_TABLES_cnt_100ms": 0, + "mysql_command_UNLOCK_TABLES_cnt_100us": 0, + "mysql_command_UNLOCK_TABLES_cnt_10ms": 0, + "mysql_command_UNLOCK_TABLES_cnt_10s": 0, + "mysql_command_UNLOCK_TABLES_cnt_1ms": 0, + "mysql_command_UNLOCK_TABLES_cnt_1s": 0, + "mysql_command_UNLOCK_TABLES_cnt_500ms": 0, + "mysql_command_UNLOCK_TABLES_cnt_500us": 0, + "mysql_command_UNLOCK_TABLES_cnt_50ms": 0, + "mysql_command_UNLOCK_TABLES_cnt_5ms": 0, + "mysql_command_UNLOCK_TABLES_cnt_5s": 0, + "mysql_command_UNLOCK_TABLES_cnt_INFs": 0, + "mysql_command_UPDATE_Total_Time_us": 0, + "mysql_command_UPDATE_Total_cnt": 0, + "mysql_command_UPDATE_cnt_100ms": 0, + "mysql_command_UPDATE_cnt_100us": 0, + "mysql_command_UPDATE_cnt_10ms": 0, + "mysql_command_UPDATE_cnt_10s": 0, + "mysql_command_UPDATE_cnt_1ms": 0, + "mysql_command_UPDATE_cnt_1s": 0, + "mysql_command_UPDATE_cnt_500ms": 0, + "mysql_command_UPDATE_cnt_500us": 0, + "mysql_command_UPDATE_cnt_50ms": 0, + "mysql_command_UPDATE_cnt_5ms": 0, + "mysql_command_UPDATE_cnt_5s": 0, + "mysql_command_UPDATE_cnt_INFs": 0, + "mysql_command_USE_Total_Time_us": 0, + "mysql_command_USE_Total_cnt": 0, + "mysql_command_USE_cnt_100ms": 0, + "mysql_command_USE_cnt_100us": 0, + "mysql_command_USE_cnt_10ms": 0, + "mysql_command_USE_cnt_10s": 0, + "mysql_command_USE_cnt_1ms": 0, + "mysql_command_USE_cnt_1s": 0, + "mysql_command_USE_cnt_500ms": 0, + "mysql_command_USE_cnt_500us": 0, + "mysql_command_USE_cnt_50ms": 0, + "mysql_command_USE_cnt_5ms": 0, + "mysql_command_USE_cnt_5s": 0, + "mysql_command_USE_cnt_INFs": 0, + "mysql_firewall_rules_config": 329, + "mysql_firewall_rules_table": 0, + "mysql_firewall_users_config": 0, + "mysql_firewall_users_table": 0, + "mysql_frontend_buffers_bytes": 196608, + "mysql_killed_backend_connections": 0, + "mysql_killed_backend_queries": 0, + "mysql_query_rules_memory": 22825, + "mysql_session_internal_bytes": 20232, + "mysql_unexpected_frontend_com_quit": 0, + "mysql_unexpected_frontend_packets": 0, + "mysql_user_first_user_frontend_connections": 0, + "mysql_user_first_user_frontend_connections_utilization": 0, + "mysql_user_second_user_frontend_connections": 3, + "mysql_user_second_user_frontend_connections_utilization": 20, + "queries_with_max_lag_ms": 0, + "queries_with_max_lag_ms__delayed": 0, + "queries_with_max_lag_ms__total_wait_time_us": 0, + "query_digest_memory": 13688, + "stack_memory_admin_threads": 16777216, + "stack_memory_cluster_threads": 0, + "stack_memory_mysql_threads": 33554432, + "whitelisted_sqli_fingerprint": 0, + } + + require.Equal(t, expected, 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 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() +} |