<p>Holger Hans Peter Freyther has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/20037">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res_prometheus: Do not generate broken metrics<br><br>In I58ef9f44036feded5966b5fc70ae754f8182883d invisible bridges were<br>skipped but that lead to producing metrics with no name and no help.<br><br>Keep track of the number of metrics configured and then only emit these.<br>Add a basic testcase that verifies that there is no '(NULL)' in the<br>output.<br><br>ASTERISK-30474<br><br>Change-Id: I06798d6085e3b36fdc63ab8554912f2b5bcc480b<br>---<br>M res/prometheus/bridges.c<br>M tests/test_res_prometheus.c<br>2 files changed, 73 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/37/20037/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/res/prometheus/bridges.c b/res/prometheus/bridges.c</span><br><span>index 505dab8..a0ca9f7 100644</span><br><span>--- a/res/prometheus/bridges.c</span><br><span>+++ b/res/prometheus/bridges.c</span><br><span>@@ -83,7 +83,7 @@</span><br><span>  struct ast_bridge *bridge;</span><br><span>   struct prometheus_metric *bridge_metrics;</span><br><span>    char eid_str[32];</span><br><span style="color: hsl(0, 100%, 40%);">-       int i, j, num_bridges;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j, num_bridges, num_outputs = 0;</span><br><span>      struct prometheus_metric bridge_count = PROMETHEUS_METRIC_STATIC_INITIALIZATION(</span><br><span>             PROMETHEUS_METRIC_GAUGE,</span><br><span>             "asterisk_bridges_count",</span><br><span>@@ -138,7 +138,7 @@</span><br><span>            }</span><br><span> </span><br><span>                for (j = 0; j < ARRAY_LEN(bridge_metric_defs); j++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        int index = i * ARRAY_LEN(bridge_metric_defs) + j;</span><br><span style="color: hsl(120, 100%, 40%);">+                    int index = num_outputs++;</span><br><span> </span><br><span>                       bridge_metrics[index].type = PROMETHEUS_METRIC_GAUGE;</span><br><span>                        ast_copy_string(bridge_metrics[index].name, bridge_metric_defs[j].name, sizeof(bridge_metrics[index].name));</span><br><span>@@ -159,7 +159,7 @@</span><br><span>   }</span><br><span>    ao2_iterator_destroy(&it_bridges);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      for (j = 0; j < ARRAY_LEN(bridge_metric_defs); j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+      for (j = 0; j < num_outputs; j++) {</span><br><span>               prometheus_metric_to_string(&bridge_metrics[j], response);</span><br><span>       }</span><br><span> </span><br><span>diff --git a/tests/test_res_prometheus.c b/tests/test_res_prometheus.c</span><br><span>index 4df4cb9..2e0f501 100644</span><br><span>--- a/tests/test_res_prometheus.c</span><br><span>+++ b/tests/test_res_prometheus.c</span><br><span>@@ -29,8 +29,11 @@</span><br><span> </span><br><span> #include "asterisk/test.h"</span><br><span> #include "asterisk/module.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/bridge.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/bridge_basic.h"</span><br><span> #include "asterisk/config.h"</span><br><span> #include "asterisk/res_prometheus.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "../res/prometheus/prometheus_internal.h"</span><br><span> </span><br><span> #define CATEGORY "/res/prometheus/"</span><br><span> </span><br><span>@@ -699,6 +702,51 @@</span><br><span>    return AST_TEST_PASS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void safe_bridge_destroy(struct ast_bridge *bridge)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bridge) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_bridge_destroy(bridge, 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%);">+AST_TEST_DEFINE(bridge_to_string)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     RAII_VAR(struct ast_bridge *, bridge1, NULL, safe_bridge_destroy);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct ast_bridge *, bridge2, NULL, safe_bridge_destroy);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct ast_str *response;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case TEST_INIT:</span><br><span style="color: hsl(120, 100%, 40%);">+               info->name = __func__;</span><br><span style="color: hsl(120, 100%, 40%);">+             info->category = CATEGORY;</span><br><span style="color: hsl(120, 100%, 40%);">+         info->summary = "Test producing bridge metrics";</span><br><span style="color: hsl(120, 100%, 40%);">+         info->description =</span><br><span style="color: hsl(120, 100%, 40%);">+                        "This test covers checking the metrics produced by the\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                   "bridge support of the basic Promtheus module.";</span><br><span style="color: hsl(120, 100%, 40%);">+            return AST_TEST_NOT_RUN;</span><br><span style="color: hsl(120, 100%, 40%);">+      case TEST_EXECUTE:</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</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%);">+   bridge1 = ast_bridge_basic_new();</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_test_validate(test, bridge1 != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   bridge2 = ast_bridge_base_new(AST_BRIDGE_CAPABILITY_HOLDING,</span><br><span style="color: hsl(120, 100%, 40%);">+          AST_BRIDGE_FLAG_INVISIBLE,</span><br><span style="color: hsl(120, 100%, 40%);">+            "test_res_prometheus", "test_bridge_invisible", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  response = prometheus_scrape_to_string();</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!response) {</span><br><span style="color: hsl(120, 100%, 40%);">+              return AST_TEST_FAIL;</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%);">+   ast_test_status_update(test, " -> Retrieved: %s\n", ast_str_buffer(response));</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_test_validate(test, strstr(ast_str_buffer(response), "(null)") == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        ast_free(response);</span><br><span style="color: hsl(120, 100%, 40%);">+   return AST_TEST_PASS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int process_config(int reload)</span><br><span> {</span><br><span>     struct ast_config *config;</span><br><span>@@ -791,6 +839,8 @@</span><br><span>     AST_TEST_UNREGISTER(config_general_basic_auth);</span><br><span>      AST_TEST_UNREGISTER(config_general_core_metrics);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ AST_TEST_UNREGISTER(bridge_to_string);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -813,6 +863,8 @@</span><br><span>     AST_TEST_REGISTER(config_general_basic_auth);</span><br><span>        AST_TEST_REGISTER(config_general_core_metrics);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   AST_TEST_REGISTER(bridge_to_string);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       ast_test_register_init(CATEGORY, &test_init_cb);</span><br><span>         ast_test_register_cleanup(CATEGORY, &test_cleanup_cb);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/20037">change 20037</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.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.asterisk.org/c/asterisk/+/20037"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 20 </div>
<div style="display:none"> Gerrit-Change-Id: I06798d6085e3b36fdc63ab8554912f2b5bcc480b </div>
<div style="display:none"> Gerrit-Change-Number: 20037 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Holger Hans Peter Freyther <automatic@freyther.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>