Răsfoiți Sursa

First code to implement prometheus metrics

Miquel Ortega 5 ani în urmă
părinte
comite
b9802690d1
4 a modificat fișierele cu 145 adăugiri și 2 ștergeri
  1. 2 2
      Makefile.in
  2. 3 0
      configure
  3. 91 0
      src/apps/relay/prom_server.c
  4. 49 0
      src/apps/relay/prom_server.h

+ 2 - 2
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

+ 3 - 0
configure

@@ -876,6 +876,9 @@ testlib wldap64
 testlib intl
 testlib nsl
 testlib resolv
+testlib prom
+testlib promhttp
+testlib microhttpd
 
 ###########################
 # Test sockets compilation

+ 91 - 0
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 });
+}

+ 49 - 0
src/apps/relay/prom_server.h

@@ -0,0 +1,49 @@
+
+#ifndef __PROM_SERVER_H__
+#define __PROM_SERVER_H__
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <microhttpd.h>
+#include <prom.h>
+#include <promhttp.h>
+
+#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__ */