<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24942">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>Change-Id: Ib7b654168dc3512f55e45cc4755dc1f6f423d023<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>5 files changed, 87 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/42/24942/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 78c687b..70c3e6c 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_ratectr.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_ratectr.h</span><br><span>@@ -95,3 +95,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%);">+void mgcp_stat_trunk_update(struct mgcp_trunk *trunk);</span><br><span>diff --git a/include/osmocom/mgcp/mgcp_trunk.h b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>index 326b16a..c0e06cb 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 ddfd6cf..95709a5 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_endp.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_endp.c</span><br><span>@@ -133,6 +133,9 @@</span><br><span> </span><br><span>  if (endp->trunk->trunk_type == MGCP_TRUNK_E1)</span><br><span>          mgcp_e1_endp_release(endp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Make sure trunk related stats items are updated */</span><br><span style="color: hsl(120, 100%, 40%);">+ mgcp_stat_trunk_update(endp->trunk);</span><br><span> }</span><br><span> </span><br><span> /* Check if the endpoint name contains the prefix (e.g. "rtpbridge/" or</span><br><span>@@ -653,6 +656,9 @@</span><br><span>          OSMO_ASSERT(false);</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Make sure trunk related stats items are updated */</span><br><span style="color: hsl(120, 100%, 40%);">+ mgcp_stat_trunk_update(endp->trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* Make sure the endpoint is released when claiming the endpoint fails. */</span><br><span>   if (rc < 0)</span><br><span>               mgcp_endp_release(endp);</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_ratectr.c b/src/libosmo-mgcp/mgcp_ratectr.c</span><br><span>index af1526a..fdecc7c 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>@@ -248,3 +251,62 @@</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%);">+/*! 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-%d: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%);">+   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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! update trunk specific stat items for a given trunk</span><br><span style="color: hsl(120, 100%, 40%);">+ *  (called after every request that might change the trunk state).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] trunk to update.</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%);">+void mgcp_stat_trunk_update(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%);">+ unsigned int endpoints_in_use = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int i;</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(stats->common, TRUNK_STAT_ENDPOINTS_TOTAL),</span><br><span style="color: hsl(120, 100%, 40%);">+                          trunk->number_endpoints);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < trunk->number_endpoints; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (trunk->endpoints[i]->callid)</span><br><span style="color: hsl(120, 100%, 40%);">+                        endpoints_in_use++;</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(stats->common, TRUNK_STAT_ENDPOINTS_USED), endpoints_in_use);</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 08f99b3..b6d93a9 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>@@ -64,6 +64,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>@@ -128,6 +129,8 @@</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> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* inital update of the stats items */</span><br><span style="color: hsl(120, 100%, 40%);">+        mgcp_stat_trunk_update(trunk);</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24942">change 24942</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/+/24942"/><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: Ib7b654168dc3512f55e45cc4755dc1f6f423d023 </div>
<div style="display:none"> Gerrit-Change-Number: 24942 </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>