<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20306">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: add rate_ctr_group to log_target<br><br>This way we account for the number of dropped log messages at<br>write_queue overflow.   However, log targets have no numerical<br>ID and hence we're not able to extract them in a reasonable manner.<br><br>Change-Id: I89b696311b823267e05d6a3e85b92c1784b220ed<br>---<br>M include/osmocom/core/logging.h<br>M src/logging.c<br>M tests/ctrl/ctrl_test.c<br>3 files changed, 43 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/06/20306/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h</span><br><span>index 94788af..410a95e 100644</span><br><span>--- a/include/osmocom/core/logging.h</span><br><span>+++ b/include/osmocom/core/logging.h</span><br><span>@@ -10,6 +10,7 @@</span><br><span> #include <stdbool.h></span><br><span> #include <osmocom/core/defs.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> </span><br><span> /*! Maximum number of logging contexts */</span><br><span> #define LOG_MAX_CTX             8</span><br><span>@@ -350,6 +351,9 @@</span><br><span>      enum log_filename_type print_filename2;</span><br><span>      /* Where on a log line to put the source file info. */</span><br><span>       enum log_filename_pos print_filename_pos;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Rate counters related to this target */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct rate_ctr_group *ctrg;</span><br><span> };</span><br><span> </span><br><span> /* use the above macros */</span><br><span>diff --git a/src/logging.c b/src/logging.c</span><br><span>index 952c350..8f52a43 100644</span><br><span>--- a/src/logging.c</span><br><span>+++ b/src/logging.c</span><br><span>@@ -59,6 +59,8 @@</span><br><span> #include <osmocom/core/timer.h></span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/write_queue.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> </span><br><span> #include <osmocom/vty/logging.h>      /* for LOGGING_STR. */</span><br><span> </span><br><span>@@ -81,6 +83,25 @@</span><br><span> void *tall_log_ctx = NULL;</span><br><span> LLIST_HEAD(osmo_log_target_list);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum tgt_ctr {</span><br><span style="color: hsl(120, 100%, 40%);">+        TGT_CTR_LOG_COUNT,</span><br><span style="color: hsl(120, 100%, 40%);">+    TGT_CTR_REOPEN_COUNT,</span><br><span style="color: hsl(120, 100%, 40%);">+ TGT_CTR_DROP_COUNT,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_desc log_target_ctr_description[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   { "writes",   "Log write count" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "repoens",  "Re-open count  " },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "drops",    "Log writes dropped due to overflow" },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_group_desc log_target_ctrg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .group_name_prefix = "log:target",</span><br><span style="color: hsl(120, 100%, 40%);">+  .group_description = "Log Target Statistics",</span><br><span style="color: hsl(120, 100%, 40%);">+       .num_ctr = ARRAY_SIZE(log_target_ctr_description),</span><br><span style="color: hsl(120, 100%, 40%);">+    .ctr_desc = log_target_ctr_description,</span><br><span style="color: hsl(120, 100%, 40%);">+       .class_id = OSMO_STATS_CLASS_GLOBAL,</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> #if (!EMBEDDED)</span><br><span> /*! This mutex must be held while using osmo_log_target_list or any of its</span><br><span>   log_targets in a multithread program. Prevents race conditions between threads</span><br><span>@@ -636,6 +657,8 @@</span><br><span>              if (!should_log_to_target(tar, subsys, level))</span><br><span>                       continue;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_inc(&tar->ctrg->ctr[TGT_CTR_LOG_COUNT]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                /* According to the manpage, vsnprintf leaves the value of ap</span><br><span>                 * in undefined state. Since _output uses vsnprintf and it may</span><br><span>                * be called several times, we have to pass a copy of ap. */</span><br><span>@@ -880,6 +903,7 @@</span><br><span>                        int line, int cont, const char *format, va_list ap)</span><br><span> {</span><br><span>        struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span> </span><br><span>  OSMO_ASSERT(target->tgt_file.wqueue);</span><br><span>     msg = msgb_alloc_c(target->tgt_file.wqueue, MAX_LOG_SIZE, "log_file_msg");</span><br><span>@@ -891,10 +915,14 @@</span><br><span>       * and call _file_wq_write_cb() */</span><br><span>   rc = _output_buf((char *)msgb_data(msg), msgb_tailroom(msg), target, subsys, level, file, line, cont, format, ap);</span><br><span>   msgb_put(msg, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_wqueue_enqueue_quiet(target->tgt_file.wqueue, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = osmo_wqueue_enqueue_quiet(target->tgt_file.wqueue, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(&target->ctrg->ctr[TGT_CTR_DROP_COUNT]);</span><br><span> }</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int log_target_ctrg_idx = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Create a new log target skeleton</span><br><span>  *  \returns dynamically-allocated log target</span><br><span>  *  This funcition allocates a \ref log_target and initializes it</span><br><span>@@ -919,6 +947,12 @@</span><br><span>               talloc_free(target);</span><br><span>                 return NULL;</span><br><span>         }</span><br><span style="color: hsl(120, 100%, 40%);">+     target->ctrg = rate_ctr_group_alloc(target, &log_target_ctrg_desc, log_target_ctrg_idx++);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!target->ctrg) {</span><br><span style="color: hsl(120, 100%, 40%);">+               talloc_free(target->categories);</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(target);</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&target->entry);</span><br><span> </span><br><span>@@ -1189,6 +1223,7 @@</span><br><span>  }</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       rate_ctr_group_free(target->ctrg);</span><br><span>        talloc_free(target);</span><br><span> }</span><br><span> </span><br><span>@@ -1225,6 +1260,7 @@</span><br><span>                        return rc;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc(&target->ctrg->ctr[TGT_CTR_REOPEN_COUNT]);</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/ctrl/ctrl_test.c b/tests/ctrl/ctrl_test.c</span><br><span>index b46e9ac..06e5d2c 100644</span><br><span>--- a/tests/ctrl/ctrl_test.c</span><br><span>+++ b/tests/ctrl/ctrl_test.c</span><br><span>@@ -478,8 +478,8 @@</span><br><span> </span><br><span>    test_deferred_cmd();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* Expecting root ctx + msgb root ctx + 5 logging elements */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (talloc_total_blocks(ctx) != 7) {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Expecting root ctx + msgb root ctx + 6 logging elements */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (talloc_total_blocks(ctx) != 8) {</span><br><span>                 talloc_report_full(ctx, stdout);</span><br><span>             OSMO_ASSERT(false);</span><br><span>  }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/20306">change 20306</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/libosmocore/+/20306"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I89b696311b823267e05d6a3e85b92c1784b220ed </div>
<div style="display:none"> Gerrit-Change-Number: 20306 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>