From fbfbc9fda79b56a6cbeef35d5a55c78cdc22bf1b Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Thu, 23 Apr 2015 21:00:52 +0300 Subject: [PATCH] Added more statistics to schemarouter diagnostics. --- server/modules/include/schemarouter.h | 5 +- .../routing/schemarouter/schemarouter.c | 56 ++++++++++++++++--- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/server/modules/include/schemarouter.h b/server/modules/include/schemarouter.h index e15d79357..4765001ee 100644 --- a/server/modules/include/schemarouter.h +++ b/server/modules/include/schemarouter.h @@ -252,7 +252,10 @@ typedef struct { int longest_sescmd; /*< Longest chain of stored session commands */ int n_hist_exceeded;/*< Number of sessions that exceeded session * command history limit */ - time_t ses_longest; /*< Session start time */ + int sessions; + double ses_longest; /*< Longest session */ + double ses_shortest; /*< Shortest session */ + double ses_average; /*< Average session length */ } ROUTER_STATS; /** diff --git a/server/modules/routing/schemarouter/schemarouter.c b/server/modules/routing/schemarouter/schemarouter.c index d9b190237..386c51120 100644 --- a/server/modules/routing/schemarouter/schemarouter.c +++ b/server/modules/routing/schemarouter/schemarouter.c @@ -726,6 +726,7 @@ createInstance(SERVICE *service, char **options) router->stats.n_queries = 0; router->stats.n_sescmd = 0; router->stats.ses_longest = 0; + router->stats.ses_shortest = (double)((unsigned long)(~0)); spinlock_init(&router->lock); /** Calculate number of servers */ @@ -769,6 +770,10 @@ createInstance(SERVICE *service, char **options) } } + /** Setting a limit to the history size is not needed if it is disabled.*/ + if(router->schemarouter_config.disable_sescmd_hist && router->schemarouter_config.max_sescmd_hist > 0) + router->schemarouter_config.max_sescmd_hist = 0; + if(failure) { free(router); @@ -1054,7 +1059,8 @@ static void* newSession( rses_end_locked_router_action(client_rses); - + + atomic_add(&router->stats.sessions, 1); /** * Version is bigger than zero once initialized. @@ -1173,9 +1179,16 @@ static void closeSession( spinlock_acquire(&inst->lock); if(inst->stats.longest_sescmd < router_cli_ses->stats.longest_sescmd) inst->stats.longest_sescmd = router_cli_ses->stats.longest_sescmd; - time_t ses_time = difftime(time(NULL),router_cli_ses->rses_client_dcb->session->stats.connect); + double ses_time = difftime(time(NULL),router_cli_ses->rses_client_dcb->session->stats.connect); if(inst->stats.ses_longest < ses_time) inst->stats.ses_longest = ses_time; + if(inst->stats.ses_shortest > ses_time) + inst->stats.ses_shortest = ses_time; + + inst->stats.ses_average = + (ses_time + ((inst->stats.sessions - 1) * inst->stats.ses_average)) / + (inst->stats.sessions); + spinlock_release(&inst->lock); } } @@ -2345,17 +2358,42 @@ diagnostic(ROUTER *instance, DCB *dcb) /** Session command statistics */ dcb_printf(dcb,"\n\33[1;4mSession Commands\33[0m\n"); dcb_printf(dcb,"Total number of queries: %d\n", - router->stats.n_queries); + router->stats.n_queries); dcb_printf(dcb,"Percentage of session commands: %.2f\n", - sescmd_pct); + sescmd_pct); dcb_printf(dcb,"Longest chain of stored session commands: %d\n", - router->stats.longest_sescmd); + router->stats.longest_sescmd); dcb_printf(dcb,"Session command history limit exceeded: %d times\n", - router->stats.n_hist_exceeded); + router->stats.n_hist_exceeded); + if(!router->schemarouter_config.disable_sescmd_hist) + { + dcb_printf(dcb,"Session command history: enabled\n"); + if(router->schemarouter_config.max_sescmd_hist == 0) + { + dcb_printf(dcb,"Session command history limit: unlimited\n"); + } + else + { + dcb_printf(dcb,"Session command history limit: %d\n", + router->schemarouter_config.max_sescmd_hist); + } + } + else + { - dcb_printf(dcb,"\n\33[1;4mSession Time Statistics\33[0m\n"); - dcb_printf(dcb,"Longest session: %d seconds\n",router->stats.ses_longest); - dcb_printf(dcb,"\n"); + dcb_printf(dcb,"Session command history: disabled\n"); + } + + /** Session time statistics */ + + if(router->stats.sessions > 0) + { + dcb_printf(dcb,"\n\33[1;4mSession Time Statistics\33[0m\n"); + dcb_printf(dcb,"Longest session: %.2lf seconds\n",router->stats.ses_longest); + dcb_printf(dcb,"Shortest session: %.2lf seconds\n",router->stats.ses_shortest); + dcb_printf(dcb,"Average session length: %.2lf seconds\n",router->stats.ses_average); + } + dcb_printf(dcb,"\n"); } /**