[tor-commits] [tor/master] metrics: New feature module to track tor metrics

ahf at torproject.org ahf at torproject.org
Tue Oct 27 15:00:48 UTC 2020


commit a882d1bf0abbbcf2bc4f8c039f9b82262462292c
Author: David Goulet <dgoulet at torproject.org>
Date:   Mon Oct 19 15:50:45 2020 -0400

    metrics: New feature module to track tor metrics
    
    Related to #40063
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 src/app/main/subsystem_list.c     |  2 ++
 src/feature/metrics/.may_include  |  1 +
 src/feature/metrics/include.am    | 10 ++++++
 src/feature/metrics/metrics.c     | 66 +++++++++++++++++++++++++++++++++++++++
 src/feature/metrics/metrics.h     | 21 +++++++++++++
 src/feature/metrics/metrics_sys.c | 37 ++++++++++++++++++++++
 src/feature/metrics/metrics_sys.h | 22 +++++++++++++
 src/include.am                    |  1 +
 src/lib/subsys/subsys.h           | 12 +++++++
 9 files changed, 172 insertions(+)

diff --git a/src/app/main/subsystem_list.c b/src/app/main/subsystem_list.c
index c6da6f4893..9562b99030 100644
--- a/src/app/main/subsystem_list.c
+++ b/src/app/main/subsystem_list.c
@@ -31,6 +31,7 @@
 #include "lib/evloop/evloop_sys.h"
 
 #include "feature/dirauth/dirauth_sys.h"
+#include "feature/metrics/metrics_sys.h"
 #include "feature/relay/relay_sys.h"
 
 #include <stddef.h>
@@ -68,6 +69,7 @@ const subsys_fns_t *tor_subsystems[] = {
   &sys_btrack,
 
   &sys_dirauth,
+  &sys_metrics,
 };
 
 const unsigned n_tor_subsystems = ARRAY_LENGTH(tor_subsystems);
diff --git a/src/feature/metrics/.may_include b/src/feature/metrics/.may_include
new file mode 100644
index 0000000000..424c745c12
--- /dev/null
+++ b/src/feature/metrics/.may_include
@@ -0,0 +1 @@
+*.h
diff --git a/src/feature/metrics/include.am b/src/feature/metrics/include.am
new file mode 100644
index 0000000000..0e875f43ad
--- /dev/null
+++ b/src/feature/metrics/include.am
@@ -0,0 +1,10 @@
+
+# ADD_C_FILE: INSERT SOURCES HERE.
+LIBTOR_APP_A_SOURCES +=		\
+	src/feature/metrics/metrics.c		\
+	src/feature/metrics/metrics_sys.c
+
+# ADD_C_FILE: INSERT HEADERS HERE.
+noinst_HEADERS +=		\
+	src/feature/metrics/metrics.h		\
+	src/feature/metrics/metrics_sys.h
diff --git a/src/feature/metrics/metrics.c b/src/feature/metrics/metrics.c
new file mode 100644
index 0000000000..5f6fe776b7
--- /dev/null
+++ b/src/feature/metrics/metrics.c
@@ -0,0 +1,66 @@
+/* Copyright (c) 2007-2020, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * @file metrics.c
+ * @brief Metrics subsystem.
+ **/
+
+#include "orconfig.h"
+
+#include "lib/container/smartlist.h"
+#include "lib/log/util_bug.h"
+#include "lib/malloc/malloc.h"
+#include "lib/metrics/metrics_store.h"
+#include "lib/string/printf.h"
+
+#include "feature/metrics/metrics.h"
+
+#include "app/main/subsysmgr.h"
+
+/** Return newly allocated string containing the output of all subsystems
+ * having metrics.
+ *
+ * This is used to output the content on the MetricsPort. */
+char *
+metrics_get_output(const metrics_format_t fmt)
+{
+  char *data;
+  smartlist_t *chunks = smartlist_new();
+
+  /* Go over all subsystems that exposes a metrics store. */
+  for (unsigned i = 0; i < n_tor_subsystems; ++i) {
+    const smartlist_t *stores;
+    const subsys_fns_t *sys = tor_subsystems[i];
+
+    /* Skip unsupported subsystems. */
+    if (!sys->supported) {
+      continue;
+    }
+
+    if (sys->get_metrics && (stores = sys->get_metrics())) {
+      SMARTLIST_FOREACH_BEGIN(stores, const metrics_store_t *, store) {
+        smartlist_add(chunks, metrics_store_get_output(fmt, store));
+      } SMARTLIST_FOREACH_END(store);
+    }
+  }
+
+  data = smartlist_join_strings(chunks, "\n", 0, NULL);
+
+  SMARTLIST_FOREACH(chunks, char *, c, tor_free(c));
+  smartlist_free(chunks);
+
+  return data;
+}
+
+/** Initialize the subsystem. */
+void
+metrics_init(void)
+{
+}
+
+/** Cleanup and free any global memory of this subsystem. */
+void
+metrics_cleanup(void)
+{
+}
diff --git a/src/feature/metrics/metrics.h b/src/feature/metrics/metrics.h
new file mode 100644
index 0000000000..a30c271bea
--- /dev/null
+++ b/src/feature/metrics/metrics.h
@@ -0,0 +1,21 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * @file metrics.h
+ * @brief Header for feature/metrics/metrics.c
+ **/
+
+#ifndef TOR_FEATURE_METRICS_METRICS_H
+#define TOR_FEATURE_METRICS_METRICS_H
+
+#include "lib/metrics/metrics_common.h"
+
+/* Initializer / Cleanup. */
+void metrics_init(void);
+void metrics_cleanup(void);
+
+/* Accessors. */
+char *metrics_get_output(const metrics_format_t fmt);
+
+#endif /* !defined(TOR_FEATURE_METRICS_METRICS_H) */
diff --git a/src/feature/metrics/metrics_sys.c b/src/feature/metrics/metrics_sys.c
new file mode 100644
index 0000000000..419318068e
--- /dev/null
+++ b/src/feature/metrics/metrics_sys.c
@@ -0,0 +1,37 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * @file metrics_sys.c
+ * @brief Setup and tear down the metrics subsystem.
+ **/
+
+#include "lib/subsys/subsys.h"
+
+#include "feature/metrics/metrics.h"
+#include "feature/metrics/metrics_sys.h"
+
+static int
+subsys_metrics_initialize(void)
+{
+  metrics_init();
+  return 0;
+}
+
+static void
+subsys_metrics_shutdown(void)
+{
+  metrics_cleanup();
+}
+
+const subsys_fns_t sys_metrics = {
+  SUBSYS_DECLARE_LOCATION(),
+
+  .name = "metrics",
+  .supported = true,
+  .level = METRICS_SUBSYS_LEVEL,
+
+  .initialize = subsys_metrics_initialize,
+  .shutdown = subsys_metrics_shutdown,
+};
+
diff --git a/src/feature/metrics/metrics_sys.h b/src/feature/metrics/metrics_sys.h
new file mode 100644
index 0000000000..30c1b14836
--- /dev/null
+++ b/src/feature/metrics/metrics_sys.h
@@ -0,0 +1,22 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * @file metrics_sys.h
+ * @brief Header for feature/metrics/metrics_sys.c
+ **/
+
+#ifndef TOR_FEATURE_METRICS_METRICS_SYS_H
+#define TOR_FEATURE_METRICS_METRICS_SYS_H
+
+extern const struct subsys_fns_t sys_metrics;
+
+/**
+ * Subsystem level for the metrics system.
+ *
+ * Defined here so that it can be shared between the real and stub
+ * definitions.
+ **/
+#define METRICS_SUBSYS_LEVEL (99)
+
+#endif /* !defined(TOR_FEATURE_METRICS_METRICS_SYS_H) */
diff --git a/src/include.am b/src/include.am
index 95acecb057..0826da7548 100644
--- a/src/include.am
+++ b/src/include.am
@@ -73,6 +73,7 @@ include src/feature/hibernate/include.am
 include src/feature/hs_common/include.am
 include src/feature/hs/include.am
 include src/feature/keymgt/include.am
+include src/feature/metrics/include.am
 include src/feature/nodelist/include.am
 include src/feature/relay/include.am
 include src/feature/rend/include.am
diff --git a/src/lib/subsys/subsys.h b/src/lib/subsys/subsys.h
index 62c0de026d..4cff5f0b6e 100644
--- a/src/lib/subsys/subsys.h
+++ b/src/lib/subsys/subsys.h
@@ -15,6 +15,7 @@
 
 struct pubsub_connector_t;
 struct config_format_t;
+struct smartlist_t;
 
 /**
  * A subsystem is a part of Tor that is initialized, shut down, configured,
@@ -190,6 +191,17 @@ typedef struct subsys_fns_t {
    * to disk.
    **/
   int (*flush_state)(void *);
+
+  /**
+   * Return a list of metrics store of this subsystem. This is called
+   * everytime a request arrives on the MetricsPort.
+   *
+   * The list MUST contain metrics_store_t object and contains entries so it
+   * can be formatted for the metrics port.
+   *
+   * This can return NULL or be NULL.
+   **/
+  const struct smartlist_t *(*get_metrics)(void);
 } subsys_fns_t;
 
 #ifndef COCCI





More information about the tor-commits mailing list