summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--accel-pppd/extra/CMakeLists.txt3
-rw-r--r--accel-pppd/extra/metrics.c74
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);