PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::monitoring::dicom_collector_base< Derived > Class Template Reference

CRTP base class for DICOM metric collectors. More...

#include <dicom_collector_base.h>

Inheritance diagram for kcenon::pacs::monitoring::dicom_collector_base< Derived >:
Inheritance graph
Collaboration diagram for kcenon::pacs::monitoring::dicom_collector_base< Derived >:
Collaboration graph

Public Member Functions

 dicom_collector_base ()=default
 
virtual ~dicom_collector_base ()=default
 
 dicom_collector_base (const dicom_collector_base &)=delete
 
dicom_collector_baseoperator= (const dicom_collector_base &)=delete
 
 dicom_collector_base (dicom_collector_base &&)=delete
 
dicom_collector_baseoperator= (dicom_collector_base &&)=delete
 
bool initialize (const config_map &config)
 Initialize the collector with configuration.
 
std::vector< dicom_metriccollect ()
 Collect metrics from the data source.
 
std::string get_name () const
 Get the name of this collector.
 
std::vector< std::string > get_metric_types () const
 Get supported metric types.
 
bool is_healthy () const
 Check if the collector is healthy.
 
stats_map get_statistics () const
 Get collector statistics.
 
bool is_enabled () const
 Check if collector is enabled.
 
std::size_t get_collection_count () const
 Get collection count.
 
std::size_t get_collection_errors () const
 Get error count.
 
std::string get_ae_title () const
 Get the AE title.
 
void set_ae_title (std::string ae_title)
 Set the AE title.
 

Protected Member Functions

dicom_metric create_base_metric (const std::string &name, double value, const std::string &type, const std::unordered_map< std::string, std::string > &extra_tags={}) const
 Create a metric with common tags.
 

Protected Attributes

bool enabled_ {true}
 
std::string ae_title_ {"PACS_SCP"}
 
std::mutex stats_mutex_
 
std::atomic< std::size_t > collection_count_ {0}
 
std::atomic< std::size_t > collection_errors_ {0}
 
std::chrono::steady_clock::time_point init_time_
 
std::chrono::system_clock::time_point last_collection_time_
 

Private Member Functions

Derived & derived ()
 Get reference to derived class (CRTP helper)
 
const Derived & derived () const
 

Detailed Description

template<typename Derived>
class kcenon::pacs::monitoring::dicom_collector_base< Derived >

CRTP base class for DICOM metric collectors.

This template class implements common functionality shared by all DICOM collectors:

  • Configuration parsing (enabled state, AE title)
  • Collection with error handling and statistics
  • Health monitoring
  • Statistics tracking (collection count, error count)

Usage:

class my_dicom_collector : public dicom_collector_base<my_dicom_collector> {
public:
static constexpr const char* collector_name = "my_dicom_collector";
bool do_initialize(const config_map& config) {
return true;
}
std::vector<dicom_metric> do_collect() {
return metrics;
}
bool is_available() const { return true; }
std::vector<std::string> do_get_metric_types() const {
return {"metric_1", "metric_2"};
}
void do_add_statistics(stats_map& stats) const {}
};
CRTP base class for DICOM metric collectors.
std::unordered_map< std::string, std::string > config_map
Type alias for configuration map.
Template Parameters
DerivedThe derived collector class (CRTP pattern)

Definition at line 104 of file dicom_collector_base.h.

Constructor & Destructor Documentation

◆ dicom_collector_base() [1/3]

template<typename Derived >
kcenon::pacs::monitoring::dicom_collector_base< Derived >::dicom_collector_base ( )
default

◆ ~dicom_collector_base()

template<typename Derived >
virtual kcenon::pacs::monitoring::dicom_collector_base< Derived >::~dicom_collector_base ( )
virtualdefault

◆ dicom_collector_base() [2/3]

template<typename Derived >
kcenon::pacs::monitoring::dicom_collector_base< Derived >::dicom_collector_base ( const dicom_collector_base< Derived > & )
delete

◆ dicom_collector_base() [3/3]

template<typename Derived >
kcenon::pacs::monitoring::dicom_collector_base< Derived >::dicom_collector_base ( dicom_collector_base< Derived > && )
delete

Member Function Documentation

◆ collect()

template<typename Derived >
std::vector< dicom_metric > kcenon::pacs::monitoring::dicom_collector_base< Derived >::collect ( )
inline

Collect metrics from the data source.

Returns
Collection of DICOM metrics

Definition at line 142 of file dicom_collector_base.h.

142 {
143 if (!enabled_) {
144 return {};
145 }
146
147 try {
148 auto metrics = derived().do_collect();
150 last_collection_time_ = std::chrono::system_clock::now();
151 return metrics;
152 } catch (...) {
154 return {};
155 }
156 }
std::chrono::system_clock::time_point last_collection_time_
Derived & derived()
Get reference to derived class (CRTP helper)

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::collection_count_, kcenon::pacs::monitoring::dicom_collector_base< Derived >::collection_errors_, kcenon::pacs::monitoring::dicom_collector_base< Derived >::derived(), kcenon::pacs::monitoring::dicom_collector_base< Derived >::enabled_, and kcenon::pacs::monitoring::dicom_collector_base< Derived >::last_collection_time_.

Here is the call graph for this function:

◆ create_base_metric()

template<typename Derived >
dicom_metric kcenon::pacs::monitoring::dicom_collector_base< Derived >::create_base_metric ( const std::string & name,
double value,
const std::string & type,
const std::unordered_map< std::string, std::string > & extra_tags = {} ) const
inlinenodiscardprotected

Create a metric with common tags.

Parameters
nameMetric name
valueMetric value
typeMetric type ("gauge", "counter", "histogram")
extra_tagsAdditional tags to include
Returns
Created metric

Definition at line 254 of file dicom_collector_base.h.

258 {}) const {
259
260 std::unordered_map<std::string, std::string> tags = extra_tags;
261 tags["collector"] = Derived::collector_name;
262 if (!ae_title_.empty()) {
263 tags["ae_title"] = ae_title_;
264 }
265
266 return dicom_metric(name, value, type, std::move(tags));
267 }
std::string_view name

◆ derived() [1/2]

◆ derived() [2/2]

template<typename Derived >
const Derived & kcenon::pacs::monitoring::dicom_collector_base< Derived >::derived ( ) const
inlineprivate

Definition at line 285 of file dicom_collector_base.h.

285{ return static_cast<const Derived&>(*this); }

◆ get_ae_title()

template<typename Derived >
std::string kcenon::pacs::monitoring::dicom_collector_base< Derived >::get_ae_title ( ) const
inlinenodiscard

Get the AE title.

Returns
Application Entity title

Definition at line 237 of file dicom_collector_base.h.

237{ return ae_title_; }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::ae_title_.

◆ get_collection_count()

template<typename Derived >
std::size_t kcenon::pacs::monitoring::dicom_collector_base< Derived >::get_collection_count ( ) const
inlinenodiscard

Get collection count.

Returns
Number of successful collections

Definition at line 221 of file dicom_collector_base.h.

221 {
222 return collection_count_.load();
223 }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::collection_count_.

◆ get_collection_errors()

template<typename Derived >
std::size_t kcenon::pacs::monitoring::dicom_collector_base< Derived >::get_collection_errors ( ) const
inlinenodiscard

Get error count.

Returns
Number of failed collections

Definition at line 229 of file dicom_collector_base.h.

229 {
230 return collection_errors_.load();
231 }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::collection_errors_.

◆ get_metric_types()

template<typename Derived >
std::vector< std::string > kcenon::pacs::monitoring::dicom_collector_base< Derived >::get_metric_types ( ) const
inlinenodiscard

Get supported metric types.

Returns
Vector of supported metric type names

Definition at line 170 of file dicom_collector_base.h.

170 {
171 return derived().do_get_metric_types();
172 }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::derived().

Here is the call graph for this function:

◆ get_name()

template<typename Derived >
std::string kcenon::pacs::monitoring::dicom_collector_base< Derived >::get_name ( ) const
inlinenodiscard

Get the name of this collector.

Returns
Collector name from Derived::collector_name

Definition at line 162 of file dicom_collector_base.h.

162 {
163 return Derived::collector_name;
164 }

◆ get_statistics()

template<typename Derived >
stats_map kcenon::pacs::monitoring::dicom_collector_base< Derived >::get_statistics ( ) const
inlinenodiscard

Get collector statistics.

Returns
Map of statistic name to value

Definition at line 189 of file dicom_collector_base.h.

189 {
190 std::lock_guard<std::mutex> lock(stats_mutex_);
191 stats_map stats;
192
193 // Common statistics
194 stats["enabled"] = enabled_ ? 1.0 : 0.0;
195 stats["collection_count"] = static_cast<double>(collection_count_.load());
196 stats["collection_errors"] = static_cast<double>(collection_errors_.load());
197
198 // Uptime if initialized
199 if (init_time_.time_since_epoch().count() > 0) {
200 const auto uptime = std::chrono::duration_cast<std::chrono::seconds>(
201 std::chrono::steady_clock::now() - init_time_);
202 stats["uptime_seconds"] = static_cast<double>(uptime.count());
203 }
204
205 // Let derived class add specific statistics
206 derived().do_add_statistics(stats);
207
208 return stats;
209 }
std::chrono::steady_clock::time_point init_time_

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::collection_count_, kcenon::pacs::monitoring::dicom_collector_base< Derived >::collection_errors_, kcenon::pacs::monitoring::dicom_collector_base< Derived >::derived(), kcenon::pacs::monitoring::dicom_collector_base< Derived >::enabled_, kcenon::pacs::monitoring::dicom_collector_base< Derived >::init_time_, and kcenon::pacs::monitoring::dicom_collector_base< Derived >::stats_mutex_.

Here is the call graph for this function:

◆ initialize()

template<typename Derived >
bool kcenon::pacs::monitoring::dicom_collector_base< Derived >::initialize ( const config_map & config)
inline

Initialize the collector with configuration.

Parameters
configConfiguration options
  • "enabled": "true"/"false" (default: true)
  • "ae_title": Application Entity title for labeling
Returns
true if initialization successful

Definition at line 122 of file dicom_collector_base.h.

122 {
123 // Parse common configuration
124 if (auto it = config.find("enabled"); it != config.end()) {
125 enabled_ = (it->second == "true" || it->second == "1");
126 }
127
128 if (auto it = config.find("ae_title"); it != config.end()) {
129 ae_title_ = it->second;
130 }
131
132 init_time_ = std::chrono::steady_clock::now();
133
134 // Delegate to derived class for specific initialization
135 return derived().do_initialize(config);
136 }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::ae_title_, kcenon::pacs::monitoring::dicom_collector_base< Derived >::derived(), kcenon::pacs::monitoring::dicom_collector_base< Derived >::enabled_, and kcenon::pacs::monitoring::dicom_collector_base< Derived >::init_time_.

Here is the call graph for this function:

◆ is_enabled()

template<typename Derived >
bool kcenon::pacs::monitoring::dicom_collector_base< Derived >::is_enabled ( ) const
inlinenodiscard

Check if collector is enabled.

Returns
true if enabled

Definition at line 215 of file dicom_collector_base.h.

215{ return enabled_; }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::enabled_.

◆ is_healthy()

template<typename Derived >
bool kcenon::pacs::monitoring::dicom_collector_base< Derived >::is_healthy ( ) const
inlinenodiscard

Check if the collector is healthy.

Returns
true if collector is operational

Definition at line 178 of file dicom_collector_base.h.

178 {
179 if (!enabled_) {
180 return true; // Disabled collectors are considered healthy
181 }
182 return derived().is_available();
183 }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::derived(), and kcenon::pacs::monitoring::dicom_collector_base< Derived >::enabled_.

Here is the call graph for this function:

◆ operator=() [1/2]

template<typename Derived >
dicom_collector_base & kcenon::pacs::monitoring::dicom_collector_base< Derived >::operator= ( const dicom_collector_base< Derived > & )
delete

◆ operator=() [2/2]

template<typename Derived >
dicom_collector_base & kcenon::pacs::monitoring::dicom_collector_base< Derived >::operator= ( dicom_collector_base< Derived > && )
delete

◆ set_ae_title()

template<typename Derived >
void kcenon::pacs::monitoring::dicom_collector_base< Derived >::set_ae_title ( std::string ae_title)
inline

Set the AE title.

Parameters
ae_titleApplication Entity title

Definition at line 243 of file dicom_collector_base.h.

243{ ae_title_ = std::move(ae_title); }

References kcenon::pacs::monitoring::dicom_collector_base< Derived >::ae_title_.

Member Data Documentation

◆ ae_title_

◆ collection_count_

◆ collection_errors_

◆ enabled_

◆ init_time_

template<typename Derived >
std::chrono::steady_clock::time_point kcenon::pacs::monitoring::dicom_collector_base< Derived >::init_time_
protected

◆ last_collection_time_

template<typename Derived >
std::chrono::system_clock::time_point kcenon::pacs::monitoring::dicom_collector_base< Derived >::last_collection_time_
protected

◆ stats_mutex_

template<typename Derived >
std::mutex kcenon::pacs::monitoring::dicom_collector_base< Derived >::stats_mutex_
mutableprotected

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