From d83b96faeb02d7a3574e63880141d6b23f31ced1 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Wed, 22 Aug 2018 08:56:53 -0700 Subject: fixes #4 Statistics support This introduces new public APIs for obtaining statistics, and adds some generic stats for dialers, listeners, pipes, and sockets. Also added are stats for inproc and pairv1 protocol. The other protocols and transports will have stats added incrementally as time goes on. A simple test program, and man pages are provided for this. Start by looking at nng_stat(5). Statistics does have some impact, and they can be disabled by using the advanced NNG_ENABLE_STATS (setting it to OFF, it's ON by default) if you need to build a minimized configuration. --- src/core/sockimpl.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-) (limited to 'src/core/sockimpl.h') diff --git a/src/core/sockimpl.h b/src/core/sockimpl.h index be454d8a..ae1fd92e 100644 --- a/src/core/sockimpl.h +++ b/src/core/sockimpl.h @@ -15,6 +15,22 @@ // and pipes. This must not be exposed to other subsystems -- these internals // are subject to change at any time. +typedef struct nni_dialer_stats { + nni_stat_item s_root; + nni_stat_item s_id; + nni_stat_item s_sock; + nni_stat_item s_url; + nni_stat_item s_npipes; + nni_stat_item s_connok; + nni_stat_item s_refused; + nni_stat_item s_canceled; + nni_stat_item s_timedout; + nni_stat_item s_othererr; + nni_stat_item s_protorej; + nni_stat_item s_apprej; + char s_scope[24]; // scope name for stats +} nni_dialer_stats; + struct nni_dialer { nni_tran_dialer_ops d_ops; // transport ops nni_tran * d_tran; // transport pointer @@ -38,8 +54,25 @@ struct nni_dialer { nni_duration d_inirtime; // initial time for reconnect nni_time d_conntime; // time of last good connect nni_reap_item d_reap; + nni_dialer_stats d_stats; }; +typedef struct nni_listener_stats { + nni_stat_item s_root; + nni_stat_item s_id; + nni_stat_item s_sock; + nni_stat_item s_url; + nni_stat_item s_npipes; + nni_stat_item s_accept; + nni_stat_item s_aborted; // aborted remotely + nni_stat_item s_timedout; + nni_stat_item s_canceled; + nni_stat_item s_othererr; + nni_stat_item s_protorej; + nni_stat_item s_apprej; + char s_scope[24]; // scope name for stats +} nni_listener_stats; + struct nni_listener { nni_tran_listener_ops l_ops; // transport ops nni_tran * l_tran; // transport pointer @@ -56,8 +89,17 @@ struct nni_listener { nni_aio * l_acc_aio; nni_aio * l_tmo_aio; nni_reap_item l_reap; + nni_listener_stats l_stats; }; +typedef struct nni_pipe_stats { + nni_stat_item s_root; + nni_stat_item s_id; + nni_stat_item s_ep_id; + nni_stat_item s_sock_id; + char s_scope[16]; // scope name for stats ("pipe" is short) +} nni_pipe_stats; + struct nni_pipe { uint32_t p_id; nni_tran_pipe_ops p_tran_ops; @@ -76,13 +118,11 @@ struct nni_pipe { nni_mtx p_mtx; nni_cv p_cv; nni_reap_item p_reap; + nni_pipe_stats p_stats; }; -extern int nni_sock_add_dialer(nni_sock *, nni_dialer *); -extern void nni_sock_remove_dialer(nni_sock *, nni_dialer *); - -extern int nni_sock_add_listener(nni_sock *, nni_listener *); -extern void nni_sock_remove_listener(nni_sock *, nni_listener *); +extern int nni_sock_add_dialer(nni_sock *, nni_dialer *); +extern int nni_sock_add_listener(nni_sock *, nni_listener *); extern void nni_dialer_add_pipe(nni_dialer *, void *); extern void nni_dialer_shutdown(nni_dialer *); @@ -101,5 +141,6 @@ extern void nni_pipe_remove(nni_pipe *); extern void nni_pipe_run_cb(nni_pipe *, nng_pipe_ev); extern int nni_pipe_create(nni_pipe **, nni_sock *, nni_tran *, void *); extern void nni_pipe_start(nni_pipe *); +extern void nni_pipe_stats_init(nni_pipe *); #endif // CORE_SOCKIMPL_H -- cgit v1.2.3-70-g09d2