9 #include "artdaq-utilities/Plugins/MetricManager.hh"
10 #include "artdaq-utilities/Plugins/makeMetricPlugin.hh"
11 #include "messagefacility/MessageLogger/MessageLogger.h"
12 #include "fhiclcpp/ParameterSet.h"
15 #include <boost/exception/all.hpp>
35 mf::LogDebug(
"MetricManager") <<
"Configuring metrics with parameter set:\n" << pset.to_string();
37 std::vector<std::string> names = pset.get_pset_names();
39 for (
auto name : names)
43 mf::LogDebug(
"MetricManager") <<
"Constructing metric plugin with name " << name;
44 fhicl::ParameterSet plugin_pset = pset.get<fhicl::ParameterSet>(name);
46 plugin_pset.get<std::string>(
"metricPluginType",
""), plugin_pset));
48 catch (
const cet::exception& e)
50 mf::LogError(
"MetricManager") <<
"Exception caught in MetricManager::initialize, error loading plugin with name " << name <<
51 ", cet::exception object caught:" << e.explain_self();
53 catch (
const boost::exception& e)
55 mf::LogError(
"MetricManager") <<
"Exception caught in MetricManager::initialize, error loading plugin with name " << name <<
56 ", boost::exception object caught: " << boost::diagnostic_information(e);
58 catch (
const std::exception& e)
60 mf::LogError(
"MetricManager") <<
"Exception caught in MetricManager::initialize, error loading plugin with name " << name <<
61 ", std::exception caught: " << e.what();
65 mf::LogError(
"MetricManager") <<
"Unknown Exception caught in MetricManager::initialize, error loading plugin with name " << name;
76 mf::LogDebug(
"MetricManager") <<
"Starting MetricManager";
77 for (
auto& metric : metric_plugins_)
81 metric->startMetrics();
82 mf::LogDebug(
"MetricManager") <<
"Metric Plugin " << metric->getLibName() <<
" started.";
87 mf::LogError(
"MetricManager") <<
88 "Exception caught in MetricManager::do_start(), error starting plugin with name " <<
100 metric_cv_.notify_all();
101 if (metric_sending_thread_.joinable()) metric_sending_thread_.join();
110 initialize(pset, prefix);
115 mf::LogDebug(
"MetricManager") <<
"MetricManager is shutting down...";
120 for (
auto& i : metric_plugins_)
124 std::string name = i->getLibName();
126 mf::LogDebug(
"MetricManager") <<
"Metric Plugin " << name <<
" shutdown.";
130 mf::LogError(
"MetricManager") <<
131 "Exception caught in MetricManager::shutdown(), error shutting down metric with name " <<
135 initialized_ =
false;
139 void artdaq::MetricManager::sendMetric(std::string
const& name, std::string
const& value, std::string
const& unit,
int level,
bool accumulate, std::string
const& metricPrefix,
bool useNameOverride)
141 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
142 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
145 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
147 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
148 metric_queue_.push_back(std::move(metric));
150 metric_cv_.notify_all();
154 void artdaq::MetricManager::sendMetric(std::string
const& name,
int const& value, std::string
const& unit,
int level,
bool accumulate, std::string
const& metricPrefix,
bool useNameOverride)
156 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
157 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
160 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
162 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
163 metric_queue_.push_back(std::move(metric));
165 metric_cv_.notify_all();
169 void artdaq::MetricManager::sendMetric(std::string
const& name,
double const& value, std::string
const& unit,
int level,
bool accumulate, std::string
const& metricPrefix,
bool useNameOverride)
171 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
172 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
175 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
177 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
178 metric_queue_.push_back(std::move(metric));
180 metric_cv_.notify_all();
184 void artdaq::MetricManager::sendMetric(std::string
const& name,
float const& value, std::string
const& unit,
int level,
bool accumulate, std::string
const& metricPrefix,
bool useNameOverride)
186 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
187 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
190 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
192 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
193 metric_queue_.push_back(std::move(metric));
195 metric_cv_.notify_all();
199 void artdaq::MetricManager::sendMetric(std::string
const& name,
long unsigned int const& value, std::string
const& unit,
int level,
bool accumulate, std::string
const& metricPrefix,
bool useNameOverride)
201 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
202 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
205 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
207 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
208 metric_queue_.push_back(std::move(metric));
210 metric_cv_.notify_all();
214 void artdaq::MetricManager::startMetricLoop_()
216 if (metric_sending_thread_.joinable()) metric_sending_thread_.join();
217 mf::LogInfo(
"MetricManager") <<
"Starting Metric Sending Thread" << std::endl;
218 metric_sending_thread_ = std::thread(&MetricManager::sendMetricLoop_,
this);
221 void artdaq::MetricManager::sendMetricLoop_()
225 while (metric_queue_.size() == 0 && running_)
227 std::unique_lock<std::mutex> lk(metric_mutex_);
228 metric_cv_.wait_for(lk, std::chrono::milliseconds(100));
231 auto temp_list = std::list<std::unique_ptr<MetricData>>();
233 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
234 temp_list.swap(metric_queue_);
237 while (temp_list.size() > 0)
239 auto data_ = std::move(temp_list.front());
240 temp_list.pop_front();
241 if (data_->type_ == MetricData::InvalidMetric)
continue;
242 std::string nameTemp = data_->name_;
243 if (!data_->useNameOverride_)
245 if (data_->metricPrefix_.size() > 0)
247 nameTemp = prefix_ +
"." + data_->metricPrefix_ +
"." + data_->name_;
251 nameTemp = prefix_ +
"." + data_->name_;
255 for (
auto& metric : metric_plugins_)
257 if (metric->getRunLevel() >= data_->level_)
261 switch (data_->type_)
263 case MetricData::StringMetric:
264 metric->sendMetric(nameTemp, data_->stringValue_, data_->unit_, data_->accumulate_);
266 case MetricData::IntMetric:
267 metric->sendMetric(nameTemp, data_->intValue_, data_->unit_, data_->accumulate_);
269 case MetricData::DoubleMetric:
270 metric->sendMetric(nameTemp, data_->doubleValue_, data_->unit_, data_->accumulate_);
272 case MetricData::FloatMetric:
273 metric->sendMetric(nameTemp, data_->floatValue_, data_->unit_, data_->accumulate_);
275 case MetricData::UnsignedMetric:
276 metric->sendMetric(nameTemp, data_->unsignedValue_, data_->unit_, data_->accumulate_);
278 case MetricData::InvalidMetric:
284 mf::LogError(
"MetricManager") <<
285 "Error in MetricManager::sendMetric: error sending value to metric plugin with name "
286 << metric->getLibName();
293 for (
auto& metric : metric_plugins_)
297 metric->stopMetrics();
298 mf::LogDebug(
"MetricManager") <<
"Metric Plugin " << metric->getLibName() <<
" stopped.";
302 mf::LogError(
"MetricManager") <<
303 "Exception caught in MetricManager::do_stop(), error stopping plugin with name " <<
304 metric->getLibName();
307 mf::LogDebug(
"MetricManager") <<
"MetricManager has been stopped.";
void reinitialize(fhicl::ParameterSet const &pset, std::string prefix="")
Reinitialize all MetricPlugin Instances.
void shutdown()
Call the destructors for all configured MetricPlugin instances.
void initialize(fhicl::ParameterSet const &pset, std::string prefix="")
Initialize the MetricPlugin instances.
std::unique_ptr< MetricPlugin > makeMetricPlugin(std::string const &generator_plugin_spec, fhicl::ParameterSet const &ps)
Load a given MetricPlugin and return a pointer to it.
MetricManager()
Construct an instance of the MetricManager class.
void do_start()
Perform startup actions for each configured MetricPlugin.
void do_stop()
Stop sending metrics to the MetricPlugin instances.
virtual ~MetricManager() noexcept
MetricManager destructor.
void do_resume()
Resume metric sending. Currently a No-Op.
void sendMetric(std::string const &name, std::string const &value, std::string const &unit, int level, bool accumulate=true, std::string const &metricPrefix="", bool useNameOverride=false)
Send a metric with the given parameters to any MetricPlugins with a threshold level >= to level...
void do_pause()
Pause metric sending. Currently a No-Op.