2 #include "artdaq-utilities/Plugins/MetricMacros.hh"
3 #include "fhiclcpp/ParameterSet.h"
4 #include "messagefacility/MessageLogger/MessageLogger.h"
5 #define TRACE_NAME "procFile_metric"
11 #include <boost/thread.hpp>
27 std::unordered_map<std::string, std::string> value_map_;
29 boost::thread thread_;
43 explicit ProcFileMetric(fhicl::ParameterSet
const& config, std::string
const& app_name)
45 , pipe_(
pset.get<std::string>(
"pipe",
"/tmp/eventQueueStat"))
49 auto names =
pset.get<std::vector<std::string>>(
"names", std::vector<std::string>());
51 for (
auto name : names)
53 value_map_[name] =
"";
56 int sts = mkfifo(pipe_.c_str(), 0777);
57 if (sts != 0) { perror(
"ProcFileMetric mkfifo"); }
58 TLOG(10) <<
"ProcFileMetric mkfifo()" << pipe_ <<
" sts=" << sts;
67 TLOG(11) <<
"~ProcFileMetric";
75 std::string
getLibName()
const override {
return "procFile"; }
82 void sendMetric_(
const std::string& name,
const std::string& value,
const std::string&)
override
84 if (value_map_.count(name))
86 TLOG(12) <<
"sendMetric_ setting value=" << value;
87 value_map_[name] = value;
97 void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit)
override
108 void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit)
override
119 void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit)
override
130 void sendMetric_(
const std::string& name,
const unsigned long int& value,
const std::string& unit)
override
144 boost::thread::attributes attrs;
145 attrs.set_stack_size(4096 * 2000);
150 catch (boost::exception
const& e)
152 std::cerr <<
"Creating ProcFile Metric thread failed! e: " << boost::diagnostic_information(e) << std::endl;
167 TLOG(11) <<
"stopMetrics_ before open " << pipe_;
168 int fd = open(pipe_.c_str(), O_RDONLY | O_NONBLOCK);
171 perror(
"stopMetrics_ open(\"r\")");
174 TLOG(10) <<
"stopMetrics_ between open and unlink" << pipe_ <<
" fd=" << fd;
175 unlink(pipe_.c_str());
176 TLOG(11) <<
"stopMetrics_ unlinked " << pipe_;
179 read(fd, buf,
sizeof(buf));
183 TLOG(11) <<
"stopMetrics_ after close " << pipe_;
184 if (thread_.joinable()) thread_.join();
195 TLOG(11) <<
"writePipe before open";
196 int fd = open(pipe_.c_str(), O_WRONLY);
198 for (
auto value : value_map_)
200 TLOG(10) <<
"writePipe open fd=" << fd <<
" name=" << value.first <<
" value=" << value.second;
201 str += value.first +
": " + value.second +
"\n";
204 int sts = write(fd, str.c_str(), str.size());
205 TLOG(11) <<
"writePipe write complete sts=" << sts;
207 TLOG(11) <<
"writePipe after close -- about to usleep";
The MetricPlugin class defines the interface that MetricManager uses to send metric data to the vario...
void startMetrics()
Perform startup actions. Simply calls the virtual startMetrics_ function.
std::string getLibName() const override
Get the "library name" of this Metric.
void stopMetrics_() override
Open the pipe for reading to allow the metric-sending thread to end gracefully.
fhicl::ParameterSet pset
The ParameterSet used to configure the MetricPlugin.
void sendMetric_(const std::string &name, const double &value, const std::string &unit) override
Set the value to be written to the pipe when it is opened by a reader.
void startMetrics_() override
Start the metric-sending thread.
ProcFileMetric(fhicl::ParameterSet const &config, std::string const &app_name)
ProcFileMetric Constructor.
void writePipe()
Wait for the pipe to be opened and then write the current value to it.
void stopMetrics()
Perform shutdown actions. Zeroes out all accumulators, and sends zeros for each metric. Calls stopMetrics_() for any plugin-defined shutdown actions.
void sendMetric_(const std::string &name, const int &value, const std::string &unit) override
Set the value to be written to the pipe when it is opened by a reader.
void sendMetric_(const std::string &name, const unsigned long int &value, const std::string &unit) override
Set the value to be written to the pipe when it is opened by a reader.
void sendMetric_(const std::string &name, const std::string &value, const std::string &) override
Set the value to be written to the pipe when it is opened by a reader.
~ProcFileMetric()
ProcFileMetric Destructor.
A MetricPlugin which writes a long unsigned int metric with a given name to a given pipe...
void sendMetric_(const std::string &name, const float &value, const std::string &unit) override
Set the value to be written to the pipe when it is opened by a reader.