diff --git a/CMakeLists.txt b/CMakeLists.txt index c4ff61f..aef07e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,12 +65,13 @@ include_directories(${PROJECT_SOURCE_DIR}/nv_ds_logger_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/sink_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/message_handling.hpp) include_directories(${PROJECT_SOURCE_DIR}/rtsp_streaming_manager.hpp) +include_directories(${PROJECT_SOURCE_DIR}/metrics_manager.hpp) set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp src/streammux_manager.cpp src/source_bin.cpp src/gstds_example_manager.cpp src/tiler_manager.cpp src/nv_video_convert_manager.cpp src/nv_osd_manager.cpp src/queue_manager.cpp src/nv_ds_logger_manager.cpp src/sink_manager.cpp src/message_handling.cpp - src/rtsp_streaming_manager.cpp) + src/rtsp_streaming_manager.cpp src/metrics_manager.cpp) # Create the executable add_executable(${PROJECT_NAME} ${SOURCES}) diff --git a/src/main.cpp b/src/main.cpp index ea680c7..8b0aca2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,14 +4,9 @@ #include #include #include -// prometheus-cpp headers -#include -#include -#include -#include -#include #include "camera_manager.hpp" +#include "metrics_manager.hpp" #include "pipeline_manager.hpp" namespace fs = std::filesystem; @@ -22,13 +17,6 @@ gboolean *check_finished_streams = NULL; gboolean *g_source_enabled = NULL; guint num_sources; // number of input cameras GstElement **g_source_bin_list = NULL; -std::atomic running{true}; -prometheus::Gauge *my_gauge = nullptr; -std::shared_ptr registry; -prometheus::Family *gauge_family = nullptr; -std::unique_ptr exposer = nullptr; -prometheus::Counter *counter = nullptr; -prometheus::Family *counter_family = nullptr; void allocate_memory_variables_cameras(const int MAX_NUM_SOURCES) { g_source_id_list = (gint *)g_malloc0(sizeof(gint) * MAX_NUM_SOURCES); @@ -65,43 +53,24 @@ int load_rtsp_address(CameraManager *camera_manager, fs::path file_path) { return EXIT_SUCCESS; } -void metrics_loop(prometheus::Gauge *my_gauge) { - while (running) { - std::cout << "metrics_loop" << std::endl; - counter->Increment(); - // simulate updating a metric - my_gauge->Set(static_cast(rand() % 100)); - std::this_thread::sleep_for(std::chrono::seconds(2)); - } -} - int main(int argc, char *argv[]) { if (argc < 1) { std::cerr << "Usage: " << argv[0] << " " << std::endl; return 1; } - const std::string address_prometheus = "0.0.0.0:8080"; - exposer = std::make_unique(address_prometheus); + // MetricsManager* metric_manager = new MetricsManager(); + std::shared_ptr metric_manager = + std::make_shared("0.0.0.0:8080"); + metric_manager->setup_prometheus(); // Calls the metrics_loop method - // Set up Prometheus as before... - registry = std::make_shared(); - gauge_family = &prometheus::BuildGauge() - .Name("frame_delay") - .Help("Delay between frames") - .Register(*registry); + std::thread metrics_thread(&MetricsManager::metrics_loop, metric_manager); - my_gauge = &gauge_family->Add({{"source", "camera1"}}); + // std::thread metrics_thread(metric_manager->metrics_loop); //, + // metric_manager->my_gauge - counter_family = &prometheus::BuildCounter() - .Name("frames_received_total") - .Help("Total frames received") - .Register(*registry); - - counter = &counter_family->Add({{"label", "value"}}); - exposer->RegisterCollectable(registry); - - std::thread metrics_thread(metrics_loop, my_gauge); + // std::thread metrics_thread(&MetricsManager::metrics_loop, + // metric_manager.get()); CameraManager *camera_manager = new CameraManager(); // Path handling works across platforms @@ -125,7 +94,7 @@ int main(int argc, char *argv[]) { pipeline_manager->create_pipeline_elements(num_sources, url_camera); // On shutdown: - running = false; + metric_manager->running = false; metrics_thread.join(); // optional: wait on thread before exiting return 0; } \ No newline at end of file diff --git a/src/metrics_manager.cpp b/src/metrics_manager.cpp new file mode 100644 index 0000000..04a2664 --- /dev/null +++ b/src/metrics_manager.cpp @@ -0,0 +1,42 @@ +#include "metrics_manager.hpp" + +MetricsManager::MetricsManager() {} + +MetricsManager::MetricsManager(const std::string& address) + : address_prometheus(address) // <- initialize const member here +{} +void MetricsManager::setup_prometheus() { + // Start the HTTP server on 0.0.0.0:8080 + exposer = std::make_unique(address_prometheus); + + // Set up Prometheus as before... + registry = std::make_shared(); + gauge_family = &prometheus::BuildGauge() + .Name("frame_delay") + .Help("Delay between frames") + .Register(*registry); + + my_gauge = &gauge_family->Add({{"source", "camera1"}}); + + counter_family = &prometheus::BuildCounter() + .Name("frames_received_total") + .Help("Total frames received") + .Register(*registry); + + counter = &counter_family->Add({{"label", "value"}}); + exposer->RegisterCollectable(registry); +} + +void MetricsManager::metrics_loop() { // prometheus::Gauge *my_gauge + while (running) { + std::cout << "metrics_loop" << std::endl; + counter->Increment(); + // simulate updating a metric + my_gauge->Set(static_cast(rand() % 100)); + std::this_thread::sleep_for(std::chrono::seconds(2)); + } +} + +MetricsManager::~MetricsManager() { + std::cout << "MetricsManager destroyed" << std::endl; +} diff --git a/src/metrics_manager.hpp b/src/metrics_manager.hpp new file mode 100644 index 0000000..ef34036 --- /dev/null +++ b/src/metrics_manager.hpp @@ -0,0 +1,29 @@ +// prometheus-cpp headers +#include +#include +#include +#include +#include + +#include +#include + +class MetricsManager { + private: + const std::string address_prometheus; + + public: + std::atomic running{true}; + prometheus::Gauge *my_gauge = nullptr; + std::shared_ptr registry; + prometheus::Family *gauge_family = nullptr; + std::unique_ptr exposer = nullptr; + prometheus::Counter *counter = nullptr; + prometheus::Family *counter_family = nullptr; + + void metrics_loop(); + void setup_prometheus(); + MetricsManager(); + MetricsManager(const std::string &address); + ~MetricsManager(); // keep only if you define it +}; \ No newline at end of file