9 #include "artdaq-utilities/Plugins/MetricManager.hh"
10 #include "artdaq-utilities/Plugins/makeMetricPlugin.hh"
12 #include "fhiclcpp/ParameterSet.h"
15 #include <boost/exception/all.hpp>
36 TLOG_DEBUG(
"MetricManager") <<
"Configuring metrics with parameter set:\n" << pset.to_string() << TLOG_ENDL;
38 std::vector<std::string> names = pset.get_pset_names();
40 for (
auto name : names)
44 TLOG_DEBUG(
"MetricManager") <<
"Constructing metric plugin with name " << name << TLOG_ENDL;
45 fhicl::ParameterSet plugin_pset = pset.get<fhicl::ParameterSet>(name);
47 plugin_pset.get<std::string>(
"metricPluginType",
""), plugin_pset));
49 catch (
const cet::exception& e)
51 TLOG_ERROR(
"MetricManager") <<
"Exception caught in MetricManager::initialize, error loading plugin with name " << name <<
52 ", cet::exception object caught:" << e.explain_self() << TLOG_ENDL;
54 catch (
const boost::exception& e)
56 TLOG_ERROR(
"MetricManager") <<
"Exception caught in MetricManager::initialize, error loading plugin with name " << name <<
57 ", boost::exception object caught: " << boost::diagnostic_information(e) << TLOG_ENDL;
59 catch (
const std::exception& e)
61 TLOG_ERROR(
"MetricManager") <<
"Exception caught in MetricManager::initialize, error loading plugin with name " << name <<
62 ", std::exception caught: " << e.what() << TLOG_ENDL;
66 TLOG_ERROR(
"MetricManager") <<
"Unknown Exception caught in MetricManager::initialize, error loading plugin with name " << name << TLOG_ENDL;
77 TLOG_DEBUG(
"MetricManager") <<
"Starting MetricManager" << TLOG_ENDL;
78 for (
auto& metric : metric_plugins_)
82 metric->startMetrics();
83 TLOG_DEBUG(
"MetricManager") <<
"Metric Plugin " << metric->getLibName() <<
" started." << TLOG_ENDL;
88 TLOG_ERROR(
"MetricManager") <<
89 "Exception caught in MetricManager::do_start(), error starting plugin with name " <<
90 metric->getLibName() << TLOG_ENDL;
101 metric_cv_.notify_all();
102 if (metric_sending_thread_.joinable()) metric_sending_thread_.join();
111 initialize(pset, prefix);
116 TLOG_DEBUG(
"MetricManager") <<
"MetricManager is shutting down..." << TLOG_ENDL;
121 for (
auto& i : metric_plugins_)
125 std::string name = i->getLibName();
127 TLOG_DEBUG(
"MetricManager") <<
"Metric Plugin " << name <<
" shutdown." << TLOG_ENDL;
131 TLOG_ERROR(
"MetricManager") <<
132 "Exception caught in MetricManager::shutdown(), error shutting down metric with name " <<
133 i->getLibName() << TLOG_ENDL;
136 initialized_ =
false;
140 void artdaq::MetricManager::sendMetric(std::string
const& name, std::string
const& value, std::string
const& unit,
int level, MetricMode mode, std::string
const& metricPrefix,
bool useNameOverride)
142 if (!initialized_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!" << TLOG_ENDL; }
143 else if (!running_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!" << TLOG_ENDL; }
146 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, mode, metricPrefix, useNameOverride));
148 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
149 metric_queue_.push_back(std::move(metric));
151 metric_cv_.notify_all();
155 void artdaq::MetricManager::sendMetric(std::string
const& name,
int const& value, std::string
const& unit,
int level, MetricMode mode, std::string
const& metricPrefix,
bool useNameOverride)
157 if (!initialized_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!" << TLOG_ENDL; }
158 else if (!running_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!" << TLOG_ENDL; }
161 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, mode, metricPrefix, useNameOverride));
163 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
164 metric_queue_.push_back(std::move(metric));
166 metric_cv_.notify_all();
170 void artdaq::MetricManager::sendMetric(std::string
const& name,
double const& value, std::string
const& unit,
int level, MetricMode mode, std::string
const& metricPrefix,
bool useNameOverride)
172 if (!initialized_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!" << TLOG_ENDL; }
173 else if (!running_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!" << TLOG_ENDL; }
176 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, mode, metricPrefix, useNameOverride));
178 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
179 metric_queue_.push_back(std::move(metric));
181 metric_cv_.notify_all();
185 void artdaq::MetricManager::sendMetric(std::string
const& name,
float const& value, std::string
const& unit,
int level, MetricMode mode, std::string
const& metricPrefix,
bool useNameOverride)
187 if (!initialized_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!" << TLOG_ENDL; }
188 else if (!running_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!" << TLOG_ENDL; }
191 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, mode, metricPrefix, useNameOverride));
193 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
194 metric_queue_.push_back(std::move(metric));
196 metric_cv_.notify_all();
200 void artdaq::MetricManager::sendMetric(std::string
const& name,
long unsigned int const& value, std::string
const& unit,
int level, MetricMode mode, std::string
const& metricPrefix,
bool useNameOverride)
202 if (!initialized_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!" << TLOG_ENDL; }
203 else if (!running_) { TLOG_WARNING(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!" << TLOG_ENDL; }
206 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, mode, metricPrefix, useNameOverride));
208 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
209 metric_queue_.push_back(std::move(metric));
211 metric_cv_.notify_all();
215 void artdaq::MetricManager::startMetricLoop_()
217 if (metric_sending_thread_.joinable()) metric_sending_thread_.join();
218 TLOG_INFO(
"MetricManager") <<
"Starting Metric Sending Thread" << TLOG_ENDL;
219 metric_sending_thread_ = std::thread(&MetricManager::sendMetricLoop_,
this);
222 void artdaq::MetricManager::sendMetricLoop_()
224 auto last_send_time = std::chrono::steady_clock::time_point();
227 while (metric_queue_.size() == 0 && running_)
229 std::unique_lock<std::mutex> lk(metric_mutex_);
230 metric_cv_.wait_for(lk, std::chrono::milliseconds(100));
231 auto now = std::chrono::steady_clock::now();
232 if (std::chrono::duration_cast<std::chrono::milliseconds>(now - last_send_time).count() > metric_send_interval_ms_)
234 for (
auto& metric : metric_plugins_) { metric->sendMetrics(); }
235 last_send_time = now;
239 auto temp_list = std::list<std::unique_ptr<MetricData>>();
241 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
242 temp_list.swap(metric_queue_);
243 temp_list.emplace_back(
new MetricData(
"Metric Calls", temp_list.size(),
"metrics", 4, MetricMode::Accumulate,
"",
false));
246 while (temp_list.size() > 0)
248 auto data_ = std::move(temp_list.front());
249 temp_list.pop_front();
250 if (data_->Type == MetricType::InvalidMetric)
continue;
251 if (!data_->UseNameOverride)
253 if (data_->MetricPrefix.size() > 0)
255 data_->Name = prefix_ +
"." + data_->MetricPrefix +
"." + data_->Name;
259 data_->Name = prefix_ +
"." + data_->Name;
263 for (
auto& metric : metric_plugins_)
265 if (metric->getRunLevel() >= data_->Level)
269 metric->addMetricData(*data_);
270 last_send_time = std::chrono::steady_clock::now();
274 TLOG_ERROR(
"MetricManager") <<
275 "Error in MetricManager::sendMetric: error sending value to metric plugin with name "
276 << metric->getLibName() << TLOG_ENDL;
283 for (
auto& metric : metric_plugins_)
287 metric->stopMetrics();
288 TLOG_DEBUG(
"MetricManager") <<
"Metric Plugin " << metric->getLibName() <<
" stopped." << TLOG_ENDL;
292 TLOG_ERROR(
"MetricManager") <<
293 "Exception caught in MetricManager::do_stop(), error stopping plugin with name " <<
294 metric->getLibName() << TLOG_ENDL;
297 TLOG_DEBUG(
"MetricManager") <<
"MetricManager has been stopped." << TLOG_ENDL;
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.
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...
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 do_pause()
Pause metric sending. Currently a No-Op.