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 static std::mutex timeMutex;
41 std::unique_lock<std::mutex> lk(timeMutex);
42 using std::chrono::system_clock;
43 std::time_t tt = system_clock::to_time_t(system_clock::now());
45 struct std::tm* ptm = std::localtime(&tt);
46 if (timeformat_.size())
48 return stream << std::put_time(ptm, timeformat_.c_str()) <<
": ";
69 explicit FileMetric(fhicl::ParameterSet
const& config, std::string
const& app_name)
71 , outputFile_(
pset.get<std::string>(
"fileName",
"FileMetric.out"))
72 , file_name_is_absolute_path_(
pset.get<bool>(
"absolute_file_path", true))
73 , relative_env_var_(
pset.get<std::string>(
"relative_directory_env_var",
"ARTDAQ_LOG_ROOT"))
74 , uniquify_file_name_(
pset.get<bool>(
"uniquify", false))
75 , timeformat_(
pset.get<std::string>(
"time_format",
"%c"))
78 std::string modeString =
pset.get<std::string>(
"fileMode",
"append");
80 mode_ = std::ofstream::out | std::ofstream::app;
81 if (modeString ==
"Overwrite" || modeString ==
"Create" || modeString ==
"Write")
83 mode_ = std::ofstream::out | std::ofstream::trunc;
86 if (uniquify_file_name_)
88 std::string unique_id = std::to_string(getpid());
89 if (outputFile_.find(
"%UID%") != std::string::npos)
91 outputFile_ = outputFile_.replace(outputFile_.find(
"%UID%"), 5, unique_id);
95 if (outputFile_.rfind(
".") != std::string::npos)
97 outputFile_ = outputFile_.insert(outputFile_.rfind(
"."),
"_" + unique_id);
101 outputFile_ = outputFile_.append(
"_" + unique_id);
130 void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& unit)
override
134 getTime_(outputStream_) <<
"FileMetric: " << name <<
": " << value <<
" " << unit <<
"." << std::endl;
144 void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit)
override
155 void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit)
override
166 void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit)
override
177 void sendMetric_(
const std::string& name,
const unsigned long int& value,
const std::string& unit)
override
188 getTime_(outputStream_) <<
"FileMetric plugin started." << std::endl;
197 getTime_(outputStream_) <<
"FileMetric plugin has been stopped!" << std::endl;
203 if (!file_name_is_absolute_path_)
205 TLOG(TLVL_DEBUG) <<
"Reading relative directory evironment variable " << relative_env_var_;
206 std::string logPathProblem =
"";
207 std::string logfileName =
"";
208 char* logRootString = getenv(relative_env_var_.c_str());
210 std::string logfileDir =
"";
211 if (logRootString !=
nullptr)
213 if (!BFS::exists(logRootString))
215 TLOG(TLVL_WARNING) <<
"Relative directory environment variable " << relative_env_var_ <<
" points to a non-existant directory! Using /tmp/!";
216 outputFile_ =
"/tmp/" + outputFile_;
217 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << outputFile_;
218 outputStream_.open(outputFile_, mode_);
222 logfileDir = logRootString;
223 logfileDir.append(
"/metrics/");
225 while (outputFile_.find(
'/') != std::string::npos)
227 TLOG(TLVL_DEBUG) <<
"Extracting subdirectories from relative file path " << outputFile_ <<
" (logfileDir = " << logfileDir <<
")";
228 logfileDir.append(outputFile_.substr(0, outputFile_.find(
'/') + 1));
229 outputFile_.erase(0, outputFile_.find(
'/') + 1);
234 TLOG(TLVL_DEBUG) <<
"Creating log file directory " << logfileDir;
235 if (!BFS::exists(logfileDir))
236 BFS::create_directories(logfileDir);
238 logfileName.append(logfileDir);
239 logfileName.append(outputFile_);
241 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << logfileName;
242 outputStream_.open(logfileName, mode_);
247 TLOG(TLVL_WARNING) <<
"Relative directory environment variable " << relative_env_var_ <<
" is null! Using /tmp/!";
248 outputFile_ =
"/tmp/" + outputFile_;
249 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << outputFile_;
250 outputStream_.open(outputFile_, mode_);
255 TLOG(TLVL_INFO) <<
"FileMetric Opening file " << outputFile_;
256 outputStream_.open(outputFile_, mode_);
258 if (outputStream_.is_open())
260 getTime_(outputStream_) <<
"FileMetric plugin file opened." << std::endl;
264 TLOG(TLVL_ERROR) <<
"Error opening metric file " << outputFile_;
270 getTime_(outputStream_) <<
"FileMetric closing file stream." << std::endl;
271 outputStream_.close();
void sendMetric_(const std::string &name, const std::string &value, const std::string &unit) override
Write metric data to a file.
void sendMetric_(const std::string &name, const unsigned long int &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.
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.
virtual ~FileMetric()
FileMetric Destructor. Calls stopMetrics and then closes the file.
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...