Adding l_srv_host and l_srv_port (local address for backend connections) to processlist

pull/317/head
René Cannaò 11 years ago
parent cfa5e861fe
commit eaf92c4cf4

@ -1582,7 +1582,7 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Threads_status(MySQL_Session *sess)
}
SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() {
const int colnum=12;
const int colnum=14;
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");
@ -1592,6 +1592,8 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() {
result->add_column_definition(SQLITE_TEXT,"cli_host");
result->add_column_definition(SQLITE_TEXT,"cli_port");
result->add_column_definition(SQLITE_TEXT,"hostgroup");
result->add_column_definition(SQLITE_TEXT,"l_srv_host");
result->add_column_definition(SQLITE_TEXT,"l_srv_port");
result->add_column_definition(SQLITE_TEXT,"srv_host");
result->add_column_definition(SQLITE_TEXT,"srv_port");
result->add_column_definition(SQLITE_TEXT,"command");
@ -1632,45 +1634,69 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() {
pta[6]=strdup(buf);
if (sess->mybe && sess->mybe->server_myds && sess->mybe->server_myds->myconn) {
MySQL_Connection *mc=sess->mybe->server_myds->myconn;
struct sockaddr addr;
socklen_t addr_len=sizeof(struct sockaddr);
memset(&addr,0,addr_len);
int rc;
rc=getsockname(mc->fd, &addr, &addr_len);
if (rc==0) {
if (addr.sa_family==AF_INET) {
struct sockaddr_in * ipv4addr=(struct sockaddr_in *)&addr;
pta[7]=strdup(inet_ntoa(ipv4addr->sin_addr));
sprintf(buf,"%d", htons(ipv4addr->sin_port));
pta[8]=strdup(buf);
} else {
pta[7]=strdup("localhost");
pta[8]=NULL;
}
} else {
pta[7]=NULL;
pta[8]=NULL;
}
sprintf(buf,"%s", mc->parent->address);
pta[7]=strdup(buf);
pta[9]=strdup(buf);
sprintf(buf,"%d", mc->parent->port);
pta[8]=strdup(buf);
pta[10]=strdup(buf);
if (mc->query.length) {
pta[11]=(char *)malloc(mc->query.length+1);
strncpy(pta[11],mc->query.ptr,mc->query.length);
pta[11][mc->query.length]='\0';
pta[13]=(char *)malloc(mc->query.length+1);
strncpy(pta[13],mc->query.ptr,mc->query.length);
pta[13][mc->query.length]='\0';
} else {
pta[11]=NULL;
pta[13]=NULL;
}
} else {
pta[7]=NULL;
pta[8]=NULL;
pta[11]=NULL;
pta[9]=NULL;
pta[10]=NULL;
pta[13]=NULL;
}
switch (sess->status) {
case CONNECTING_SERVER:
pta[9]=strdup("Connect");
pta[11]=strdup("Connect");
break;
case PROCESSING_QUERY:
if (sess->pause_until > sess->thread->curtime) {
pta[9]=strdup("Delay");
pta[11]=strdup("Delay");
} else {
pta[9]=strdup("Query");
pta[11]=strdup("Query");
}
break;
case WAITING_CLIENT_DATA:
pta[9]=strdup("Sleep");
pta[11]=strdup("Sleep");
break;
case CHANGING_USER_SERVER:
pta[9]=strdup("Change user");
pta[11]=strdup("Change user");
break;
case CHANGING_SCHEMA:
pta[9]=strdup("InitDB");
pta[11]=strdup("InitDB");
break;
default:
sprintf(buf,"%d", sess->status);
pta[9]=strdup(buf);
pta[11]=strdup(buf);
break;
}
int idx=sess->client_myds->poll_fds_idx;
@ -1678,7 +1704,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[10]=strdup(buf);
pta[12]=strdup(buf);
result->add_row(pta);
unsigned int k;

@ -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, 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)"
#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)"
@ -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\",\"%s\",\"%s\")";
char *a=(char *)"INSERT INTO stats_mysql_processlist VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")";
for (std::vector<SQLite3_row *>::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) {
SQLite3_row *r=*it;
int arg_len=0;
for (int i=0; i<12; i++) {
for (int i=0; i<14; 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],r->fields[10],r->fields[11]);
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],r->fields[12],r->fields[13]);
statsdb->execute(query);
free(query);
}

Loading…
Cancel
Save