<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25274">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  neels: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve
  osmith: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add stat_items for BTS and TRX connection stati<br><br>So far we have stat items per BTS. Add stat items summing overall BTS<br>status.<br><br>Add stat items:<br>- num_bts:oml_connected<br>- num_bts:all_trx_rsl_connected<br>- num_bts:total<br>- num_trx:rsl_connected<br>- num_trx:total<br><br>Related: SYS#5542<br>Related: Ic1b35b7406547f92818afe399a2383d154576409 (osmo-ttcn3-hacks)<br>Change-Id: I2057a798e681a169cc03243a09b3d6449734c010<br>---<br>M include/osmocom/bsc/bsc_stats.h<br>M src/osmo-bsc/bsc_stats.c<br>M src/osmo-bsc/bts_vty.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>4 files changed, 80 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bsc_stats.h b/include/osmocom/bsc/bsc_stats.h</span><br><span>index 639f87f..4250079 100644</span><br><span>--- a/include/osmocom/bsc/bsc_stats.h</span><br><span>+++ b/include/osmocom/bsc/bsc_stats.h</span><br><span>@@ -21,6 +21,7 @@</span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span> </span><br><span> struct osmo_stat_item_group_desc;</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_network;</span><br><span> </span><br><span> /* OsmoBSC rate_ctr indexes */</span><br><span> enum {</span><br><span>@@ -87,7 +88,11 @@</span><br><span> </span><br><span> /* OsmoBSC stat_item indexes */</span><br><span> enum {</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_STAT_NUM_BTS_OML_CONNECTED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_STAT_NUM_BTS_ALL_TRX_RSL_CONNECTED,</span><br><span>      BSC_STAT_NUM_BTS_TOTAL,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_STAT_NUM_TRX_RSL_CONNECTED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_STAT_NUM_TRX_TOTAL,</span><br><span>      BSC_STAT_NUM_MSC_CONNECTED,</span><br><span>  BSC_STAT_NUM_MSC_TOTAL,</span><br><span> };</span><br><span>@@ -98,3 +103,5 @@</span><br><span> #define BTS_STAT_IDX_UNKNOWN (UINT16_MAX + 1)</span><br><span> </span><br><span> extern const struct osmo_stat_item_group_desc bsc_statg_desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_update_connection_stats(struct gsm_network *net);</span><br><span>diff --git a/src/osmo-bsc/bsc_stats.c b/src/osmo-bsc/bsc_stats.c</span><br><span>index 36d38c2..f33e6c8 100644</span><br><span>--- a/src/osmo-bsc/bsc_stats.c</span><br><span>+++ b/src/osmo-bsc/bsc_stats.c</span><br><span>@@ -23,6 +23,9 @@</span><br><span> #include <osmocom/core/stats.h></span><br><span> #include <osmocom/core/stat_item.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const struct rate_ctr_desc bsc_ctr_description[] = {</span><br><span>     [BSC_CTR_ASSIGNMENT_ATTEMPTED] =        {"assignment:attempted", "Assignment attempts"},</span><br><span>         [BSC_CTR_ASSIGNMENT_COMPLETED] =        {"assignment:completed", "Assignment completed"},</span><br><span>@@ -110,7 +113,11 @@</span><br><span> };</span><br><span> </span><br><span> static const struct osmo_stat_item_desc bsc_stat_desc[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_STAT_NUM_BTS_OML_CONNECTED] = { "num_bts:oml_connected", "Number of BTS for this BSC where OML is up", "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+        [BSC_STAT_NUM_BTS_ALL_TRX_RSL_CONNECTED] = { "num_bts:all_trx_rsl_connected", "Number of BTS for this BSC where RSL is up for all TRX", "", 16, 0 },</span><br><span>   [BSC_STAT_NUM_BTS_TOTAL] = { "num_bts:total", "Number of configured BTS for this BSC", "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_STAT_NUM_TRX_RSL_CONNECTED] = { "num_trx:rsl_connected", "Number of TRX where RSL is up, total sum across all BTS", "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BSC_STAT_NUM_TRX_TOTAL] = { "num_trx:total", "Number of configured TRX, total sum across all BTS", "", 1, 0 },</span><br><span>        [BSC_STAT_NUM_MSC_CONNECTED] = { "num_msc:connected", "Number of actively connected MSCs", "", 16, 0 },</span><br><span>        [BSC_STAT_NUM_MSC_TOTAL] = { "num_msc:total", "Number of configured MSCs, not necessarily connected", "", 1, 0 },</span><br><span> };</span><br><span>@@ -122,3 +129,55 @@</span><br><span>         .num_items = ARRAY_SIZE(bsc_stat_desc),</span><br><span>      .item_desc = bsc_stat_desc,</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Count all BTS and TRX OML and RSL stati and update stat items */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_update_connection_stats(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Nr of configured BTS and total sum of configured TRX across all BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+     int num_bts = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int num_trx_total = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Nr of BTS where OML is up */</span><br><span style="color: hsl(120, 100%, 40%);">+       int bts_oml_connected = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Nr of TRX across all BTS where RSL is up */</span><br><span style="color: hsl(120, 100%, 40%);">+        int trx_rsl_connected_total = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Nr of BTS that have all TRX RSL up */</span><br><span style="color: hsl(120, 100%, 40%);">+      int bts_rsl_all_trx_connected = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &net->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bool oml_connected = false;</span><br><span style="color: hsl(120, 100%, 40%);">+           int num_trx = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              int trx_rsl_connected = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* If any one trx is usable, it means OML for this BTS is connected */</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (trx_is_usable(trx))</span><br><span style="color: hsl(120, 100%, 40%);">+                               oml_connected = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Count nr of TRX for this BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+                    num_trx++;</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (trx->ts[0].is_rsl_ready)</span><br><span style="color: hsl(120, 100%, 40%);">+                               trx_rsl_connected++;</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%);">+           num_trx_total += num_trx;</span><br><span style="color: hsl(120, 100%, 40%);">+             trx_rsl_connected_total += trx_rsl_connected;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               num_bts++;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (oml_connected)</span><br><span style="color: hsl(120, 100%, 40%);">+                    bts_oml_connected++;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (trx_rsl_connected == num_trx)</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_rsl_all_trx_connected++;</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%);">+   osmo_stat_item_set(osmo_stat_item_group_get_item(net->bsc_statg, BSC_STAT_NUM_BTS_OML_CONNECTED),</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_oml_connected);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stat_item_set(osmo_stat_item_group_get_item(net->bsc_statg, BSC_STAT_NUM_BTS_ALL_TRX_RSL_CONNECTED),</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_rsl_all_trx_connected);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stat_item_set(osmo_stat_item_group_get_item(net->bsc_statg, BSC_STAT_NUM_BTS_TOTAL), num_bts);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stat_item_set(osmo_stat_item_group_get_item(net->bsc_statg, BSC_STAT_NUM_TRX_RSL_CONNECTED),</span><br><span style="color: hsl(120, 100%, 40%);">+                     trx_rsl_connected_total);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_stat_item_set(osmo_stat_item_group_get_item(net->bsc_statg, BSC_STAT_NUM_TRX_TOTAL), num_trx_total);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c</span><br><span>index bd06463..ebc11b5 100644</span><br><span>--- a/src/osmo-bsc/bts_vty.c</span><br><span>+++ b/src/osmo-bsc/bts_vty.c</span><br><span>@@ -123,7 +123,6 @@</span><br><span>           /* allocate a new one */</span><br><span>             bts = bsc_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,</span><br><span>                                        HARDCODED_BSIC);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_inc(osmo_stat_item_group_get_item(gsmnet->bsc_statg, BSC_STAT_NUM_BTS_TOTAL), 1);</span><br><span>  } else</span><br><span>               bts = gsm_bts_num(gsmnet, bts_nr);</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index 14cbc22..395a60e 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -380,6 +380,18 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_timer_list update_connection_stats_timer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Periodically call bsc_update_connection_stats() to keep stat items updated.</span><br><span style="color: hsl(120, 100%, 40%);">+ * It would be nicer to trigger this only when OML or RSL state is seen to flip. I tried hard to find all code paths</span><br><span style="color: hsl(120, 100%, 40%);">+ * that should call this and failed to get accurate results; this trivial timer covers all of them. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void update_connection_stats_cb(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      bsc_update_connection_stats(bsc_gsmnet);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_timer_setup(&update_connection_stats_timer, update_connection_stats_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_timer_schedule(&update_connection_stats_timer, 1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Callback function to be called every time we receive a signal from INPUT */</span><br><span> static int inp_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span>                   void *handler_data, void *signal_data)</span><br><span>@@ -1058,6 +1070,8 @@</span><br><span>         signal(SIGUSR2, &signal_handler);</span><br><span>        osmo_init_ignore_signals();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       update_connection_stats_cb(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (daemonize) {</span><br><span>             rc = osmo_daemonize();</span><br><span>               if (rc < 0) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25274">change 25274</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/osmo-bsc/+/25274"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2057a798e681a169cc03243a09b3d6449734c010 </div>
<div style="display:none"> Gerrit-Change-Number: 25274 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>