diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/core/socket.c | 18 | ||||
| -rw-r--r-- | src/core/stats.c | 6 | ||||
| -rw-r--r-- | src/core/stats_test.c | 96 |
4 files changed, 115 insertions, 6 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 8ff5a80d..eb511a83 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -82,4 +82,5 @@ nng_test(list_test) nng_test(message_test) nng_test(reconnect_test) nng_test(sock_test) +nng_test(stats_test) nng_test(url_test) diff --git a/src/core/socket.c b/src/core/socket.c index 75c9eedc..7d15f3cb 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -1,5 +1,5 @@ // -// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2022 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a @@ -237,8 +237,13 @@ sock_get_sockname(void *s, void *buf, size_t *szp, nni_type t) static int sock_set_sockname(void *s, const void *buf, size_t sz, nni_type t) { - return (nni_copyin_str( + int rv; + rv = (nni_copyin_str( SOCK(s)->s_name, buf, sizeof(SOCK(s)->s_name), sz, t)); + if (rv == 0) { + nni_stat_set_string(&SOCK(s)->st_name, SOCK(s)->s_name); + } + return (rv); } static int @@ -646,8 +651,11 @@ nni_sock_open(nni_sock **sockp, const nni_proto *proto) (void) snprintf(s->s_name, sizeof(s->s_name), "%u", s->s_id); #ifdef NNG_ENABLE_STATS - // Set up basic stat values. + // Set up basic stat values. The socket id wasn't + // known at stat creation time, so we set it now. nni_stat_set_id(&s->st_id, (int) s->s_id); + nni_stat_set_id(&s->st_root, (int) s->s_id); + nni_stat_set_string(&s->st_name, s->s_name); // Add our stats chain. nni_stat_register(&s->st_root); @@ -1488,6 +1496,8 @@ nni_dialer_add_pipe(nni_dialer *d, void *tpipe) return; } #ifdef NNG_ENABLE_STATS + nni_stat_set_id(&p->st_root, (int) p->p_id); + nni_stat_set_id(&p->st_id, (int) p->p_id); nni_stat_register(&p->st_root); #endif nni_pipe_run_cb(p, NNG_PIPE_EV_ADD_POST); @@ -1599,6 +1609,8 @@ nni_listener_add_pipe(nni_listener *l, void *tpipe) return; } #ifdef NNG_ENABLE_STATS + nni_stat_set_id(&p->st_root, (int) p->p_id); + nni_stat_set_id(&p->st_id, (int) p->p_id); nni_stat_register(&p->st_root); #endif nni_pipe_run_cb(p, NNG_PIPE_EV_ADD_POST); diff --git a/src/core/stats.c b/src/core/stats.c index f9de055e..50f24e29 100644 --- a/src/core/stats.c +++ b/src/core/stats.c @@ -1,5 +1,5 @@ // -// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2022 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a @@ -463,7 +463,7 @@ nng_stat * nng_stat_find_scope(nng_stat *stat, const char *name, int id) { nng_stat *child; - if (stat == NULL) { + if (stat == NULL || stat->s_info->si_type != NNG_STAT_SCOPE) { return (NULL); } if ((stat->s_val.sv_id == id) && @@ -473,7 +473,7 @@ nng_stat_find_scope(nng_stat *stat, const char *name, int id) } NNI_LIST_FOREACH (&stat->s_children, child) { nng_stat *result; - if ((result = nng_stat_find(child, name)) != NULL) { + if ((result = nng_stat_find_scope(child, name, id)) != NULL) { return (result); } } diff --git a/src/core/stats_test.c b/src/core/stats_test.c new file mode 100644 index 00000000..ba4198ab --- /dev/null +++ b/src/core/stats_test.c @@ -0,0 +1,96 @@ +// +// Copyright 2022 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This software is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +#include <nuts.h> + +#define SECONDS(x) ((x) *1000) + +void +test_stats_socket(void) +{ +#ifdef NNG_ENABLE_STATS + nng_socket s1; + nng_socket s2; + nng_stat *st1; + nng_stat *st2; + nng_stat *item; + nng_stat *stats; + + NUTS_OPEN(s1); + NUTS_OPEN(s2); + nng_socket_set_string(s2, NNG_OPT_SOCKNAME, "second"); + NUTS_MARRY(s1, s2); + NUTS_SEND(s1, "ping"); + NUTS_RECV(s2, "ping"); + + nng_stats_get(&stats); + NUTS_ASSERT(stats != NULL); + st1 = nng_stat_find_socket(stats, s1); + st2 = nng_stat_find_socket(stats, s2); + NUTS_ASSERT(st1 != NULL); + NUTS_ASSERT(st2 != NULL); + NUTS_ASSERT(st1 != st2); + item = nng_stat_find(st1, "name"); + NUTS_ASSERT(item != NULL); + NUTS_ASSERT(nng_stat_string(item) != NULL); + NUTS_MATCH(nng_stat_string(item), "1"); + item = nng_stat_find(st2, "name"); + NUTS_ASSERT(item != NULL); + NUTS_ASSERT(nng_stat_string(item) != NULL); + NUTS_MATCH(nng_stat_string(item), "second"); + item = nng_stat_find(st1, "tx_msgs"); + NUTS_ASSERT(item != NULL); + NUTS_ASSERT(nng_stat_value(item) == 1); + NUTS_ASSERT(nng_stat_unit(item) == NNG_UNIT_MESSAGES); + item = nng_stat_find(st2, "rx_msgs"); + NUTS_ASSERT(item != NULL); + NUTS_ASSERT(nng_stat_value(item) == 1); + NUTS_ASSERT(nng_stat_unit(item) == NNG_UNIT_MESSAGES); + NUTS_CLOSE(s1); + NUTS_CLOSE(s2); + nng_stats_free(stats); +#endif +} + +void +test_stats_dump(void) +{ +#ifdef NNG_ENABLE_STATS + nng_socket s1; + nng_socket s2; + nng_stat *st1; + nng_stat *st2; + nng_stat *stats; + + NUTS_OPEN(s1); + NUTS_OPEN(s2); + nng_socket_set_string(s2, NNG_OPT_SOCKNAME, "second"); + NUTS_MARRY(s1, s2); + NUTS_SEND(s1, "ping"); + NUTS_RECV(s2, "ping"); + nng_stats_get(&stats); + NUTS_ASSERT(stats != NULL); + st1 = nng_stat_find_socket(stats, s1); + st2 = nng_stat_find_socket(stats, s2); + NUTS_ASSERT(st1 != NULL); + NUTS_ASSERT(st2 != NULL); + NUTS_ASSERT(st1 != st2); + nng_stats_dump(stats); + nng_stats_free(stats); + NUTS_CLOSE(s1); + NUTS_CLOSE(s2); +#endif +} + +NUTS_TESTS = { + { "socket stats", test_stats_socket }, + { "dump stats", test_stats_dump }, + { NULL, NULL }, +}; |
