00001
00002
00003
00004
00005
00006
00007 #include "artdaq-utilities/Plugins/MetricMacros.hh"
00008 #include "fhiclcpp/ParameterSet.h"
00009
00010 #include <fstream>
00011 #include <ctime>
00012 #include <string>
00013 #include <sstream>
00014 #include <mutex>
00015 #include <sys/types.h>
00016 #include <unistd.h>
00017 #include "tracemf.h"
00018
00019 namespace artdaq
00020 {
00024 class PeriodicReportMetric : public MetricPlugin
00025 {
00026 private:
00027 std::chrono::steady_clock::time_point last_report_time_;
00028
00029 std::map<std::string, std::string> metrics_;
00030
00031 std::mutex report_mutex_;
00032 public:
00042 explicit PeriodicReportMetric(fhicl::ParameterSet const& config, std::string const& app_name) : MetricPlugin(config, app_name)
00043 , last_report_time_(std::chrono::steady_clock::now())
00044 ,metrics_()
00045 {
00046 startMetrics();
00047 }
00048
00052 virtual ~PeriodicReportMetric()
00053 {
00054 stopMetrics();
00055 }
00056
00061 std::string getLibName() const override { return "report"; }
00062
00069 void sendMetric_(const std::string& name, const std::string& value, const std::string& unit) override
00070 {
00071 if (!inhibit_)
00072 {
00073 metrics_[name] = value + " " + unit;
00074 writeReportMessage_(false);
00075 }
00076 }
00077
00084 void sendMetric_(const std::string& name, const int& value, const std::string& unit) override
00085 {
00086 sendMetric_(name, std::to_string(value), unit);
00087 }
00088
00095 void sendMetric_(const std::string& name, const double& value, const std::string& unit) override
00096 {
00097 sendMetric_(name, std::to_string(value), unit);
00098 }
00099
00106 void sendMetric_(const std::string& name, const float& value, const std::string& unit) override
00107 {
00108 sendMetric_(name, std::to_string(value), unit);
00109 }
00110
00117 void sendMetric_(const std::string& name, const unsigned long int& value, const std::string& unit) override
00118 {
00119 sendMetric_(name, std::to_string(value), unit);
00120 }
00121
00125 void startMetrics_() override
00126 {
00127 }
00128
00132 void stopMetrics_() override
00133 {
00134 writeReportMessage_(true);
00135 metrics_.clear();
00136 }
00137
00138 private:
00139 void writeReportMessage_(bool force)
00140 {
00141 std::unique_lock<std::mutex> lk(report_mutex_);
00142 if(force || std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1>>>(std::chrono::steady_clock::now() - last_report_time_).count() >= accumulationTime_)
00143 {
00144 if(metrics_.size() == 0) return;
00145 last_report_time_ = std::chrono::steady_clock::now();
00146 std::ostringstream str;
00147
00148 int count = 0;
00149 int live_metrics = 0;
00150 for(auto& metric : metrics_)
00151 {
00152 if(count != 0) str << "," << std::endl;
00153 str << "\t" << metric.first << ": " << metric.second;
00154 if(metric.second != "NOT REPORTED") live_metrics++;
00155 metric.second = "NOT REPORTED";
00156 count++;
00157 }
00158 if(live_metrics > 0) TLOG_INFO(app_name_) << "Periodic report: " << live_metrics << " active metrics:" << std::endl << str.str();
00159 else TLOG_INFO(app_name_) << "Periodic report: No active metrics in last reporting interval!";
00160 }
00161 }
00162 };
00163 }
00164
00165 DEFINE_ARTDAQ_METRIC(artdaq::PeriodicReportMetric)