prom_server.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "mainrelay.h"
  2. #include "prom_server.h"
  3. #include "ns_turn_utils.h"
  4. #if !defined(TURN_NO_PROMETHEUS)
  5. prom_counter_t *turn_traffic_rcvp;
  6. prom_counter_t *turn_traffic_rcvb;
  7. prom_counter_t *turn_traffic_sentp;
  8. prom_counter_t *turn_traffic_sentb;
  9. prom_counter_t *turn_traffic_peer_rcvp;
  10. prom_counter_t *turn_traffic_peer_rcvb;
  11. prom_counter_t *turn_traffic_peer_sentp;
  12. prom_counter_t *turn_traffic_peer_sentb;
  13. prom_counter_t *turn_total_traffic_rcvp;
  14. prom_counter_t *turn_total_traffic_rcvb;
  15. prom_counter_t *turn_total_traffic_sentp;
  16. prom_counter_t *turn_total_traffic_sentb;
  17. prom_counter_t *turn_total_traffic_peer_rcvp;
  18. prom_counter_t *turn_total_traffic_peer_rcvb;
  19. prom_counter_t *turn_total_traffic_peer_sentp;
  20. prom_counter_t *turn_total_traffic_peer_sentb;
  21. prom_gauge_t *turn_total_allocations;
  22. void start_prometheus_server(void){
  23. if (turn_params.prometheus == 0){
  24. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "prometheus collector disabled, not started\n");
  25. return;
  26. }
  27. prom_collector_registry_default_init();
  28. const char *label[] = {"realm", NULL};
  29. size_t nlabels = 1;
  30. if (turn_params.prometheus_username_labels) {
  31. label[1] = "user";
  32. nlabels++;
  33. }
  34. // Create traffic counter metrics
  35. turn_traffic_rcvp = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_rcvp", "Represents finished sessions received packets", nlabels, label));
  36. turn_traffic_rcvb = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_rcvb", "Represents finished sessions received bytes", nlabels, label));
  37. turn_traffic_sentp = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_sentp", "Represents finished sessions sent packets", nlabels, label));
  38. turn_traffic_sentb = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_sentb", "Represents finished sessions sent bytes", nlabels, label));
  39. // Create finished sessions traffic for peers counter metrics
  40. turn_traffic_peer_rcvp = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_peer_rcvp", "Represents finished sessions peer received packets", nlabels, label));
  41. turn_traffic_peer_rcvb = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_peer_rcvb", "Represents finished sessions peer received bytes", nlabels, label));
  42. turn_traffic_peer_sentp = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_peer_sentp", "Represents finished sessions peer sent packets", nlabels, label));
  43. turn_traffic_peer_sentb = prom_collector_registry_must_register_metric(prom_counter_new("turn_traffic_peer_sentb", "Represents finished sessions peer sent bytes", nlabels, label));
  44. // Create total finished traffic counter metrics
  45. turn_total_traffic_rcvp = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_rcvp", "Represents total finished sessions received packets", 0, NULL));
  46. turn_total_traffic_rcvb = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_rcvb", "Represents total finished sessions received bytes", 0, NULL));
  47. turn_total_traffic_sentp = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_sentp", "Represents total finished sessions sent packets", 0, NULL));
  48. turn_total_traffic_sentb = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_sentb", "Represents total finished sessions sent bytes", 0, NULL));
  49. // Create total finished sessions traffic for peers counter metrics
  50. turn_total_traffic_peer_rcvp = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_peer_rcvp", "Represents total finished sessions peer received packets", 0, NULL));
  51. turn_total_traffic_peer_rcvb = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_peer_rcvb", "Represents total finished sessions peer received bytes", 0, NULL));
  52. turn_total_traffic_peer_sentp = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_peer_sentp", "Represents total finished sessions peer sent packets", 0, NULL));
  53. turn_total_traffic_peer_sentb = prom_collector_registry_must_register_metric(prom_counter_new("turn_total_traffic_peer_sentb", "Represents total finished sessions peer sent bytes", 0, NULL));
  54. // Create total allocations number gauge metric
  55. turn_total_allocations = prom_collector_registry_must_register_metric(prom_gauge_new("turn_total_allocations", "Represents current allocations number", 1, (const char*[]) {"type"}));
  56. promhttp_set_active_collector_registry(NULL);
  57. unsigned int flags = MHD_USE_DUAL_STACK
  58. #if MHD_USE_ERROR_LOG
  59. | MHD_USE_ERROR_LOG
  60. #endif
  61. ;
  62. if (MHD_is_feature_supported(MHD_FEATURE_EPOLL)) {
  63. #if MHD_USE_EPOLL_INTERNAL_THREAD
  64. flags |= MHD_USE_EPOLL_INTERNAL_THREAD;
  65. #else
  66. flags |= MHD_USE_SELECT_INTERNALLY; //ubuntu 16.04
  67. #endif
  68. } else {
  69. flags |= MHD_USE_SELECT_INTERNALLY;
  70. }
  71. struct MHD_Daemon *daemon = promhttp_start_daemon(flags, turn_params.prometheus_port, NULL, NULL);
  72. if (daemon == NULL) {
  73. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "could not start prometheus collector\n");
  74. return;
  75. }
  76. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "prometheus collector started successfully\n");
  77. return;
  78. }
  79. void prom_set_finished_traffic(const char* realm, const char* user, unsigned long rsvp, unsigned long rsvb, unsigned long sentp, unsigned long sentb, bool peer){
  80. if (turn_params.prometheus == 1){
  81. const char *label[] = {realm, NULL};
  82. if (turn_params.prometheus_username_labels){
  83. label[1] = user;
  84. }
  85. if (peer){
  86. prom_counter_add(turn_traffic_peer_rcvp, rsvp, label);
  87. prom_counter_add(turn_traffic_peer_rcvb, rsvb, label);
  88. prom_counter_add(turn_traffic_peer_sentp, sentp, label);
  89. prom_counter_add(turn_traffic_peer_sentb, sentb, label);
  90. prom_counter_add(turn_total_traffic_peer_rcvp, rsvp, NULL);
  91. prom_counter_add(turn_total_traffic_peer_rcvb, rsvb, NULL);
  92. prom_counter_add(turn_total_traffic_peer_sentp, sentp, NULL);
  93. prom_counter_add(turn_total_traffic_peer_sentb, sentb, NULL);
  94. } else {
  95. prom_counter_add(turn_traffic_rcvp, rsvp, label);
  96. prom_counter_add(turn_traffic_rcvb, rsvb, label);
  97. prom_counter_add(turn_traffic_sentp, sentp, label);
  98. prom_counter_add(turn_traffic_sentb, sentb, label);
  99. prom_counter_add(turn_total_traffic_rcvp, rsvp, NULL);
  100. prom_counter_add(turn_total_traffic_rcvb, rsvb, NULL);
  101. prom_counter_add(turn_total_traffic_sentp, sentp, NULL);
  102. prom_counter_add(turn_total_traffic_sentb, sentb, NULL);
  103. }
  104. }
  105. }
  106. void prom_inc_allocation(SOCKET_TYPE type) {
  107. if (turn_params.prometheus == 1){
  108. prom_gauge_inc(turn_total_allocations, (const char*[]) {socket_type_name(type)});
  109. }
  110. }
  111. void prom_dec_allocation(SOCKET_TYPE type) {
  112. if (turn_params.prometheus == 1){
  113. prom_gauge_dec(turn_total_allocations, (const char*[]) {socket_type_name(type)});
  114. }
  115. }
  116. #else
  117. void start_prometheus_server(void){
  118. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "turnserver compiled without prometheus support\n");
  119. return;
  120. }
  121. #endif /* TURN_NO_PROMETHEUS */