STATS: stat_client updates.
[vpp.git] / src / vpp / stats / stat_segment.c
index 6fb9c83..8459138 100644 (file)
@@ -43,7 +43,7 @@ vlib_stats_push_heap (void)
 }
 
 void
-vlib_stats_pop_heap (void *cm_arg, void *oldheap)
+vlib_stats_pop_heap (void *cm_arg, void *oldheap, stat_directory_type_t type)
 {
   vlib_simple_counter_main_t *cm = (vlib_simple_counter_main_t *) cm_arg;
   stats_main_t *sm = &stats_main;
@@ -80,7 +80,7 @@ vlib_stats_pop_heap (void *cm_arg, void *oldheap)
        }
       name_copy = format (0, "%s%c", stat_segment_name, 0);
       ep = clib_mem_alloc (sizeof (*ep));
-      ep->type = STAT_DIR_TYPE_COUNTER_VECTOR;
+      ep->type = type;
       ep->value = cm->counters;
       hash_set_mem (sm->counter_vector_by_name, name_copy, ep);
 
@@ -186,8 +186,8 @@ vlib_stats_pop_heap2 (u64 * counter_vector, u32 thread_index, void *oldheap)
   ssvm_pop_heap (oldheap);
 }
 
-static clib_error_t *
-map_stat_segment_init (vlib_main_t * vm)
+clib_error_t *
+vlib_map_stat_segment_init (void)
 {
   stats_main_t *sm = &stats_main;
   ssvm_private_t *ssvmp = &sm->stat_segment;
@@ -198,8 +198,13 @@ map_stat_segment_init (vlib_main_t * vm)
   void *oldheap;
   u32 *lock;
   int rv;
+  u64 memory_size;
+
+  memory_size = sm->memory_size;
+  if (memory_size == 0)
+    memory_size = STAT_SEGMENT_DEFAULT_SIZE;
 
-  ssvmp->ssvm_size = 32 << 20; /*$$$$$ CONFIG PARAM */
+  ssvmp->ssvm_size = memory_size;
   ssvmp->i_am_master = 1;
   ssvmp->my_pid = getpid ();
   ssvmp->name = format (0, "/stats%c", 0);
@@ -231,35 +236,43 @@ map_stat_segment_init (vlib_main_t * vm)
   sm->input_rate_ptr = (scalar_data + 1);
   sm->last_runtime_ptr = (scalar_data + 2);
   sm->last_runtime_stats_clear_ptr = (scalar_data + 3);
+  sm->heartbeat_ptr = (scalar_data + 4);
 
-  name = format (0, "vector_rate%c", 0);
+  name = format (0, "/sys/vector_rate%c", 0);
   ep = clib_mem_alloc (sizeof (*ep));
   ep->type = STAT_DIR_TYPE_SCALAR_POINTER;
   ep->value = sm->vector_rate_ptr;
 
   hash_set_mem (sm->counter_vector_by_name, name, ep);
 
-  name = format (0, "input_rate%c", 0);
+  name = format (0, "/sys/input_rate%c", 0);
   ep = clib_mem_alloc (sizeof (*ep));
   ep->type = STAT_DIR_TYPE_SCALAR_POINTER;
   ep->value = sm->input_rate_ptr;
 
   hash_set_mem (sm->counter_vector_by_name, name, ep);
 
-  name = format (0, "last_update%c", 0);
+  name = format (0, "/sys/last_update%c", 0);
   ep = clib_mem_alloc (sizeof (*ep));
   ep->type = STAT_DIR_TYPE_SCALAR_POINTER;
   ep->value = sm->last_runtime_ptr;
 
   hash_set_mem (sm->counter_vector_by_name, name, ep);
 
-  name = format (0, "last_stats_clear%c", 0);
+  name = format (0, "/sys/last_stats_clear%c", 0);
   ep = clib_mem_alloc (sizeof (*ep));
   ep->type = STAT_DIR_TYPE_SCALAR_POINTER;
   ep->value = sm->last_runtime_stats_clear_ptr;
 
   hash_set_mem (sm->counter_vector_by_name, name, ep);
 
+  name = format (0, "/sys/heartbeat%c", 0);
+  ep = clib_mem_alloc (sizeof (*ep));
+  ep->type = STAT_DIR_TYPE_SCALAR_POINTER;
+  ep->value = sm->heartbeat_ptr;
+
+  hash_set_mem (sm->counter_vector_by_name, name, ep);
+
 
   /* Publish the hash table */
   shared_header->opaque[STAT_SEGMENT_OPAQUE_DIR] = sm->counter_vector_by_name;
@@ -269,8 +282,6 @@ map_stat_segment_init (vlib_main_t * vm)
   return 0;
 }
 
-VLIB_INIT_FUNCTION (map_stat_segment_init);
-
 typedef struct
 {
   u8 *name;
@@ -306,7 +317,8 @@ format_stat_dir_entry (u8 * s, va_list * args)
       type_name = "VectorPtr";
       break;
 
-    case STAT_DIR_TYPE_COUNTER_VECTOR:
+    case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
+    case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
       type_name = "CMainPtr";
       break;
 
@@ -507,9 +519,36 @@ do_stat_segment_updates (stats_main_t * sm)
   sm->last_runtime_stats_clear_ptr[0] =
     vm->node_main.time_last_runtime_stats_clear;
 
-  update_serialized_nodes (sm);
+  if (sm->serialize_nodes)
+    update_serialized_nodes (sm);
+
+  /* Heartbeat, so clients detect we're still here */
+  (*sm->heartbeat_ptr)++;
+}
+
+static clib_error_t *
+statseg_config (vlib_main_t * vm, unformat_input_t * input)
+{
+  stats_main_t *sm = &stats_main;
+  uword ms;
+
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "size %U", unformat_memory_size, &sm->memory_size))
+       ;
+      else if (unformat (input, "serialize-nodes on"))
+       sm->serialize_nodes = 1;
+      else if (unformat (input, "serialize-nodes off"))
+       sm->serialize_nodes = 0;
+      else
+       return clib_error_return (0, "unknown input `%U'",
+                                 format_unformat_error, input);
+    }
+
+  return 0;
 }
 
+VLIB_EARLY_CONFIG_FUNCTION (statseg_config, "statseg");
 
 /*
  * fd.io coding-style-patch-verification: ON