metrics: New feature module to track tor metrics

Related to #40063

Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
David Goulet 2020-10-19 15:50:45 -04:00
parent ec731290a5
commit a882d1bf0a
9 changed files with 172 additions and 0 deletions

View File

@ -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);

View File

@ -0,0 +1 @@
*.h

View File

@ -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

View File

@ -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)
{
}

View File

@ -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) */

View File

@ -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,
};

View File

@ -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) */

View File

@ -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

View File

@ -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