Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
observability_bridge.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
6
8
10 std::shared_ptr<logger_interface> logger,
11 std::shared_ptr<monitoring_interface> monitor, BackendType backend_type) {
12 if (!logger) {
15 "ObservabilityBridge requires non-null logger",
16 "ObservabilityBridge::create");
17 }
18 if (!monitor) {
21 "ObservabilityBridge requires non-null monitor",
22 "ObservabilityBridge::create");
23 }
24 return ok(std::shared_ptr<ObservabilityBridge>(
25 new ObservabilityBridge(std::move(logger), std::move(monitor), backend_type)));
26}
27
29 std::shared_ptr<logger_interface> logger,
30 std::shared_ptr<monitoring_interface> monitor,
31 BackendType backend_type)
32 : logger_(std::move(logger))
33 , monitor_(std::move(monitor))
34 , backend_type_(backend_type) {
35}
36
42
44 if (initialized_.load()) {
45 return error_void(
47 "ObservabilityBridge already initialized",
48 "ObservabilityBridge::initialize");
49 }
50
51 if (!logger_) {
52 return error_void(
54 "Logger is null",
55 "ObservabilityBridge::initialize");
56 }
57
58 if (!monitor_) {
59 return error_void(
61 "Monitor is null",
62 "ObservabilityBridge::initialize");
63 }
64
65 // Check if bridge is enabled (default: true)
66 auto enabled_it = config.properties.find("enabled");
67 if (enabled_it != config.properties.end() && enabled_it->second == "false") {
68 return error_void(
70 "Bridge is disabled in configuration",
71 "ObservabilityBridge::initialize");
72 }
73
74 // Check if monitoring is enabled (default: true)
75 auto monitoring_enabled_it = config.properties.find("enable_monitoring");
76 monitoring_enabled_ = (monitoring_enabled_it == config.properties.end() ||
77 monitoring_enabled_it->second != "false");
78
79 // Initialize metrics
80 std::lock_guard<std::mutex> lock(metrics_mutex_);
82 cached_metrics_.last_activity = std::chrono::steady_clock::now();
83 cached_metrics_.custom_metrics["backend_type"] = static_cast<double>(backend_type_);
84 cached_metrics_.custom_metrics["monitoring_enabled"] = monitoring_enabled_ ? 1.0 : 0.0;
85 cached_metrics_.custom_metrics["logger_available"] = logger_ ? 1.0 : 0.0;
86 cached_metrics_.custom_metrics["monitor_available"] = monitor_ ? 1.0 : 0.0;
87
88 initialized_.store(true);
89 return ok();
90}
91
93 if (!initialized_.load()) {
94 return ok(); // Idempotent: already shut down
95 }
96
97 // Flush logger before shutdown
98 if (logger_) {
99 try {
100 logger_->flush();
101 } catch (...) {
102 // Ignore flush errors during shutdown
103 }
104 }
105
106 // Update metrics to reflect shutdown state
107 {
108 std::lock_guard<std::mutex> lock(metrics_mutex_);
110 cached_metrics_.last_activity = std::chrono::steady_clock::now();
111 }
112
113 initialized_.store(false);
114 return ok();
115}
116
118 return initialized_.load() && logger_ && monitor_;
119}
120
122 std::lock_guard<std::mutex> lock(metrics_mutex_);
123
124 if (!initialized_.load() || !logger_ || !monitor_) {
125 BridgeMetrics metrics;
126 metrics.is_healthy = false;
128 return metrics;
129 }
130
131 // Update metrics with current state
133 metrics.is_healthy = (logger_ && monitor_);
134 metrics.last_activity = std::chrono::steady_clock::now();
135 metrics.custom_metrics["backend_type"] = static_cast<double>(backend_type_);
136 metrics.custom_metrics["monitoring_enabled"] = monitoring_enabled_ ? 1.0 : 0.0;
137 metrics.custom_metrics["logger_available"] = logger_ ? 1.0 : 0.0;
138 metrics.custom_metrics["monitor_available"] = monitor_ ? 1.0 : 0.0;
139
140 // Update cached metrics for next call
141 cached_metrics_ = metrics;
142
143 return metrics;
144}
145
146std::shared_ptr<logger_interface> ObservabilityBridge::get_logger() const {
147 return logger_;
148}
149
150std::shared_ptr<monitoring_interface> ObservabilityBridge::get_monitor() const {
151 return monitor_;
152}
153
157
158#if KCENON_WITH_COMMON_SYSTEM
159Result<std::shared_ptr<ObservabilityBridge>> ObservabilityBridge::from_common_system(
160 std::shared_ptr<::kcenon::common::interfaces::ILogger> logger,
161 std::shared_ptr<::kcenon::common::interfaces::IMonitor> monitor) {
162 if (!logger) {
165 "ObservabilityBridge::from_common_system requires non-null logger",
166 "ObservabilityBridge::from_common_system");
167 }
168 if (!monitor) {
171 "ObservabilityBridge::from_common_system requires non-null monitor",
172 "ObservabilityBridge::from_common_system");
173 }
174 auto adapted_logger = std::make_shared<common_system_logger_adapter>();
175 auto adapted_monitor = std::make_shared<basic_monitoring>();
176 return create(adapted_logger, adapted_monitor, BackendType::CommonSystem);
177}
178#endif
179
180} // namespace kcenon::network::integration
static Result< std::shared_ptr< ObservabilityBridge > > create(std::shared_ptr< logger_interface > logger, std::shared_ptr< monitoring_interface > monitor, BackendType backend_type=BackendType::Standalone)
Construct bridge with logger and monitoring interfaces.
BridgeMetrics get_metrics() const override
Get current metrics.
bool is_initialized() const override
Check if the bridge is initialized.
ObservabilityBridge(std::shared_ptr< logger_interface > logger, std::shared_ptr< monitoring_interface > monitor, BackendType backend_type)
std::shared_ptr< logger_interface > get_logger() const
Get the logger interface.
std::shared_ptr< monitoring_interface > monitor_
VoidResult initialize(const BridgeConfig &config) override
Initialize the bridge with configuration.
VoidResult shutdown() override
Shutdown the bridge.
BackendType get_backend_type() const
Get the backend type.
std::shared_ptr< monitoring_interface > get_monitor() const
Get the monitoring interface.
@ CommonSystem
Uses common_system's ILogger and IMonitor.
tracing_config config
Definition exporters.cpp:29
VoidResult error_void(int code, const std::string &message, const std::string &source="network_system", const std::string &details="")
VoidResult ok()
Observability (logger and monitoring) integration bridge for network_system.
Configuration for bridge initialization.
Metrics and health information for a bridge.
std::chrono::steady_clock::time_point last_activity
Timestamp of last activity or health check.
std::map< std::string, double > custom_metrics
Bridge-specific custom metrics.
bool is_healthy
Overall health status of the bridge.