diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-08-22 08:56:53 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-09-03 22:57:23 -0400 |
| commit | d83b96faeb02d7a3574e63880141d6b23f31ced1 (patch) | |
| tree | b6cd2feca3513dccba012b9da2ac230e94d09ac0 /src/core/dialer.c | |
| parent | 1b2a93503e0ed108f7c4add4bcf4b201a363bb80 (diff) | |
| download | nng-d83b96faeb02d7a3574e63880141d6b23f31ced1.tar.gz nng-d83b96faeb02d7a3574e63880141d6b23f31ced1.tar.bz2 nng-d83b96faeb02d7a3574e63880141d6b23f31ced1.zip | |
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.
Diffstat (limited to 'src/core/dialer.c')
| -rw-r--r-- | src/core/dialer.c | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/src/core/dialer.c b/src/core/dialer.c index 00ebb513..11faed7c 100644 --- a/src/core/dialer.c +++ b/src/core/dialer.c @@ -23,6 +23,8 @@ static void dialer_timer_cb(void *); static nni_idhash *dialers; static nni_mtx dialers_lk; +#define BUMPSTAT(x) nni_stat_inc_atomic(x, 1) + int nni_dialer_sys_init(void) { @@ -32,8 +34,7 @@ nni_dialer_sys_init(void) return (rv); } nni_mtx_init(&dialers_lk); - nni_idhash_set_limits( - dialers, 1, 0x7fffffff, nni_random() & 0x7fffffff); + nni_idhash_set_limits(dialers, 1, 0x7fffffff, 1); return (0); } @@ -70,6 +71,55 @@ nni_dialer_destroy(nni_dialer *d) NNI_FREE_STRUCT(d); } +static void +dialer_stats_init(nni_dialer *d) +{ + nni_dialer_stats *st = &d->d_stats; + nni_stat_item * root = &st->s_root; + + nni_stat_init_scope(root, st->s_scope, "dialer statistics"); + + nni_stat_init_id(&st->s_id, "id", "dialer id", d->d_id); + nni_stat_append(root, &st->s_id); + + nni_stat_init_id(&st->s_sock, "socket", "socket for dialer", + nni_sock_id(d->d_sock)); + nni_stat_append(root, &st->s_sock); + + nni_stat_init_string( + &st->s_url, "url", "dialer url", d->d_url->u_rawurl); + nni_stat_append(root, &st->s_url); + + nni_stat_init_atomic(&st->s_npipes, "npipes", "open pipes"); + nni_stat_append(root, &st->s_npipes); + + nni_stat_init_atomic(&st->s_connok, "connok", "connections made"); + nni_stat_append(root, &st->s_connok); + + nni_stat_init_atomic( + &st->s_canceled, "canceled", "connections canceled"); + nni_stat_append(root, &st->s_canceled); + + nni_stat_init_atomic(&st->s_refused, "refused", "connections refused"); + nni_stat_append(root, &st->s_refused); + + nni_stat_init_atomic( + &st->s_timedout, "timedout", "connections timed out"); + nni_stat_append(root, &st->s_timedout); + + nni_stat_init_atomic( + &st->s_othererr, "othererr", "other connection errors"); + nni_stat_append(root, &st->s_othererr); + + nni_stat_init_atomic( + &st->s_protorej, "protoreject", "pipes rejected by protocol"); + nni_stat_append(root, &st->s_protorej); + + nni_stat_init_atomic( + &st->s_apprej, "appreject", "pipes rejected by application"); + nni_stat_append(root, &st->s_apprej); +} + int nni_dialer_create(nni_dialer **dp, nni_sock *s, const char *urlstr) { @@ -110,6 +160,7 @@ nni_dialer_create(nni_dialer **dp, nni_sock *s, const char *urlstr) nni_mtx_init(&d->d_mtx); + dialer_stats_init(d); if (((rv = nni_aio_init(&d->d_con_aio, dialer_connect_cb, d)) != 0) || ((rv = nni_aio_init(&d->d_tmo_aio, dialer_timer_cb, d)) != 0) || ((rv = d->d_ops.d_init(&d->d_data, url, d)) != 0) || @@ -119,6 +170,10 @@ nni_dialer_create(nni_dialer **dp, nni_sock *s, const char *urlstr) return (rv); } + snprintf(d->d_stats.s_scope, sizeof(d->d_stats.s_scope), "dialer%u", + d->d_id); + nni_stat_set_value(&d->d_stats.s_id, d->d_id); + nni_stat_append(NULL, &d->d_stats.s_root); *dp = d; return (0); } @@ -167,6 +222,7 @@ nni_dialer_rele(nni_dialer *d) nni_mtx_lock(&dialers_lk); d->d_refcnt--; if ((d->d_refcnt == 0) && (d->d_closed)) { + nni_stat_remove(&d->d_stats.s_root); nni_reap(&d->d_reap, (nni_cb) nni_dialer_reap, d); } nni_mtx_unlock(&dialers_lk); @@ -242,12 +298,33 @@ dialer_connect_cb(void *arg) switch ((rv = nni_aio_result(aio))) { case 0: + BUMPSTAT(&d->d_stats.s_connok); nni_dialer_add_pipe(d, nni_aio_get_output(aio, 0)); break; case NNG_ECLOSED: // No further action. case NNG_ECANCELED: // No further action. + BUMPSTAT(&d->d_stats.s_canceled); break; + case NNG_ECONNREFUSED: + BUMPSTAT(&d->d_stats.s_refused); + if (uaio == NULL) { + nni_dialer_timer_start(d); + } else { + nni_atomic_flag_reset(&d->d_started); + } + break; + + case NNG_ETIMEDOUT: + BUMPSTAT(&d->d_stats.s_timedout); + if (uaio == NULL) { + nni_dialer_timer_start(d); + } else { + nni_atomic_flag_reset(&d->d_started); + } + break; + default: + BUMPSTAT(&d->d_stats.s_othererr); if (uaio == NULL) { nni_dialer_timer_start(d); } else { @@ -389,3 +466,9 @@ nni_dialer_getopt( return (nni_sock_getopt(d->d_sock, name, valp, szp, t)); } + +void +nni_dialer_add_stat(nni_dialer *d, nni_stat_item *stat) +{ + nni_stat_append(&d->d_stats.s_root, stat); +} |
