From 0b8df6df0004b291fdd052bb8fd18dfcc6db2495 Mon Sep 17 00:00:00 2001 From: Rahim Kanji Date: Wed, 28 Aug 2024 14:46:13 +0500 Subject: [PATCH] Added stats_pgsql_users table --- include/ProxySQL_Admin_Tables_Definitions.h | 4 +- include/proxysql_admin.h | 3 +- lib/Admin_Bootstrap.cpp | 1 + lib/ProxySQL_Admin.cpp | 8 +++- lib/ProxySQL_Admin_Stats.cpp | 50 +++++++++++++++++++++ 5 files changed, 62 insertions(+), 4 deletions(-) diff --git a/include/ProxySQL_Admin_Tables_Definitions.h b/include/ProxySQL_Admin_Tables_Definitions.h index fa5a90a6b..d8980901b 100644 --- a/include/ProxySQL_Admin_Tables_Definitions.h +++ b/include/ProxySQL_Admin_Tables_Definitions.h @@ -292,7 +292,7 @@ /* #define STATS_SQLITE_TABLE_MYSQL_QUERY_RULES "CREATE TABLE stats_pgsql_query_rules (rule_id INTEGER PRIMARY KEY , hits INT NOT NULL)" -#define STATS_SQLITE_TABLE_MYSQL_USERS "CREATE TABLE stats_pgsql_users (username VARCHAR PRIMARY KEY , frontend_connections INT NOT NULL , frontend_max_connections INT NOT NULL)" + #define STATS_SQLITE_TABLE_MYSQL_COMMANDS_COUNTERS "CREATE TABLE stats_pgsql_commands_counters (Command VARCHAR NOT NULL PRIMARY KEY , Total_Time_us INT NOT NULL , Total_cnt INT NOT NULL , cnt_100us INT NOT NULL , cnt_500us INT NOT NULL , cnt_1ms INT NOT NULL , cnt_5ms INT NOT NULL , cnt_10ms INT NOT NULL , cnt_50ms INT NOT NULL , cnt_100ms INT NOT NULL , cnt_500ms INT NOT NULL , cnt_1s INT NOT NULL , cnt_5s INT NOT NULL , cnt_10s INT NOT NULL , cnt_INFs)" #define STATS_SQLITE_TABLE_MYSQL_PROCESSLIST "CREATE TABLE stats_pgsql_processlist (ThreadID INT NOT NULL , SessionID INTEGER PRIMARY KEY , user VARCHAR , db VARCHAR , cli_host VARCHAR , cli_port INT , hostgroup INT , l_srv_host VARCHAR , l_srv_port INT , srv_host VARCHAR , srv_port INT , command VARCHAR , time_ms INT NOT NULL , info VARCHAR , status_flags INT , extended_info VARCHAR)" @@ -305,7 +305,7 @@ #define STATS_SQLITE_TABLE_PGSQL_CONNECTION_POOL "CREATE TABLE stats_pgsql_connection_pool (hostgroup INT , srv_host VARCHAR , srv_port INT , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , MaxConnUsed INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT , Latency_us INT)" #define STATS_SQLITE_TABLE_PGSQL_CONNECTION_POOL_RESET "CREATE TABLE stats_pgsql_connection_pool_reset (hostgroup INT , srv_host VARCHAR , srv_port INT , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , MaxConnUsed INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT , Latency_us INT)" #define STATS_SQLITE_TABLE_PGSQL_FREE_CONNECTIONS "CREATE TABLE stats_pgsql_free_connections (fd INT NOT NULL , hostgroup INT NOT NULL , srv_host VARCHAR NOT NULL , srv_port INT NOT NULL , user VARCHAR NOT NULL , database VARCHAR , init_connect VARCHAR , time_zone VARCHAR , sql_mode VARCHAR , idle_ms INT , statistics VARCHAR , pgsql_info VARCHAR)" - +#define STATS_SQLITE_TABLE_PGSQL_USERS "CREATE TABLE stats_pgsql_users (username VARCHAR PRIMARY KEY , frontend_connections INT NOT NULL , frontend_max_connections INT NOT NULL)" //#define STATS_SQLITE_TABLE_MEMORY_METRICS "CREATE TABLE stats_memory_metrics (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)" /* #define STATS_SQLITE_TABLE_MYSQL_ERRORS "CREATE TABLE stats_pgsql_errors (hostgroup INT NOT NULL , hostname VARCHAR NOT NULL , port INT NOT NULL , username VARCHAR NOT NULL , client_address VARCHAR NOT NULL , schemaname VARCHAR NOT NULL , errno INT NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , last_error VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup, hostname, port, username, schemaname, errno) )" diff --git a/include/proxysql_admin.h b/include/proxysql_admin.h index d5cb8a01c..4513ab697 100644 --- a/include/proxysql_admin.h +++ b/include/proxysql_admin.h @@ -644,7 +644,6 @@ class ProxySQL_Admin { void stats___mysql_commands_counters(); void stats___mysql_processlist(); void stats___mysql_free_connections(); - void stats___pgsql_free_connections(); void stats___mysql_connection_pool(bool _reset); void stats___mysql_errors(bool reset); void stats___memory_metrics(); @@ -652,6 +651,8 @@ class ProxySQL_Admin { void stats___mysql_users(); void stats___pgsql_global(); + void stats___pgsql_users(); + void stats___pgsql_free_connections(); void stats___pgsql_connection_pool(bool _reset); void stats___proxysql_servers_checksums(); diff --git a/lib/Admin_Bootstrap.cpp b/lib/Admin_Bootstrap.cpp index f71cc51af..21e75ed3f 100644 --- a/lib/Admin_Bootstrap.cpp +++ b/lib/Admin_Bootstrap.cpp @@ -677,6 +677,7 @@ bool ProxySQL_Admin::init(const bootstrap_info_t& bootstrap_info) { insert_into_tables_defs(tables_defs_stats,"stats_pgsql_connection_pool", STATS_SQLITE_TABLE_PGSQL_CONNECTION_POOL); insert_into_tables_defs(tables_defs_stats,"stats_pgsql_connection_pool_reset", STATS_SQLITE_TABLE_PGSQL_CONNECTION_POOL_RESET); insert_into_tables_defs(tables_defs_stats,"stats_pgsql_free_connections", STATS_SQLITE_TABLE_PGSQL_FREE_CONNECTIONS); + insert_into_tables_defs(tables_defs_stats,"stats_pgsql_users", STATS_SQLITE_TABLE_PGSQL_USERS); // ProxySQL Cluster insert_into_tables_defs(tables_defs_admin,"proxysql_servers", ADMIN_SQLITE_TABLE_PROXYSQL_SERVERS); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 1555d0ef9..102be6b0a 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -1148,6 +1148,7 @@ bool ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign bool stats_mysql_commands_counters=false; bool stats_mysql_query_rules=false; bool stats_mysql_users=false; + bool stats_pgsql_users = false; bool stats_mysql_gtid_executed=false; bool stats_mysql_client_host_cache=false; bool stats_mysql_client_host_cache_reset=false; @@ -1262,6 +1263,8 @@ bool ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign { stats_mysql_query_rules=true; refresh=true; } if (strstr(query_no_space,"stats_mysql_users")) { stats_mysql_users=true; refresh=true; } + if (strstr(query_no_space,"stats_pgsql_users")) + { stats_pgsql_users = true; refresh = true; } if (strstr(query_no_space,"stats_mysql_gtid_executed")) { stats_mysql_gtid_executed=true; refresh=true; } if (strstr(query_no_space,"stats_mysql_client_host_cache")) @@ -1442,6 +1445,8 @@ bool ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign stats___mysql_commands_counters(); if (stats_mysql_users) stats___mysql_users(); + if (stats_pgsql_users) + stats___pgsql_users(); if (stats_mysql_gtid_executed) stats___mysql_gtid_executed(); @@ -1594,7 +1599,7 @@ bool ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign stats_mysql_commands_counters || stats_mysql_query_rules || stats_mysql_users || stats_mysql_gtid_executed || stats_mysql_free_connections || stats_pgsql_global || stats_pgsql_connection_pool || stats_pgsql_connection_pool_reset || - stats_pgsql_free_connections + stats_pgsql_free_connections || stats_pgsql_users ) { ret = true; } @@ -1800,6 +1805,7 @@ void ProxySQL_Admin::vacuum_stats(bool is_admin) { "stats_mysql_query_digest_reset", "stats_mysql_query_rules", "stats_mysql_users", + "stats_pgsql_users", "stats_proxysql_servers_checksums", "stats_proxysql_servers_metrics", "stats_proxysql_servers_status", diff --git a/lib/ProxySQL_Admin_Stats.cpp b/lib/ProxySQL_Admin_Stats.cpp index 9b74877cc..1636ecf28 100644 --- a/lib/ProxySQL_Admin_Stats.cpp +++ b/lib/ProxySQL_Admin_Stats.cpp @@ -28,6 +28,7 @@ extern bool admin_proxysql_mysql_paused; extern bool admin_proxysql_pgsql_paused; extern MySQL_Authentication *GloMyAuth; +extern PgSQL_Authentication* GloPgAuth; extern MySQL_LDAP_Authentication *GloMyLdapAuth; extern Query_Cache *GloQC; extern ProxySQL_Admin *GloAdmin; @@ -1933,6 +1934,55 @@ void ProxySQL_Admin::stats___mysql_users() { free(ads); } +void ProxySQL_Admin::stats___pgsql_users() { + pgsql_account_details_t** ads = NULL; + statsdb->execute("DELETE FROM stats_pgsql_users"); + + int num_users = GloPgAuth->dump_all_users(&ads, false); + if (num_users == 0) return; + + const char q[] = "INSERT INTO stats_pgsql_users(username,frontend_connections,frontend_max_connections) VALUES ('%s',%d,%d)"; + + char buf[256] = { 0 }; + + for (int i = 0; i < num_users; i++) { + pgsql_account_details_t* ad = ads[i]; + if (ad->default_hostgroup >= 0) { // only not admin/stats + cfmt_t q_fmt = cstr_format(buf, q, ad->username, ad->num_connections_used, ad->max_connections); + + if (q_fmt.str.size()) { + statsdb->execute(q_fmt.str.c_str()); + } + else { + statsdb->execute(buf); + } + } + free(ad->username); + free(ad); + } + + /*if (GloMyLdapAuth) { + std::unique_ptr ldap_users{ GloMyLdapAuth->dump_all_users() }; + + for (const SQLite3_row* row : ldap_users->rows) { + const char* username = row->fields[LDAP_USER_FIELD_IDX::USERNAME]; + int f_conns = atoi(row->fields[LDAP_USER_FIELD_IDX::FRONTEND_CONNECTIONS]); + int f_max_conns = atoi(row->fields[LDAP_USER_FIELD_IDX::FRONTED_MAX_CONNECTIONS]); + + cfmt_t q_fmt = cstr_format(buf, q, username, f_conns, f_max_conns); + + if (q_fmt.str.size()) { + statsdb->execute(q_fmt.str.c_str()); + } + else { + statsdb->execute(buf); + } + } + }*/ + + free(ads); +} + void ProxySQL_Admin::stats___mysql_gtid_executed() { statsdb->execute("DELETE FROM stats_mysql_gtid_executed"); SQLite3_result *resultset=NULL;