Skip to content

Commit

Permalink
kex: new rpc command stats.fetchn
Browse files Browse the repository at this point in the history
- get internal statistics with the values represented as numbers
- alternative to stats.fetch where the values are represented as strings
  • Loading branch information
miconda committed Feb 21, 2020
1 parent 61ffd51 commit 7a9cb26
Showing 1 changed file with 151 additions and 3 deletions.
154 changes: 151 additions & 3 deletions src/modules/kex/core_stats.c
Expand Up @@ -489,7 +489,7 @@ static void rpc_stats_get_statistics(rpc_t* rpc, void* ctx)
}

/**
* Satistic getter RPC callback.
* Satistic getter RPC callback with string value.
*/
static void rpc_fetch_grp_vars_cbk(void* p, str* g, str* n, counter_handle_t h)
{
Expand Down Expand Up @@ -613,7 +613,7 @@ static void stats_fetch_all(rpc_t* rpc, void* ctx, char* stat)
}

/**
* RPC statistics getter.
* RPC statistics getter with string values.
*/
static void rpc_stats_fetch_statistics(rpc_t* rpc, void* ctx)
{
Expand All @@ -634,6 +634,145 @@ static void rpc_stats_fetch_statistics(rpc_t* rpc, void* ctx)
return;
}

/**
* Satistic getter RPC callback with number value.
*/
static void rpc_fetchn_grp_vars_cbk(void* p, str* g, str* n, counter_handle_t h)
{
struct rpc_list_params *packed_params;
rpc_t* rpc;
void* ctx;
void* hst;
char nbuf[128];

packed_params = p;
rpc = packed_params->rpc;
ctx = packed_params->ctx;
hst = packed_params->hst;

snprintf(nbuf, 127, "%.*s.%.*s", g->len, g->s, n->len, n->s);
if(rpc->struct_add(hst, "d", nbuf, (int)counter_get_val(h))<0)
{
rpc->fault(ctx, 500, "Internal error");
return;
}
}

/**
* Group statistic getter RPC callback.
*/
static void rpc_fetchn_all_grps_cbk(void* p, str* g)
{
counter_iterate_grp_vars(g->s, rpc_fetchn_grp_vars_cbk, p);
}

/**
* All statistic getter RPC callback with number value.
*/
static void stats_fetchn_all(rpc_t* rpc, void* ctx, char* stat)
{
int len = strlen(stat);
struct rpc_list_params packed_params;
str s_statistic;
stat_var *s_stat;
void *th;
char nbuf[128];
char *m;
char *n;
int i;

if (rpc->add(ctx, "{", &th) < 0) {
rpc->fault(ctx, 500, "Internal error creating root struct");
return;
}

if (len==3 && strcmp("all", stat)==0) {
packed_params.rpc = rpc;
packed_params.ctx = ctx;
packed_params.hst = th;
counter_iterate_grp_names(rpc_fetchn_all_grps_cbk, &packed_params);
}
else if (stat[len-1]==':') {
packed_params.rpc = rpc;
packed_params.ctx = ctx;
packed_params.hst = th;
stat[len-1] = '\0';
counter_iterate_grp_vars(stat, rpc_fetchn_grp_vars_cbk, &packed_params);
stat[len-1] = ':';
}
else {
s_statistic.s = stat;
s_statistic.len = strlen(stat);
s_stat = get_stat(&s_statistic);
if (s_stat) {
snprintf(nbuf, 127, "%s.%s",
ZSW(get_stat_module(s_stat)), ZSW(get_stat_name(s_stat)));
if(rpc->struct_add(th, "d", nbuf, (int)get_stat_val(s_stat))<0) {
rpc->fault(ctx, 500, "Internal error");
return;
}
} else {
n = strchr(stat, '.');
if(n==NULL) {
n =strchr(stat, ':');
}
if(n==NULL) {
return;
}
n++;
s_statistic.s = n;
s_statistic.len = strlen(n);
s_stat = get_stat(&s_statistic);
if (s_stat) {
m = get_stat_module(s_stat);
if(m==NULL) {
return;
}
for(i=0; m[i]!=0 && stat[i]!=0; i++) {
if(stat[i]!=m[i]) {
/* module name mismatch */
return;
}
}
if(m[i]!=0 || (stat[i]!='.' && stat[i]!=':')) {
/* module name mismatch */
return;
}

snprintf(nbuf, 127, "%s.%s",
m, ZSW(get_stat_name(s_stat)));
if(rpc->struct_add(th, "d", nbuf, (int)get_stat_val(s_stat))<0) {
rpc->fault(ctx, 500, "Internal error");
return;
}
}
}
}
}


/**
* RPC statistics getter with number values.
*/
static void rpc_stats_fetchn_statistics(rpc_t* rpc, void* ctx)
{
char* stat;

if (stats_support()==0) {
rpc->fault(ctx, 400, "stats support not enabled");
return;
}
if (rpc->scan(ctx, "s", &stat) < 1) {
rpc->fault(ctx, 400, "Please provide which stats to retrieve");
return;
}
stats_fetchn_all(rpc, ctx, stat);
while((rpc->scan(ctx, "*s", &stat)>0)) {
stats_fetchn_all(rpc, ctx, stat);
}
return;
}

/**
* Satistic reset/clear-er RPC callback..
*/
Expand Down Expand Up @@ -787,7 +926,14 @@ static const char* rpc_stats_get_statistics_doc[2] =
* RPC statistics getter doc.
*/
static const char* rpc_stats_fetch_statistics_doc[2] =
{"fetch core and modules stats", 0};
{"fetch core and modules stats as string values", 0};

/**
* RPC statistics getter doc.
*/
static const char* rpc_stats_fetchn_statistics_doc[2] =
{"fetch core and modules stats as number values", 0};


/**
* RPC statistics reseter doc.
Expand All @@ -810,6 +956,8 @@ rpc_export_t kex_stats_rpc[] =
rpc_stats_get_statistics_doc, RET_ARRAY},
{"stats.fetch", rpc_stats_fetch_statistics,
rpc_stats_fetch_statistics_doc, 0},
{"stats.fetchn", rpc_stats_fetchn_statistics,
rpc_stats_fetchn_statistics_doc, 0},
{"stats.reset_statistics", rpc_stats_reset_statistics,
rpc_stats_reset_statistics_doc, 0},
{"stats.clear_statistics", rpc_stats_clear_statistics,
Expand Down

0 comments on commit 7a9cb26

Please sign in to comment.