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 <sys/types.h>
00014 #include <unistd.h>
00015
00016 namespace artdaq
00017 {
00021 class FileMetric : public MetricPlugin
00022 {
00023 private:
00024 std::string outputFile_;
00025 bool uniquify_file_name_;
00026 std::ofstream outputStream_;
00027 std::ios_base::openmode mode_;
00028 bool stopped_;
00029 public:
00041 explicit FileMetric(fhicl::ParameterSet config) : MetricPlugin(config)
00042 , outputFile_(pset.get<std::string>("fileName", "FileMetric.out"))
00043 , uniquify_file_name_(pset.get<bool>("uniquify", false))
00044 , stopped_(true)
00045 {
00046 std::string modeString = pset.get<std::string>("fileMode", "append");
00047
00048 mode_ = std::ofstream::out | std::ofstream::app;
00049 if (modeString == "Overwrite" || modeString == "Create" || modeString == "Write")
00050 {
00051 mode_ = std::ofstream::out | std::ofstream::trunc;
00052 }
00053
00054 if (uniquify_file_name_)
00055 {
00056 std::string unique_id = std::to_string(getpid());
00057 if (outputFile_.find("%UID%") != std::string::npos)
00058 {
00059 outputFile_ = outputFile_.replace(outputFile_.find("%UID%"), 5, unique_id);
00060 }
00061 else
00062 {
00063 if (outputFile_.rfind(".") != std::string::npos)
00064 {
00065 outputFile_ = outputFile_.insert(outputFile_.rfind("."), "_" + unique_id);
00066 }
00067 else
00068 {
00069 outputFile_ = outputFile_.append("_" + unique_id);
00070 }
00071 }
00072 }
00073 openFile_();
00074 startMetrics();
00075 }
00076
00080 virtual ~FileMetric()
00081 {
00082 stopMetrics();
00083 closeFile_();
00084 }
00085
00090 std::string getLibName() const override { return "file"; }
00091
00098 void sendMetric_(const std::string& name, const std::string& value, const std::string& unit) override
00099 {
00100 if (!stopped_ && !inhibit_)
00101 {
00102 const std::time_t result = std::time(0);
00103 outputStream_ << std::ctime(&result) << "FileMetric: " << name << ": " << value << " " << unit << "." << std::endl;
00104 }
00105 }
00106
00113 void sendMetric_(const std::string& name, const int& value, const std::string& unit) override
00114 {
00115 sendMetric(name, std::to_string(value), unit);
00116 }
00117
00124 void sendMetric_(const std::string& name, const double& value, const std::string& unit) override
00125 {
00126 sendMetric(name, std::to_string(value), unit);
00127 }
00128
00135 void sendMetric_(const std::string& name, const float& value, const std::string& unit) override
00136 {
00137 sendMetric(name, std::to_string(value), unit);
00138 }
00139
00146 void sendMetric_(const std::string& name, const unsigned long int& value, const std::string& unit) override
00147 {
00148 sendMetric(name, std::to_string(value), unit);
00149 }
00150
00154 void startMetrics_() override
00155 {
00156 stopped_ = false;
00157 const std::time_t result = std::time(0);
00158 outputStream_ << std::ctime(&result) << "FileMetric plugin started." << std::endl;
00159 }
00160
00164 void stopMetrics_() override
00165 {
00166 stopped_ = true;
00167 const std::time_t result = std::time(0);
00168 outputStream_ << std::ctime(&result) << "FileMetric plugin has been stopped!" << std::endl;
00169 }
00170
00171 private:
00172 void openFile_()
00173 {
00174 outputStream_.open(outputFile_.c_str(), mode_);
00175 const std::time_t result = std::time(0);
00176 outputStream_ << std::ctime(&result) << "FileMetric plugin file opened." << std::endl;
00177 }
00178
00179 void closeFile_()
00180 {
00181 const std::time_t result = std::time(0);
00182 outputStream_ << std::ctime(&result) << "FileMetric closing file stream." << std::endl;
00183 outputStream_.close();
00184 }
00185 };
00186 }
00187
00188 DEFINE_ARTDAQ_METRIC(artdaq::FileMetric)