[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor/master] metrics: New feature module to track tor metrics
commit a882d1bf0abbbcf2bc4f8c039f9b82262462292c
Author: David Goulet <dgoulet@xxxxxxxxxxxxxx>
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@xxxxxxxxxxxxxx>
---
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
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits