1 #ifndef artdaq_DAQrate_MetricManager_hh
2 #define artdaq_DAQrate_MetricManager_hh
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"
20 #include <condition_variable>
22 #include <boost/thread.hpp>
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"} };
51 using Parameters = fhicl::WrappedTable<Config>;
88 void initialize(fhicl::ParameterSet const& pset, std::
string const& prefix = "");
117 void reinitialize(fhicl::ParameterSet const& pset, std::
string const& prefix = "");
137 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);
152 void sendMetric(std::
string const& name,
int const& value, std::
string const& unit,
int level,
MetricMode mode, std::
string const& metricPrefix = "",
bool useNameOverride = false);
167 void sendMetric(std::
string const& name,
double const& value, std::
string const& unit,
int level,
MetricMode mode, std::
string const& metricPrefix = "",
bool useNameOverride = false);
182 void sendMetric(std::
string const& name,
float const& value, std::
string const& unit,
int level,
MetricMode mode, std::
string const& metricPrefix = "",
bool useNameOverride = false);
197 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);
203 void setPrefix(std::
string const& prefix) { prefix_ = prefix; }
237 void sendMetricLoop_();
239 void startMetricLoop_();
241 std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
242 boost::thread metric_sending_thread_;
243 std::mutex metric_mutex_;
244 std::condition_variable metric_cv_;
245 int metric_send_interval_ms_;
247 std::atomic<bool> initialized_;
248 std::atomic<bool> running_;
249 std::atomic<bool> active_;
254 typedef std::unique_ptr<MetricData> metric_data_ptr;
255 typedef std::pair<std::atomic<size_t>, std::list<metric_data_ptr>> queue_entry;
257 std::unordered_map<std::string, queue_entry> metric_queue_;
258 std::mutex metric_queue_mutex_;
259 std::atomic<size_t> missed_metric_calls_;
260 size_t metric_queue_max_size_;
261 size_t metric_queue_notify_size_;
fhicl::Atom< int > metric_send_maximum_delay_ms
"metric_send_maximum_delay_ms": (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 >= 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...
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
"metric_queue_notify_size": (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
"metric_queue_size": (Default: 1000): The maximum number of metric entries which can be stored in the...