diff options
author | Ole Troan <ot@cisco.com> | 2019-05-16 15:01:34 +0200 |
---|---|---|
committer | Andrew Yourtchenko <ayourtch@gmail.com> | 2019-05-22 09:43:49 +0000 |
commit | 233e4681830bc2a9cd40deb4b5909b4e310d1a2a (patch) | |
tree | 495c36ffbafdfaf8c85672024e2162ea8ee923ac /src/vpp | |
parent | a29d18ae6bb7cda3923693a052c3b9208588be8e (diff) |
stats: support multiple works for error counters
The current code only allowed access to the main thread error counters.
That is not so useful for a multi worker instance.
No return a vector indexed by thread of counter_t values.
Type: fix
Change-Id: Ie322c8889c0c8175e1116e71de04a2cf453b9ed7
Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp')
-rw-r--r-- | src/vpp/app/vpp_get_stats.c | 8 | ||||
-rw-r--r-- | src/vpp/app/vpp_prometheus_export.c | 10 | ||||
-rw-r--r-- | src/vpp/stats/stat_segment.c | 16 | ||||
-rw-r--r-- | src/vpp/stats/stat_segment.h | 1 | ||||
-rw-r--r-- | src/vpp/stats/stats.md | 3 |
5 files changed, 28 insertions, 10 deletions
diff --git a/src/vpp/app/vpp_get_stats.c b/src/vpp/app/vpp_get_stats.c index 1d878029dda..c00fb835d1c 100644 --- a/src/vpp/app/vpp_get_stats.c +++ b/src/vpp/app/vpp_get_stats.c @@ -80,7 +80,9 @@ stat_poll_loop (u8 ** patterns) break; case STAT_DIR_TYPE_ERROR_INDEX: - fformat (stdout, "%llu %s\n", res[i].error_value, res[i].name); + for (j = 0; j < vec_len (res[i].error_vector); j++) + fformat (stdout, "%llu %s\n", res[i].error_vector[j], + res[i].name); break; case STAT_DIR_TYPE_SCALAR_INDEX: @@ -213,7 +215,9 @@ reconnect: break; case STAT_DIR_TYPE_ERROR_INDEX: - fformat (stdout, "%llu %s\n", res[i].error_value, res[i].name); + for (j = 0; j < vec_len (res[i].error_vector); j++) + fformat (stdout, "[@%d] %llu %s\n", j, res[i].error_vector[j], + res[i].name); break; case STAT_DIR_TYPE_SCALAR_INDEX: diff --git a/src/vpp/app/vpp_prometheus_export.c b/src/vpp/app/vpp_prometheus_export.c index e2fdd7150e5..06f1a9169cd 100644 --- a/src/vpp/app/vpp_prometheus_export.c +++ b/src/vpp/app/vpp_prometheus_export.c @@ -97,9 +97,13 @@ retry: } break; case STAT_DIR_TYPE_ERROR_INDEX: - fformat (stream, "# TYPE %s counter\n", prom_string (res[i].name)); - fformat (stream, "%s{thread=\"0\"} %lld\n", - prom_string (res[i].name), res[i].error_value); + for (j = 0; j < vec_len (res[i].error_vector); j++) + { + fformat (stream, "# TYPE %s counter\n", + prom_string (res[i].name)); + fformat (stream, "%s{thread=\"%d\"} %lld\n", + prom_string (res[i].name), j, res[i].error_vector[j]); + } break; case STAT_DIR_TYPE_SCALAR_INDEX: diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c index bb2ffad8f6d..4cd00a22641 100644 --- a/src/vpp/stats/stat_segment.c +++ b/src/vpp/stats/stat_segment.c @@ -22,6 +22,7 @@ #undef HAVE_MEMFD_CREATE #include <vppinfra/linux/syscall.h> #include <vpp-api/client/stat_client.h> + stat_segment_main_t stat_segment_main; /* @@ -200,22 +201,29 @@ stat_validate_counter_vector (stat_segment_directory_entry_t * ep, u32 max) } void -vlib_stats_pop_heap2 (u64 * error_vector, u32 thread_index, void *oldheap) +vlib_stats_pop_heap2 (u64 * error_vector, u32 thread_index, void *oldheap, + int lock) { stat_segment_main_t *sm = &stat_segment_main; stat_segment_shared_header_t *shared_header = sm->shared_header; ASSERT (shared_header); - vlib_stat_segment_lock (); + if (lock) + vlib_stat_segment_lock (); /* Reset the client hash table pointer, since it WILL change! */ - shared_header->error_offset = + vec_validate (sm->error_vector, thread_index); + sm->error_vector[thread_index] = stat_segment_offset (shared_header, error_vector); + + shared_header->error_offset = + stat_segment_offset (shared_header, sm->error_vector); shared_header->directory_offset = stat_segment_offset (shared_header, sm->directory_vector); - vlib_stat_segment_unlock (); + if (lock) + vlib_stat_segment_unlock (); clib_mem_set_heap (oldheap); } diff --git a/src/vpp/stats/stat_segment.h b/src/vpp/stats/stat_segment.h index fd7ce79cabe..b9ffedf2169 100644 --- a/src/vpp/stats/stat_segment.h +++ b/src/vpp/stats/stat_segment.h @@ -110,6 +110,7 @@ typedef struct /* statistics segment */ uword *directory_vector_by_name; stat_segment_directory_entry_t *directory_vector; + u64 *error_vector; u8 **interfaces; u8 **nodes; diff --git a/src/vpp/stats/stats.md b/src/vpp/stats/stats.md index 6a62ca6c8ad..20ca7909baa 100644 --- a/src/vpp/stats/stats.md +++ b/src/vpp/stats/stats.md @@ -106,7 +106,8 @@ int main (int argc, char **argv) { break; case STAT_DIR_TYPE_ERROR_INDEX: - fformat (stdout, "%llu %s\n", res[i].error_value, res[i].name); + for (j = 0; j < vec_len (res[i].error_vector); j++) + fformat (stdout, "[@%d] %llu %s\n", j, res[i].error_vector[j], res[i].name); break; case STAT_DIR_TYPE_SCALAR_INDEX: |