session: add session stats

Type: feature

Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Change-Id: I02d9bb5292b32ffb1b2f05daccd8a7d5dba05125
This commit is contained in:
Filip Tehlar
2023-03-14 08:50:28 +01:00
committed by Florin Coras
parent b53b88a08e
commit ac3c8dcb07
5 changed files with 99 additions and 13 deletions

View File

@@ -480,6 +480,7 @@ app_worker_own_session (app_worker_t * app_wrk, session_t * s)
{
segment_manager_t *sm;
svm_fifo_t *rxf, *txf;
int rv;
if (s->session_state == SESSION_STATE_LISTENING)
return application_change_listener_owner (s, app_wrk);
@@ -496,8 +497,8 @@ app_worker_own_session (app_worker_t * app_wrk, session_t * s)
s->tx_fifo = 0;
sm = app_worker_get_connect_segment_manager (app_wrk);
if (app_worker_alloc_session_fifos (sm, s))
return -1;
if ((rv = app_worker_alloc_session_fifos (sm, s)))
return rv;
if (!svm_fifo_is_empty_cons (rxf))
svm_fifo_clone (s->rx_fifo, rxf);

View File

@@ -105,8 +105,8 @@ segment_manager_add_segment_inline (segment_manager_t *sm, uword segment_size,
/* Not configured for addition of new segments and not first */
if (!props->add_segment && !segment_size)
{
clib_warning ("cannot allocate new segment");
return VNET_API_ERROR_INVALID_VALUE;
SESSION_DBG ("cannot allocate new segment");
return SESSION_E_INVALID;
}
/*
@@ -418,7 +418,7 @@ segment_manager_init_first (segment_manager_t * sm)
fs_index = segment_manager_add_segment (sm, max_seg_size, 0);
if (fs_index < 0)
{
clib_warning ("Failed to preallocate segment %d", i);
SESSION_DBG ("Failed to preallocate segment %d", i);
return fs_index;
}
@@ -440,7 +440,7 @@ segment_manager_init_first (segment_manager_t * sm)
fs_index = segment_manager_add_segment (sm, first_seg_size, 0);
if (fs_index < 0)
{
clib_warning ("Failed to allocate segment");
SESSION_DBG ("Failed to allocate segment");
return fs_index;
}
@@ -458,7 +458,7 @@ segment_manager_init_first (segment_manager_t * sm)
for (; i < fs->n_slices; i++)
{
if (fifo_segment_prealloc_fifo_hdrs (fs, i, hdrs_per_slice))
return VNET_API_ERROR_SVM_SEGMENT_CREATE_FAIL;
return SESSION_E_SEG_CREATE;
}
}
@@ -807,7 +807,7 @@ sm_lock_and_alloc_segment_and_fifos (segment_manager_t *sm,
props->tx_fifo_size, rx_fifo, tx_fifo);
if (rv)
{
clib_warning ("Added a segment, still can't allocate a fifo");
SESSION_DBG ("Added a segment, still can't allocate a fifo");
rv = SESSION_E_SEG_NO_SPACE2;
goto done;
}

View File

@@ -40,6 +40,11 @@ typedef enum
SESSION_N_ERROR,
} session_input_error_t;
typedef struct session_wrk_stats_
{
u32 errors[SESSION_N_ERRORS];
} session_wrk_stats_t;
typedef struct session_tx_context_
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
@@ -169,6 +174,8 @@ typedef struct session_worker_
u16 batch_num;
vlib_dma_batch_t *batch;
session_wrk_stats_t stats;
#if SESSION_DEBUG
/** last event poll time by thread */
clib_time_type_t last_event_poll;
@@ -732,6 +739,23 @@ session_main_is_enabled ()
return session_main.is_enabled == 1;
}
always_inline void
session_worker_stat_error_inc (session_worker_t *wrk, int error, int value)
{
if ((-(error) >= 0 && -(error) < SESSION_N_ERRORS))
wrk->stats.errors[-error] += value;
else
SESSION_DBG ("unknown session counter");
}
always_inline void
session_stat_error_inc (int error, int value)
{
session_worker_t *wrk;
wrk = session_main_get_worker (vlib_get_thread_index ());
session_worker_stat_error_inc (wrk, error, value);
}
#define session_cli_return_if_not_enabled() \
do { \
if (!session_main.is_enabled) \

View File

@@ -868,6 +868,62 @@ VLIB_CLI_COMMAND (session_enable_disable_command, static) =
};
/* *INDENT-ON* */
static clib_error_t *
show_session_stats_fn (vlib_main_t *vm, unformat_input_t *input,
vlib_cli_command_t *cmd)
{
session_main_t *smm = &session_main;
session_worker_t *wrk;
unsigned int *e;
if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
return clib_error_return (0, "unknown input `%U'", format_unformat_error,
input);
vec_foreach (wrk, smm->wrk)
{
vlib_cli_output (vm, "Thread %u:\n", wrk - smm->wrk);
e = wrk->stats.errors;
#define _(name, str) \
if (e[SESSION_EP_##name]) \
vlib_cli_output (vm, " %lu %s", e[SESSION_EP_##name], str);
foreach_session_error
#undef _
}
return 0;
}
VLIB_CLI_COMMAND (show_session_stats_command, static) = {
.path = "show session stats",
.short_help = "show session stats",
.function = show_session_stats_fn,
};
static clib_error_t *
clear_session_stats_fn (vlib_main_t *vm, unformat_input_t *input,
vlib_cli_command_t *cmd)
{
session_main_t *smm = &session_main;
session_worker_t *wrk;
if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
return clib_error_return (0, "unknown input `%U'", format_unformat_error,
input);
vec_foreach (wrk, smm->wrk)
{
clib_memset (&wrk->stats, 0, sizeof (wrk->stats));
}
return 0;
}
VLIB_CLI_COMMAND (clear_session_stats_command, static) = {
.path = "clear session stats",
.short_help = "clear session stats",
.function = clear_session_stats_fn,
};
/*
* fd.io coding-style-patch-verification: ON
*

View File

@@ -139,7 +139,7 @@ session_mq_listen_handler (session_worker_t *wrk, session_evt_elt_t *elt)
a->sep_ext.ext_cfg = session_mq_get_ext_config (app, mp->ext_config);
if ((rv = vnet_listen (a)))
clib_warning ("listen returned: %U", format_session_error, rv);
session_worker_stat_error_inc (wrk, rv, 1);
app_wrk = application_get_worker (app, mp->wrk_index);
mq_send_session_bound_cb (app_wrk->wrk_index, mp->context, a->handle, rv);
@@ -178,6 +178,7 @@ session_mq_connect_one (session_connect_msg_t *mp)
{
vnet_connect_args_t _a, *a = &_a;
app_worker_t *app_wrk;
session_worker_t *wrk;
application_t *app;
int rv;
@@ -211,7 +212,8 @@ session_mq_connect_one (session_connect_msg_t *mp)
if ((rv = vnet_connect (a)))
{
clib_warning ("connect returned: %U", format_session_error, rv);
wrk = session_main_get_worker (vlib_get_thread_index ());
session_worker_stat_error_inc (wrk, rv, 1);
app_wrk = application_get_worker (app, mp->wrk_index);
mq_send_session_connected_cb (app_wrk->wrk_index, mp->context, 0, rv);
}
@@ -320,7 +322,7 @@ session_mq_connect_uri_handler (session_worker_t *wrk, session_evt_elt_t *elt)
a->app_index = app->app_index;
if ((rv = vnet_connect_uri (a)))
{
clib_warning ("connect_uri returned: %d", rv);
session_worker_stat_error_inc (wrk, rv, 1);
app_wrk = application_get_worker (app, 0 /* default wrk only */ );
mq_send_session_connected_cb (app_wrk->wrk_index, mp->context, 0, rv);
}
@@ -402,7 +404,7 @@ session_mq_unlisten_handler (session_worker_t *wrk, session_evt_elt_t *elt)
a->wrk_map_index = mp->wrk_index;
if ((rv = vnet_unlisten (a)))
clib_warning ("unlisten returned: %d", rv);
session_worker_stat_error_inc (wrk, rv, 1);
app_wrk = application_get_worker (app, a->wrk_map_index);
if (!app_wrk)
@@ -601,6 +603,7 @@ session_mq_worker_update_handler (void *data)
session_event_t *evt;
session_t *s;
application_t *app;
int rv;
app = application_lookup (mp->client_index);
if (!app)
@@ -637,7 +640,9 @@ session_mq_worker_update_handler (void *data)
return;
}
app_worker_own_session (app_wrk, s);
rv = app_worker_own_session (app_wrk, s);
if (rv)
session_stat_error_inc (rv, 1);
/*
* Send reply