$treeview $search $mathjax $extrastylesheet
artdaq_utilities
v1_04_10
$projectbrief
|
$projectbrief
|
$searchbox |
00001 // report_metric.cc: Periodic Report Metric Plugin 00002 // Author: Eric Flumerfelt 00003 // Last Modified: 11/06/2014 00004 // 00005 // An implementation of the MetricPlugin for creating "Periodic Report" messages 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 } //End namespace artdaq 00164 00165 DEFINE_ARTDAQ_METRIC(artdaq::PeriodicReportMetric)