blob: 94a852ac75188571b191566dc4b8da69f68a3b8e [file] [log] [blame]
Damjan Marion8973b072022-03-01 15:51:18 +01001/* 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
8static int
9name_sort_cmp (void *a1, void *a2)
10{
11 vlib_stats_entry_t *n1 = a1;
12 vlib_stats_entry_t *n2 = a2;
13
14 return strcmp ((char *) n1->name, (char *) n2->name);
15}
16
17static u8 *
18format_stat_dir_entry (u8 *s, va_list *args)
19{
20 vlib_stats_entry_t *ep = va_arg (*args, vlib_stats_entry_t *);
21 char *type_name;
22 char *format_string;
23
24 format_string = "%-74s %-10s %10lld";
25
26 switch (ep->type)
27 {
28 case STAT_DIR_TYPE_SCALAR_INDEX:
29 type_name = "ScalarPtr";
30 break;
31
32 case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
33 case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
34 type_name = "CMainPtr";
35 break;
36
Damjan Marion8973b072022-03-01 15:51:18 +010037 case STAT_DIR_TYPE_NAME_VECTOR:
38 type_name = "NameVector";
39 break;
40
41 case STAT_DIR_TYPE_EMPTY:
42 type_name = "empty";
43 break;
44
45 case STAT_DIR_TYPE_SYMLINK:
46 type_name = "Symlink";
47 break;
48
49 default:
50 type_name = "illegal!";
51 break;
52 }
53
54 return format (s, format_string, ep->name, type_name, 0);
55}
56static clib_error_t *
57show_stat_segment_command_fn (vlib_main_t *vm, unformat_input_t *input,
58 vlib_cli_command_t *cmd)
59{
60 vlib_stats_segment_t *sm = vlib_stats_get_segment ();
61 vlib_stats_entry_t *show_data;
62 int i;
63
64 int verbose = 0;
65
66 if (unformat (input, "verbose"))
67 verbose = 1;
68
69 /* Lock even as reader, as this command doesn't handle epoch changes */
70 vlib_stats_segment_lock ();
71 show_data = vec_dup (sm->directory_vector);
72 vlib_stats_segment_unlock ();
73
74 vec_sort_with_function (show_data, name_sort_cmp);
75
76 vlib_cli_output (vm, "%-74s %10s %10s", "Name", "Type", "Value");
77
78 for (i = 0; i < vec_len (show_data); i++)
79 {
80 vlib_stats_entry_t *ep = vec_elt_at_index (show_data, i);
81
82 if (ep->type == STAT_DIR_TYPE_EMPTY)
83 continue;
84
85 vlib_cli_output (vm, "%-100U", format_stat_dir_entry,
86 vec_elt_at_index (show_data, i));
87 }
88
89 if (verbose)
90 {
91 ASSERT (sm->heap);
92 vlib_cli_output (vm, "%U", format_clib_mem_heap, sm->heap,
93 0 /* verbose */);
94 }
95
96 return 0;
97}
98
99static clib_error_t *
100show_stat_segment_hash_command_fn (vlib_main_t *vm, unformat_input_t *input,
101 vlib_cli_command_t *cmd)
102{
103 vlib_stats_segment_t *sm = vlib_stats_get_segment ();
104 char *name;
105 u32 i;
106 hash_foreach_mem (name, i, sm->directory_vector_by_name,
107 ({ vlib_cli_output (vm, "%d: %s\n", i, name); }));
108 return 0;
109}
110
111VLIB_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
117VLIB_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};