PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::integration::monitoring_adapter::impl Class Reference
Collaboration diagram for kcenon::pacs::integration::monitoring_adapter::impl:
Collaboration graph

Public Member Functions

 impl ()=default
 
 ~impl ()
 
void initialize (const monitoring_config &config)
 
void shutdown ()
 
auto is_initialized () const noexcept -> bool
 
void increment_counter (std::string_view name, std::int64_t value)
 
void set_gauge (std::string_view name, double value)
 
void record_histogram (std::string_view name, double value)
 
void record_timing (std::string_view name, std::chrono::nanoseconds duration)
 
void record_c_store (std::chrono::nanoseconds duration, std::size_t bytes, bool success)
 
void record_c_find (std::chrono::nanoseconds duration, std::size_t matches, query_level level)
 
void record_association (const std::string &calling_ae, bool established)
 
void update_storage_stats (std::size_t total_instances, std::size_t total_bytes)
 
auto get_health () -> monitoring_adapter::health_status
 
void register_health_check (std::string_view component, std::function< bool()> check)
 
void unregister_health_check (std::string_view component)
 
auto get_config () const -> const monitoring_config &
 

Private Attributes

std::mutex mutex_
 
std::mutex counters_mutex_
 
std::mutex gauges_mutex_
 
std::shared_mutex health_checks_mutex_
 
std::atomic< bool > initialized_ {false}
 
monitoring_config config_
 
std::unordered_map< std::string, std::int64_t > counters_
 
std::unordered_map< std::string, double > gauges_
 
std::unordered_map< std::string, std::function< bool()> > health_checks_
 

Detailed Description

Definition at line 166 of file monitoring_adapter.cpp.

Constructor & Destructor Documentation

◆ impl()

kcenon::pacs::integration::monitoring_adapter::impl::impl ( )
default

◆ ~impl()

kcenon::pacs::integration::monitoring_adapter::impl::~impl ( )
inline

Member Function Documentation

◆ get_config()

auto kcenon::pacs::integration::monitoring_adapter::impl::get_config ( ) const -> const monitoring_config&
inlinenodiscard

Definition at line 372 of file monitoring_adapter.cpp.

372 {
373 return config_;
374 }

Referenced by kcenon::pacs::integration::monitoring_adapter::get_config().

Here is the caller graph for this function:

◆ get_health()

auto kcenon::pacs::integration::monitoring_adapter::impl::get_health ( ) -> monitoring_adapter::health_status
inlinenodiscard

Definition at line 337 of file monitoring_adapter.cpp.

337 {
338 monitoring_adapter::health_status status;
339 status.healthy = true;
340 status.status = "healthy";
341
342 std::shared_lock lock(health_checks_mutex_);
343 for (const auto& [component, check] : health_checks_) {
344 try {
345 bool component_healthy = check();
346 status.components[component] = component_healthy ? "healthy" : "unhealthy";
347 if (!component_healthy) {
348 status.healthy = false;
349 status.status = "degraded";
350 }
351 } catch (const std::exception& e) {
352 status.components[component] = std::string("error: ") + e.what();
353 status.healthy = false;
354 status.status = "degraded";
355 }
356 }
357
358 return status;
359 }
std::unordered_map< std::string, std::function< bool()> > health_checks_
constexpr dicom_tag status
Status.

Referenced by kcenon::pacs::integration::monitoring_adapter::get_health().

Here is the caller graph for this function:

◆ increment_counter()

void kcenon::pacs::integration::monitoring_adapter::impl::increment_counter ( std::string_view name,
std::int64_t value )
inline

Definition at line 226 of file monitoring_adapter.cpp.

226 {
227 if (!initialized_) return;
228
229 std::lock_guard lock(counters_mutex_);
230 counters_[std::string(name)] += value;
231 }
std::unordered_map< std::string, std::int64_t > counters_
std::string_view name

References name.

Referenced by kcenon::pacs::integration::monitoring_adapter::increment_counter().

Here is the caller graph for this function:

◆ initialize()

void kcenon::pacs::integration::monitoring_adapter::impl::initialize ( const monitoring_config & config)
inline

Definition at line 171 of file monitoring_adapter.cpp.

171 {
172 std::lock_guard lock(mutex_);
173
174 if (initialized_) {
175 return;
176 }
177
178 config_ = config;
179
180 // Initialize performance monitor
181 if (config.enable_metrics) {
182 auto& monitor = kcenon::monitoring::global_performance_monitor();
183 monitor.set_enabled(true);
184 monitor.get_profiler().set_max_samples(config.max_samples_per_operation);
185
186 auto init_result = monitor.initialize();
187 if (init_result.is_err()) {
188 // Log warning but continue - metrics will still work locally
189 }
190 }
191
192 // Initialize counters and gauges to zero
199
203
204 initialized_ = true;
205 }
std::unordered_map< std::string, double > gauges_

References kcenon::pacs::integration::monitoring_config::enable_metrics, and kcenon::pacs::integration::monitoring_config::max_samples_per_operation.

Referenced by kcenon::pacs::integration::monitoring_adapter::initialize().

Here is the caller graph for this function:

◆ is_initialized()

auto kcenon::pacs::integration::monitoring_adapter::impl::is_initialized ( ) const -> bool
inlinenodiscardnoexcept

Definition at line 222 of file monitoring_adapter.cpp.

222 {
223 return initialized_.load();
224 }

Referenced by kcenon::pacs::integration::monitoring_adapter::is_initialized().

Here is the caller graph for this function:

◆ record_association()

void kcenon::pacs::integration::monitoring_adapter::impl::record_association ( const std::string & calling_ae,
bool established )
inline

Definition at line 307 of file monitoring_adapter.cpp.

307 {
308 if (!initialized_) return;
309
310 // Update counters and gauges
311 {
312 std::lock_guard lock(counters_mutex_);
314 }
315
316 {
317 std::lock_guard lock(gauges_mutex_);
318 if (established) {
320 } else {
322 (std::max)(0.0, gauges_[metrics::associations_active] - 1);
323 }
324 }
325
326 (void)calling_ae; // Used for logging/tagging
327 }

Referenced by kcenon::pacs::integration::monitoring_adapter::record_association().

Here is the caller graph for this function:

◆ record_c_find()

void kcenon::pacs::integration::monitoring_adapter::impl::record_c_find ( std::chrono::nanoseconds duration,
std::size_t matches,
query_level level )
inline

Definition at line 281 of file monitoring_adapter.cpp.

283 {
284 if (!initialized_) return;
285
286 // Update counters
287 {
288 std::lock_guard lock(counters_mutex_);
290 }
291
292 // Record timing and matches histogram
294 auto& profiler =
295 kcenon::monitoring::global_performance_monitor().get_profiler();
296 profiler.record_sample(metrics::c_find_duration, duration, true);
297
298 // Record matches as a timing metric (converting to nanoseconds)
299 auto matches_as_duration =
300 std::chrono::nanoseconds(static_cast<std::int64_t>(matches));
301 profiler.record_sample(metrics::c_find_matches, matches_as_duration, true);
302 }
303
304 (void)level; // Level used for tagging in tracing
305 }
bool enable_metrics
Enable metrics collection.

Referenced by kcenon::pacs::integration::monitoring_adapter::record_c_find().

Here is the caller graph for this function:

◆ record_c_store()

void kcenon::pacs::integration::monitoring_adapter::impl::record_c_store ( std::chrono::nanoseconds duration,
std::size_t bytes,
bool success )
inline

Definition at line 256 of file monitoring_adapter.cpp.

258 {
259 if (!initialized_) return;
260
261 // Update counters
262 {
263 std::lock_guard lock(counters_mutex_);
265 if (success) {
267 } else {
269 }
270 counters_[metrics::c_store_bytes_total] += static_cast<std::int64_t>(bytes);
271 }
272
273 // Record timing histogram
275 auto& profiler =
276 kcenon::monitoring::global_performance_monitor().get_profiler();
277 profiler.record_sample(metrics::c_store_duration, duration, success);
278 }
279 }

References kcenon::pacs::integration::success.

Referenced by kcenon::pacs::integration::monitoring_adapter::record_c_store().

Here is the caller graph for this function:

◆ record_histogram()

void kcenon::pacs::integration::monitoring_adapter::impl::record_histogram ( std::string_view name,
double value )
inline

Definition at line 240 of file monitoring_adapter.cpp.

240 {
241 if (!initialized_ || !config_.enable_metrics) return;
242
243 auto& profiler = kcenon::monitoring::global_performance_monitor().get_profiler();
244 // Convert double to nanoseconds for histogram recording
245 auto duration = std::chrono::nanoseconds(static_cast<std::int64_t>(value * 1e9));
246 profiler.record_sample(std::string(name), duration, true);
247 }

References name.

Referenced by kcenon::pacs::integration::monitoring_adapter::record_histogram().

Here is the caller graph for this function:

◆ record_timing()

void kcenon::pacs::integration::monitoring_adapter::impl::record_timing ( std::string_view name,
std::chrono::nanoseconds duration )
inline

Definition at line 249 of file monitoring_adapter.cpp.

249 {
250 if (!initialized_ || !config_.enable_metrics) return;
251
252 auto& profiler = kcenon::monitoring::global_performance_monitor().get_profiler();
253 profiler.record_sample(std::string(name), duration, true);
254 }

References name.

Referenced by kcenon::pacs::integration::monitoring_adapter::record_timing().

Here is the caller graph for this function:

◆ register_health_check()

void kcenon::pacs::integration::monitoring_adapter::impl::register_health_check ( std::string_view component,
std::function< bool()> check )
inline

Definition at line 361 of file monitoring_adapter.cpp.

362 {
363 std::unique_lock lock(health_checks_mutex_);
364 health_checks_[std::string(component)] = std::move(check);
365 }

Referenced by kcenon::pacs::integration::monitoring_adapter::register_health_check().

Here is the caller graph for this function:

◆ set_gauge()

void kcenon::pacs::integration::monitoring_adapter::impl::set_gauge ( std::string_view name,
double value )
inline

Definition at line 233 of file monitoring_adapter.cpp.

233 {
234 if (!initialized_) return;
235
236 std::lock_guard lock(gauges_mutex_);
237 gauges_[std::string(name)] = value;
238 }

References name.

Referenced by kcenon::pacs::integration::monitoring_adapter::set_gauge().

Here is the caller graph for this function:

◆ shutdown()

void kcenon::pacs::integration::monitoring_adapter::impl::shutdown ( )
inline

Definition at line 207 of file monitoring_adapter.cpp.

207 {
208 std::lock_guard lock(mutex_);
209
210 if (!initialized_) {
211 return;
212 }
213
214 // Cleanup performance monitor
215 auto& monitor = kcenon::monitoring::global_performance_monitor();
216 auto cleanup_result = monitor.cleanup();
217 (void)cleanup_result; // Ignore cleanup errors during shutdown
218
219 initialized_ = false;
220 }

Referenced by kcenon::pacs::integration::monitoring_adapter::shutdown().

Here is the caller graph for this function:

◆ unregister_health_check()

void kcenon::pacs::integration::monitoring_adapter::impl::unregister_health_check ( std::string_view component)
inline

Definition at line 367 of file monitoring_adapter.cpp.

367 {
368 std::unique_lock lock(health_checks_mutex_);
369 health_checks_.erase(std::string(component));
370 }

Referenced by kcenon::pacs::integration::monitoring_adapter::unregister_health_check().

Here is the caller graph for this function:

◆ update_storage_stats()

void kcenon::pacs::integration::monitoring_adapter::impl::update_storage_stats ( std::size_t total_instances,
std::size_t total_bytes )
inline

Definition at line 329 of file monitoring_adapter.cpp.

329 {
330 if (!initialized_) return;
331
332 std::lock_guard lock(gauges_mutex_);
333 gauges_[metrics::storage_instances] = static_cast<double>(total_instances);
334 gauges_[metrics::storage_bytes] = static_cast<double>(total_bytes);
335 }

Referenced by kcenon::pacs::integration::monitoring_adapter::update_storage_stats().

Here is the caller graph for this function:

Member Data Documentation

◆ config_

monitoring_config kcenon::pacs::integration::monitoring_adapter::impl::config_
private

Definition at line 383 of file monitoring_adapter.cpp.

◆ counters_

std::unordered_map<std::string, std::int64_t> kcenon::pacs::integration::monitoring_adapter::impl::counters_
private

Definition at line 386 of file monitoring_adapter.cpp.

◆ counters_mutex_

std::mutex kcenon::pacs::integration::monitoring_adapter::impl::counters_mutex_
mutableprivate

Definition at line 378 of file monitoring_adapter.cpp.

◆ gauges_

std::unordered_map<std::string, double> kcenon::pacs::integration::monitoring_adapter::impl::gauges_
private

Definition at line 387 of file monitoring_adapter.cpp.

◆ gauges_mutex_

std::mutex kcenon::pacs::integration::monitoring_adapter::impl::gauges_mutex_
mutableprivate

Definition at line 379 of file monitoring_adapter.cpp.

◆ health_checks_

std::unordered_map<std::string, std::function<bool()> > kcenon::pacs::integration::monitoring_adapter::impl::health_checks_
private

Definition at line 388 of file monitoring_adapter.cpp.

◆ health_checks_mutex_

std::shared_mutex kcenon::pacs::integration::monitoring_adapter::impl::health_checks_mutex_
mutableprivate

Definition at line 380 of file monitoring_adapter.cpp.

◆ initialized_

std::atomic<bool> kcenon::pacs::integration::monitoring_adapter::impl::initialized_ {false}
private

Definition at line 382 of file monitoring_adapter.cpp.

382{false};

◆ mutex_

std::mutex kcenon::pacs::integration::monitoring_adapter::impl::mutex_
mutableprivate

Definition at line 377 of file monitoring_adapter.cpp.


The documentation for this class was generated from the following file: