<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>