NVIDIA DeepStream SDK API Reference

9.0 Release
sources/libs/nvds_rest_server/opentelemetry_client.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: LicenseRef-NvidiaProprietary
4  *
5  * NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
6  * property and proprietary rights in and to this material, related
7  * documentation and any modifications thereto. Any use, reproduction,
8  * disclosure or distribution of this material and related documentation
9  * without an express license agreement from NVIDIA CORPORATION or
10  * its affiliates is strictly prohibited.
11  */
12 
13 /*
14  * OpenTelemetry Client for DeepStream Metrics
15  *
16  * This client provides OpenTelemetry integration for DeepStream metrics.
17  * Uses PeriodicExportingMetricReader to automatically export metrics at configured intervals.
18  *
19  * Usage:
20  * auto client = GET_OPENTELEMETRY(refresh_period, otlp_url);
21  * client->setNvMultiUriSrcbinCreator(custom_ctx);
22  *
23  * refresh_period: seconds between exports (default: 5)
24  * -1 to disable OpenTelemetry
25  * otlp_url: OTLP endpoint in "ip:port" format (e.g., "192.168.1.100:4318")
26  * or full URL (e.g., "http://localhost:4318/v1/metrics")
27  * (default: "http://localhost:4318/v1/metrics")
28  * custom_ctx: pointer to NvMultiUriSrcbinCreator context (required for sensor info)
29  *
30  * Metrics exported to: configured OTLP endpoint
31  *
32  * Examples:
33  * GET_OPENTELEMETRY(5); // Uses default localhost:4318
34  * GET_OPENTELEMETRY(5, "192.168.1.100:4318"); // Custom IP and port
35  * GET_OPENTELEMETRY(5, "http://custom.endpoint/v1/metrics"); // Full URL
36  *
37  * Exported Metrics:
38  * - stream_fps: Frames per second per source
39  * - stream_latency: Stream latency per source (ms)
40  * - stream_frame_number: Frame number per source
41  * - system_metrics: CPU/GPU/RAM usage
42  *
43  * Note: Inactive streams are sent with -1 values for one cycle to allow
44  * OTEL processors to drop them properly.
45  *
46  * Control via HTTP Header (X-Refresh-Period):
47  * curl -H "X-Refresh-Period: 3" http://localhost:9010/api/v1/metrics
48  * curl -H "X-Refresh-Period: -1" http://localhost:9010/api/v1/metrics # Disable
49  */
50 #pragma once
51 
52 #include <memory>
53 #include <string>
54 #include <mutex>
55 #include <unordered_map>
56 
57 #include "opentelemetry/exporters/otlp/otlp_http_metric_exporter.h"
58 #include "opentelemetry/exporters/ostream/metric_exporter.h"
59 #include "opentelemetry/exporters/otlp/otlp_http_metric_exporter_options.h"
60 #include "opentelemetry/metrics/provider.h"
61 #include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h"
62 #include "opentelemetry/sdk/metrics/meter_provider.h"
63 #include "opentelemetry/sdk/metrics/meter_provider_factory.h"
64 #include "opentelemetry/nostd/shared_ptr.h"
65 #include "nvds_stats.h"
66 
67 namespace metric_sdk = opentelemetry::sdk::metrics;
68 namespace metric_api = opentelemetry::metrics;
69 namespace otlp_exporter = opentelemetry::exporter::otlp;
70 
71 #define GET_OPENTELEMETRY OpenTelemetryClient::getInstance
72 
73 struct SourceMetrics {
74  double fps;
75  double latency;
76  int64_t frame_number;
77  std::string source_id;
78  std::string sensor_name;
79  std::string sensor_id;
80  bool active;
81 };
82 
84 {
85 public:
86  OpenTelemetryClient(int refresh_period_ms = 5000, const std::string& otlp_url = "http://localhost:4318", bool from_rest_api = false);
88 
89  static OpenTelemetryClient* getInstance(int refresh_period_ms = 5000, const std::string& otlp_url = "http://localhost:4318", bool from_rest_api = false);
90 
91  void setupGauges();
92  void shutdown();
93  void reinitialize(int refresh_period_ms, const std::string& otlp_url, bool from_rest_api = false);
94 
95  bool isEnabled() const { return m_is_enabled; }
96  std::string getOtlpUrl() const { return m_otlp_url; }
97 
98  void updateSourceMetrics();
99  void updateSystemMetrics();
100 
101  std::unordered_map<std::string, SourceMetrics> getSourceMetrics();
102 
103  void setNvMultiUriSrcbinCreator(void* nvmultiurisrcbin_creator);
104 
105 private:
106  static OpenTelemetryClient* _instance;
107  static std::once_flag _init_flag;
108 
109  std::unordered_map<std::string, SourceMetrics> m_source_metrics;
110  std::unordered_map<std::string, SourceMetrics> m_previous_source_metrics;
111  std::mutex m_source_metrics_mutex;
112 
113  int m_refresh_period_ms;
114  std::string m_otlp_url;
115  bool m_is_enabled;
116  bool m_metrics_updated_in_cycle;
117  int m_callback_counter;
118  std::mutex m_update_flag_mutex;
119  bool m_initialized_from_rest_api;
120  void initializeComponents();
121 
122  opentelemetry::nostd::shared_ptr<metric_api::ObservableInstrument> m_fps_gauge;
123  opentelemetry::nostd::shared_ptr<metric_api::ObservableInstrument> m_latency_gauge;
124  opentelemetry::nostd::shared_ptr<metric_api::ObservableInstrument> m_frame_number_gauge;
125  opentelemetry::nostd::shared_ptr<metric_api::ObservableInstrument> m_system_metrics_gauge;
126  opentelemetry::nostd::shared_ptr<metric_api::ObservableInstrument> m_stream_count_gauge;
127  opentelemetry::nostd::shared_ptr<metric_api::MeterProvider> m_provider;
128  opentelemetry::nostd::shared_ptr<metric_api::Meter> m_meter;
129  std::shared_ptr<metric_sdk::MeterProvider> m_provider_sdk;
130  void* m_nvmultiurisrcbin_creator;
131  double m_ram_memory;
132  double m_cpu_usage;
133  double m_gpu_memory;
134  double m_gpu_usage;
135  guint m_stream_count;
136 };
137 
OpenTelemetryClient::getSourceMetrics
std::unordered_map< std::string, SourceMetrics > getSourceMetrics()
OpenTelemetryClient
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:83
OpenTelemetryClient::getInstance
static OpenTelemetryClient * getInstance(int refresh_period_ms=5000, const std::string &otlp_url="http://localhost:4318", bool from_rest_api=false)
OpenTelemetryClient::isEnabled
bool isEnabled() const
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:95
SourceMetrics::active
bool active
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:80
OpenTelemetryClient::setupGauges
void setupGauges()
OpenTelemetryClient::shutdown
void shutdown()
SourceMetrics::sensor_id
std::string sensor_id
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:79
OpenTelemetryClient::reinitialize
void reinitialize(int refresh_period_ms, const std::string &otlp_url, bool from_rest_api=false)
SourceMetrics::sensor_name
std::string sensor_name
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:78
OpenTelemetryClient::~OpenTelemetryClient
~OpenTelemetryClient()
OpenTelemetryClient::getOtlpUrl
std::string getOtlpUrl() const
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:96
SourceMetrics::source_id
std::string source_id
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:77
OpenTelemetryClient::updateSystemMetrics
void updateSystemMetrics()
SourceMetrics::fps
double fps
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:74
OpenTelemetryClient::updateSourceMetrics
void updateSourceMetrics()
OpenTelemetryClient::setNvMultiUriSrcbinCreator
void setNvMultiUriSrcbinCreator(void *nvmultiurisrcbin_creator)
SourceMetrics
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:73
SourceMetrics::latency
double latency
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:75
SourceMetrics::frame_number
int64_t frame_number
Definition: sources/libs/nvds_rest_server/opentelemetry_client.h:76
OpenTelemetryClient::OpenTelemetryClient
OpenTelemetryClient(int refresh_period_ms=5000, const std::string &otlp_url="http://localhost:4318", bool from_rest_api=false)