artdaq_utilities  v1_04_07
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/MetricPlugin.hh"
13 #include "artdaq-utilities/Plugins/MetricData.hh"
14 #include "fhiclcpp/fwd.h"
15 #include "fhiclcpp/types/OptionalTable.h"
16 #include "messagefacility/MessageLogger/MessageLogger.h"
17 
18 #include <sstream>
19 #include <queue>
20 #include <condition_variable>
21 #include <atomic>
22 #include <boost/thread.hpp>
23 
24 namespace artdaq
25 {
26  class MetricManager;
27 }
28 
35 {
36 public:
40  struct Config
41  {
43  fhicl::Atom<size_t> metric_queue_size{ fhicl::Name{"metric_queue_size"}, fhicl::Comment{"The maximum number of metric entries which can be stored in the metric queue."}, 1000 };
45  fhicl::Atom<size_t> metric_queue_notify_size{ fhicl::Name{"metric_queue_notify_size"}, fhicl::Comment{"The number of metric entries in the list which will cause reports of the queue size to be printed."}, 10 };
47  fhicl::Atom<int> metric_send_maximum_delay_ms{ fhicl::Name{"metric_send_maximum_delay_ms"}, fhicl::Comment{"The maximum amount of time between metric send calls (will send 0s for metrics which have not reported in this interval)"}, 15000 };
49  fhicl::OptionalTable<artdaq::MetricPlugin::Config> metricConfig{ fhicl::Name{"metricConfig"} };
50  };
51 #if MESSAGEFACILITY_HEX_VERSION >= 0x20103
52  using Parameters = fhicl::WrappedTable<Config>;
53 #endif
54 
58  MetricManager();
59 
63  MetricManager(MetricManager const&) = delete;
64 
70  virtual ~MetricManager() noexcept;
71 
76  MetricManager& operator=(MetricManager const&) = delete;
77 
90  void initialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
91 
95  void do_start();
96 
100  void do_stop();
101 
105  void do_pause();
106 
110  void do_resume();
111 
119  void reinitialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
120 
124  void shutdown();
125 
139  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);
140 
154  void sendMetric(std::string const& name, int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
155 
169  void sendMetric(std::string const& name, double const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
170 
184  void sendMetric(std::string const& name, float const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
185 
199  void sendMetric(std::string const& name, long unsigned int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
200 
205  void setPrefix(std::string const& prefix) { prefix_ = prefix; }
206 
211  bool Initialized() { return initialized_; }
212 
217  bool Running() { return running_; }
218 
223  bool Active() { return active_; }
224 
229  bool metricQueueEmpty();
230 
236  size_t metricQueueSize(std::string const& name = "");
237 
238 private:
239  void sendMetricLoop_();
240 
241  void startMetricLoop_();
242 
243  std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
244  boost::thread metric_sending_thread_;
245  std::mutex metric_mutex_;
246  std::condition_variable metric_cv_;
247  int metric_send_interval_ms_;
248 
249  bool initialized_;
250  bool running_;
251  bool active_;
252  std::string prefix_;
253 
254  //https://stackoverflow.com/questions/228908/is-listsize-really-on
255  // e10 does NOT properly have std::list::size as O(1)!!! Keep track of size separately while we still support e10.
256  typedef std::unique_ptr<MetricData> metric_data_ptr;
257  typedef std::pair<size_t, std::list<metric_data_ptr>> queue_entry;
258 
259  std::unordered_map<std::string, queue_entry> metric_queue_;
260  std::mutex metric_queue_mutex_;
261  std::atomic<size_t> missed_metric_calls_;
262  size_t metric_queue_max_size_;
263  size_t metric_queue_notify_size_;
264 };
265 
266 #endif /* artdaq_DAQrate_MetricManager_hh */
fhicl::Atom< int > metric_send_maximum_delay_ms
&quot;metric_send_maximum_delay_ms&quot;: (Default: 15000): The maximum amount of time between metric send call...
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
&quot;metric_queue_notify_size&quot;: (Default: 10): The number of metric entries in the list which will cause ...
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.
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
&quot;metric_queue_size&quot;: (Default: 1000): The maximum number of metric entries which can be stored in the...