diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 87661b7d1..6faf645bd 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -52,6 +52,8 @@ class MySrvC { // MySQL Server Container time_t time_last_detected_error; unsigned int connect_ERR_at_time_last_detected_error; unsigned long long queries_sent; + unsigned long long bytes_sent; + unsigned long long bytes_recv; bool shunned_automatic; //uint8_t charset; MySrvConnList *ConnectionsUsed; diff --git a/include/MySQL_Protocol.h b/include/MySQL_Protocol.h index e78f51b66..23b3ee18d 100644 --- a/include/MySQL_Protocol.h +++ b/include/MySQL_Protocol.h @@ -20,7 +20,7 @@ class MySQL_ResultSet { PtrSizeArray *PSarrayOUT; MySQL_ResultSet(MySQL_Protocol *_myprot, MYSQL_RES *_res, MYSQL *_my); ~MySQL_ResultSet(); - void add_row(MYSQL_ROW row); + unsigned int add_row(MYSQL_ROW row); void add_eof(); bool get_resultset(PtrSizeArray *PSarrayFinal); }; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 526e9bab3..40a9b344a 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -113,6 +113,8 @@ MySrvC::MySrvC(char *add, uint16_t p, unsigned int _weight, enum MySerStatus _st connect_OK=0; connect_ERR=0; queries_sent=0; + bytes_sent=0; + bytes_recv=0; time_last_detected_error=0; connect_ERR_at_time_last_detected_error=0; shunned_automatic=false; @@ -696,7 +698,7 @@ __exit_get_multiple_idle_connections: } SQLite3_result * MySQL_HostGroups_Manager::SQL3_Connection_Pool() { - const int colnum=9; + const int colnum=11; proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 4, "Dumping Connection Pool\n"); SQLite3_result *result=new SQLite3_result(colnum); result->add_column_definition(SQLITE_TEXT,"hostgroup"); @@ -708,7 +710,8 @@ SQLite3_result * MySQL_HostGroups_Manager::SQL3_Connection_Pool() { result->add_column_definition(SQLITE_TEXT,"ConnOK"); result->add_column_definition(SQLITE_TEXT,"ConnERR"); result->add_column_definition(SQLITE_TEXT,"Queries"); - + result->add_column_definition(SQLITE_TEXT,"Bytes_sent"); + result->add_column_definition(SQLITE_TEXT,"Bytes_recv"); wrlock(); int i,j, k; for (i=0; i<(int)MyHostGroups->len; i++) { @@ -761,6 +764,10 @@ SQLite3_result * MySQL_HostGroups_Manager::SQL3_Connection_Pool() { pta[7]=strdup(buf); sprintf(buf,"%llu", mysrvc->queries_sent); pta[8]=strdup(buf); + sprintf(buf,"%llu", mysrvc->bytes_sent); + pta[9]=strdup(buf); + sprintf(buf,"%llu", mysrvc->bytes_recv); + pta[10]=strdup(buf); result->add_row(pta); for (k=0; kgenerate_pkt_row2(PSarrayOUT, &pkt_length, sid, num_fields, lengths, row); sid++; resultset_size+=pkt_length; num_rows++; + return pkt_length; } void MySQL_ResultSet::add_eof() { diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 118aa8286..124a1bb0f 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -62,7 +62,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 , 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)" +#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))" @@ -2221,15 +2221,15 @@ void ProxySQL_Admin::stats___mysql_connection_pool() { if (resultset==NULL) return; statsdb->execute("BEGIN"); statsdb->execute("DELETE FROM stats_mysql_connection_pool"); - char *a=(char *)"INSERT INTO stats_mysql_connection_pool VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")"; + char *a=(char *)"INSERT INTO stats_mysql_connection_pool 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<9; 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]); + 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]); statsdb->execute(query); free(query); } diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 9e6ec67ce..6ebb76ec9 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -461,6 +461,7 @@ handler_again: case ASYNC_QUERY_START: real_query_start(); __sync_fetch_and_add(&parent->queries_sent,1); + __sync_fetch_and_add(&parent->bytes_sent,query.length); if (async_exit_status) { next_event(ASYNC_QUERY_CONT); } else { @@ -527,7 +528,8 @@ handler_again: } else { async_fetch_row_start=false; if (mysql_row) { - MyRS->add_row(mysql_row); + unsigned int br=MyRS->add_row(mysql_row); + __sync_fetch_and_add(&parent->bytes_recv,br); NEXT_IMMEDIATE(ASYNC_USE_RESULT_CONT); } else { MyRS->add_eof();