8 #ifndef __METRIC_INTERFACE__
9 #define __METRIC_INTERFACE__
13 #include <unordered_map>
14 #include "fhiclcpp/ParameterSet.h"
15 #include "artdaq-utilities/Plugins/MetricData.hh"
16 #include "cetlib/compiler_macros.h"
18 #define FALLTHROUGH while(0)
64 virtual std::string
getLibName()
const {
return "ERROR"; }
74 virtual void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& unit) = 0;
84 virtual void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit) = 0;
94 virtual void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit) = 0;
104 virtual void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit) = 0;
114 virtual void sendMetric_(
const std::string& name,
const long unsigned int& value,
const std::string& unit) = 0;
148 if (!metricRegistry_.count(data.
Name))
150 metricRegistry_[data.
Name] = data;
152 metricData_[data.
Name].push_back(data);
161 void sendMetrics(
bool forceSend =
false, std::chrono::steady_clock::time_point interval_end = std::chrono::steady_clock::now())
163 for (
auto metric : metricData_)
165 auto metricName = metric.first;
166 if (readyToSend_(metricName) || forceSend)
168 if (metricData_[metricName].size() == 0 && metricRegistry_.count(metricName))
170 sendZero_(metricRegistry_[metricName]);
172 else if (metricData_[metricName].size() > 0)
174 auto metricMode = metricData_[metricName].back().Mode;
175 auto metricUnits = metricData_[metricName].back().Unit;
176 auto metricType = metricData_[metricName].back().Type;
180 if (metricData_[metricName].size() > 1)
182 metricData_[metricName].erase(metricData_[metricName].begin(), std::prev(metricData_[metricName].end()));
193 for (
auto& mv : metricData_[metricName]) { ds += mv.DoubleValue; }
196 case MetricMode::Average: ds /=
static_cast<double>(metricData_[metricName].size());
break;
197 case MetricMode::Rate: ds /= std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count();
break;
198 case MetricMode::AccumulateAndRate:
sendMetric_(metricName +
" - Rate", ds / std::chrono::duration_cast<std::chrono::duration<
double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count(), metricUnits +
"/s");
break;
209 for (
auto& mv : metricData_[metricName]) { fs += mv.FloatValue; }
214 ds = fs /
static_cast<double>(metricData_[metricName].size());
218 ds = fs / std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count();
222 sendMetric_(metricName +
" - Rate", fs / std::chrono::duration_cast<std::chrono::duration<
double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count(), metricUnits +
"/s");
235 for (
auto& mv : metricData_[metricName]) { is += mv.IntValue; }
240 ds = is /
static_cast<double>(metricData_[metricName].size());
244 ds = is / std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count();
248 sendMetric_(metricName +
" - Rate", is / std::chrono::duration_cast<std::chrono::duration<
double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count(), metricUnits +
"/s");
261 for (
auto& mv : metricData_[metricName]) { us += mv.UnsignedValue; }
266 ds = us /
static_cast<double>(metricData_[metricName].size());
270 ds = us / std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count();
274 sendMetric_(metricName +
" - Rate", us / std::chrono::duration_cast<std::chrono::duration<
double, std::ratio<1>>>(interval_end - interval_start_[metricName]).count(), metricUnits +
"/s");
286 metricData_[metricName].clear();
289 interval_start_[metricName] = interval_end;
307 for (
auto metric : metricRegistry_)
309 sendZero_(metric.second);
333 std::unordered_map<std::string, std::list<MetricData>> metricData_;
334 std::unordered_map<std::string, MetricData> metricRegistry_;
335 std::unordered_map<std::string, std::chrono::steady_clock::time_point> lastSendTime_;
336 std::unordered_map<std::string, std::chrono::steady_clock::time_point> interval_start_;
338 bool readyToSend_(std::string name)
340 auto now = std::chrono::steady_clock::now();
341 if (std::chrono::duration_cast<std::chrono::duration<
double, std::ratio<1>>>(now - lastSendTime_[name]).count() >=
accumulationTime_)
343 lastSendTime_[name] = now;
381 sendMetric_(data.Name, data.DoubleValue, data.Unit);
384 sendMetric_(data.Name, data.FloatValue, data.Unit);
390 sendMetric_(data.Name, data.UnsignedValue, data.Unit);
399 #endif //End ifndef __METRIC_INTERFACE__
virtual void startMetrics_()=0
Perform any start-up actions necessary for the metric plugin.
std::string StringValue
Value of the metric, if it is a MetricType::StringMetric
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.
Report the average of all values. Use for rates to report accurate results.
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.)
std::string Unit
Units of the metric
Metric is a std::string (not in union)
std::string Name
Name of the metric
Reports the sum of all values, divided by the length of the time interval they were accumulated over...
MetricMode Mode
Accumulation mode of the metric
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.
Metric is a long unsigned int.
void sendMetrics(bool forceSend=false, std::chrono::steady_clock::time_point interval_end=std::chrono::steady_clock::now())
For each known metric, determine whether the reporting interval has elapsed, and if so...
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.
Sends both the Accumulate mode and Rate mode metric. (Rate mode metric will append "/s" to metric uni...
MetricType Type
Type of the metric
Report the sum of all values. Use for counters to report accurate results.
double accumulationTime_
The amount of time to average metric values; except for accumulate=false metrics, will be the interva...
Small structure used to hold a metric data point before sending to the metric plugins ...
Report only the last value recorded. Useful for event counters, run numbers, etc. ...
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 ...