diff options
| author | Denys Fedoryshchenko <denys.f@collabora.com> | 2026-05-13 22:09:39 +0300 |
|---|---|---|
| committer | Denys Fedoryshchenko <denys.f@collabora.com> | 2026-05-13 22:09:39 +0300 |
| commit | d890a1313df666dcc52b85fa07aa989865b4d18e (patch) | |
| tree | a840eed0bca3c16d7d6b5de3b01beb32de21dafd | |
| parent | d611c3240863f79029ab48d492659a67f82465d9 (diff) | |
| download | accel-ppp-d890a1313df666dcc52b85fa07aa989865b4d18e.tar.gz accel-ppp-d890a1313df666dcc52b85fa07aa989865b4d18e.zip | |
metrics: scaffold module with config parsing
Add a new extra module `metrics` that will eventually expose statistics
over HTTP. This first commit only:
* creates accel-pppd/extra/metrics.c with an init() that parses the
[metrics] section options `format` (prometheus|json) and
`address` (host:port);
* wires the new shared library into the extras CMakeLists.
No listener, no metrics rendering yet — those land in follow-up
commits. With this commit alone, loading the `metrics` module just
logs the configured listen address and format and is otherwise inert.
Signed-off-by: Denys Fedoryshchenko <denys.f@collabora.com>
| -rw-r--r-- | accel-pppd/extra/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | accel-pppd/extra/metrics.c | 74 |
2 files changed, 76 insertions, 1 deletions
diff --git a/accel-pppd/extra/CMakeLists.txt b/accel-pppd/extra/CMakeLists.txt index 6badcd5e..6b5beaff 100644 --- a/accel-pppd/extra/CMakeLists.txt +++ b/accel-pppd/extra/CMakeLists.txt @@ -8,8 +8,9 @@ ADD_LIBRARY(chap-secrets SHARED chap-secrets.c) ADD_LIBRARY(logwtmp SHARED logwtmp.c) TARGET_LINK_LIBRARIES(logwtmp util) ADD_LIBRARY(connlimit SHARED connlimit.c) +ADD_LIBRARY(metrics SHARED metrics.c) -INSTALL(TARGETS pppd_compat ippool ipv6pool sigchld chap-secrets logwtmp connlimit +INSTALL(TARGETS pppd_compat ippool ipv6pool sigchld chap-secrets logwtmp connlimit metrics LIBRARY DESTINATION lib${LIB_SUFFIX}/accel-ppp ) diff --git a/accel-pppd/extra/metrics.c b/accel-pppd/extra/metrics.c new file mode 100644 index 00000000..c7a52ed8 --- /dev/null +++ b/accel-pppd/extra/metrics.c @@ -0,0 +1,74 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> + +#include "triton.h" +#include "events.h" +#include "log.h" + +#include "memdebug.h" + +enum metrics_format { + METRICS_FORMAT_PROMETHEUS, + METRICS_FORMAT_JSON, +}; + +static enum metrics_format conf_format = METRICS_FORMAT_PROMETHEUS; +static char *conf_address; + +static int parse_format(const char *opt, enum metrics_format *out) +{ + if (!strcasecmp(opt, "prometheus")) { + *out = METRICS_FORMAT_PROMETHEUS; + return 0; + } + if (!strcasecmp(opt, "json")) { + *out = METRICS_FORMAT_JSON; + return 0; + } + return -1; +} + +static int load_config(void) +{ + const char *opt; + enum metrics_format fmt = METRICS_FORMAT_PROMETHEUS; + char *address = NULL; + + opt = conf_get_opt("metrics", "format"); + if (opt && parse_format(opt, &fmt) < 0) { + log_error("metrics: unknown format '%s', expected 'prometheus' or 'json'\n", opt); + return -1; + } + + opt = conf_get_opt("metrics", "address"); + if (!opt) { + log_emerg("metrics: 'address' option is required (host:port)\n"); + return -1; + } + address = _strdup(opt); + if (!address) { + log_emerg("metrics: out of memory while loading config\n"); + return -1; + } + + conf_format = fmt; + if (conf_address) + _free(conf_address); + conf_address = address; + + return 0; +} + +static void init(void) +{ + if (load_config() < 0) + return; + + log_info2("metrics: module loaded, listen %s, format %s\n", + conf_address, + conf_format == METRICS_FORMAT_PROMETHEUS ? "prometheus" : "json"); +} + +DEFINE_INIT(100, init); |
