Add prometheus

This commit is contained in:
Barzan Hayati 2025-07-06 14:15:24 +00:00
parent 6a240dae33
commit b5126ab4dc
4 changed files with 84 additions and 43 deletions

View File

@ -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})

View File

@ -4,14 +4,9 @@
#include <iostream>
#include <string>
#include <thread>
// prometheus-cpp headers
#include <prometheus/counter.h>
#include <prometheus/exposer.h>
#include <prometheus/gauge.h>
#include <prometheus/histogram.h>
#include <prometheus/registry.h>
#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<bool> running{true};
prometheus::Gauge *my_gauge = nullptr;
std::shared_ptr<prometheus::Registry> registry;
prometheus::Family<prometheus::Gauge> *gauge_family = nullptr;
std::unique_ptr<prometheus::Exposer> exposer = nullptr;
prometheus::Counter *counter = nullptr;
prometheus::Family<prometheus::Counter> *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<double>(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] << " <RTSP_URL>" << std::endl;
return 1;
}
const std::string address_prometheus = "0.0.0.0:8080";
exposer = std::make_unique<prometheus::Exposer>(address_prometheus);
// MetricsManager* metric_manager = new MetricsManager();
std::shared_ptr<MetricsManager> metric_manager =
std::make_shared<MetricsManager>("0.0.0.0:8080");
metric_manager->setup_prometheus(); // Calls the metrics_loop method
// Set up Prometheus as before...
registry = std::make_shared<prometheus::Registry>();
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;
}

42
src/metrics_manager.cpp Normal file
View File

@ -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<prometheus::Exposer>(address_prometheus);
// Set up Prometheus as before...
registry = std::make_shared<prometheus::Registry>();
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<double>(rand() % 100));
std::this_thread::sleep_for(std::chrono::seconds(2));
}
}
MetricsManager::~MetricsManager() {
std::cout << "MetricsManager destroyed" << std::endl;
}

29
src/metrics_manager.hpp Normal file
View File

@ -0,0 +1,29 @@
// prometheus-cpp headers
#include <prometheus/counter.h>
#include <prometheus/exposer.h>
#include <prometheus/gauge.h>
#include <prometheus/histogram.h>
#include <prometheus/registry.h>
#include <iostream>
#include <thread>
class MetricsManager {
private:
const std::string address_prometheus;
public:
std::atomic<bool> running{true};
prometheus::Gauge *my_gauge = nullptr;
std::shared_ptr<prometheus::Registry> registry;
prometheus::Family<prometheus::Gauge> *gauge_family = nullptr;
std::unique_ptr<prometheus::Exposer> exposer = nullptr;
prometheus::Counter *counter = nullptr;
prometheus::Family<prometheus::Counter> *counter_family = nullptr;
void metrics_loop();
void setup_prometheus();
MetricsManager();
MetricsManager(const std::string &address);
~MetricsManager(); // keep only if you define it
};