PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::monitoring::dicom_storage_collector Class Reference

Collector for DICOM storage and data transfer metrics. More...

#include <dicom_storage_collector.h>

Collaboration diagram for kcenon::pacs::monitoring::dicom_storage_collector:
Collaboration graph

Public Member Functions

 dicom_storage_collector (std::string ae_title="PACS_SCP")
 Default constructor.
 
 ~dicom_storage_collector ()=default
 Destructor.
 
 dicom_storage_collector (const dicom_storage_collector &)=delete
 
dicom_storage_collectoroperator= (const dicom_storage_collector &)=delete
 
 dicom_storage_collector (dicom_storage_collector &&)=delete
 
dicom_storage_collectoroperator= (dicom_storage_collector &&)=delete
 
bool initialize (const std::unordered_map< std::string, std::string > &config)
 Initialize the collector with configuration.
 
std::vector< storage_metriccollect ()
 Collect current storage metrics.
 
std::string get_name () const
 Get the collector name.
 
std::vector< std::string > get_metric_types () const
 Get supported metric types.
 
bool is_healthy () const
 Check if the collector is healthy.
 
std::unordered_map< std::string, double > get_statistics () const
 Get collector statistics.
 
void set_ae_title (std::string ae_title)
 Set the AE title for metric labels.
 
std::string get_ae_title () const
 Get the current AE title.
 
void set_pool_metrics_enabled (bool enabled)
 Enable or disable pool metrics collection.
 
bool is_pool_metrics_enabled () const
 Check if pool metrics collection is enabled.
 

Private Member Functions

void collect_transfer_metrics (std::vector< storage_metric > &metrics)
 
void collect_pool_metrics (std::vector< storage_metric > &metrics)
 
storage_metric create_metric (const std::string &name, double value, const std::string &type, const std::string &unit="") const
 

Private Attributes

std::string ae_title_
 
bool initialized_ {false}
 
bool collect_pool_metrics_ {true}
 
std::mutex stats_mutex_
 
std::uint64_t collection_count_ {0}
 
std::chrono::steady_clock::time_point init_time_
 
std::uint64_t prev_bytes_sent_ {0}
 
std::uint64_t prev_bytes_received_ {0}
 
std::chrono::steady_clock::time_point prev_collection_time_
 

Detailed Description

Collector for DICOM storage and data transfer metrics.

This collector gathers metrics related to DICOM storage including:

  • Bytes sent/received over the network
  • Images stored/retrieved counts
  • Object pool statistics (element, dataset, PDU buffer pools)
  • Storage throughput calculations

Thread Safety: All public methods are thread-safe.

Definition at line 81 of file dicom_storage_collector.h.

Constructor & Destructor Documentation

◆ dicom_storage_collector() [1/3]

kcenon::pacs::monitoring::dicom_storage_collector::dicom_storage_collector ( std::string ae_title = "PACS_SCP")
inlineexplicit

Default constructor.

Parameters
ae_titleOptional AE title for labeling metrics
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 205 of file dicom_storage_collector.h.

◆ ~dicom_storage_collector()

kcenon::pacs::monitoring::dicom_storage_collector::~dicom_storage_collector ( )
default

◆ dicom_storage_collector() [2/3]

kcenon::pacs::monitoring::dicom_storage_collector::dicom_storage_collector ( const dicom_storage_collector & )
delete

◆ dicom_storage_collector() [3/3]

kcenon::pacs::monitoring::dicom_storage_collector::dicom_storage_collector ( dicom_storage_collector && )
delete

Member Function Documentation

◆ collect()

std::vector< storage_metric > kcenon::pacs::monitoring::dicom_storage_collector::collect ( )
inlinenodiscard

Collect current storage metrics.

Returns
Vector of storage metrics
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 226 of file dicom_storage_collector.h.

226 {
227 std::vector<storage_metric> metrics;
228
229 if (!initialized_) {
230 return metrics;
231 }
232
233 // Collect transfer metrics
235
236 // Collect pool metrics if enabled
238 collect_pool_metrics(metrics);
239 }
240
241 // Update statistics
242 {
243 std::lock_guard<std::mutex> lock(stats_mutex_);
245 }
246
247 return metrics;
248}
void collect_transfer_metrics(std::vector< storage_metric > &metrics)
void collect_pool_metrics(std::vector< storage_metric > &metrics)

References collect_pool_metrics(), collect_pool_metrics_, collect_transfer_metrics(), collection_count_, initialized_, and stats_mutex_.

Here is the call graph for this function:

◆ collect_pool_metrics()

void kcenon::pacs::monitoring::dicom_storage_collector::collect_pool_metrics ( std::vector< storage_metric > & metrics)
inlineprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 322 of file dicom_storage_collector.h.

323 {
324
325 const auto& pacs = pacs_metrics::global_metrics();
326
327 // Element pool metrics
328 const auto& element_pool = pacs.element_pool();
329 metrics.push_back(create_metric(
330 "dicom_element_pool_acquisitions_total",
331 static_cast<double>(element_pool.total_acquisitions.load(std::memory_order_relaxed)),
332 "counter",
333 "count"));
334 metrics.push_back(create_metric(
335 "dicom_element_pool_hit_ratio",
336 element_pool.hit_ratio(),
337 "gauge",
338 "ratio"));
339 metrics.push_back(create_metric(
340 "dicom_element_pool_size",
341 static_cast<double>(element_pool.current_pool_size.load(std::memory_order_relaxed)),
342 "gauge",
343 "count"));
344
345 // Dataset pool metrics
346 const auto& dataset_pool = pacs.dataset_pool();
347 metrics.push_back(create_metric(
348 "dicom_dataset_pool_acquisitions_total",
349 static_cast<double>(dataset_pool.total_acquisitions.load(std::memory_order_relaxed)),
350 "counter",
351 "count"));
352 metrics.push_back(create_metric(
353 "dicom_dataset_pool_hit_ratio",
354 dataset_pool.hit_ratio(),
355 "gauge",
356 "ratio"));
357 metrics.push_back(create_metric(
358 "dicom_dataset_pool_size",
359 static_cast<double>(dataset_pool.current_pool_size.load(std::memory_order_relaxed)),
360 "gauge",
361 "count"));
362
363 // PDU buffer pool metrics
364 const auto& pdu_pool = pacs.pdu_buffer_pool();
365 metrics.push_back(create_metric(
366 "dicom_pdu_buffer_pool_acquisitions_total",
367 static_cast<double>(pdu_pool.total_acquisitions.load(std::memory_order_relaxed)),
368 "counter",
369 "count"));
370 metrics.push_back(create_metric(
371 "dicom_pdu_buffer_pool_hit_ratio",
372 pdu_pool.hit_ratio(),
373 "gauge",
374 "ratio"));
375 metrics.push_back(create_metric(
376 "dicom_pdu_buffer_pool_size",
377 static_cast<double>(pdu_pool.current_pool_size.load(std::memory_order_relaxed)),
378 "gauge",
379 "count"));
380}
storage_metric create_metric(const std::string &name, double value, const std::string &type, const std::string &unit="") const
static pacs_metrics & global_metrics() noexcept
Get the global singleton instance.

References create_metric(), and kcenon::pacs::monitoring::pacs_metrics::global_metrics().

Referenced by collect().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ collect_transfer_metrics()

void kcenon::pacs::monitoring::dicom_storage_collector::collect_transfer_metrics ( std::vector< storage_metric > & metrics)
inlineprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 250 of file dicom_storage_collector.h.

251 {
252
253 const auto& transfer = pacs_metrics::global_metrics().transfer();
254 const auto now = std::chrono::steady_clock::now();
255
256 // Current values
257 const auto bytes_sent = transfer.bytes_sent.load(std::memory_order_relaxed);
258 const auto bytes_received = transfer.bytes_received.load(std::memory_order_relaxed);
259 const auto images_stored = transfer.images_stored.load(std::memory_order_relaxed);
260 const auto images_retrieved = transfer.images_retrieved.load(std::memory_order_relaxed);
261
262 // Total bytes sent (counter)
263 metrics.push_back(create_metric(
264 "dicom_bytes_sent_total",
265 static_cast<double>(bytes_sent),
266 "counter",
267 "bytes"));
268
269 // Total bytes received (counter)
270 metrics.push_back(create_metric(
271 "dicom_bytes_received_total",
272 static_cast<double>(bytes_received),
273 "counter",
274 "bytes"));
275
276 // Images stored (counter)
277 metrics.push_back(create_metric(
278 "dicom_images_stored_total",
279 static_cast<double>(images_stored),
280 "counter",
281 "count"));
282
283 // Images retrieved (counter)
284 metrics.push_back(create_metric(
285 "dicom_images_retrieved_total",
286 static_cast<double>(images_retrieved),
287 "counter",
288 "count"));
289
290 // Calculate throughput rates
291 const auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
293
294 if (elapsed.count() > 0) {
295 // Bytes per second sent (gauge)
296 const auto sent_delta = bytes_sent - prev_bytes_sent_;
297 const double send_rate =
298 static_cast<double>(sent_delta) * 1000.0 / static_cast<double>(elapsed.count());
299 metrics.push_back(create_metric(
300 "dicom_bytes_sent_rate",
301 send_rate,
302 "gauge",
303 "bytes_per_second"));
304
305 // Bytes per second received (gauge)
306 const auto received_delta = bytes_received - prev_bytes_received_;
307 const double receive_rate =
308 static_cast<double>(received_delta) * 1000.0 / static_cast<double>(elapsed.count());
309 metrics.push_back(create_metric(
310 "dicom_bytes_received_rate",
311 receive_rate,
312 "gauge",
313 "bytes_per_second"));
314 }
315
316 // Update previous values for next rate calculation
317 prev_bytes_sent_ = bytes_sent;
318 prev_bytes_received_ = bytes_received;
320}
std::chrono::steady_clock::time_point prev_collection_time_
const data_transfer_metrics & transfer() const noexcept
Get data transfer metrics.

References create_metric(), kcenon::pacs::monitoring::pacs_metrics::global_metrics(), prev_bytes_received_, prev_bytes_sent_, prev_collection_time_, and kcenon::pacs::monitoring::pacs_metrics::transfer().

Referenced by collect().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_metric()

storage_metric kcenon::pacs::monitoring::dicom_storage_collector::create_metric ( const std::string & name,
double value,
const std::string & type,
const std::string & unit = "" ) const
inlinenodiscardprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 451 of file dicom_storage_collector.h.

455 {
456 return storage_metric(
457 name,
458 value,
459 type,
460 unit,
461 {{"ae", ae_title_}});
462}
std::string_view name

References ae_title_, and name.

Referenced by collect_pool_metrics(), and collect_transfer_metrics().

Here is the caller graph for this function:

◆ get_ae_title()

std::string kcenon::pacs::monitoring::dicom_storage_collector::get_ae_title ( ) const
inlinenodiscard

Get the current AE title.

Returns
The Application Entity title
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 439 of file dicom_storage_collector.h.

439 {
440 return ae_title_;
441}

References ae_title_.

◆ get_metric_types()

std::vector< std::string > kcenon::pacs::monitoring::dicom_storage_collector::get_metric_types ( ) const
inlinenodiscard

Get supported metric types.

Returns
Vector of metric type names
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 386 of file dicom_storage_collector.h.

386 {
387 std::vector<std::string> types = {
388 // Transfer metrics
389 "dicom_bytes_sent_total",
390 "dicom_bytes_received_total",
391 "dicom_images_stored_total",
392 "dicom_images_retrieved_total",
393 "dicom_bytes_sent_rate",
394 "dicom_bytes_received_rate"
395 };
396
398 // Element pool
399 types.push_back("dicom_element_pool_acquisitions_total");
400 types.push_back("dicom_element_pool_hit_ratio");
401 types.push_back("dicom_element_pool_size");
402 // Dataset pool
403 types.push_back("dicom_dataset_pool_acquisitions_total");
404 types.push_back("dicom_dataset_pool_hit_ratio");
405 types.push_back("dicom_dataset_pool_size");
406 // PDU buffer pool
407 types.push_back("dicom_pdu_buffer_pool_acquisitions_total");
408 types.push_back("dicom_pdu_buffer_pool_hit_ratio");
409 types.push_back("dicom_pdu_buffer_pool_size");
410 }
411
412 return types;
413}

References collect_pool_metrics_.

◆ get_name()

std::string kcenon::pacs::monitoring::dicom_storage_collector::get_name ( ) const
inlinenodiscard

Get the collector name.

Returns
"dicom_storage_collector"
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 382 of file dicom_storage_collector.h.

382 {
383 return "dicom_storage_collector";
384}

◆ get_statistics()

std::unordered_map< std::string, double > kcenon::pacs::monitoring::dicom_storage_collector::get_statistics ( ) const
inlinenodiscard

Get collector statistics.

Returns
Map of statistic name to value
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 420 of file dicom_storage_collector.h.

420 {
421 std::lock_guard<std::mutex> lock(stats_mutex_);
422
423 std::unordered_map<std::string, double> stats;
424 stats["collection_count"] = static_cast<double>(collection_count_);
425
426 if (initialized_) {
427 const auto uptime = std::chrono::duration_cast<std::chrono::seconds>(
428 std::chrono::steady_clock::now() - init_time_);
429 stats["uptime_seconds"] = static_cast<double>(uptime.count());
430 }
431
432 return stats;
433}

References collection_count_, init_time_, initialized_, and stats_mutex_.

◆ initialize()

bool kcenon::pacs::monitoring::dicom_storage_collector::initialize ( const std::unordered_map< std::string, std::string > & config)
inlinenodiscard

Initialize the collector with configuration.

Parameters
configConfiguration map
Returns
true if initialization succeeded
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 208 of file dicom_storage_collector.h.

209 {
210 // Extract AE title from config if provided
211 if (auto it = config.find("ae_title"); it != config.end()) {
212 ae_title_ = it->second;
213 }
214
215 // Check for pool metrics configuration
216 if (auto it = config.find("collect_pool_metrics"); it != config.end()) {
217 collect_pool_metrics_ = (it->second == "true" || it->second == "1");
218 }
219
220 init_time_ = std::chrono::steady_clock::now();
222 initialized_ = true;
223 return true;
224}

References ae_title_, collect_pool_metrics_, init_time_, initialized_, and prev_collection_time_.

◆ is_healthy()

bool kcenon::pacs::monitoring::dicom_storage_collector::is_healthy ( ) const
inlinenodiscard

Check if the collector is healthy.

Returns
true if operational
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 415 of file dicom_storage_collector.h.

415 {
416 return initialized_;
417}

References initialized_.

◆ is_pool_metrics_enabled()

bool kcenon::pacs::monitoring::dicom_storage_collector::is_pool_metrics_enabled ( ) const
inlinenodiscard

Check if pool metrics collection is enabled.

Returns
true if pool metrics are collected
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 447 of file dicom_storage_collector.h.

447 {
449}

References collect_pool_metrics_.

◆ operator=() [1/2]

◆ operator=() [2/2]

dicom_storage_collector & kcenon::pacs::monitoring::dicom_storage_collector::operator= ( dicom_storage_collector && )
delete

◆ set_ae_title()

void kcenon::pacs::monitoring::dicom_storage_collector::set_ae_title ( std::string ae_title)
inline

Set the AE title for metric labels.

Parameters
ae_titleThe Application Entity title
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 435 of file dicom_storage_collector.h.

435 {
436 ae_title_ = std::move(ae_title);
437}

References ae_title_.

◆ set_pool_metrics_enabled()

void kcenon::pacs::monitoring::dicom_storage_collector::set_pool_metrics_enabled ( bool enabled)
inline

Enable or disable pool metrics collection.

Parameters
enabledWhether to collect pool metrics
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/monitoring/collectors/dicom_storage_collector.h.

Definition at line 443 of file dicom_storage_collector.h.

443 {
444 collect_pool_metrics_ = enabled;
445}

References collect_pool_metrics_.

Member Data Documentation

◆ ae_title_

std::string kcenon::pacs::monitoring::dicom_storage_collector::ae_title_
private

◆ collect_pool_metrics_

bool kcenon::pacs::monitoring::dicom_storage_collector::collect_pool_metrics_ {true}
private

◆ collection_count_

std::uint64_t kcenon::pacs::monitoring::dicom_storage_collector::collection_count_ {0}
private

◆ init_time_

std::chrono::steady_clock::time_point kcenon::pacs::monitoring::dicom_storage_collector::init_time_
private

◆ initialized_

bool kcenon::pacs::monitoring::dicom_storage_collector::initialized_ {false}
private

◆ prev_bytes_received_

std::uint64_t kcenon::pacs::monitoring::dicom_storage_collector::prev_bytes_received_ {0}
private

◆ prev_bytes_sent_

std::uint64_t kcenon::pacs::monitoring::dicom_storage_collector::prev_bytes_sent_ {0}
private

◆ prev_collection_time_

std::chrono::steady_clock::time_point kcenon::pacs::monitoring::dicom_storage_collector::prev_collection_time_
private

◆ stats_mutex_

std::mutex kcenon::pacs::monitoring::dicom_storage_collector::stats_mutex_
mutableprivate

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