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 {
00018 class FileMetric : public MetricPlugin
00019 {
00020 private:
00021 std::string outputFile_;
00022 bool uniquify_file_name_;
00023 std::ofstream outputStream_;
00024 std::ios_base::openmode mode_;
00025 bool stopped_;
00026 public:
00027 FileMetric(fhicl::ParameterSet config) : MetricPlugin(config)
00028 , outputFile_(pset.get<std::string>("fileName", "FileMetric.out"))
00029 , uniquify_file_name_(pset.get<bool>("uniquify", false))
00030 , stopped_(true)
00031 {
00032 std::string modeString = pset.get<std::string>("fileMode", "append");
00033
00034 mode_ = std::ofstream::out | std::ofstream::app;
00035 if (modeString == "Overwrite" || modeString == "Create" || modeString == "Write")
00036 {
00037 mode_ = std::ofstream::out | std::ofstream::trunc;
00038 }
00039
00040 if (uniquify_file_name_)
00041 {
00042 std::string unique_id = std::to_string(getpid());
00043 if (outputFile_.find("%UID%") != std::string::npos)
00044 {
00045 outputFile_ = outputFile_.replace(outputFile_.find("%UID%"), 5, unique_id);
00046 }
00047 else
00048 {
00049 if (outputFile_.rfind(".") != std::string::npos)
00050 {
00051 outputFile_ = outputFile_.insert(outputFile_.rfind("."), "_" + unique_id);
00052 }
00053 else
00054 {
00055 outputFile_ = outputFile_.append("_" + unique_id);
00056 }
00057 }
00058 }
00059 openFile_();
00060 startMetrics();
00061 }
00062
00063 ~FileMetric()
00064 {
00065 stopMetrics();
00066 closeFile_();
00067 }
00068
00069 virtual std::string getLibName() const { return "file"; }
00070
00071 virtual void sendMetric_(const std::string& name, const std::string& value, const std::string& unit)
00072 {
00073 if (!stopped_ && !inhibit_)
00074 {
00075 const std::time_t result = std::time(NULL);
00076 outputStream_ << std::ctime(&result) << "FileMetric: " << name << ": " << value << " " << unit << "." << std::endl;
00077 }
00078 }
00079
00080 virtual void sendMetric_(const std::string& name, const int& value, const std::string& unit)
00081 {
00082 sendMetric(name, std::to_string(value), unit);
00083 }
00084
00085 virtual void sendMetric_(const std::string& name, const double& value, const std::string& unit)
00086 {
00087 sendMetric(name, std::to_string(value), unit);
00088 }
00089
00090 virtual void sendMetric_(const std::string& name, const float& value, const std::string& unit)
00091 {
00092 sendMetric(name, std::to_string(value), unit);
00093 }
00094
00095 virtual void sendMetric_(const std::string& name, const unsigned long int& value, const std::string& unit)
00096 {
00097 sendMetric(name, std::to_string(value), unit);
00098 }
00099
00100 virtual void startMetrics_()
00101 {
00102 stopped_ = false;
00103 const std::time_t result = std::time(NULL);
00104 outputStream_ << std::ctime(&result) << "FileMetric plugin started." << std::endl;
00105 }
00106
00107 virtual void stopMetrics_()
00108 {
00109 stopped_ = true;
00110 const std::time_t result = std::time(NULL);
00111 outputStream_ << std::ctime(&result) << "FileMetric plugin has been stopped!" << std::endl;
00112 }
00113
00114 private:
00115 void openFile_()
00116 {
00117 outputStream_.open(outputFile_.c_str(), mode_);
00118 const std::time_t result = std::time(NULL);
00119 outputStream_ << std::ctime(&result) << "FileMetric plugin file opened." << std::endl;
00120 }
00121
00122 void closeFile_()
00123 {
00124 const std::time_t result = std::time(NULL);
00125 outputStream_ << std::ctime(&result) << "FileMetric closing file stream." << std::endl;
00126 outputStream_.close();
00127 }
00128 };
00129 }
00130
00131 DEFINE_ARTDAQ_METRIC(artdaq::FileMetric)