From b9802690d160c8cae3e66b1c40e7b0e5e7fd4958 Mon Sep 17 00:00:00 2001 From: Miquel Ortega Date: Thu, 2 Apr 2020 00:49:28 +0200 Subject: [PATCH] First code to implement prometheus metrics --- Makefile.in | 4 +- configure | 3 ++ src/apps/relay/prom_server.c | 91 ++++++++++++++++++++++++++++++++++++ src/apps/relay/prom_server.h | 49 +++++++++++++++++++ 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 src/apps/relay/prom_server.c create mode 100644 src/apps/relay/prom_server.h diff --git a/Makefile.in b/Makefile.in index 078f50c3..a4479e15 100755 --- a/Makefile.in +++ b/Makefile.in @@ -30,8 +30,8 @@ HIREDIS_MODS = src/apps/common/hiredis_libevent2.c USERDB_HEADERS = src/apps/relay/dbdrivers/dbdriver.h src/apps/relay/dbdrivers/dbd_sqlite.h src/apps/relay/dbdrivers/dbd_pgsql.h src/apps/relay/dbdrivers/dbd_mysql.h src/apps/relay/dbdrivers/dbd_mongo.h src/apps/relay/dbdrivers/dbd_redis.h USERDB_MODS = src/apps/relay/dbdrivers/dbdriver.c src/apps/relay/dbdrivers/dbd_sqlite.c src/apps/relay/dbdrivers/dbd_pgsql.c src/apps/relay/dbdrivers/dbd_mysql.c src/apps/relay/dbdrivers/dbd_mongo.c src/apps/relay/dbdrivers/dbd_redis.c -SERVERAPP_HEADERS = src/apps/relay/userdb.h src/apps/relay/tls_listener.h src/apps/relay/mainrelay.h src/apps/relay/turn_admin_server.h src/apps/relay/dtls_listener.h src/apps/relay/libtelnet.h ${HIREDIS_HEADERS} ${USERDB_HEADERS} -SERVERAPP_MODS = src/apps/relay/mainrelay.c src/apps/relay/netengine.c src/apps/relay/libtelnet.c src/apps/relay/turn_admin_server.c src/apps/relay/userdb.c src/apps/relay/tls_listener.c src/apps/relay/dtls_listener.c ${HIREDIS_MODS} ${USERDB_MODS} +SERVERAPP_HEADERS = src/apps/relay/userdb.h src/apps/relay/tls_listener.h src/apps/relay/mainrelay.h src/apps/relay/turn_admin_server.h src/apps/relay/dtls_listener.h src/apps/relay/libtelnet.h src/apps/relay/prom_server.h ${HIREDIS_HEADERS} ${USERDB_HEADERS} +SERVERAPP_MODS = src/apps/relay/mainrelay.c src/apps/relay/netengine.c src/apps/relay/libtelnet.c src/apps/relay/turn_admin_server.c src/apps/relay/userdb.c src/apps/relay/tls_listener.c src/apps/relay/dtls_listener.c src/apps/relay/prom_server.c ${HIREDIS_MODS} ${USERDB_MODS} SERVERAPP_DEPS = ${SERVERTURN_MODS} ${SERVERTURN_DEPS} ${SERVERAPP_MODS} ${SERVERAPP_HEADERS} ${COMMON_DEPS} ${IMPL_DEPS} lib/libturnclient.a TURN_BUILD_RESULTS = bin/turnutils_oauth bin/turnutils_natdiscovery bin/turnutils_stunclient bin/turnutils_rfc5769check bin/turnutils_uclient bin/turnserver bin/turnutils_peer lib/libturnclient.a include/turn/ns_turn_defs.h sqlite_empty_db diff --git a/configure b/configure index a7af75af..f9283117 100755 --- a/configure +++ b/configure @@ -876,6 +876,9 @@ testlib wldap64 testlib intl testlib nsl testlib resolv +testlib prom +testlib promhttp +testlib microhttpd ########################### # Test sockets compilation diff --git a/src/apps/relay/prom_server.c b/src/apps/relay/prom_server.c new file mode 100644 index 00000000..fccb676c --- /dev/null +++ b/src/apps/relay/prom_server.c @@ -0,0 +1,91 @@ +#include "prom_server.h" + +int start_prometheus_server(void){ + prom_collector_registry_default_init(); + turn_status = prom_collector_registry_must_register_metric(prom_gauge_new("turn_status", "Represents status", 5, (const char *[]) {"realm", "user", "allocation", "status", "lifetime" })); + turn_traffic_rcvp = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_rcvp", "Represents received packets", 3, (const char *[]) {"realm", "user", "allocation" })); + turn_traffic_rcvb = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_rcvb", "Represents received bytes", 3, (const char *[]) {"realm", "user", "allocation" })); + turn_traffic_sentp = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_sentp", "Represents sent packets", 3, (const char *[]) {"realm", "user", "allocation" })); + turn_traffic_sentb = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_sentb", "Represents received bytes", 3, (const char *[]) {"realm", "user", "allocation" })); + turn_traffic_peer_rcvp = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_peer_rcvp", "Represents peer received packets", 3, (const char *[]) {"realm", "user", "allocation" })); + turn_traffic_peer_rcvb = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_peer_rcvb", "Represents peer received bytes", 3, (const char *[]) {"realm", "user", "allocation" })); + turn_traffic_peer_sentp = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_peer_sentp", "Represents peer sent packets", 3, (const char *[]) {"realm", "user", "allocation" })); + turn_traffic_peer_sentb = prom_collector_registry_must_register_metric(prom_gauge_new("turn_traffic_peer_sentb", "Represents peer received bytes", 3, (const char *[]) {"realm", "user", "allocation" })); + promhttp_set_active_collector_registry(NULL); + + + struct MHD_Daemon *daemon = promhttp_start_daemon(MHD_USE_SELECT_INTERNALLY, DEFAULT_PROM_SERVER_PORT, NULL, NULL); + if (daemon == NULL) { + return 1; + } + return 0; +} + +void prom_set_status(const char* realm, const char* user, unsigned long long allocation, const char* status, unsigned long lifetime){ + char allocation_chars[1024]; + char lifetime_chars[1024]; + + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + snprintf(lifetime_chars, sizeof(lifetime_chars), "%lu", lifetime); + + prom_gauge_add(turn_status, 1, (const char *[]) { realm , user, allocation_chars, status, lifetime_chars }); +} + +void prom_del_status(const char* realm, const char* user, unsigned long long allocation, const char* status){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_sub(turn_status, 1, (const char *[]) { realm , user, allocation_chars, (char *)"new", (char *)"600" }); + prom_gauge_add(turn_status, 1, (const char *[]) { realm , user, allocation_chars, status, NULL }); + +} + +void prom_set_rcvp(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvp){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_rcvp, rsvp, (const char *[]) { realm , user, allocation_chars }); +} +void prom_set_rcvb(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvb){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_rcvb, rsvb, (const char *[]) { realm , user, allocation_chars }); +} +void prom_set_sentp(const char* realm, const char* user, unsigned long long allocation, unsigned long sentp){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_sentp, sentp, (const char *[]) { realm , user, allocation_chars }); +} +void prom_set_sentb(const char* realm, const char* user, unsigned long long allocation, unsigned long sentb){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_sentb, sentb, (const char *[]) { realm , user, allocation_chars }); +} + +void prom_set_peer_rcvp(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvp){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_peer_rcvp, rsvp, (const char *[]) { realm , user, allocation_chars }); +} +void prom_set_peer_rcvb(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvb){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_peer_rcvb, rsvb, (const char *[]) { realm , user, allocation_chars }); +} +void prom_set_peer_sentp(const char* realm, const char* user, unsigned long long allocation, unsigned long sentp){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_peer_sentp, sentp, (const char *[]) { realm , user, allocation_chars }); +} +void prom_set_peer_sentb(const char* realm, const char* user, unsigned long long allocation, unsigned long sentb){ + char allocation_chars[1024]; + snprintf(allocation_chars, sizeof(allocation_chars), "%018llu", allocation); + + prom_gauge_set(turn_traffic_peer_sentb, sentb, (const char *[]) { realm , user, allocation_chars }); +} diff --git a/src/apps/relay/prom_server.h b/src/apps/relay/prom_server.h new file mode 100644 index 00000000..bfe3a288 --- /dev/null +++ b/src/apps/relay/prom_server.h @@ -0,0 +1,49 @@ + +#ifndef __PROM_SERVER_H__ +#define __PROM_SERVER_H__ + +#include +#include +#include +#include + +#include +#include +#include + +#define DEFAULT_PROM_SERVER_PORT (9121) + +prom_gauge_t *turn_status; +prom_gauge_t *turn_traffic_rcvp; +prom_gauge_t *turn_traffic_rcvb; +prom_gauge_t *turn_traffic_sentp; +prom_gauge_t *turn_traffic_sentb; +prom_gauge_t *turn_traffic_peer_rcvp; +prom_gauge_t *turn_traffic_peer_rcvb; +prom_gauge_t *turn_traffic_peer_sentp; +prom_gauge_t *turn_traffic_peer_sentb; + +#ifdef __cplusplus +extern "C" { +#endif + +int start_prometheus_server(void); + +void prom_set_status(const char* realm, const char* user, unsigned long long allocation, const char* status, unsigned long lifetime); +void prom_del_status(const char* realm, const char* user, unsigned long long allocation, const char* status); +void prom_set_rcvp(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvp); +void prom_set_rcvb(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvb); +void prom_set_sentp(const char* realm, const char* user, unsigned long long allocation, unsigned long sentp); +void prom_set_sentb(const char* realm, const char* user, unsigned long long allocation, unsigned long sentb); +void prom_set_peer_rcvp(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvp); +void prom_set_peer_rcvb(const char* realm, const char* user, unsigned long long allocation, unsigned long rsvb); +void prom_set_peer_sentp(const char* realm, const char* user, unsigned long long allocation, unsigned long sentp); +void prom_set_peer_sentb(const char* realm, const char* user, unsigned long long allocation, unsigned long sentb); + + + +#ifdef __cplusplus +} +#endif /* __clplusplus */ + +#endif /* __PROM_SERVER_H__ */ \ No newline at end of file