From 8d4afe043b692e156955aaff2a26e144187dbdfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 5 Aug 2015 08:26:12 +0000 Subject: [PATCH] Added "user" and "db" in processlist --- lib/MySQL_Thread.cpp | 47 +++++++++++++++++++++++------------------- lib/ProxySQL_Admin.cpp | 8 +++---- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 4df713d36..fd06e6f4e 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -1582,11 +1582,13 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Threads_status(MySQL_Session *sess) } SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() { - const int colnum=10; + const int colnum=12; proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 4, "Dumping MySQL Processlist\n"); SQLite3_result *result=new SQLite3_result(colnum); result->add_column_definition(SQLITE_TEXT,"ThreadID"); result->add_column_definition(SQLITE_TEXT,"SessionID"); + result->add_column_definition(SQLITE_TEXT,"user"); + result->add_column_definition(SQLITE_TEXT,"db"); result->add_column_definition(SQLITE_TEXT,"cli_host"); result->add_column_definition(SQLITE_TEXT,"cli_port"); result->add_column_definition(SQLITE_TEXT,"hostgroup"); @@ -1614,51 +1616,54 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() { pta[0]=strdup(buf); sprintf(buf,"%u", sess->thread_session_id); pta[1]=strdup(buf); + MySQL_Connection_userinfo *ui=sess->client_myds->myconn->userinfo; + pta[2]=strdup(ui->username); + pta[3]=strdup(ui->schemaname); if (sess->client_myds->client_addr->sa_family==AF_INET) { struct sockaddr_in * ipv4addr=(struct sockaddr_in *)sess->client_myds->client_addr; - pta[2]=strdup(inet_ntoa(ipv4addr->sin_addr)); + pta[4]=strdup(inet_ntoa(ipv4addr->sin_addr)); sprintf(buf,"%d", htons(ipv4addr->sin_port)); - pta[3]=strdup(buf); + pta[5]=strdup(buf); } else { - pta[2]=strdup("localhost"); - pta[3]=NULL; + pta[4]=strdup("localhost"); + pta[5]=NULL; } sprintf(buf,"%d", sess->current_hostgroup); - pta[4]=strdup(buf); + pta[6]=strdup(buf); if (sess->mybe && sess->mybe->server_myds && sess->mybe->server_myds->myconn) { MySQL_Connection *mc=sess->mybe->server_myds->myconn; sprintf(buf,"%s", mc->parent->address); - pta[5]=strdup(buf); + pta[7]=strdup(buf); sprintf(buf,"%d", mc->parent->port); - pta[6]=strdup(buf); + pta[8]=strdup(buf); if (mc->query.length) { - pta[9]=(char *)malloc(mc->query.length+1); - strncpy(pta[9],mc->query.ptr,mc->query.length); - pta[9][mc->query.length]='\0'; + pta[11]=(char *)malloc(mc->query.length+1); + strncpy(pta[11],mc->query.ptr,mc->query.length); + pta[11][mc->query.length]='\0'; } else { - pta[9]=NULL; + pta[11]=NULL; } } else { - pta[5]=NULL; - pta[6]=NULL; - pta[9]=NULL; + pta[7]=NULL; + pta[8]=NULL; + pta[11]=NULL; } switch (sess->status) { case CONNECTING_SERVER: - pta[7]=strdup("Connect"); + pta[9]=strdup("Connect"); break; case PROCESSING_QUERY: if (sess->pause_until > sess->thread->curtime) { - pta[7]=strdup("Delay"); + pta[9]=strdup("Delay"); } else { - pta[7]=strdup("Query"); + pta[9]=strdup("Query"); } break; case WAITING_CLIENT_DATA: - pta[7]=strdup("Sleep"); + pta[9]=strdup("Sleep"); break; default: - pta[7]=strdup(""); + pta[9]=strdup(""); break; } int idx=sess->client_myds->poll_fds_idx; @@ -1666,7 +1671,7 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() { unsigned long long last_recv=sess->thread->mypolls.last_recv[idx]; unsigned long long last_time=(last_sent > last_recv ? last_sent : last_recv); sprintf(buf,"%llu", (sess->thread->curtime - last_time)/1000 ); - pta[8]=strdup(buf); + pta[10]=strdup(buf); result->add_row(pta); unsigned int k; diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 28bc37b99..5c40031df 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -46,7 +46,7 @@ pthread_mutex_t admin_mutex = PTHREAD_MUTEX_INITIALIZER; #define STATS_SQLITE_TABLE_MYSQL_QUERY_RULES "CREATE TABLE stats_mysql_query_rules (rule_id INTEGER PRIMARY KEY, hits INT NOT NULL)" #define STATS_SQLITE_TABLE_MYSQL_COMMANDS_COUNTERS "CREATE TABLE stats_mysql_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_mysql_processlist (ThreadID INT NOT NULL, SessionID INTEGER PRIMARY KEY, cli_host VARCHAR, cli_port VARCHAR, hostgroup VARCHAR, srv_host VARCHAR, srv_port VARCHAR, command VARCHAR, time_ms INT NOT NULL, info VARCHAR)" +#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, srv_host VARCHAR, srv_port VARCHAR, command VARCHAR, time_ms INT NOT NULL, info VARCHAR)" @@ -1873,15 +1873,15 @@ void ProxySQL_Admin::stats___mysql_processlist() { if (resultset==NULL) return; statsdb->execute("BEGIN"); statsdb->execute("DELETE FROM stats_mysql_processlist"); - char *a=(char *)"INSERT INTO stats_mysql_processlist VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")"; + char *a=(char *)"INSERT INTO stats_mysql_processlist VALUES (\"%s\",\"%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<12; 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[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],r->fields[10],r->fields[11]); statsdb->execute(query); free(query); }