From d2bbdef69429ccfaf8c4c508f3e2b3fa9bb8e8d1 Mon Sep 17 00:00:00 2001 From: Filip Tehlar Date: Fri, 22 Feb 2019 05:05:53 -0800 Subject: stats: add buffer gauges Change-Id: I7f7a459f25d64ea5fa36e30d7dccc667bc19c5a9 Signed-off-by: Filip Tehlar --- src/vpp/stats/stat_segment.c | 47 +++++++++++++++++++++++++++++++++++++------- src/vpp/stats/stat_segment.h | 8 ++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) (limited to 'src/vpp') diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c index 793936bf08f..2d6c8c67901 100644 --- a/src/vpp/stats/stat_segment.c +++ b/src/vpp/stats/stat_segment.c @@ -214,15 +214,8 @@ vlib_map_stat_segment_init (void) stat_segment_main_t *sm = &stat_segment_main; stat_segment_shared_header_t *shared_header; stat_segment_directory_entry_t *ep; - - f64 *scalar_data; - u8 *name; void *oldheap; - u32 *lock; - int rv; ssize_t memory_size; - - int mfd; char *mem_name = "stat_segment_test"; void *memaddr; @@ -282,6 +275,7 @@ vlib_map_stat_segment_init (void) /* Save the vector offset in the shared segment, for clients */ shared_header->directory_offset = stat_segment_offset (shared_header, sm->directory_vector); + sm->gauges_fns = 0; clib_mem_set_heap (oldheap); @@ -514,6 +508,12 @@ do_stat_segment_updates (stat_segment_main_t * sm) if (sm->node_counters_enabled) update_node_counters (sm); + for (i = 0; i < vec_len (sm->gauges_fns); i++) + { + if (sm->gauges_fns[i]) + sm->gauges_fns[i] (&sm->directory_vector[i]); + } + /* Heartbeat, so clients detect we're still here */ sm->directory_vector[STAT_COUNTER_HEARTBEAT].value++; } @@ -618,6 +618,39 @@ statseg_init (vlib_main_t * vm) return 0; } +clib_error_t * +stat_segment_register_gauge (u8 * name, stat_segment_update_fn update_fn) +{ + stat_segment_main_t *sm = &stat_segment_main; + stat_segment_shared_header_t *shared_header = sm->shared_header; + void *oldheap; + stat_segment_directory_entry_t e; + u32 index; + + ASSERT (shared_header); + + oldheap = vlib_stats_push_heap (); + vlib_stat_segment_lock (); + + memset (&e, 0, sizeof (e)); + e.type = STAT_DIR_TYPE_SCALAR_INDEX; + + memcpy (e.name, name, vec_len (name)); + index = vec_len (sm->directory_vector); + vec_add1 (sm->directory_vector, e); + + shared_header->directory_offset = + stat_segment_offset (shared_header, sm->directory_vector); + + vlib_stat_segment_unlock (); + clib_mem_set_heap (oldheap); + + vec_validate (sm->gauges_fns, index); + sm->gauges_fns[index] = update_fn; + + return NULL; +} + static clib_error_t * statseg_config (vlib_main_t * vm, unformat_input_t * input) { diff --git a/src/vpp/stats/stat_segment.h b/src/vpp/stats/stat_segment.h index 3ce82809255..f3ea50c9d99 100644 --- a/src/vpp/stats/stat_segment.h +++ b/src/vpp/stats/stat_segment.h @@ -85,8 +85,13 @@ stat_segment_pointer (void *start, uint64_t offset) return ((char *) start + offset); } +typedef void (*stat_segment_update_fn)(stat_segment_directory_entry_t * e); + typedef struct { + /* internal, does not point to shared memory */ + stat_segment_update_fn *gauges_fns; + /* statistics segment */ uword *directory_vector_by_name; stat_segment_directory_entry_t *directory_vector; @@ -104,4 +109,7 @@ typedef struct extern stat_segment_main_t stat_segment_main; +clib_error_t * +stat_segment_register_gauge (u8 *names, stat_segment_update_fn update_fn); + #endif -- cgit 1.2.3-korg