artdaq_utilities  v1_02_02
 All Classes
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 {
18  class FileMetric : public MetricPlugin
19  {
20  private:
21  std::string outputFile_;
22  bool uniquify_file_name_;
23  std::ofstream outputStream_;
24  std::ios_base::openmode mode_;
25  bool stopped_;
26  public:
27  FileMetric(fhicl::ParameterSet config) : MetricPlugin(config)
28  , outputFile_(pset.get<std::string>("fileName", "FileMetric.out"))
29  , uniquify_file_name_(pset.get<bool>("uniquify", false))
30  , stopped_(true)
31  {
32  std::string modeString = pset.get<std::string>("fileMode", "append");
33 
34  mode_ = std::ofstream::out | std::ofstream::app;
35  if (modeString == "Overwrite" || modeString == "Create" || modeString == "Write")
36  {
37  mode_ = std::ofstream::out | std::ofstream::trunc;
38  }
39 
40  if (uniquify_file_name_)
41  {
42  std::string unique_id = std::to_string(getpid());
43  if (outputFile_.find("%UID%") != std::string::npos)
44  {
45  outputFile_ = outputFile_.replace(outputFile_.find("%UID%"), 5, unique_id);
46  }
47  else
48  {
49  if (outputFile_.rfind(".") != std::string::npos)
50  {
51  outputFile_ = outputFile_.insert(outputFile_.rfind("."), "_" + unique_id);
52  }
53  else
54  {
55  outputFile_ = outputFile_.append("_" + unique_id);
56  }
57  }
58  }
59  openFile_();
60  startMetrics();
61  }
62 
63  ~FileMetric()
64  {
65  stopMetrics();
66  closeFile_();
67  }
68 
69  virtual std::string getLibName() const { return "file"; }
70 
71  virtual void sendMetric_(const std::string& name, const std::string& value, const std::string& unit)
72  {
73  if (!stopped_ && !inhibit_)
74  {
75  const std::time_t result = std::time(NULL);
76  outputStream_ << std::ctime(&result) << "FileMetric: " << name << ": " << value << " " << unit << "." << std::endl;
77  }
78  }
79 
80  virtual void sendMetric_(const std::string& name, const int& value, const std::string& unit)
81  {
82  sendMetric(name, std::to_string(value), unit);
83  }
84 
85  virtual void sendMetric_(const std::string& name, const double& value, const std::string& unit)
86  {
87  sendMetric(name, std::to_string(value), unit);
88  }
89 
90  virtual void sendMetric_(const std::string& name, const float& value, const std::string& unit)
91  {
92  sendMetric(name, std::to_string(value), unit);
93  }
94 
95  virtual void sendMetric_(const std::string& name, const unsigned long int& value, const std::string& unit)
96  {
97  sendMetric(name, std::to_string(value), unit);
98  }
99 
100  virtual void startMetrics_()
101  {
102  stopped_ = false;
103  const std::time_t result = std::time(NULL);
104  outputStream_ << std::ctime(&result) << "FileMetric plugin started." << std::endl;
105  }
106 
107  virtual void stopMetrics_()
108  {
109  stopped_ = true;
110  const std::time_t result = std::time(NULL);
111  outputStream_ << std::ctime(&result) << "FileMetric plugin has been stopped!" << std::endl;
112  }
113 
114  private:
115  void openFile_()
116  {
117  outputStream_.open(outputFile_.c_str(), mode_);
118  const std::time_t result = std::time(NULL);
119  outputStream_ << std::ctime(&result) << "FileMetric plugin file opened." << std::endl;
120  }
121 
122  void closeFile_()
123  {
124  const std::time_t result = std::time(NULL);
125  outputStream_ << std::ctime(&result) << "FileMetric closing file stream." << std::endl;
126  outputStream_.close();
127  }
128  };
129 } //End namespace artdaq
130 
131 DEFINE_ARTDAQ_METRIC(artdaq::FileMetric)