artdaq_utilities  v1_04_08
file_metric.cc
1 // FileMetric.h: File Metric Plugin
2 // Author: Eric Flumerfelt
3 // Last Modified: 11/06/2014
4 //
5 // An implementation of the MetricPlugin for Log Files
6 
7 #include "artdaq-utilities/Plugins/MetricMacros.hh"
8 #include "fhiclcpp/ParameterSet.h"
9 
10 #include <fstream>
11 #include <ctime>
12 #include <string>
13 #include <sys/types.h>
14 #include <unistd.h>
15 
16 namespace artdaq
17 {
21  class FileMetric : public MetricPlugin
22  {
23  private:
24  std::string outputFile_;
25  bool uniquify_file_name_;
26  std::ofstream outputStream_;
27  std::ios_base::openmode mode_;
28  std::string timeformat_;
29  bool stopped_;
30 
31  std::string getTime_()
32  {
33  static std::mutex timeMutex;
34  std::unique_lock<std::mutex> lk(timeMutex);
35  const std::time_t result = std::time(0);
36  auto resultTm = localtime(&result);
37  std::string timeString;
38  timeString.reserve(30);
39  strftime(&timeString[0], 30, timeformat_.c_str(), resultTm);
40 
41  return timeString;
42  }
43  public:
57  explicit FileMetric(fhicl::ParameterSet const& config, std::string const& app_name) : MetricPlugin(config, app_name)
58  , outputFile_(pset.get<std::string>("fileName", "FileMetric.out"))
59  , uniquify_file_name_(pset.get<bool>("uniquify", false))
60  , timeformat_(pset.get<std::string>("time_format", "%c"))
61  , stopped_(true)
62  {
63  std::string modeString = pset.get<std::string>("fileMode", "append");
64 
65  mode_ = std::ofstream::out | std::ofstream::app;
66  if (modeString == "Overwrite" || modeString == "Create" || modeString == "Write")
67  {
68  mode_ = std::ofstream::out | std::ofstream::trunc;
69  }
70 
71  if (uniquify_file_name_)
72  {
73  std::string unique_id = std::to_string(getpid());
74  if (outputFile_.find("%UID%") != std::string::npos)
75  {
76  outputFile_ = outputFile_.replace(outputFile_.find("%UID%"), 5, unique_id);
77  }
78  else
79  {
80  if (outputFile_.rfind(".") != std::string::npos)
81  {
82  outputFile_ = outputFile_.insert(outputFile_.rfind("."), "_" + unique_id);
83  }
84  else
85  {
86  outputFile_ = outputFile_.append("_" + unique_id);
87  }
88  }
89  }
90  openFile_();
91  startMetrics();
92  }
93 
97  virtual ~FileMetric()
98  {
99  stopMetrics();
100  closeFile_();
101  }
102 
107  std::string getLibName() const override { return "file"; }
108 
115  void sendMetric_(const std::string& name, const std::string& value, const std::string& unit) override
116  {
117  if (!stopped_ && !inhibit_)
118  {
119  outputStream_ << getTime_() << "FileMetric: " << name << ": " << value << " " << unit << "." << std::endl;
120  }
121  }
122 
129  void sendMetric_(const std::string& name, const int& value, const std::string& unit) override
130  {
131  sendMetric_(name, std::to_string(value), unit);
132  }
133 
140  void sendMetric_(const std::string& name, const double& value, const std::string& unit) override
141  {
142  sendMetric_(name, std::to_string(value), unit);
143  }
144 
151  void sendMetric_(const std::string& name, const float& value, const std::string& unit) override
152  {
153  sendMetric_(name, std::to_string(value), unit);
154  }
155 
162  void sendMetric_(const std::string& name, const unsigned long int& value, const std::string& unit) override
163  {
164  sendMetric_(name, std::to_string(value), unit);
165  }
166 
170  void startMetrics_() override
171  {
172  stopped_ = false;
173  outputStream_ << getTime_() << "FileMetric plugin started." << std::endl;
174  }
175 
179  void stopMetrics_() override
180  {
181  stopped_ = true;
182  outputStream_ << getTime_() << "FileMetric plugin has been stopped!" << std::endl;
183  }
184 
185  private:
186  void openFile_()
187  {
188  outputStream_.open(outputFile_.c_str(), mode_);
189  outputStream_ << getTime_() << "FileMetric plugin file opened." << std::endl;
190  }
191 
192  void closeFile_()
193  {
194  outputStream_ << getTime_() << "FileMetric closing file stream." << std::endl;
195  outputStream_.close();
196  }
197  };
198 } //End namespace artdaq
199 
200 DEFINE_ARTDAQ_METRIC(artdaq::FileMetric)
void sendMetric_(const std::string &name, const std::string &value, const std::string &unit) override
Write metric data to a file.
Definition: file_metric.cc:115
void sendMetric_(const std::string &name, const unsigned long int &value, const std::string &unit) override
Write metric data to a file.
Definition: file_metric.cc:162
void sendMetric_(const std::string &name, const double &value, const std::string &unit) override
Write metric data to a file.
Definition: file_metric.cc:140
fhicl::ParameterSet pset
The ParameterSet used to configure the MetricPlugin.
void sendMetric_(const std::string &name, const int &value, const std::string &unit) override
Write metric data to a file.
Definition: file_metric.cc:129
void stopMetrics_() override
Perform shutdown actions. Writes stop message to output file.
Definition: file_metric.cc:179
void startMetrics_() override
Perform startup actions. Writes start message to output file.
Definition: file_metric.cc:170
void sendMetric_(const std::string &name, const float &value, const std::string &unit) override
Write metric data to a file.
Definition: file_metric.cc:151
FileMetric writes metric data to a file on disk.
Definition: file_metric.cc:21
virtual ~FileMetric()
FileMetric Destructor. Calls stopMetrics and then closes the file.
Definition: file_metric.cc:97
FileMetric(fhicl::ParameterSet const &config, std::string const &app_name)
FileMetric Constructor. Opens the file and starts the metric.
Definition: file_metric.cc:57
std::string getLibName() const override
Get the library name for the File metric.
Definition: file_metric.cc:107
bool inhibit_
Whether to inhibit all metric sending.