8 #ifndef __METRIC_INTERFACE__
9 #define __METRIC_INTERFACE__
14 #include <unordered_map>
15 #include "fhiclcpp/ParameterSet.h"
25 runLevel_ = pset.get<
int>(
"level", 0);
26 accumulationTime_ = pset.get<
double>(
"reporting_interval", 15.0);
37 virtual std::string getLibName()
const {
return "ERROR"; }
41 virtual void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& unit) = 0;
43 virtual void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit) = 0;
45 virtual void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit) = 0;
47 virtual void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit) = 0;
49 virtual void sendMetric_(
const std::string& name,
const long unsigned int& value,
const std::string& unit) = 0;
52 virtual void startMetrics_() = 0;
54 virtual void stopMetrics_() = 0;
63 virtual void sendMetric(
const std::string& name,
const std::string& value,
const std::string& unit,
bool accumulate =
true)
68 sendMetric_(name, value, unit);
72 sendMetric_(name, value, unit);
76 virtual void sendMetric(
const std::string& name,
const int& value,
const std::string& unit,
bool accumulate =
true)
81 intAccumulator_[name].push_back(value);
85 sendMetric_(name, value, unit);
86 intAccumulator_[name].clear();
87 lastSendTime_[name] = std::chrono::steady_clock::now();
91 if (readyToSend_(name))
94 for (
auto val : intAccumulator_[name])
96 sendValue += val / (double)intAccumulator_[name].size();
99 sendMetric_(name, sendValue, unit);
101 intAccumulator_[name].clear();
105 virtual void sendMetric(
const std::string& name,
const double& value,
const std::string& unit,
bool accumulate =
true)
110 doubleAccumulator_[name].push_back(value);
114 sendMetric_(name, value, unit);
115 doubleAccumulator_[name].clear();
116 lastSendTime_[name] = std::chrono::steady_clock::now();
120 if (readyToSend_(name))
122 double sendValue = 0;
123 for (
auto val : doubleAccumulator_[name])
125 sendValue += val / doubleAccumulator_[name].size();
128 sendMetric_(name, sendValue, unit);
130 doubleAccumulator_[name].clear();
134 virtual void sendMetric(
const std::string& name,
const float& value,
const std::string& unit,
bool accumulate =
true)
139 floatAccumulator_[name].push_back(value);
143 sendMetric_(name, value, unit);
144 floatAccumulator_[name].clear();
145 lastSendTime_[name] = std::chrono::steady_clock::now();
149 if (readyToSend_(name))
152 for (
auto val : floatAccumulator_[name])
154 sendValue += val / floatAccumulator_[name].size();
157 sendMetric_(name, sendValue, unit);
159 floatAccumulator_[name].clear();
163 virtual void sendMetric(
const std::string& name,
const long unsigned int& value,
const std::string& unit,
bool accumulate =
true)
168 uint32_t uvalue =
static_cast<uint32_t
>(value);
169 uintAccumulator_[name].push_back(uvalue);
173 sendMetric_(name, value, unit);
174 uintAccumulator_[name].clear();
175 lastSendTime_[name] = std::chrono::steady_clock::now();
179 if (readyToSend_(name))
181 double sendValue = 0;
182 for (
auto val : uintAccumulator_[name])
184 sendValue += val / (double)uintAccumulator_[name].size();
187 sendMetric_(name, sendValue, unit);
189 uintAccumulator_[name].clear();
195 virtual void startMetrics() { startMetrics_(); }
197 virtual void stopMetrics()
200 for (
auto dv : doubleAccumulator_)
202 static_cast<std::vector<double>
>(dv.second).clear();
204 sendMetric(dv.first, (
double)0.0,
"",
false);
206 for (
auto iv : intAccumulator_)
208 static_cast<std::vector<int>
>(iv.second).clear();
210 sendMetric(iv.first, (
int)0,
"",
false);
212 for (
auto fv : floatAccumulator_)
214 static_cast<std::vector<float>
>(fv.second).clear();
216 sendMetric(fv.first, (
float)0.0,
"",
false);
218 for (
auto uv : uintAccumulator_)
220 static_cast<std::vector<uint32_t>
>(uv.second).clear();
222 sendMetric(uv.first, (
long unsigned int)0,
"",
false);
228 void setRunLevel(
int level) { runLevel_ = level; }
229 int getRunLevel() {
return runLevel_; }
233 fhicl::ParameterSet pset;
234 double accumulationTime_;
238 std::unordered_map<std::string, std::vector<double>> doubleAccumulator_;
239 std::unordered_map<std::string, std::vector<int>> intAccumulator_;
240 std::unordered_map<std::string, std::vector<float>> floatAccumulator_;
241 std::unordered_map<std::string, std::vector<uint32_t>> uintAccumulator_;
242 std::unordered_map<std::string, std::chrono::steady_clock::time_point> lastSendTime_;
244 bool readyToSend_(std::string name)
246 auto now = std::chrono::steady_clock::now();
247 if (std::chrono::duration_cast<std::chrono::duration<
double, std::ratio<1>>>(now - lastSendTime_[name]).count() >= accumulationTime_)
249 lastSendTime_[name] = now;
258 #endif //End ifndef __METRIC_INTERFACE__