From b1306a28b3c1f72990186557265e16679d9e7262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 25 Feb 2020 00:20:51 +1100 Subject: [PATCH] Extending Statistics, only for new Web UI --- include/ProxySQL_Statistics.hpp | 15 +++++- lib/ProxySQL_Admin.cpp | 9 +++- lib/ProxySQL_Statistics.cpp | 91 ++++++++++++++++++++++++++++++++- 3 files changed, 112 insertions(+), 3 deletions(-) diff --git a/include/ProxySQL_Statistics.hpp b/include/ProxySQL_Statistics.hpp index 7dd2a8983..b07f6744c 100644 --- a/include/ProxySQL_Statistics.hpp +++ b/include/ProxySQL_Statistics.hpp @@ -12,6 +12,15 @@ #define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_V2_0 +#define STATSDB_SQLITE_TABLE_HISTORY_MYSQL_STATUS_VARIABLES_V2_0_10 "CREATE TABLE history_mysql_status_variables (timestamp INT NOT NULL , variable_name VARCHAR NOT NULL , variable_value VARCHAR NOT NULL , PRIMARY KEY (timestamp, variable_name))" + +#define STATSDB_SQLITE_TABLE_HISTORY_MYSQL_STATUS_VARIABLES STATSDB_SQLITE_TABLE_HISTORY_MYSQL_STATUS_VARIABLES_V2_0_10 + +#define STATSDB_SQLITE_TABLE_HISTORY_STATS_MYSQL_CONNECTION_POOL_V2_0_10 "CREATE TABLE history_stats_mysql_connection_pool (timestamp INT NOT NULL , hostgroup INT , srv_host VARCHAR , srv_port INT , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , MaxConnUsed INT , Queries INT , Queries_GTID_sync INT , Bytes_data_sent INT , Bytes_data_recv INT , Latency_us INT, PRIMARY KEY (timestamp, hostgroup , srv_host , srv_port))" + +#define STATSDB_SQLITE_TABLE_HISTORY_STATS_MYSQL_CONNECTION_POOL STATSDB_SQLITE_TABLE_HISTORY_STATS_MYSQL_CONNECTION_POOL_V2_0_10 + + #define STATSDB_SQLITE_TABLE_MYHGM_CONNECTIONS_V2_0 "CREATE TABLE myhgm_connections (timestamp INT NOT NULL, MyHGM_myconnpoll_destroy INT NOT NULL, MyHGM_myconnpoll_get INT NOT NULL, MyHGM_myconnpoll_get_ok INT NOT NULL, MyHGM_myconnpoll_push INT NOT NULL, MyHGM_myconnpoll_reset INT NOT NULL, PRIMARY KEY (timestamp))" #define STATSDB_SQLITE_TABLE_MYHGM_CONNECTIONS STATSDB_SQLITE_TABLE_MYHGM_CONNECTIONS_V2_0 @@ -80,6 +89,10 @@ class ProxySQL_Statistics { unsigned long long next_timer_system_memory; #endif unsigned long long next_timer_MySQL_Query_Cache; + void MySQL_Threads_Handler_sets_v1(SQLite3_result *); + void MySQL_Threads_Handler_sets_v2(SQLite3_result *); + void MyHGM_Handler_sets_v1(SQLite3_result *); + void MyHGM_Handler_sets_connection_pool(SQLite3_result *); public: struct { int stats_mysql_connection_pool; @@ -104,7 +117,7 @@ class ProxySQL_Statistics { #endif bool MySQL_Query_Cache_timetoget(unsigned long long); void MySQL_Threads_Handler_sets(SQLite3_result *); - void MyHGM_Handler_sets(SQLite3_result *); + void MyHGM_Handler_sets(SQLite3_result *, SQLite3_result *); void system_cpu_sets(); #ifndef NOJEM void system_memory_sets(); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index dca9a5ef7..cf4f40dcd 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -4596,8 +4596,15 @@ __end_while_pool: if (MyHGM) { SQLite3_result * resultset=MyHGM->SQL3_Get_ConnPool_Stats(); if (resultset) { - GloProxyStats->MyHGM_Handler_sets(resultset); + SQLite3_result * resultset2 = NULL; + if (GloVars.web_interface_plugin) { + resultset2 = MyHGM->SQL3_Connection_Pool(false); + } + GloProxyStats->MyHGM_Handler_sets(resultset, resultset2); delete resultset; + if (resultset2) { + delete resultset2; + } } } } diff --git a/lib/ProxySQL_Statistics.cpp b/lib/ProxySQL_Statistics.cpp index 9ee6009c2..0fd832cae 100644 --- a/lib/ProxySQL_Statistics.cpp +++ b/lib/ProxySQL_Statistics.cpp @@ -19,6 +19,7 @@ #endif /* DEBUG */ #define PROXYSQL_STATISTICS_VERSION "1.4.1027" DEB +using namespace std; extern ProxySQL_Admin *GloAdmin; extern MySQL_Threads_Handler *GloMTH; @@ -80,6 +81,8 @@ void ProxySQL_Statistics::init() { tables_defs_statsdb_disk = new std::vector; insert_into_tables_defs(tables_defs_statsdb_mem,"mysql_connections", STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS); insert_into_tables_defs(tables_defs_statsdb_disk,"mysql_connections", STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS); + insert_into_tables_defs(tables_defs_statsdb_disk,"history_mysql_status_variables", STATSDB_SQLITE_TABLE_HISTORY_MYSQL_STATUS_VARIABLES); + insert_into_tables_defs(tables_defs_statsdb_disk,"history_stats_mysql_connection_pool", STATSDB_SQLITE_TABLE_HISTORY_STATS_MYSQL_CONNECTION_POOL); insert_into_tables_defs(tables_defs_statsdb_disk,"system_cpu", STATSDB_SQLITE_TABLE_SYSTEM_CPU); #ifndef NOJEM insert_into_tables_defs(tables_defs_statsdb_disk,"system_memory", STATSDB_SQLITE_TABLE_SYSTEM_MEMORY); @@ -629,7 +632,49 @@ void ProxySQL_Statistics::system_memory_sets() { } #endif -void ProxySQL_Statistics::MyHGM_Handler_sets(SQLite3_result *resultset) { +void ProxySQL_Statistics::MyHGM_Handler_sets(SQLite3_result *resultset1, SQLite3_result *resultset2) { + MyHGM_Handler_sets_v1(resultset1); + if (GloVars.web_interface_plugin && resultset2) { + MySQL_Threads_Handler_sets_v2(resultset1); + MyHGM_Handler_sets_connection_pool(resultset2); + } +} + +void ProxySQL_Statistics::MyHGM_Handler_sets_connection_pool(SQLite3_result *resultset) { + int rc; + if (resultset == NULL) + return; + sqlite3 *mydb3=statsdb_disk->get_db(); + sqlite3_stmt *statement=NULL; + string query; + if (resultset->rows_count == 0) { + return; + } + time_t ts = time(NULL); + query = "INSERT INTO history_stats_mysql_connection_pool VALUES (?1"; + for (int i=0; i < resultset->columns; i++) { + query += ",?" + to_string(i+2); + } + query += ")"; + rc=sqlite3_prepare_v2(mydb3, query.c_str(), -1, &statement, 0); + if (rc!=SQLITE_OK) { + proxy_error("SQLITE CRITICAL error: %s . Shutting down.\n", sqlite3_errmsg(mydb3)); + exit(EXIT_SUCCESS); + } + for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { + SQLite3_row *r=*it; + rc=sqlite3_bind_int64(statement, 1, ts); ASSERT_SQLITE_OK(rc, statsdb_disk); + for (int i=0 ; i < resultset->columns ; i++) { + rc=sqlite3_bind_text(statement, i+2, r->fields[i] , -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, statsdb_disk); + } + SAFE_SQLITE3_STEP2(statement); + rc=sqlite3_clear_bindings(statement); ASSERT_SQLITE_OK(rc, statsdb_disk); + rc=sqlite3_reset(statement); //ASSERT_SQLITE_OK(rc, statsdb_disk); + } + sqlite3_finalize(statement); +} + +void ProxySQL_Statistics::MyHGM_Handler_sets_v1(SQLite3_result *resultset) { int rc; if (resultset == NULL) return; @@ -733,6 +778,50 @@ void ProxySQL_Statistics::MyHGM_Handler_sets(SQLite3_result *resultset) { } void ProxySQL_Statistics::MySQL_Threads_Handler_sets(SQLite3_result *resultset) { + MySQL_Threads_Handler_sets_v1(resultset); + if (GloVars.web_interface_plugin) { + MySQL_Threads_Handler_sets_v2(resultset); + } +} + +void ProxySQL_Statistics::MySQL_Threads_Handler_sets_v2(SQLite3_result *resultset) { + int rc; + if (resultset == NULL) + return; + sqlite3 *mydb3=statsdb_disk->get_db(); + sqlite3_stmt *statement=NULL; + string query; + if (resultset->rows_count == 0) { + return; + } + time_t ts = time(NULL); + query = "INSERT INTO history_mysql_status_variables VALUES "; + int idx = 0; + for (int i=0; i < resultset->rows_count; i++) { + query += "(?" + to_string(idx+1) + ",?" + to_string(idx+2) + ",?" + to_string(idx+3) + "),"; + idx+=3; + } + query.pop_back(); + rc=sqlite3_prepare_v2(mydb3, query.c_str(), -1, &statement, 0); + if (rc!=SQLITE_OK) { + proxy_error("SQLITE CRITICAL error: %s . Shutting down.\n", sqlite3_errmsg(mydb3)); + exit(EXIT_SUCCESS); + } + idx=0; + for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { + SQLite3_row *r=*it; + rc=sqlite3_bind_int64(statement, idx+1, ts); ASSERT_SQLITE_OK(rc, statsdb_disk); + rc=sqlite3_bind_text(statement, idx+2, r->fields[0] , -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, statsdb_disk); // name + rc=sqlite3_bind_text(statement, idx+3, r->fields[1] , -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, statsdb_disk); // value + idx+=3; + } + SAFE_SQLITE3_STEP2(statement); + rc=sqlite3_clear_bindings(statement); ASSERT_SQLITE_OK(rc, statsdb_disk); + rc=sqlite3_reset(statement); //ASSERT_SQLITE_OK(rc, statsdb_disk); + sqlite3_finalize(statement); +} + +void ProxySQL_Statistics::MySQL_Threads_Handler_sets_v1(SQLite3_result *resultset) { int rc; if (resultset == NULL) return;