summaryrefslogtreecommitdiff
path: root/src/feature
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2020-10-19 15:50:45 -0400
committerDavid Goulet <dgoulet@torproject.org>2020-10-27 10:43:42 -0400
commita882d1bf0abbbcf2bc4f8c039f9b82262462292c (patch)
treec37c263e44ba53924929062f473c913e2124dd93 /src/feature
parentec731290a5a790093961f0fdb06cf69000194adf (diff)
downloadtor-a882d1bf0abbbcf2bc4f8c039f9b82262462292c.tar.gz
tor-a882d1bf0abbbcf2bc4f8c039f9b82262462292c.zip
metrics: New feature module to track tor metrics
Related to #40063 Signed-off-by: David Goulet <dgoulet@torproject.org>
Diffstat (limited to 'src/feature')
-rw-r--r--src/feature/metrics/.may_include1
-rw-r--r--src/feature/metrics/include.am10
-rw-r--r--src/feature/metrics/metrics.c66
-rw-r--r--src/feature/metrics/metrics.h21
-rw-r--r--src/feature/metrics/metrics_sys.c37
-rw-r--r--src/feature/metrics/metrics_sys.h22
6 files changed, 157 insertions, 0 deletions
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) */