25#include <unordered_map>
42 std::unordered_map<std::string, std::string>
labels;
48 std::unordered_map<std::string, std::string> l = {})
53 ,
timestamp(std::chrono::system_clock::now())
114 const std::unordered_map<std::string, std::string>& config);
120 [[nodiscard]] std::vector<storage_metric>
collect();
126 [[nodiscard]] std::string
get_name()
const;
144 [[nodiscard]] std::unordered_map<std::string, double>
get_statistics()
const;
195 const std::string&
name,
197 const std::string& type,
198 const std::string& unit =
"")
const;
206 : ae_title_(std::move(ae_title)) {}
209 const std::unordered_map<std::string, std::string>& config) {
211 if (
auto it = config.find(
"ae_title"); it != config.end()) {
216 if (
auto it = config.find(
"collect_pool_metrics"); it != config.end()) {
220 init_time_ = std::chrono::steady_clock::now();
227 std::vector<storage_metric> metrics;
251 std::vector<storage_metric>& metrics) {
254 const auto now = std::chrono::steady_clock::now();
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);
264 "dicom_bytes_sent_total",
265 static_cast<double>(bytes_sent),
271 "dicom_bytes_received_total",
272 static_cast<double>(bytes_received),
278 "dicom_images_stored_total",
279 static_cast<double>(images_stored),
285 "dicom_images_retrieved_total",
286 static_cast<double>(images_retrieved),
291 const auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
294 if (elapsed.count() > 0) {
297 const double send_rate =
298 static_cast<double>(sent_delta) * 1000.0 /
static_cast<double>(elapsed.count());
300 "dicom_bytes_sent_rate",
303 "bytes_per_second"));
307 const double receive_rate =
308 static_cast<double>(received_delta) * 1000.0 /
static_cast<double>(elapsed.count());
310 "dicom_bytes_received_rate",
313 "bytes_per_second"));
323 std::vector<storage_metric>& metrics) {
328 const auto& element_pool =
pacs.element_pool();
330 "dicom_element_pool_acquisitions_total",
331 static_cast<double>(element_pool.total_acquisitions.load(std::memory_order_relaxed)),
335 "dicom_element_pool_hit_ratio",
336 element_pool.hit_ratio(),
340 "dicom_element_pool_size",
341 static_cast<double>(element_pool.current_pool_size.load(std::memory_order_relaxed)),
346 const auto& dataset_pool =
pacs.dataset_pool();
348 "dicom_dataset_pool_acquisitions_total",
349 static_cast<double>(dataset_pool.total_acquisitions.load(std::memory_order_relaxed)),
353 "dicom_dataset_pool_hit_ratio",
354 dataset_pool.hit_ratio(),
358 "dicom_dataset_pool_size",
359 static_cast<double>(dataset_pool.current_pool_size.load(std::memory_order_relaxed)),
364 const auto& pdu_pool =
pacs.pdu_buffer_pool();
366 "dicom_pdu_buffer_pool_acquisitions_total",
367 static_cast<double>(pdu_pool.total_acquisitions.load(std::memory_order_relaxed)),
371 "dicom_pdu_buffer_pool_hit_ratio",
372 pdu_pool.hit_ratio(),
376 "dicom_pdu_buffer_pool_size",
377 static_cast<double>(pdu_pool.current_pool_size.load(std::memory_order_relaxed)),
383 return "dicom_storage_collector";
387 std::vector<std::string> types = {
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"
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");
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");
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");
419inline std::unordered_map<std::string, double>
423 std::unordered_map<std::string, double> stats;
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());
452 const std::string&
name,
454 const std::string& type,
455 const std::string& unit)
const {
Collector for DICOM storage and data transfer metrics.
void collect_transfer_metrics(std::vector< storage_metric > &metrics)
dicom_storage_collector(const dicom_storage_collector &)=delete
~dicom_storage_collector()=default
Destructor.
dicom_storage_collector(std::string ae_title="PACS_SCP")
Default constructor.
std::uint64_t collection_count_
std::string get_ae_title() const
Get the current AE title.
dicom_storage_collector & operator=(dicom_storage_collector &&)=delete
void set_pool_metrics_enabled(bool enabled)
Enable or disable pool metrics collection.
bool is_healthy() const
Check if the collector is healthy.
bool collect_pool_metrics_
std::uint64_t prev_bytes_sent_
std::vector< std::string > get_metric_types() const
Get supported metric types.
std::chrono::steady_clock::time_point init_time_
bool initialize(const std::unordered_map< std::string, std::string > &config)
Initialize the collector with configuration.
std::string get_name() const
Get the collector name.
bool is_pool_metrics_enabled() const
Check if pool metrics collection is enabled.
std::chrono::steady_clock::time_point prev_collection_time_
std::unordered_map< std::string, double > get_statistics() const
Get collector statistics.
std::vector< storage_metric > collect()
Collect current storage metrics.
void set_ae_title(std::string ae_title)
Set the AE title for metric labels.
dicom_storage_collector & operator=(const dicom_storage_collector &)=delete
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
std::uint64_t prev_bytes_received_
dicom_storage_collector(dicom_storage_collector &&)=delete
const data_transfer_metrics & transfer() const noexcept
Get data transfer metrics.
static pacs_metrics & global_metrics() noexcept
Get the global singleton instance.
Operation metrics collection for PACS DICOM services.
Standard metric structure for storage data.
std::unordered_map< std::string, std::string > labels
storage_metric(std::string n, double v, std::string t, std::string u="", std::unordered_map< std::string, std::string > l={})
std::chrono::system_clock::time_point timestamp