aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp/stats/stat_segment_provider.c
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2021-05-06 11:02:37 +0200
committerDamjan Marion <dmarion@me.com>2021-05-06 18:10:13 +0000
commit3b51f28a6fd480cc397dac90b8f0c1152c186d4d (patch)
tree21a6712a70e92ac51e62addfcf0505a543e74fdb /src/vpp/stats/stat_segment_provider.c
parent8f12698f836a94c2aa45a76045d97ca5d9d53e8a (diff)
stats: move vector_rate counters into provider
Type: improvement Signed-off-by: Ole Troan <ot@cisco.com> Change-Id: Iae1fb59a6dc9679c0fa0b87fa5232d551a7995a5
Diffstat (limited to 'src/vpp/stats/stat_segment_provider.c')
-rw-r--r--src/vpp/stats/stat_segment_provider.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/vpp/stats/stat_segment_provider.c b/src/vpp/stats/stat_segment_provider.c
index 2212ffe98dd..fc883f7751d 100644
--- a/src/vpp/stats/stat_segment_provider.c
+++ b/src/vpp/stats/stat_segment_provider.c
@@ -119,3 +119,80 @@ vlib_stats_register_mem_heap (clib_mem_heap_t *heap)
stat_segment_poll_add (mem_vector_index, stat_provider_mem_usage_update_fn,
heap_index, 10);
}
+
+static void
+stat_provider_vector_rate_per_thread_update_fn (
+ stat_segment_directory_entry_t *e, u32 index)
+{
+ vlib_main_t *this_vlib_main;
+ int i;
+ ASSERT (e->data);
+ counter_t **counters = e->data;
+
+ for (i = 0; i < vlib_get_n_threads (); i++)
+ {
+
+ f64 this_vector_rate;
+
+ this_vlib_main = vlib_get_main_by_index (i);
+
+ this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
+ vlib_clear_internal_node_vector_rate (this_vlib_main);
+ /* Set the per-worker rate */
+ counter_t *cb = counters[i];
+ cb[0] = this_vector_rate;
+ }
+}
+
+static void
+stat_provider_vector_rate_update_fn (stat_segment_directory_entry_t *e,
+ u32 index)
+{
+ vlib_main_t *this_vlib_main;
+ int i;
+ f64 vector_rate = 0.0;
+ for (i = 0; i < vlib_get_n_threads (); i++)
+ {
+
+ f64 this_vector_rate;
+
+ this_vlib_main = vlib_get_main_by_index (i);
+
+ this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
+ vlib_clear_internal_node_vector_rate (this_vlib_main);
+
+ vector_rate += this_vector_rate;
+ }
+
+ /* And set the system average rate */
+ vector_rate /= (f64) (i > 1 ? i - 1 : 1);
+ e->value = vector_rate;
+}
+
+void
+stat_provider_register_vector_rate (u32 num_workers)
+{
+ int i;
+
+ u8 *s = format (0, "/sys/vector_rate");
+
+ i = stat_segment_new_entry (s, STAT_DIR_TYPE_SCALAR_INDEX);
+ if (i == ~0)
+ ASSERT (0);
+ vec_free (s);
+ stat_segment_poll_add (i, stat_provider_vector_rate_update_fn, ~0, 10);
+
+ s = format (0, "/sys/vector_rate_per_worker");
+ i = stat_segment_new_entry (s, STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE);
+ if (i == ~0)
+ ASSERT (0);
+ vec_free (s);
+ stat_segment_poll_add (i, stat_provider_vector_rate_per_thread_update_fn, ~0,
+ 10);
+
+ stat_segment_main_t *sm = &stat_segment_main;
+ vlib_stat_segment_lock ();
+ stat_segment_directory_entry_t *ep = &sm->directory_vector[i];
+ ep->data = stat_validate_counter_vector3 (ep->data, num_workers, 0);
+ vlib_stat_segment_unlock ();
+}