<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/26171">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stats: allow configuring reporter's name in the VTY<br><br>This allows configuring more than one reporter of the given type.<br><br>Change-Id: Ia815c24dc974648985539913012b3b074ea317a9<br>Related: SYS#5713<br>---<br>M include/osmocom/core/stats.h<br>M src/stats.c<br>M src/vty/stats_vty.c<br>M tests/stats/stats_vty_test.vty<br>4 files changed, 121 insertions(+), 28 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/71/26171/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/stats.h b/include/osmocom/core/stats.h</span><br><span>index b9edac2..c4f71c8 100644</span><br><span>--- a/include/osmocom/core/stats.h</span><br><span>+++ b/include/osmocom/core/stats.h</span><br><span>@@ -108,6 +108,7 @@</span><br><span>        int interval;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern struct llist_head osmo_stats_reporter_list;</span><br><span> extern struct osmo_stats_config *osmo_stats_config;</span><br><span> </span><br><span> void osmo_stats_init(void *ctx);</span><br><span>diff --git a/src/stats.c b/src/stats.c</span><br><span>index 0967305..702e408 100644</span><br><span>--- a/src/stats.c</span><br><span>+++ b/src/stats.c</span><br><span>@@ -106,7 +106,7 @@</span><br><span> #define STATS_DEFAULT_INTERVAL 5 /* secs */</span><br><span> #define STATS_DEFAULT_BUFLEN 256</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(osmo_stats_reporter_list);</span><br><span style="color: hsl(120, 100%, 40%);">+LLIST_HEAD(osmo_stats_reporter_list);</span><br><span> static void *osmo_stats_ctx = NULL;</span><br><span> static int is_initialised = 0;</span><br><span> </span><br><span>diff --git a/src/vty/stats_vty.c b/src/vty/stats_vty.c</span><br><span>index 17e7190..a4fc6ea 100644</span><br><span>--- a/src/vty/stats_vty.c</span><br><span>+++ b/src/vty/stats_vty.c</span><br><span>@@ -269,14 +269,20 @@</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_stats_reporter_statsd, cfg_stats_reporter_statsd_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-   "stats reporter statsd",</span><br><span style="color: hsl(0, 100%, 40%);">-      CFG_STATS_STR CFG_REPORTER_STR "Report to a STATSD server\n")</span><br><span style="color: hsl(120, 100%, 40%);">+       "stats reporter statsd [NAME]",</span><br><span style="color: hsl(120, 100%, 40%);">+     CFG_STATS_STR CFG_REPORTER_STR</span><br><span style="color: hsl(120, 100%, 40%);">+        "Report to a STATSD server\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Name of the reporter\n")</span><br><span> {</span><br><span>     struct osmo_stats_reporter *srep;</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *name = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (argc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              name = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, name);</span><br><span>   if (!srep) {</span><br><span style="color: hsl(0, 100%, 40%);">-            srep = osmo_stats_reporter_create_statsd(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+               srep = osmo_stats_reporter_create_statsd(name);</span><br><span>              if (!srep) {</span><br><span>                         vty_out(vty, "%% Unable to create statsd reporter%s",</span><br><span>                              VTY_NEWLINE);</span><br><span>@@ -293,12 +299,18 @@</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_no_stats_reporter_statsd, cfg_no_stats_reporter_statsd_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "no stats reporter statsd",</span><br><span style="color: hsl(0, 100%, 40%);">-   NO_STR CFG_STATS_STR CFG_REPORTER_STR "Report to a STATSD server\n")</span><br><span style="color: hsl(120, 100%, 40%);">+        "no stats reporter statsd [NAME]",</span><br><span style="color: hsl(120, 100%, 40%);">+  NO_STR CFG_STATS_STR CFG_REPORTER_STR</span><br><span style="color: hsl(120, 100%, 40%);">+ "Report to a STATSD server\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Name of the reporter\n")</span><br><span> {</span><br><span>     struct osmo_stats_reporter *srep;</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *name = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (argc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              name = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, name);</span><br><span>   if (!srep) {</span><br><span>                 vty_out(vty, "%% No statsd logging active%s",</span><br><span>                      VTY_NEWLINE);</span><br><span>@@ -311,14 +323,20 @@</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_stats_reporter_log, cfg_stats_reporter_log_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-     "stats reporter log",</span><br><span style="color: hsl(0, 100%, 40%);">- CFG_STATS_STR CFG_REPORTER_STR "Report to the logger\n")</span><br><span style="color: hsl(120, 100%, 40%);">+    "stats reporter log [NAME]",</span><br><span style="color: hsl(120, 100%, 40%);">+        CFG_STATS_STR CFG_REPORTER_STR</span><br><span style="color: hsl(120, 100%, 40%);">+        "Report to the logger\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "Name of the reporter\n")</span><br><span> {</span><br><span>     struct osmo_stats_reporter *srep;</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *name = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (argc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              name = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, name);</span><br><span>      if (!srep) {</span><br><span style="color: hsl(0, 100%, 40%);">-            srep = osmo_stats_reporter_create_log(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+          srep = osmo_stats_reporter_create_log(name);</span><br><span>                 if (!srep) {</span><br><span>                         vty_out(vty, "%% Unable to create log reporter%s",</span><br><span>                                 VTY_NEWLINE);</span><br><span>@@ -335,12 +353,18 @@</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_no_stats_reporter_log, cfg_no_stats_reporter_log_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-       "no stats reporter log",</span><br><span style="color: hsl(0, 100%, 40%);">-      NO_STR CFG_STATS_STR CFG_REPORTER_STR "Report to the logger\n")</span><br><span style="color: hsl(120, 100%, 40%);">+     "no stats reporter log [NAME]",</span><br><span style="color: hsl(120, 100%, 40%);">+     NO_STR CFG_STATS_STR CFG_REPORTER_STR</span><br><span style="color: hsl(120, 100%, 40%);">+ "Report to the logger\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "Name of the reporter\n")</span><br><span> {</span><br><span>     struct osmo_stats_reporter *srep;</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *name = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (argc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              name = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, name);</span><br><span>      if (!srep) {</span><br><span>                 vty_out(vty, "%% No log reporting active%s",</span><br><span>                       VTY_NEWLINE);</span><br><span>@@ -598,18 +622,22 @@</span><br><span> </span><br><span> static int config_write_stats_reporter(struct vty *vty, struct osmo_stats_reporter *srep)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     if (srep == NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *type = NULL;</span><br><span> </span><br><span>         switch (srep->type) {</span><br><span>     case OSMO_STATS_REPORTER_STATSD:</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "stats reporter statsd%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               type = "statsd";</span><br><span>           break;</span><br><span>       case OSMO_STATS_REPORTER_LOG:</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, "stats reporter log%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+          type = "log";</span><br><span>              break;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "stats reporter %s", type);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (srep->name != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, " %s", srep->name);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         vty_out(vty, "  disable%s", VTY_NEWLINE);</span><br><span> </span><br><span>      if (srep->have_net_config) {</span><br><span>@@ -652,11 +680,9 @@</span><br><span> {</span><br><span>  struct osmo_stats_reporter *srep;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* TODO: loop through all reporters */</span><br><span style="color: hsl(0, 100%, 40%);">-  srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-      config_write_stats_reporter(vty, srep);</span><br><span style="color: hsl(0, 100%, 40%);">- srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- config_write_stats_reporter(vty, srep);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Loop through all reporters */</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry(srep, &osmo_stats_reporter_list, list)</span><br><span style="color: hsl(120, 100%, 40%);">+               config_write_stats_reporter(vty, srep);</span><br><span> </span><br><span>  vty_out(vty, "stats interval %d%s", osmo_stats_config->interval, VTY_NEWLINE);</span><br><span> </span><br><span>diff --git a/tests/stats/stats_vty_test.vty b/tests/stats/stats_vty_test.vty</span><br><span>index 4ec03c9..017b188 100644</span><br><span>--- a/tests/stats/stats_vty_test.vty</span><br><span>+++ b/tests/stats/stats_vty_test.vty</span><br><span>@@ -2,10 +2,10 @@</span><br><span> stats_vty_test# configure terminal</span><br><span> stats_vty_test(config)# list</span><br><span> ...</span><br><span style="color: hsl(0, 100%, 40%);">-  stats reporter statsd</span><br><span style="color: hsl(0, 100%, 40%);">-  no stats reporter statsd</span><br><span style="color: hsl(0, 100%, 40%);">-  stats reporter log</span><br><span style="color: hsl(0, 100%, 40%);">-  no stats reporter log</span><br><span style="color: hsl(120, 100%, 40%);">+  stats reporter statsd [NAME]</span><br><span style="color: hsl(120, 100%, 40%);">+  no stats reporter statsd [NAME]</span><br><span style="color: hsl(120, 100%, 40%);">+  stats reporter log [NAME]</span><br><span style="color: hsl(120, 100%, 40%);">+  no stats reporter log [NAME]</span><br><span>   stats interval <0-65535></span><br><span> ...</span><br><span> </span><br><span>@@ -148,6 +148,72 @@</span><br><span> ...</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# ### Create an additional statsd reporter</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# stats reporter statsd statsd-foo</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# level global</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# prefix statsd-one-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# remote-ip 192.168.2.200</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# remote-port 9696</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# flush-period 1</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# ### Create an additional log reporter</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# stats reporter log log-bar</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# level global</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# prefix log-bar-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# flush-period 2</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# ### Create an additional log reporter</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# stats reporter log log-zoo</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# level global</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# prefix log-zoo-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# flush-period 3</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config-stats)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# ### We should have 5 reporters now</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+stats reporter statsd</span><br><span style="color: hsl(120, 100%, 40%);">+  disable</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 192.168.1.200</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-port 6969</span><br><span style="color: hsl(120, 100%, 40%);">+  level subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+  prefix statsd-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+  enable</span><br><span style="color: hsl(120, 100%, 40%);">+stats reporter log</span><br><span style="color: hsl(120, 100%, 40%);">+  disable</span><br><span style="color: hsl(120, 100%, 40%);">+  level peer</span><br><span style="color: hsl(120, 100%, 40%);">+  prefix log-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+  enable</span><br><span style="color: hsl(120, 100%, 40%);">+stats reporter statsd statsd-foo</span><br><span style="color: hsl(120, 100%, 40%);">+  disable</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 192.168.2.200</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-port 9696</span><br><span style="color: hsl(120, 100%, 40%);">+  level global</span><br><span style="color: hsl(120, 100%, 40%);">+  prefix statsd-one-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+  flush-period 1</span><br><span style="color: hsl(120, 100%, 40%);">+stats reporter log log-bar</span><br><span style="color: hsl(120, 100%, 40%);">+  disable</span><br><span style="color: hsl(120, 100%, 40%);">+  level global</span><br><span style="color: hsl(120, 100%, 40%);">+  prefix log-bar-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+  flush-period 2</span><br><span style="color: hsl(120, 100%, 40%);">+stats reporter log log-zoo</span><br><span style="color: hsl(120, 100%, 40%);">+  disable</span><br><span style="color: hsl(120, 100%, 40%);">+  level global</span><br><span style="color: hsl(120, 100%, 40%);">+  prefix log-zoo-prefix</span><br><span style="color: hsl(120, 100%, 40%);">+  flush-period 3</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# ### Test removing reporters</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# no stats reporter statsd statsd-foo</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# no stats reporter log log-bar</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# no stats reporter log log-zoo</span><br><span style="color: hsl(120, 100%, 40%);">+stats_vty_test(config)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !(foo|bar|zoo)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> stats_vty_test(config)# stats interval 1337</span><br><span> stats_vty_test(config)# show running-config</span><br><span> ...</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/26171">change 26171</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/26171"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia815c24dc974648985539913012b3b074ea317a9 </div>
<div style="display:none"> Gerrit-Change-Number: 26171 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>