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"
16 artdaq::MetricManager::
17 MetricManager() : metric_plugins_(0)
22 artdaq::MetricManager::~MetricManager()
27 void artdaq::MetricManager::initialize(fhicl::ParameterSet
const& pset, std::string prefix)
34 mf::LogDebug(
"MetricManager") <<
"Configuring metrics with parameter set:\n" << pset.to_string();
36 std::vector<std::string> names = pset.get_pset_names();
38 for (
auto name : names)
42 mf::LogDebug(
"MetricManager") <<
"Constructing metric plugin with name " << name;
43 fhicl::ParameterSet plugin_pset = pset.get<fhicl::ParameterSet>(name);
44 metric_plugins_.push_back(makeMetricPlugin(
45 plugin_pset.get<std::string>(
"metricPluginType",
""), plugin_pset));
49 mf::LogError(
"MetricManager") <<
"Exception caught in MetricManager::initialize, error loading plugin with name " << name;
56 void artdaq::MetricManager::do_start()
60 mf::LogDebug(
"MetricManager") <<
"Starting MetricManager";
61 for (
auto& metric : metric_plugins_)
65 metric->startMetrics();
66 mf::LogDebug(
"MetricManager") <<
"Metric Plugin " << metric->getLibName() <<
" started.";
71 mf::LogError(
"MetricManager") <<
72 "Exception caught in MetricManager::do_start(), error starting plugin with name " <<
81 void artdaq::MetricManager::do_stop()
84 metric_cv_.notify_all();
85 if (metric_sending_thread_.joinable()) metric_sending_thread_.join();
88 void artdaq::MetricManager::do_pause() { }
89 void artdaq::MetricManager::do_resume() { }
91 void artdaq::MetricManager::reinitialize(fhicl::ParameterSet
const& pset, std::string prefix)
94 initialize(pset, prefix);
97 void artdaq::MetricManager::shutdown()
99 mf::LogDebug(
"MetricManager") <<
"MetricManager is shutting down...";
104 for (
auto& i : metric_plugins_)
108 std::string name = i->getLibName();
110 mf::LogDebug(
"MetricManager") <<
"Metric Plugin " << name <<
" shutdown.";
114 mf::LogError(
"MetricManager") <<
115 "Exception caught in MetricManager::shutdown(), error shutting down metric with name " <<
119 initialized_ =
false;
123 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)
125 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
126 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
129 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
131 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
132 metric_queue_.push_back(std::move(metric));
134 metric_cv_.notify_all();
138 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)
140 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
141 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
144 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
146 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
147 metric_queue_.push_back(std::move(metric));
149 metric_cv_.notify_all();
153 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)
155 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
156 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
159 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
161 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
162 metric_queue_.push_back(std::move(metric));
164 metric_cv_.notify_all();
168 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)
170 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
171 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
174 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
176 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
177 metric_queue_.push_back(std::move(metric));
179 metric_cv_.notify_all();
183 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)
185 if (!initialized_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager has not yet been initialized!";
186 else if (!running_) mf::LogWarning(
"MetricManager") <<
"Attempted to send metric when MetricManager stopped!";
189 std::unique_ptr<MetricData> metric(
new MetricData(name, value, unit, level, accumulate, metricPrefix, useNameOverride));
191 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
192 metric_queue_.push_back(std::move(metric));
194 metric_cv_.notify_all();
198 void artdaq::MetricManager::startMetricLoop_()
200 if (metric_sending_thread_.joinable()) metric_sending_thread_.join();
201 mf::LogInfo(
"MetricManager") <<
"Starting Metric Sending Thread" << std::endl;
202 metric_sending_thread_ = std::thread(&MetricManager::sendMetricLoop_,
this);
205 void artdaq::MetricManager::sendMetricLoop_()
209 while (metric_queue_.size() == 0 && running_)
211 std::unique_lock<std::mutex> lk(metric_mutex_);
212 metric_cv_.wait_for(lk, std::chrono::milliseconds(100));
215 auto temp_list = std::list<std::unique_ptr<MetricData>>();
217 std::unique_lock<std::mutex> lk(metric_queue_mutex_);
218 temp_list.swap(metric_queue_);
221 while (temp_list.size() > 0)
223 auto data_ = std::move(temp_list.front());
224 temp_list.pop_front();
225 if (data_->type_ == MetricData::InvalidMetric)
continue;
226 std::string nameTemp = data_->name_;
227 if (!data_->useNameOverride_)
229 if (data_->metricPrefix_.size() > 0)
231 nameTemp = prefix_ +
"." + data_->metricPrefix_ +
"." + data_->name_;
235 nameTemp = prefix_ +
"." + data_->name_;
239 for (
auto& metric : metric_plugins_)
241 if (metric->getRunLevel() >= data_->level_)
245 switch (data_->type_)
247 case MetricData::StringMetric:
248 metric->sendMetric(nameTemp, data_->stringValue_, data_->unit_, data_->accumulate_);
250 case MetricData::IntMetric:
251 metric->sendMetric(nameTemp, data_->intValue_, data_->unit_, data_->accumulate_);
253 case MetricData::DoubleMetric:
254 metric->sendMetric(nameTemp, data_->doubleValue_, data_->unit_, data_->accumulate_);
256 case MetricData::FloatMetric:
257 metric->sendMetric(nameTemp, data_->floatValue_, data_->unit_, data_->accumulate_);
259 case MetricData::UnsignedMetric:
260 metric->sendMetric(nameTemp, data_->unsignedValue_, data_->unit_, data_->accumulate_);
262 case MetricData::InvalidMetric:
268 mf::LogError(
"MetricManager") <<
269 "Error in MetricManager::sendMetric: error sending value to metric plugin with name "
270 << metric->getLibName();
277 for (
auto& metric : metric_plugins_)
281 metric->stopMetrics();
282 mf::LogDebug(
"MetricManager") <<
"Metric Plugin " << metric->getLibName() <<
" stopped.";
286 mf::LogError(
"MetricManager") <<
287 "Exception caught in MetricManager::do_stop(), error stopping plugin with name " <<
288 metric->getLibName();
291 mf::LogDebug(
"MetricManager") <<
"MetricManager has been stopped.";