<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/25041">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgcp_ratectr: add stats items to monitor trunk usage<br><br>We are currently counting events in rate counters, but there is<br>currently no way to get a sample of the current situation of the trunk<br>usage. In particular how many endpoints are currently in use.<br><br>This is a corrected version of:<br>Ib7b654168dc3512f55e45cc4755dc1f6f423d023<br><br>Change-Id: I6d3a74f6087512130d85002348787bffc672de81<br>Related: SYS#5535<br>---<br>M include/osmocom/mgcp/mgcp_ratectr.h<br>M include/osmocom/mgcp/mgcp_trunk.h<br>M src/libosmo-mgcp/mgcp_endp.c<br>M src/libosmo-mgcp/mgcp_ratectr.c<br>M src/libosmo-mgcp/mgcp_trunk.c<br>M tests/mgcp/mgcp_test.c<br>6 files changed, 101 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/41/25041/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/mgcp/mgcp_ratectr.h b/include/osmocom/mgcp/mgcp_ratectr.h</span><br><span>index 4c01059..5212f9b 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_ratectr.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_ratectr.h</span><br><span>@@ -94,3 +94,17 @@</span><br><span> </span><br><span> int mgcp_ratectr_global_alloc(struct mgcp_config *cfg);</span><br><span> int mgcp_ratectr_trunk_alloc(struct mgcp_trunk *trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Trunk-global common stat items */</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRUNK_STAT_ENDPOINTS_TOTAL,</span><br><span style="color: hsl(120, 100%, 40%);">+   TRUNK_STAT_ENDPOINTS_USED,</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%);">+struct mgcp_stat_trunk {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Stat item group which contains general status values of the trunk. */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_stat_item_group *common;</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%);">+int mgcp_stat_trunk_alloc(struct mgcp_trunk *trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/include/osmocom/mgcp/mgcp_trunk.h b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>index 048ac5b..d960428 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>@@ -52,8 +52,9 @@</span><br><span>      unsigned int number_endpoints;</span><br><span>       struct mgcp_endpoint **endpoints;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* global rate counters to measure the trunks overall performance and health */</span><br><span style="color: hsl(120, 100%, 40%);">+       /* rate counters and stat items to measure the trunks overall performance and health */</span><br><span>      struct mgcp_ratectr_trunk ratectr;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mgcp_stat_trunk stats;</span><br><span> </span><br><span>    union {</span><br><span>              /* Virtual trunk specific */</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_endp.c b/src/libosmo-mgcp/mgcp_endp.c</span><br><span>index 41e0d4f..c304013 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_endp.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_endp.c</span><br><span>@@ -29,6 +29,7 @@</span><br><span> </span><br><span> #include <osmocom/abis/e1_input.h></span><br><span> #include <osmocom/mgcp/mgcp_e1.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span> </span><br><span> #define E1_RATE_MAX 64</span><br><span> #define E1_OFFS_MAX 8</span><br><span>@@ -122,6 +123,12 @@</span><br><span>     * RSIP is executed), free them all at once. */</span><br><span>      mgcp_conn_free_all(endp);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* We must only decrement the stat item when the endpoint as actually</span><br><span style="color: hsl(120, 100%, 40%);">+  * claimed. An endpoint is claimed when a call-id is set */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (endp->callid)</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_stat_item_dec(osmo_stat_item_group_get_item(endp->trunk->stats.common,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              TRUNK_STAT_ENDPOINTS_USED), 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* Reset endpoint parameters and states */</span><br><span>   talloc_free(endp->callid);</span><br><span>        endp->callid = NULL;</span><br><span>@@ -628,6 +635,8 @@</span><br><span>         * connection ids) */</span><br><span>        endp->callid = talloc_strdup(endp, callid);</span><br><span>       OSMO_ASSERT(endp->callid);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_inc(osmo_stat_item_group_get_item(endp->trunk->stats.common,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      TRUNK_STAT_ENDPOINTS_USED), 1);</span><br><span> </span><br><span>         /* Allocate resources */</span><br><span>     switch (endp->trunk->trunk_type) {</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_ratectr.c b/src/libosmo-mgcp/mgcp_ratectr.c</span><br><span>index 3c3b5db..d8e0374 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_ratectr.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_ratectr.c</span><br><span>@@ -24,8 +24,11 @@</span><br><span> </span><br><span> #include <errno.h></span><br><span> #include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span> #include <osmocom/mgcp/mgcp_conn.h></span><br><span> #include <osmocom/mgcp/mgcp_trunk.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/mgcp/mgcp_protocol.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/mgcp/mgcp_endp.h></span><br><span> #include <osmocom/mgcp/mgcp_ratectr.h></span><br><span> </span><br><span> static const struct rate_ctr_desc mgcp_general_ctr_desc[] = {</span><br><span>@@ -247,3 +250,48 @@</span><br><span>  }</span><br><span>    return 0;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct osmo_stat_item_desc trunk_stat_desc[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      [TRUNK_STAT_ENDPOINTS_TOTAL] = { "endpoints:total",</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "Number of endpoints that exist on the trunk",</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "", 60, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+       [TRUNK_STAT_ENDPOINTS_USED] = { "endpoints:used",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "Number of endpoints in use",</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "", 60, 0 },</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%);">+const struct osmo_stat_item_group_desc trunk_statg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+     .group_name_prefix = "trunk",</span><br><span style="color: hsl(120, 100%, 40%);">+       .group_description = "mgw trunk",</span><br><span style="color: hsl(120, 100%, 40%);">+   .class_id = OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_items = ARRAY_SIZE(trunk_stat_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+     .item_desc = trunk_stat_desc,</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%);">+static int free_stat_item_group(struct osmo_stat_item_group *stat_item_group)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_group_free(stat_item_group);</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</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%);">+/*! allocate trunk specific stat items</span><br><span style="color: hsl(120, 100%, 40%);">+ *  (called once on trunk initialization).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] trunk for which the stat items are allocated.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success, -EINVAL on failure. */</span><br><span style="color: hsl(120, 100%, 40%);">+int mgcp_stat_trunk_alloc(struct mgcp_trunk *trunk)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct mgcp_stat_trunk *stats = &trunk->stats;</span><br><span style="color: hsl(120, 100%, 40%);">+ static unsigned int common_stat_index = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    char stat_name[256];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        stats->common = osmo_stat_item_group_alloc(trunk, &trunk_statg_desc, common_stat_index);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!stats->common)</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       snprintf(stat_name, sizeof(stat_name), "%s-%u:common", mgcp_trunk_type_strs_str(trunk->trunk_type),</span><br><span style="color: hsl(120, 100%, 40%);">+               trunk->trunk_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_group_set_name(stats->common, stat_name);</span><br><span style="color: hsl(120, 100%, 40%);">+   talloc_set_destructor(stats->common, free_stat_item_group);</span><br><span style="color: hsl(120, 100%, 40%);">+        common_stat_index++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_trunk.c b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>index 27663b4..b2d1969 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>@@ -27,6 +27,7 @@</span><br><span> #include <osmocom/mgcp/mgcp_trunk.h></span><br><span> #include <osmocom/mgcp/mgcp_e1.h></span><br><span> #include <osmocom/abis/e1_input.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span> </span><br><span> const struct value_string mgcp_trunk_type_strs[] = {</span><br><span>        { MGCP_TRUNK_VIRTUAL,           "virtual" },</span><br><span>@@ -64,6 +65,7 @@</span><br><span>   llist_add_tail(&trunk->entry, &cfg->trunks);</span><br><span> </span><br><span>       mgcp_ratectr_trunk_alloc(trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+      mgcp_stat_trunk_alloc(trunk);</span><br><span> </span><br><span>    return trunk;</span><br><span> }</span><br><span>@@ -127,7 +129,8 @@</span><br><span> </span><br><span>         /* make the endpoints we just created available to the MGW code */</span><br><span>   trunk->number_endpoints = number_endpoints;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stat_item_set(osmo_stat_item_group_get_item(trunk->stats.common, TRUNK_STAT_ENDPOINTS_TOTAL),</span><br><span style="color: hsl(120, 100%, 40%);">+                    trunk->number_endpoints);</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c</span><br><span>index bcbcc02..26fcc2a 100644</span><br><span>--- a/tests/mgcp/mgcp_test.c</span><br><span>+++ b/tests/mgcp/mgcp_test.c</span><br><span>@@ -1065,20 +1065,20 @@</span><br><span>    int i;</span><br><span>       struct mgcp_endpoint endp;</span><br><span>   struct mgcp_endpoint *endpoints[1];</span><br><span style="color: hsl(0, 100%, 40%);">-     struct mgcp_config cfg = {0};</span><br><span style="color: hsl(0, 100%, 40%);">-   struct mgcp_trunk trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_config *cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_trunk *trunk;</span><br><span> </span><br><span>        printf("Testing packet loss calculation.\n");</span><br><span> </span><br><span>  memset(&endp, 0, sizeof(endp));</span><br><span style="color: hsl(0, 100%, 40%);">-     memset(&trunk, 0, sizeof(trunk));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   endp.cfg = &cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+  cfg = mgcp_config_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk = mgcp_trunk_alloc(cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+        endp.cfg = cfg;</span><br><span>      endp.type = &ep_typeset.rtp;</span><br><span style="color: hsl(0, 100%, 40%);">-        trunk.v.vty_number_endpoints = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       trunk.endpoints = endpoints;</span><br><span style="color: hsl(0, 100%, 40%);">-    trunk.endpoints[0] = &endp;</span><br><span style="color: hsl(0, 100%, 40%);">- endp.trunk = &trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->v.vty_number_endpoints = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ trunk->endpoints = endpoints;</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->endpoints[0] = &endp;</span><br><span style="color: hsl(120, 100%, 40%);">+   endp.trunk = trunk;</span><br><span>  INIT_LLIST_HEAD(&endp.conns);</span><br><span> </span><br><span>        for (i = 0; i < ARRAY_SIZE(pl_test_dat); ++i) {</span><br><span>@@ -1116,6 +1116,8 @@</span><br><span>           mgcp_conn_free_all(&endp);</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span> int mgcp_parse_stats(struct msgb *msg, uint32_t *ps, uint32_t *os,</span><br><span>@@ -1297,10 +1299,10 @@</span><br><span> {</span><br><span>      int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      struct mgcp_trunk trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_trunk *trunk;</span><br><span>    struct mgcp_endpoint endp;</span><br><span>   struct mgcp_endpoint *endpoints[1];</span><br><span style="color: hsl(0, 100%, 40%);">-     struct mgcp_config cfg = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_config *cfg;</span><br><span>     struct mgcp_rtp_state state;</span><br><span>         struct mgcp_rtp_end *rtp;</span><br><span>    struct osmo_sockaddr addr = { 0 };</span><br><span>@@ -1318,7 +1320,8 @@</span><br><span>          patch_ssrc ? ", patch SSRC" : "",</span><br><span>                patch_ts ? ", patch timestamps" : "");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   memset(&trunk, 0, sizeof(trunk));</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg = mgcp_config_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk = mgcp_trunk_alloc(cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);</span><br><span>       memset(&endp, 0, sizeof(endp));</span><br><span>  memset(&state, 0, sizeof(state));</span><br><span> </span><br><span>@@ -1327,16 +1330,16 @@</span><br><span>  state.in_stream.err_ts_ctr = &test_ctr_in;</span><br><span>       state.out_stream.err_ts_ctr = &test_ctr_out;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    endp.cfg = &cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+  endp.cfg = cfg;</span><br><span>      endp.type = &ep_typeset.rtp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    trunk.v.vty_number_endpoints = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       trunk.endpoints = endpoints;</span><br><span style="color: hsl(0, 100%, 40%);">-    trunk.endpoints[0] = &endp;</span><br><span style="color: hsl(0, 100%, 40%);">- trunk.force_constant_ssrc = patch_ssrc;</span><br><span style="color: hsl(0, 100%, 40%);">- trunk.force_aligned_timing = patch_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+        trunk->v.vty_number_endpoints = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ trunk->endpoints = endpoints;</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->endpoints[0] = &endp;</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk->force_constant_ssrc = patch_ssrc;</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk->force_aligned_timing = patch_ts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  endp.trunk = &trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+      endp.trunk = trunk;</span><br><span> </span><br><span>      INIT_LLIST_HEAD(&endp.conns);</span><br><span>    _conn = mgcp_conn_alloc(NULL, &endp, MGCP_CONN_TYPE_RTP,</span><br><span>@@ -1395,6 +1398,8 @@</span><br><span> </span><br><span>     force_monotonic_time_us = -1;</span><br><span>        mgcp_conn_free_all(&endp);</span><br><span style="color: hsl(120, 100%, 40%);">+        talloc_free(trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span> static void test_multilple_codec(void)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/25041">change 25041</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-mgw/+/25041"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-mgw </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6d3a74f6087512130d85002348787bffc672de81 </div>
<div style="display:none"> Gerrit-Change-Number: 25041 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>