7 #define TRACE_NAME "FileMetric"
10 #include "artdaq-utilities/Plugins/MetricMacros.hh"
11 #include "fhiclcpp/ParameterSet.h"
13 #include <sys/types.h>
15 #include <boost/filesystem.hpp>
20 namespace BFS = boost::filesystem;
29 std::string outputFile_;
30 bool file_name_is_absolute_path_;
31 std::string relative_env_var_;
32 bool uniquify_file_name_;
33 std::ofstream outputStream_;
34 std::ios_base::openmode mode_;
35 std::string timeformat_;
38 std::ostream& getTime_(std::ostream& stream)
40 std::time_t tt = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
42 struct std::tm* ptm = std::localtime(&tt);
43 if (!timeformat_.empty())
45 return stream << std::put_time(ptm, timeformat_.c_str()) <<
": ";
71 explicit FileMetric(fhicl::ParameterSet
const& config, std::string
const& app_name)
73 , outputFile_(
pset.get<std::string>(
"fileName",
"FileMetric.out"))
74 , file_name_is_absolute_path_(
pset.get<bool>(
"absolute_file_path", true))
75 , relative_env_var_(
pset.get<std::string>(
"relative_directory_env_var",
"ARTDAQ_LOG_ROOT"))
76 , uniquify_file_name_(
pset.get<bool>(
"uniquify", false))
77 , timeformat_(
pset.get<std::string>(
"time_format",
"%c"))
80 auto modeString =
pset.get<std::string>(
"fileMode",
"append");
82 mode_ = std::ofstream::out | std::ofstream::app;
83 if (modeString ==
"Overwrite" || modeString ==
"Create" || modeString ==
"Write")
85 mode_ = std::ofstream::out | std::ofstream::trunc;
88 if (uniquify_file_name_)
90 std::string unique_id = std::to_string(getpid());
91 if (outputFile_.find(
"%UID%") != std::string::npos)
93 outputFile_ = outputFile_.replace(outputFile_.find(
"%UID%"), 5, unique_id);
97 if (outputFile_.rfind(
'.') != std::string::npos)
99 outputFile_ = outputFile_.insert(outputFile_.rfind(
'.'),
"_" + unique_id);
103 outputFile_ = outputFile_.append(
"_" + unique_id);
132 void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& unit)
override
136 getTime_(outputStream_) <<
"FileMetric: " << name <<
": " << value <<
" " << unit <<
"." << std::endl;
146 void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit)
override
157 void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit)
override
168 void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit)
override
179 void sendMetric_(
const std::string& name,
const uint64_t& value,
const std::string& unit)
override
190 getTime_(outputStream_) <<
"FileMetric plugin started." << std::endl;
199 getTime_(outputStream_) <<
"FileMetric plugin has been stopped!" << std::endl;
205 if (!file_name_is_absolute_path_)
207 TLOG(TLVL_DEBUG) <<
"Reading relative directory evironment variable " << relative_env_var_;
208 std::string logPathProblem;
209 std::string logfileName;
210 char* logRootString = getenv(relative_env_var_.c_str());
212 std::string logfileDir;
213 if (logRootString !=
nullptr)
215 if (!BFS::exists(logRootString))
217 TLOG(TLVL_WARNING) <<
"Relative directory environment variable " << relative_env_var_ <<
" points to a non-existant directory! Using /tmp/!";
218 outputFile_ =
"/tmp/" + outputFile_;
219 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << outputFile_;
220 outputStream_.open(outputFile_, mode_);
224 logfileDir = logRootString;
225 logfileDir.append(
"/metrics/");
227 while (outputFile_.find(
'/') != std::string::npos)
229 TLOG(TLVL_DEBUG) <<
"Extracting subdirectories from relative file path " << outputFile_ <<
" (logfileDir = " << logfileDir <<
")";
230 logfileDir.append(outputFile_.substr(0, outputFile_.find(
'/') + 1));
231 outputFile_.erase(0, outputFile_.find(
'/') + 1);
236 TLOG(TLVL_DEBUG) <<
"Creating log file directory " << logfileDir;
237 if (!BFS::exists(logfileDir))
239 BFS::create_directories(logfileDir);
242 logfileName.append(logfileDir);
243 logfileName.append(outputFile_);
245 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << logfileName;
246 outputStream_.open(logfileName, mode_);
251 TLOG(TLVL_WARNING) <<
"Relative directory environment variable " << relative_env_var_ <<
" is null! Using /tmp/!";
252 outputFile_ =
"/tmp/" + outputFile_;
253 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << outputFile_;
254 outputStream_.open(outputFile_, mode_);
259 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << outputFile_;
260 outputStream_.open(outputFile_, mode_);
262 if (outputStream_.is_open())
264 getTime_(outputStream_) <<
"FileMetric plugin file opened." << std::endl;
268 TLOG(TLVL_ERROR) <<
"Error opening metric file " << outputFile_;
274 getTime_(outputStream_) <<
"FileMetric closing file stream." << std::endl;
277 outputStream_.flush();
278 outputStream_.close();
void sendMetric_(const std::string &name, const uint64_t &value, const std::string &unit) override
Write metric data to a file.
void sendMetric_(const std::string &name, const std::string &value, const std::string &unit) override
Write metric data to a file.
The MetricPlugin class defines the interface that MetricManager uses to send metric data to the vario...
void sendMetric_(const std::string &name, const double &value, const std::string &unit) override
Write metric data to a file.
void startMetrics()
Perform startup actions. Simply calls the virtual startMetrics_ function.
~FileMetric() override
FileMetric Destructor. Calls stopMetrics and then closes the file.
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.
void stopMetrics_() override
Perform shutdown actions. Writes stop message to output file.
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.
void sendMetric_(const std::string &name, const float &value, const std::string &unit) override
Write metric data to a file.
FileMetric writes metric data to a file on disk.
FileMetric(fhicl::ParameterSet const &config, std::string const &app_name)
FileMetric Constructor. Opens the file and starts the metric.
std::string getLibName() const override
Get the library name for the File metric.
bool inhibit_
Flag to indicate that the MetricPlugin is being stopped, and any metric back-ends which do not have a...