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