@@ -33,6 +33,8 @@
#include <osmocom/vty/misc.h>
#include <osmocom/core/stats.h>
+#include <osmocom/core/statistics.h>
+#include <osmocom/core/rate_ctr.h>
#define CFG_STATS_STR "Configure stats sub-system\n"
#define CFG_REPORTER_STR "Configure a stats reporter\n"
@@ -355,6 +357,113 @@
return CMD_SUCCESS;
}
+static int ascii_handle_counter(struct osmo_counter *counter, void *sctx_)
+{
+ struct vty *vty = sctx_;
+ const char *description = counter->description ? counter->description : "";
+
+ /* | name | This document & | description | */
+ vty_out(vty, "| %s | <<ungroup_counter_%s>> | %s%s",
+ counter->name,
+ counter->name,
+ description,
+ VTY_NEWLINE);
+
+ return 0;
+}
+
+static void ascii_counter_generate(struct vty *vty)
+{
+ vty_out(vty, "// ungrouped osmo_counters%s", VTY_NEWLINE);
+ vty_out(vty, ".ungrouped osmo counters%s", VTY_NEWLINE);
+ vty_out(vty, "|===%s", VTY_NEWLINE);
+ vty_out(vty, "| name | This document & | description%s", VTY_NEWLINE);
+ osmo_counters_for_each(ascii_handle_counter, vty);
+ vty_out(vty, "|===%s", VTY_NEWLINE);
+}
+
+static int asciidoc_rate_ctr_handler(
+ struct rate_ctr_group *ctrg, struct rate_ctr *ctr,
+ const struct rate_ctr_desc *desc, void *sctx_)
+{
+ struct vty *vty = sctx_;
+ const char *description = desc->description ? desc->description : "";
+
+ /* | name | This document & | description | */
+ vty_out(vty, "| %s | <<%s_%s>> | %s%s",
+ desc->name,
+ ctrg->desc->group_name_prefix,
+ desc->name,
+ description,
+ VTY_NEWLINE);
+ return 0;
+}
+
+static int asciidoc_rate_ctr_group_handler(struct rate_ctr_group *ctrg, void *sctx_)
+{
+ struct vty *vty = sctx_;
+ vty_out(vty, "// rate_ctr_group table %s%s", ctrg->desc->group_description, VTY_NEWLINE);
+ vty_out(vty, ".%s - %s %s", ctrg->desc->group_name_prefix, ctrg->desc->group_description, VTY_NEWLINE);
+ vty_out(vty, "|===%s", VTY_NEWLINE);
+ vty_out(vty, "| name | This document & | description%s", VTY_NEWLINE);
+ rate_ctr_for_each_counter(ctrg, asciidoc_rate_ctr_handler, sctx_);
+ vty_out(vty, "|===%s", VTY_NEWLINE);
+
+ return 0;
+}
+
+static int asciidoc_osmo_stat_item_handler(
+ struct osmo_stat_item_group *statg, struct osmo_stat_item *item, void *sctx_)
+{
+ struct vty *vty = sctx_;
+
+ const char *description = item->desc->description ? item->desc->description : "";
+ const char *unit = item->desc->unit ? item->desc->unit : "";
+
+ /* | name | This document & | description | unit | */
+ vty_out(vty, "| %s | <<%s_%s>> | %s | %s%s",
+ item->desc->name,
+ statg->desc->group_name_prefix,
+ item->desc->name,
+ description,
+ unit,
+ VTY_NEWLINE);
+
+ return 0;
+}
+
+static int asciidoc_osmo_stat_item_group_handler(struct osmo_stat_item_group *statg, void *sctx_)
+{
+ struct vty *vty = sctx_;
+ vty_out(vty, "%s%s", statg->desc->group_description, VTY_NEWLINE);
+
+ vty_out(vty, "// osmo_stat_item_group table %s%s", statg->desc->group_description, VTY_NEWLINE);
+ vty_out(vty, ".%s - %s %s", statg->desc->group_name_prefix, statg->desc->group_description, VTY_NEWLINE);
+ vty_out(vty, "|===%s", VTY_NEWLINE);
+ vty_out(vty, "| name | This document & | description | unit%s", VTY_NEWLINE);
+ osmo_stat_item_for_each_item(statg, asciidoc_osmo_stat_item_handler, sctx_);
+ vty_out(vty, "|===%s", VTY_NEWLINE);
+
+
+ return 0;
+}
+
+DEFUN(show_stats_asciidoc_table,
+ show_stats_asciidoc_table_cmd,
+ "show asciidoc",
+ "Generate an ascii doc table of all registered counters.\n")
+{
+ vty_out(vty, "// generating tables for rate_ctr_group%s", VTY_NEWLINE);
+ rate_ctr_for_each_group(asciidoc_rate_ctr_group_handler, vty);
+
+ vty_out(vty, "// generating tables for osmo_stat_items%s", VTY_NEWLINE);
+ osmo_stat_item_for_each_group(asciidoc_osmo_stat_item_group_handler, vty);
+
+ vty_out(vty, "// generating tables for osmo_counters%s", VTY_NEWLINE);
+ ascii_counter_generate(vty);
+ return CMD_SUCCESS;
+}
+
static int config_write_stats_reporter(struct vty *vty, struct osmo_stats_reporter *srep)
{
if (srep == NULL)
@@ -443,4 +552,6 @@
install_element(CFG_STATS_NODE, &cfg_stats_reporter_level_cmd);
install_element(CFG_STATS_NODE, &cfg_stats_reporter_enable_cmd);
install_element(CFG_STATS_NODE, &cfg_stats_reporter_disable_cmd);
+
+ install_element_ve(&show_stats_asciidoc_table_cmd);
}