diff options
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); +} |
