artdaq_utilities  v1_04_06
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  bool stopped_;
29  public:
42  explicit FileMetric(fhicl::ParameterSet const& config, std::string const& app_name) : MetricPlugin(config, app_name)
43  , outputFile_(pset.get<std::string>("fileName", "FileMetric.out"))
44  , uniquify_file_name_(pset.get<bool>("uniquify", false))
45  , stopped_(true)
46  {
47  std::string modeString = pset.get<std::string>("fileMode", "append");
48 
49  mode_ = std::ofstream::out | std::ofstream::app;
50  if (modeString == "Overwrite" || modeString == "Create" || modeString == "Write")
51  {
52  mode_ = std::ofstream::out | std::ofstream::trunc;
53  }
54 
55  if (uniquify_file_name_)
56  {
57  std::string unique_id = std::to_string(getpid());
58  if (outputFile_.find("%UID%") != std::string::npos)
59  {
60  outputFile_ = outputFile_.replace(outputFile_.find("%UID%"), 5, unique_id);
61  }
62  else
63  {
64  if (outputFile_.rfind(".") != std::string::npos)
65  {
66  outputFile_ = outputFile_.insert(outputFile_.rfind("."), "_" + unique_id);
67  }
68  else
69  {
70  outputFile_ = outputFile_.append("_" + unique_id);
71  }
72  }
73  }
74  openFile_();
75  startMetrics();
76  }
77 
81  virtual ~FileMetric()
82  {
83  stopMetrics();
84  closeFile_();
85  }
86 
91  std::string getLibName() const override { return "file"; }
92 
99  void sendMetric_(const std::string& name, const std::string& value, const std::string& unit) override
100  {
101  if (!stopped_ && !inhibit_)
102  {
103  const std::time_t result = std::time(0);
104  outputStream_ << std::ctime(&result) << "FileMetric: " << name << ": " << value << " " << unit << "." << std::endl;
105  }
106  }
107 
114  void sendMetric_(const std::string& name, const int& value, const std::string& unit) override
115  {
116  sendMetric_(name, std::to_string(value), unit);
117  }
118 
125  void sendMetric_(const std::string& name, const double& value, const std::string& unit) override
126  {
127  sendMetric_(name, std::to_string(value), unit);
128  }
129 
136  void sendMetric_(const std::string& name, const float& value, const std::string& unit) override
137  {
138  sendMetric_(name, std::to_string(value), unit);
139  }
140 
147  void sendMetric_(const std::string& name, const unsigned long int& value, const std::string& unit) override
148  {
149  sendMetric_(name, std::to_string(value), unit);
150  }
151 
155  void startMetrics_() override
156  {
157  stopped_ = false;
158  const std::time_t result = std::time(0);
159  outputStream_ << std::ctime(&result) << "FileMetric plugin started." << std::endl;
160  }
161 
165  void stopMetrics_() override
166  {
167  stopped_ = true;
168  const std::time_t result = std::time(0);
169  outputStream_ << std::ctime(&result) << "FileMetric plugin has been stopped!" << std::endl;
170  }
171 
172  private:
173  void openFile_()
174  {
175  outputStream_.open(outputFile_.c_str(), mode_);
176  const std::time_t result = std::time(0);
177  outputStream_ << std::ctime(&result) << "FileMetric plugin file opened." << std::endl;
178  }
179 
180  void closeFile_()
181  {
182  const std::time_t result = std::time(0);
183  outputStream_ << std::ctime(&result) << "FileMetric closing file stream." << std::endl;
184  outputStream_.close();
185  }
186  };
187 } //End namespace artdaq
188 
189 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:99
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:147
The MetricPlugin class defines the interface that MetricManager uses to send metric data to the vario...
Definition: MetricPlugin.hh:32
void sendMetric_(const std::string &name, const double &value, const std::string &unit) override
Write metric data to a file.
Definition: file_metric.cc:125
void startMetrics()
Perform startup actions. Simply calls the virtual startMetrics_ function.
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:114
void stopMetrics_() override
Perform shutdown actions. Writes stop message to output file.
Definition: file_metric.cc:165
void stopMetrics()
Perform shutdown actions. Zeroes out all accumulators, and sends zeros for each metric. Calls stopMetrics_() for any plugin-defined shutdown actions.
void startMetrics_() override
Perform startup actions. Writes start message to output file.
Definition: file_metric.cc:155
void sendMetric_(const std::string &name, const float &value, const std::string &unit) override
Write metric data to a file.
Definition: file_metric.cc:136
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:81
FileMetric(fhicl::ParameterSet const &config, std::string const &app_name)
FileMetric Constructor. Opens the file and starts the metric.
Definition: file_metric.cc:42
std::string getLibName() const override
Get the library name for the File metric.
Definition: file_metric.cc:91
bool inhibit_
Whether to inhibit all metric sending.