26std::string counter_to_json(
const operation_counter&
counter) {
27 std::ostringstream oss;
28 const auto total =
counter.total_count();
29 const auto success =
counter.success_count.load(std::memory_order_relaxed);
30 const auto failure =
counter.failure_count.load(std::memory_order_relaxed);
31 const auto avg_us =
counter.average_duration_us();
32 const auto min_us =
counter.min_duration_us.load(std::memory_order_relaxed);
33 const auto max_us =
counter.max_duration_us.load(std::memory_order_relaxed);
36 << R
"("total":)" << total
39 << R"(,"avg_duration_us":)" << avg_us;
43 oss << R
"(,"min_duration_us":)" << min_us
44 << R"(,"max_duration_us":)" << max_us;
58void counter_to_prometheus(std::ostringstream& oss,
59 std::string_view prefix,
60 std::string_view op_name,
61 const operation_counter&
counter) {
62 const auto success =
counter.success_count.load(std::memory_order_relaxed);
63 const auto failure =
counter.failure_count.load(std::memory_order_relaxed);
64 const auto total =
counter.total_count();
65 const auto total_duration =
counter.total_duration_us.load(std::memory_order_relaxed);
68 oss <<
"# HELP " << prefix <<
"_dimse_" << op_name <<
"_total "
69 <<
"Total " << op_name <<
" operations\n"
70 <<
"# TYPE " << prefix <<
"_dimse_" << op_name <<
"_total counter\n"
71 << prefix <<
"_dimse_" << op_name <<
"_total " << total <<
"\n";
74 oss <<
"# HELP " << prefix <<
"_dimse_" << op_name <<
"_success_total "
75 <<
"Successful " << op_name <<
" operations\n"
76 <<
"# TYPE " << prefix <<
"_dimse_" << op_name <<
"_success_total counter\n"
77 << prefix <<
"_dimse_" << op_name <<
"_success_total " <<
success <<
"\n";
80 oss <<
"# HELP " << prefix <<
"_dimse_" << op_name <<
"_failure_total "
81 <<
"Failed " << op_name <<
" operations\n"
82 <<
"# TYPE " << prefix <<
"_dimse_" << op_name <<
"_failure_total counter\n"
83 << prefix <<
"_dimse_" << op_name <<
"_failure_total " <<
failure <<
"\n";
86 oss <<
"# HELP " << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_sum "
87 <<
"Total duration of " << op_name <<
" operations in microseconds\n"
88 <<
"# TYPE " << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_sum counter\n"
89 << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_sum " << total_duration <<
"\n";
93 const auto min_us =
counter.min_duration_us.load(std::memory_order_relaxed);
94 const auto max_us =
counter.max_duration_us.load(std::memory_order_relaxed);
96 oss <<
"# HELP " << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_min "
97 <<
"Minimum duration of " << op_name <<
" operations in microseconds\n"
98 <<
"# TYPE " << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_min gauge\n"
99 << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_min " << min_us <<
"\n";
101 oss <<
"# HELP " << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_max "
102 <<
"Maximum duration of " << op_name <<
" operations in microseconds\n"
103 <<
"# TYPE " << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_max gauge\n"
104 << prefix <<
"_dimse_" << op_name <<
"_duration_microseconds_max " << max_us <<
"\n";
111 std::ostringstream oss;
115 oss << R
"("dimse_operations":{)"
116 << R"("c_echo":)" << counter_to_json(c_echo_)
117 << R"(,"c_store":)" << counter_to_json(c_store_)
118 << R"(,"c_find":)" << counter_to_json(c_find_)
119 << R"(,"c_move":)" << counter_to_json(c_move_)
120 << R"(,"c_get":)" << counter_to_json(c_get_)
121 << R"(,"n_create":)" << counter_to_json(n_create_)
122 << R"(,"n_set":)" << counter_to_json(n_set_)
123 << R"(,"n_get":)" << counter_to_json(n_get_)
124 << R"(,"n_action":)" << counter_to_json(n_action_)
125 << R"(,"n_event":)" << counter_to_json(n_event_)
126 << R"(,"n_delete":)" << counter_to_json(n_delete_)
130 oss << R
"(,"data_transfer":{)"
138 oss << R
"(,"associations":{)"
151 std::ostringstream oss;
154 counter_to_prometheus(oss, prefix,
"c_echo",
c_echo_);
155 counter_to_prometheus(oss, prefix,
"c_store",
c_store_);
156 counter_to_prometheus(oss, prefix,
"c_find",
c_find_);
157 counter_to_prometheus(oss, prefix,
"c_move",
c_move_);
158 counter_to_prometheus(oss, prefix,
"c_get",
c_get_);
159 counter_to_prometheus(oss, prefix,
"n_create",
n_create_);
160 counter_to_prometheus(oss, prefix,
"n_set",
n_set_);
161 counter_to_prometheus(oss, prefix,
"n_get",
n_get_);
162 counter_to_prometheus(oss, prefix,
"n_action",
n_action_);
163 counter_to_prometheus(oss, prefix,
"n_event",
n_event_);
164 counter_to_prometheus(oss, prefix,
"n_delete",
n_delete_);
167 oss <<
"# HELP " << prefix <<
"_bytes_sent_total Total bytes sent over network\n"
168 <<
"# TYPE " << prefix <<
"_bytes_sent_total counter\n"
169 << prefix <<
"_bytes_sent_total " <<
transfer_.
bytes_sent.load(std::memory_order_relaxed) <<
"\n";
171 oss <<
"# HELP " << prefix <<
"_bytes_received_total Total bytes received from network\n"
172 <<
"# TYPE " << prefix <<
"_bytes_received_total counter\n"
175 oss <<
"# HELP " << prefix <<
"_images_stored_total Total DICOM images stored\n"
176 <<
"# TYPE " << prefix <<
"_images_stored_total counter\n"
179 oss <<
"# HELP " << prefix <<
"_images_retrieved_total Total DICOM images retrieved\n"
180 <<
"# TYPE " << prefix <<
"_images_retrieved_total counter\n"
184 oss <<
"# HELP " << prefix <<
"_associations_established_total Total associations established\n"
185 <<
"# TYPE " << prefix <<
"_associations_established_total counter\n"
188 oss <<
"# HELP " << prefix <<
"_associations_rejected_total Total associations rejected\n"
189 <<
"# TYPE " << prefix <<
"_associations_rejected_total counter\n"
192 oss <<
"# HELP " << prefix <<
"_associations_aborted_total Total associations aborted\n"
193 <<
"# TYPE " << prefix <<
"_associations_aborted_total counter\n"
196 oss <<
"# HELP " << prefix <<
"_associations_active Current active associations\n"
197 <<
"# TYPE " << prefix <<
"_associations_active gauge\n"
200 oss <<
"# HELP " << prefix <<
"_associations_peak_active Peak concurrent associations\n"
201 <<
"# TYPE " << prefix <<
"_associations_peak_active gauge\n"
operation_counter n_event_
operation_counter c_move_
std::string to_prometheus(std::string_view prefix="pacs") const
Export metrics in Prometheus text format.
operation_counter c_store_
operation_counter n_action_
operation_counter n_create_
std::string to_json() const
Export metrics as JSON string.
association_counters associations_
operation_counter c_find_
operation_counter c_echo_
data_transfer_metrics transfer_
operation_counter n_delete_
@ counter
Monotonic increasing value.
@ failure
Printer has a critical error.
Operation metrics collection for PACS DICOM services.
std::atomic< std::uint32_t > peak_active
std::atomic< std::uint64_t > total_rejected
std::atomic< std::uint64_t > total_aborted
std::atomic< std::uint32_t > current_active
std::atomic< std::uint64_t > total_established
std::atomic< std::uint64_t > images_retrieved
std::atomic< std::uint64_t > bytes_sent
std::atomic< std::uint64_t > images_stored
std::atomic< std::uint64_t > bytes_received