LCOV - code coverage report
Current view: top level - vlib/stats - cli.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 2 53 3.8 %
Date: 2023-07-05 22:20:52 Functions: 4 8 50.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: Apache-2.0
       2             :  * Copyright(c) 2022 Cisco Systems, Inc.
       3             :  */
       4             : 
       5             : #include <vlib/vlib.h>
       6             : #include <vlib/stats/stats.h>
       7             : 
       8             : static int
       9           0 : name_sort_cmp (void *a1, void *a2)
      10             : {
      11           0 :   vlib_stats_entry_t *n1 = a1;
      12           0 :   vlib_stats_entry_t *n2 = a2;
      13             : 
      14           0 :   return strcmp ((char *) n1->name, (char *) n2->name);
      15             : }
      16             : 
      17             : static u8 *
      18           0 : format_stat_dir_entry (u8 *s, va_list *args)
      19             : {
      20           0 :   vlib_stats_entry_t *ep = va_arg (*args, vlib_stats_entry_t *);
      21             :   char *type_name;
      22             :   char *format_string;
      23             : 
      24           0 :   format_string = "%-74s %-10s %10lld";
      25             : 
      26           0 :   switch (ep->type)
      27             :     {
      28           0 :     case STAT_DIR_TYPE_SCALAR_INDEX:
      29           0 :       type_name = "ScalarPtr";
      30           0 :       break;
      31             : 
      32           0 :     case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
      33             :     case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
      34           0 :       type_name = "CMainPtr";
      35           0 :       break;
      36             : 
      37           0 :     case STAT_DIR_TYPE_NAME_VECTOR:
      38           0 :       type_name = "NameVector";
      39           0 :       break;
      40             : 
      41           0 :     case STAT_DIR_TYPE_EMPTY:
      42           0 :       type_name = "empty";
      43           0 :       break;
      44             : 
      45           0 :     case STAT_DIR_TYPE_SYMLINK:
      46           0 :       type_name = "Symlink";
      47           0 :       break;
      48             : 
      49           0 :     default:
      50           0 :       type_name = "illegal!";
      51           0 :       break;
      52             :     }
      53             : 
      54           0 :   return format (s, format_string, ep->name, type_name, 0);
      55             : }
      56             : static clib_error_t *
      57           0 : show_stat_segment_command_fn (vlib_main_t *vm, unformat_input_t *input,
      58             :                               vlib_cli_command_t *cmd)
      59             : {
      60           0 :   vlib_stats_segment_t *sm = vlib_stats_get_segment ();
      61             :   vlib_stats_entry_t *show_data;
      62             :   int i;
      63             : 
      64           0 :   int verbose = 0;
      65             : 
      66           0 :   if (unformat (input, "verbose"))
      67           0 :     verbose = 1;
      68             : 
      69             :   /* Lock even as reader, as this command doesn't handle epoch changes */
      70           0 :   vlib_stats_segment_lock ();
      71           0 :   show_data = vec_dup (sm->directory_vector);
      72           0 :   vlib_stats_segment_unlock ();
      73             : 
      74           0 :   vec_sort_with_function (show_data, name_sort_cmp);
      75             : 
      76           0 :   vlib_cli_output (vm, "%-74s %10s %10s", "Name", "Type", "Value");
      77             : 
      78           0 :   for (i = 0; i < vec_len (show_data); i++)
      79             :     {
      80           0 :       vlib_stats_entry_t *ep = vec_elt_at_index (show_data, i);
      81             : 
      82           0 :       if (ep->type == STAT_DIR_TYPE_EMPTY)
      83           0 :         continue;
      84             : 
      85           0 :       vlib_cli_output (vm, "%-100U", format_stat_dir_entry,
      86           0 :                        vec_elt_at_index (show_data, i));
      87             :     }
      88             : 
      89           0 :   if (verbose)
      90             :     {
      91           0 :       ASSERT (sm->heap);
      92           0 :       vlib_cli_output (vm, "%U", format_clib_mem_heap, sm->heap,
      93             :                        0 /* verbose */);
      94             :     }
      95             : 
      96           0 :   return 0;
      97             : }
      98             : 
      99             : static clib_error_t *
     100           0 : show_stat_segment_hash_command_fn (vlib_main_t *vm, unformat_input_t *input,
     101             :                                    vlib_cli_command_t *cmd)
     102             : {
     103           0 :   vlib_stats_segment_t *sm = vlib_stats_get_segment ();
     104             :   char *name;
     105             :   u32 i;
     106           0 :   hash_foreach_mem (name, i, sm->directory_vector_by_name,
     107             :                     ({ vlib_cli_output (vm, "%d: %s\n", i, name); }));
     108           0 :   return 0;
     109             : }
     110             : 
     111      272887 : VLIB_CLI_COMMAND (show_stat_segment_hash_command, static) = {
     112             :   .path = "show statistics hash",
     113             :   .short_help = "show statistics hash",
     114             :   .function = show_stat_segment_hash_command_fn,
     115             : };
     116             : 
     117      272887 : VLIB_CLI_COMMAND (show_stat_segment_command, static) = {
     118             :   .path = "show statistics segment",
     119             :   .short_help = "show statistics segment [verbose]",
     120             :   .function = show_stat_segment_command_fn,
     121             : };

Generated by: LCOV version 1.14