From e43c7899c485eb62431b68d587cde15dcfd631a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 30 Dec 2015 02:01:14 +0000 Subject: [PATCH 1/2] Track hostgroup in stats_mysql_query_digest #446 --- include/query_processor.h | 2 +- lib/ProxySQL_Admin.cpp | 16 ++++++++-------- lib/Query_Processor.cpp | 25 ++++++++++++++++--------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/include/query_processor.h b/include/query_processor.h index f40f848ff..405743338 100644 --- a/include/query_processor.h +++ b/include/query_processor.h @@ -229,7 +229,7 @@ class Query_Processor { char * get_digest_text(void *args); uint64_t get_digest(void *args); - void update_query_digest(void *p, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n); + void update_query_digest(void *p, int hid, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n); unsigned long long query_parser_update_counters(MySQL_Session *sess, enum MYSQL_COM_QUERY_command c, void *p, unsigned long long t); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 0e6f89599..41d6be9aa 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -67,9 +67,9 @@ pthread_mutex_t admin_mutex = PTHREAD_MUTEX_INITIALIZER; #define STATS_SQLITE_TABLE_MYSQL_PROCESSLIST "CREATE TABLE stats_mysql_processlist (ThreadID INT NOT NULL , SessionID INTEGER PRIMARY KEY , user VARCHAR , db VARCHAR , cli_host VARCHAR , cli_port VARCHAR , hostgroup VARCHAR , l_srv_host VARCHAR , l_srv_port VARCHAR , srv_host VARCHAR , srv_port VARCHAR , command VARCHAR , time_ms INT NOT NULL , info VARCHAR)" #define STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL "CREATE TABLE stats_mysql_connection_pool (hostgroup VARCHAR , srv_host VARCHAR , srv_port VARCHAR , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT)" -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))" +#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))" -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))" +#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))" #define STATS_SQLITE_TABLE_MYSQL_GLOBAL "CREATE TABLE stats_mysql_global (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)" @@ -2597,15 +2597,15 @@ void ProxySQL_Admin::stats___mysql_query_digests() { if (resultset==NULL) return; statsdb->execute("BEGIN"); statsdb->execute("DELETE FROM stats_mysql_query_digest"); - char *a=(char *)"INSERT INTO stats_mysql_query_digest VALUES (\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)"; + char *a=(char *)"INSERT INTO stats_mysql_query_digest VALUES (%s,\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)"; for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; int arg_len=0; - for (int i=0; i<10; i++) { + for (int i=0; i<11; i++) { arg_len+=strlen(r->fields[i]); } char *query=(char *)malloc(strlen(a)+arg_len+32); - sprintf(query,a,r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]); + sprintf(query,a,r->fields[10],r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]); statsdb->execute(query); free(query); } @@ -2619,15 +2619,15 @@ void ProxySQL_Admin::stats___mysql_query_digests_reset() { if (resultset==NULL) return; statsdb->execute("BEGIN"); statsdb->execute("DELETE FROM stats_mysql_query_digest_reset"); - char *a=(char *)"INSERT INTO stats_mysql_query_digest_reset VALUES (\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)"; + char *a=(char *)"INSERT INTO stats_mysql_query_digest_reset VALUES (%s,\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)"; for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; int arg_len=0; - for (int i=0; i<10; i++) { + for (int i=0; i<11; i++) { arg_len+=strlen(r->fields[i]); } char *query=(char *)malloc(strlen(a)+arg_len+32); - sprintf(query,a,r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]); + sprintf(query,a,r->fields[10],r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]); statsdb->execute(query); free(query); } diff --git a/lib/Query_Processor.cpp b/lib/Query_Processor.cpp index ba6fb99bd..6269cde1b 100644 --- a/lib/Query_Processor.cpp +++ b/lib/Query_Processor.cpp @@ -91,7 +91,8 @@ class QP_query_digest_stats { unsigned long long sum_time; unsigned long long min_time; unsigned long long max_time; - QP_query_digest_stats(char *u, char *s, uint64_t d, char *dt) { + int hid; + QP_query_digest_stats(char *u, char *s, uint64_t d, char *dt, int h) { digest=d; digest_text=strdup(dt); username=strdup(u); @@ -102,12 +103,13 @@ class QP_query_digest_stats { sum_time=0; min_time=0; max_time=0; + hid=h; } void add_time(unsigned long long t, unsigned long long n) { count_star++; sum_time+=t; if (t < min_time || min_time==0) { - min_time = t; + if (t) min_time = t; } if (t > max_time) { max_time = t; @@ -133,7 +135,7 @@ class QP_query_digest_stats { } char **get_row() { char buf[128]; - char **pta=(char **)malloc(sizeof(char *)*10); + char **pta=(char **)malloc(sizeof(char *)*11); assert(schemaname); pta[0]=strdup(schemaname); assert(username); @@ -176,11 +178,13 @@ class QP_query_digest_stats { pta[8]=strdup(buf); sprintf(buf,"%llu",max_time); pta[9]=strdup(buf); + sprintf(buf,"%d",hid); + pta[10]=strdup(buf); return pta; } void free_row(char **pta) { int i; - for (i=0;i<10;i++) { + for (i=0;i<11;i++) { assert(pta[i]); free(pta[i]); } @@ -564,8 +568,9 @@ SQLite3_result * Query_Processor::get_current_query_rules() { SQLite3_result * Query_Processor::get_query_digests() { proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 4, "Dumping current query digest\n"); - SQLite3_result *result=new SQLite3_result(10); + SQLite3_result *result=new SQLite3_result(11); spin_rdlock(&digest_rwlock); + result->add_column_definition(SQLITE_TEXT,"hid"); result->add_column_definition(SQLITE_TEXT,"schemaname"); result->add_column_definition(SQLITE_TEXT,"usernname"); result->add_column_definition(SQLITE_TEXT,"digest"); @@ -587,8 +592,9 @@ SQLite3_result * Query_Processor::get_query_digests() { } SQLite3_result * Query_Processor::get_query_digests_reset() { - SQLite3_result *result=new SQLite3_result(10); + SQLite3_result *result=new SQLite3_result(11); spin_wrlock(&digest_rwlock); + result->add_column_definition(SQLITE_TEXT,"hid"); result->add_column_definition(SQLITE_TEXT,"schemaname"); result->add_column_definition(SQLITE_TEXT,"usernname"); result->add_column_definition(SQLITE_TEXT,"digest"); @@ -877,14 +883,15 @@ unsigned long long Query_Processor::query_parser_update_counters(MySQL_Session * myhash->Update(ui->username,strlen(ui->username)); myhash->Update(&qp->digest,sizeof(qp->digest)); myhash->Update(ui->schemaname,strlen(ui->schemaname)); + myhash->Update(&sess->current_hostgroup,sizeof(sess->default_hostgroup)); myhash->Final(&qp->digest_total,&hash2); delete myhash; - update_query_digest(qp, ui, t, sess->thread->curtime); + update_query_digest(qp, sess->current_hostgroup, ui, t, sess->thread->curtime); } return ret; } -void Query_Processor::update_query_digest(void *p, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n) { +void Query_Processor::update_query_digest(void *p, int hid, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n) { SQP_par_t *qp=(SQP_par_t *)p; spin_wrlock(&digest_rwlock); @@ -897,7 +904,7 @@ void Query_Processor::update_query_digest(void *p, MySQL_Connection_userinfo *ui qds=(QP_query_digest_stats *)it->second; qds->add_time(t,n); } else { - qds=new QP_query_digest_stats(ui->username, ui->schemaname, qp->digest, qp->digest_text); + qds=new QP_query_digest_stats(ui->username, ui->schemaname, qp->digest, qp->digest_text, hid); qds->add_time(t,n); digest_bt_map.insert(std::make_pair(qp->digest_total,(void *)qds)); } From 832da9e5b864546a7c828d3a4406a23f58c05546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 30 Dec 2015 02:07:48 +0000 Subject: [PATCH 2/2] Fixed table definition for issue #446 Fixed PK for stats_mysql_query_digest and stats_mysql_query_digest_reset --- lib/ProxySQL_Admin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 41d6be9aa..2314b08c0 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -67,9 +67,9 @@ pthread_mutex_t admin_mutex = PTHREAD_MUTEX_INITIALIZER; #define STATS_SQLITE_TABLE_MYSQL_PROCESSLIST "CREATE TABLE stats_mysql_processlist (ThreadID INT NOT NULL , SessionID INTEGER PRIMARY KEY , user VARCHAR , db VARCHAR , cli_host VARCHAR , cli_port VARCHAR , hostgroup VARCHAR , l_srv_host VARCHAR , l_srv_port VARCHAR , srv_host VARCHAR , srv_port VARCHAR , command VARCHAR , time_ms INT NOT NULL , info VARCHAR)" #define STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL "CREATE TABLE stats_mysql_connection_pool (hostgroup VARCHAR , srv_host VARCHAR , srv_port VARCHAR , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT)" -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))" +#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))" -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))" +#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))" #define STATS_SQLITE_TABLE_MYSQL_GLOBAL "CREATE TABLE stats_mysql_global (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)"