artdaq_utilities  v1_04_11
MetricManager.hh
1 #ifndef artdaq_DAQrate_MetricManager_hh
2 #define artdaq_DAQrate_MetricManager_hh
3 
4 // MetricManager class definition file
5 // Author: Eric Flumerfelt
6 // Last Modified: 11/14/2014
7 //
8 // MetricManager loads a user-specified set of plugins, sends them their configuration,
9 // and sends them data as it is recieved. It also maintains the state of the plugins
10 // relative to the application state.
11 
12 #include "artdaq-utilities/Plugins/MetricData.hh"
13 #include "artdaq-utilities/Plugins/MetricPlugin.hh"
14 #include "fhiclcpp/fwd.h"
15 #include "fhiclcpp/types/OptionalTable.h"
16 #include "messagefacility/MessageLogger/MessageLogger.h"
17 
18 #include <atomic>
19 #include <boost/thread.hpp>
20 #include <condition_variable>
21 #include <queue>
22 #include <sstream>
23 
24 namespace artdaq {
25  class MetricManager;
26 }
27 
34 public:
38  struct Config {
41  fhicl::Atom<size_t> metric_queue_size{
42  fhicl::Name{"metric_queue_size"},
43  fhicl::Comment{"The maximum number of metric entries which can be stored in the metric queue."}, 1000};
46  fhicl::Atom<size_t> metric_queue_notify_size{
47  fhicl::Name{"metric_queue_notify_size"},
48  fhicl::Comment{
49  "The number of metric entries in the list which will cause reports of the queue size to be printed."},
50  10};
53  fhicl::Atom<int> metric_send_maximum_delay_ms{
54  fhicl::Name{"metric_send_maximum_delay_ms"},
55  fhicl::Comment{"The maximum amount of time between metric send calls (will send 0s for metrics which have not "
56  "reported in this interval)"},
57  15000};
59  fhicl::OptionalTable<artdaq::MetricPlugin::Config> metricConfig{ fhicl::Name{"metricConfig"} };
60  };
62  using Parameters = fhicl::WrappedTable<Config>;
63 
67  MetricManager();
68 
72  MetricManager(MetricManager const&) = delete;
73 
79  virtual ~MetricManager() noexcept;
80 
85  MetricManager& operator=(MetricManager const&) = delete;
86 
100  void initialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
101 
105  void do_start();
106 
110  void do_stop();
111 
115  void do_pause();
116 
120  void do_resume();
121 
129  void reinitialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
130 
134  void shutdown();
135 
149  void sendMetric(std::string const& name, std::string const& value, std::string const& unit, int level,
150  MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
151 
165  void sendMetric(std::string const& name, int const& value, std::string const& unit, int level, MetricMode mode,
166  std::string const& metricPrefix = "", bool useNameOverride = false);
167 
181  void sendMetric(std::string const& name, double const& value, std::string const& unit, int level, MetricMode mode,
182  std::string const& metricPrefix = "", bool useNameOverride = false);
183 
197  void sendMetric(std::string const& name, float const& value, std::string const& unit, int level, MetricMode mode,
198  std::string const& metricPrefix = "", bool useNameOverride = false);
199 
213  void sendMetric(std::string const& name, long unsigned int const& value, std::string const& unit, int level,
214  MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
215 
220  void setPrefix(std::string const& prefix) { prefix_ = prefix; }
221 
226  bool Initialized() { return initialized_; }
227 
232  bool Running() { return running_; }
233 
238  bool Active() { return active_; }
239 
244  bool metricQueueEmpty();
245 
251  size_t metricQueueSize(std::string const& name = "");
252 
253 private:
254  void sendMetricLoop_();
255 
256  void startMetricLoop_();
257 
258  std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
259  boost::thread metric_sending_thread_;
260  std::mutex metric_mutex_;
261  std::condition_variable metric_cv_;
262  int metric_send_interval_ms_;
263 
264  std::atomic<bool> initialized_;
265  std::atomic<bool> running_;
266  std::atomic<bool> active_;
267  std::string prefix_;
268 
269  std::unordered_map<std::string, std::unique_ptr<MetricData>> metric_cache_;
270  std::mutex metric_cache_mutex_;
271  std::atomic<size_t> missed_metric_calls_;
272  std::atomic<size_t> metric_calls_;
273  size_t metric_cache_max_size_;
274  size_t metric_cache_notify_size_;
275 };
276 
277 #endif /* artdaq_DAQrate_MetricManager_hh */
fhicl::Atom< int > metric_send_maximum_delay_ms
void shutdown()
Call the destructors for all configured MetricPlugin instances.
void initialize(fhicl::ParameterSet const &pset, std::string const &prefix="")
Initialize the MetricPlugin instances.
bool Initialized()
Returns whether the MetricManager has been initialized (configured)
void sendMetric(std::string const &name, std::string const &value, std::string const &unit, int level, MetricMode mode, std::string const &metricPrefix="", bool useNameOverride=false)
Send a metric with the given parameters to any MetricPlugins with a threshold level &gt;= to level...
size_t metricQueueSize(std::string const &name="")
Return the size of the named metric queue
void reinitialize(fhicl::ParameterSet const &pset, std::string const &prefix="")
Reinitialize all MetricPlugin Instances.
MetricMode
The Mode of the metric indicates how multiple metric values should be combined within a reporting int...
Definition: MetricData.hh:30
MetricManager()
Construct an instance of the MetricManager class.
void do_start()
Perform startup actions for each configured MetricPlugin.
fhicl::Atom< size_t > metric_queue_notify_size
bool Running()
Returns whether the MetricManager is running (accepting metric calls)
void do_stop()
Stop sending metrics to the MetricPlugin instances.
virtual ~MetricManager() noexcept
MetricManager destructor.
void setPrefix(std::string const &prefix)
Sets the prefix prepended to all metrics without useNameOverride set.
The MetricManager class handles loading metric plugins and asynchronously sending metric data to them...
The Config struct defines the accepted configuration parameters for this class.
fhicl::OptionalTable< artdaq::MetricPlugin::Config > metricConfig
Example MetricPlugin Configuration.
fhicl::WrappedTable< Config > Parameters
Used for ParameterSet validation (if desired)
bool Active()
Returns whether any Metric Plugins are defined and configured
void do_resume()
Resume metric sending. Currently a No-Op.
bool metricQueueEmpty()
Returns whether the metric queue is completely empty
void do_pause()
Pause metric sending. Currently a No-Op.
fhicl::Atom< size_t > metric_queue_size