mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
metrics: New feature module to track tor metrics
Related to #40063 Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
ec731290a5
commit
a882d1bf0a
@ -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);
|
||||
|
1
src/feature/metrics/.may_include
Normal file
1
src/feature/metrics/.may_include
Normal file
@ -0,0 +1 @@
|
||||
*.h
|
10
src/feature/metrics/include.am
Normal file
10
src/feature/metrics/include.am
Normal 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
|
66
src/feature/metrics/metrics.c
Normal file
66
src/feature/metrics/metrics.c
Normal 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)
|
||||
{
|
||||
}
|
21
src/feature/metrics/metrics.h
Normal file
21
src/feature/metrics/metrics.h
Normal 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) */
|
37
src/feature/metrics/metrics_sys.c
Normal file
37
src/feature/metrics/metrics_sys.c
Normal 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,
|
||||
};
|
||||
|
22
src/feature/metrics/metrics_sys.h
Normal file
22
src/feature/metrics/metrics_sys.h
Normal 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) */
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user