8 #ifndef __METRIC_INTERFACE__
9 #define __METRIC_INTERFACE__
13 #include <unordered_map>
14 #include "fhiclcpp/ParameterSet.h"
15 #include "artdaq-utilities/Plugins/MetricData.hh"
60 virtual std::string
getLibName()
const {
return "ERROR"; }
70 virtual void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& unit) = 0;
80 virtual void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit) = 0;
90 virtual void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit) = 0;
100 virtual void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit) = 0;
110 virtual void sendMetric_(
const std::string& name,
const long unsigned int& value,
const std::string& unit) = 0;
138 if (data.Type == MetricType::StringMetric)
140 sendMetric_(data.Name, data.StringValue, data.Unit);
144 if (!metricRegistry_.count(data.Name))
146 metricRegistry_[data.Name] = data;
148 metricData_[data.Name].push_back(data);
158 for (
auto metric : metricData_)
160 auto metricName = metric.first;
161 if (readyToSend_(metricName))
163 if (metricData_[metricName].size() == 0 && metricRegistry_.count(metricName))
165 sendZero_(metricRegistry_[metricName]);
167 else if (metricData_[metricName].size() > 0)
169 auto metricMode = metricData_[metricName].back().Mode;
170 auto metricUnits = metricData_[metricName].back().Unit;
171 auto metricType = metricData_[metricName].back().Type;
173 if (metricMode == MetricMode::LastPoint)
175 std::list<MetricData> tmpList(1);
176 auto lastPoint = metricData_[metricName].back();
177 tmpList.push_back(lastPoint);
178 metricData_[metricName].swap(tmpList);
179 assert(metricData_[metricName].size() == 1);
186 case MetricType::DoubleMetric:
189 for (
auto& mv : metricData_[metricName]) { ds += mv.DoubleValue; }
190 if (metricMode == MetricMode::Average) { ds /= metricData_[metricName].size(); }
194 case MetricType::FloatMetric:
197 for (
auto& mv : metricData_[metricName]) { fs += mv.FloatValue; }
198 if (metricMode == MetricMode::Average) { fs /= metricData_[metricName].size(); }
202 case MetricType::IntMetric:
205 for (
auto& mv : metricData_[metricName]) { is += mv.IntValue; }
206 if (metricMode == MetricMode::Average) { is /= metricData_[metricName].size(); }
210 case MetricType::UnsignedMetric:
213 for (
auto& mv : metricData_[metricName]) { us += mv.UnsignedValue; }
214 if (metricMode == MetricMode::Average) { us /= metricData_[metricName].size(); }
221 metricData_[metricName].clear();
240 for (
auto metric : metricRegistry_)
242 sendZero_(metric.second);
266 std::unordered_map<std::string, std::list<MetricData>> metricData_;
267 std::unordered_map<std::string, MetricData> metricRegistry_;
268 std::unordered_map<std::string, std::chrono::steady_clock::time_point> lastSendTime_;
270 bool readyToSend_(std::string name)
272 auto now = std::chrono::steady_clock::now();
273 if (std::chrono::duration_cast<std::chrono::duration<
double, std::ratio<1>>>(now - lastSendTime_[name]).count() >=
accumulationTime_)
275 lastSendTime_[name] = now;
286 case MetricType::DoubleMetric:
287 sendMetric_(data.Name, static_cast<double>(0.0), data.Unit);
289 case MetricType::FloatMetric:
290 sendMetric_(data.Name, static_cast<float>(0.0), data.Unit);
292 case MetricType::IntMetric:
293 sendMetric_(data.Name, static_cast<int>(0), data.Unit);
295 case MetricType::UnsignedMetric:
296 sendMetric_(data.Name, static_cast<unsigned long>(0), data.Unit);
307 case MetricType::DoubleMetric:
308 sendMetric_(data.Name, data.DoubleValue, data.Unit);
310 case MetricType::FloatMetric:
311 sendMetric_(data.Name, data.FloatValue, data.Unit);
313 case MetricType::IntMetric:
316 case MetricType::UnsignedMetric:
317 sendMetric_(data.Name, data.UnsignedValue, data.Unit);
326 #endif //End ifndef __METRIC_INTERFACE__
virtual void startMetrics_()=0
Perform any start-up actions necessary for the metric plugin.
The MetricPlugin class defines the interface that MetricManager uses to send metric data to the vario...
void startMetrics()
Perform startup actions. Simply calls the virtual startMetrics_ function.
MetricPlugin(fhicl::ParameterSet const &ps)
MetricPlugin Constructor.
fhicl::ParameterSet pset
The ParameterSet used to configure the MetricPlugin.
virtual void sendMetric_(const std::string &name, const std::string &value, const std::string &unit)=0
Send a metric to the underlying metric storage (file, Graphite, Ganglia, etc.)
void addMetricData(MetricData data)
Send a metric value to the MetricPlugin.
void stopMetrics()
Perform shutdown actions. Zeroes out all accumulators, and sends zeros for each metric. Calls stopMetrics_() for any plugin-defined shutdown actions.
int getRunLevel() const
Get the threshold for sending metrics to the underlying storage.
virtual std::string getLibName() const
Return the name of the current MetricPlugin instance.
virtual void stopMetrics_()=0
Perform any shutdown actions necessary for the metric plugin.
void sendMetrics()
For each known metric, determine whether the reporting interval has elapsed, and if so...
double accumulationTime_
The amount of time to average metric values; except for accumulate=false metrics, will be the interva...
virtual ~MetricPlugin()=default
Default virtual Desctructor.
void setRunLevel(int level)
Set the threshold for sending metrics to the underlying storage.
bool inhibit_
Whether to inhibit all metric sending.
int runLevel_
The threshold for sending metrics to the underlying storage. Metrics with level <= to runLevel_ will ...