Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
monitoring_adapter.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
9
10// Include system_monitoring_backend only if monitoring_system is available
11#ifdef HAVE_SYSTEM_MONITORING_BACKEND
13#endif
14
15namespace database
16{
17namespace integrated
18{
19namespace adapters
20{
21
22// ═══════════════════════════════════════════════════════════════
23// Backend Factory
24// ═══════════════════════════════════════════════════════════════
25
26std::unique_ptr<backends::monitoring_backend> monitoring_adapter::create_backend(
27 const db_monitoring_config& config,
29{
30 switch (backend_type)
31 {
33 // Prefer system_monitoring_backend if available
34#ifdef HAVE_SYSTEM_MONITORING_BACKEND
35 return std::make_unique<backends::system_monitoring_backend>(config);
36#else
37 return std::make_unique<backends::fallback_monitoring_backend>(config);
38#endif
39
41#ifdef HAVE_SYSTEM_MONITORING_BACKEND
42 return std::make_unique<backends::system_monitoring_backend>(config);
43#else
44 // Fallback to fallback backend if system backend not available
45 return std::make_unique<backends::fallback_monitoring_backend>(config);
46#endif
47
49 return std::make_unique<backends::fallback_monitoring_backend>(config);
50
52 return std::make_unique<backends::null_monitoring_backend>(config);
53
54 default:
55 return std::make_unique<backends::fallback_monitoring_backend>(config);
56 }
57}
58
59// ═══════════════════════════════════════════════════════════════
60// Public Interface Implementation
61// ═══════════════════════════════════════════════════════════════
62
64 const db_monitoring_config& config,
66 : config_(config)
67 , backend_(create_backend(config, backend_type))
68{
69}
70
72{
73 if (backend_ && backend_->is_initialized())
74 {
75 backend_->shutdown();
76 }
77}
78
80
82{
83 if (!backend_)
84 {
85 return common::VoidResult(
86 common::error_info{ -1, "Backend not created", "" });
87 }
88
89 return backend_->initialize();
90}
91
93{
94 if (!backend_)
95 {
96 return common::ok();
97 }
98
99 return backend_->shutdown();
100}
101
103{
104 return backend_ && backend_->is_initialized();
105}
106
107// ═══════════════════════════════════════════════════════════════
108// Monitoring Interface Implementation
109// ═══════════════════════════════════════════════════════════════
110
111common::VoidResult monitoring_adapter::record_metric(const std::string& name, double value)
112{
113 if (!backend_)
114 {
115 return common::VoidResult(
116 common::error_info{ -1, "Backend not initialized", "" });
117 }
118
119 return backend_->record_metric(name, value);
120}
121
123 const std::string& name, double value,
124 const std::unordered_map<std::string, std::string>& tags)
125{
126 if (!backend_)
127 {
128 return common::VoidResult(
129 common::error_info{ -1, "Backend not initialized", "" });
130 }
131
132 return backend_->record_metric(name, value, tags);
133}
134
136{
137 if (!backend_)
138 {
140 common::error_info{ -1, "Backend not initialized", "" });
141 }
142
143 return backend_->get_metrics();
144}
145
147{
148 if (!backend_)
149 {
151 common::error_info{ -1, "Backend not initialized", "" });
152 }
153
154 return backend_->check_health();
155}
156
158{
159 if (!backend_)
160 {
161 return common::VoidResult(
162 common::error_info{ -1, "Backend not initialized", "" });
163 }
164
165 return backend_->reset();
166}
167
168// ═══════════════════════════════════════════════════════════════
169// Database-Specific Monitoring
170// ═══════════════════════════════════════════════════════════════
171
172void monitoring_adapter::record_query_execution(std::chrono::microseconds duration, bool success)
173{
174 if (backend_)
175 {
176 backend_->record_query_execution(duration, success);
177 }
178}
179
181{
182 if (backend_)
183 {
184 backend_->record_connection_acquired();
185 }
186}
187
189{
190 if (backend_)
191 {
192 backend_->record_connection_released();
193 }
194}
195
196void monitoring_adapter::update_pool_stats(std::size_t active, std::size_t idle, std::size_t total)
197{
198 if (backend_)
199 {
200 backend_->update_pool_stats(active, idle, total);
201 }
202}
203
205{
206 if (backend_)
207 {
208 backend_->record_transaction_begin();
209 }
210}
211
213{
214 if (backend_)
215 {
216 backend_->record_transaction_commit();
217 }
218}
219
221{
222 if (backend_)
223 {
224 backend_->record_transaction_rollback();
225 }
226}
227
229{
230 if (!backend_)
231 {
233 common::error_info{ -1, "Backend not initialized", "" });
234 }
235
236 return backend_->get_database_metrics();
237}
238
240{
241 if (!backend_)
242 {
243 return "# Backend not initialized\n";
244 }
245
246 return backend_->export_prometheus_metrics();
247}
248
249} // namespace adapters
250} // namespace integrated
251} // namespace database
Monitoring adapter for database operations.
void update_pool_stats(std::size_t active, std::size_t idle, std::size_t total)
Update connection pool statistics.
common::VoidResult initialize()
Initialize monitoring system.
void record_connection_released()
Record connection release.
void record_query_execution(std::chrono::microseconds duration, bool success)
Record query execution.
void record_transaction_rollback()
Record transaction rollback.
static std::unique_ptr< backends::monitoring_backend > create_backend(const db_monitoring_config &config, monitoring_backend_type backend_type)
Create appropriate backend based on type.
common::Result< backends::health_check_result > check_health()
Perform health check.
bool is_initialized() const
Check if monitoring is initialized.
~monitoring_adapter()
Destructor - ensures graceful shutdown.
common::Result< database_metrics > get_database_metrics()
Get database-specific metrics.
std::unique_ptr< backends::monitoring_backend > backend_
Monitoring backend implementation.
common::Result< backends::metrics_snapshot > get_metrics()
Get current metrics snapshot.
common::VoidResult record_metric(const std::string &name, double value)
Record a metric value.
monitoring_adapter(const db_monitoring_config &config, monitoring_backend_type backend_type=monitoring_backend_type::auto_select)
Construct monitoring adapter with configuration.
common::VoidResult shutdown()
Shutdown monitoring system.
std::string export_prometheus_metrics()
Export metrics in Prometheus format.
void record_transaction_commit()
Record transaction commit.
void record_connection_acquired()
Record connection acquisition.
Fallback monitoring backend using internal metrics tracking.
Database monitoring adapter with runtime backend selection.
Abstract interface for monitoring backends.
VoidResult ok()
Result< std::monostate > VoidResult
monitoring_backend_type
Monitoring backend type selection.
@ null
No-op backend (discard all metrics)
@ auto_select
Automatically select best available backend.
@ system
Use monitoring_system (requires HAVE_SYSTEM_MONITORING_BACKEND)
static std::shared_ptr< core::database_backend > create_backend(backend_type type)
Create database backend instance.
backend_type
Database backend type enumeration.
kcenon::common::VoidResult VoidResult
Primary VoidResult type - use this for void operations.
Definition result.h:33
Null monitoring backend (no-op)
Monitoring and metrics configuration.
Monitoring backend using kcenon/monitoring_system.