2 #include "artdaq-utilities/Plugins/MetricMacros.hh"
3 #include "fhiclcpp/ParameterSet.h"
4 #include "messagefacility/MessageLogger/MessageLogger.h"
5 #define TRACE_NAME "procFile_metric"
13 #include <boost/thread.hpp>
28 std::unordered_map<std::string, std::string> value_map_;
30 boost::thread thread_;
44 , pipe_(
pset.get<std::string>(
"pipe",
"/tmp/eventQueueStat"))
48 auto names =
pset.get<std::vector<std::string>>(
"names", std::vector<std::string>());
50 for (
auto name : names)
52 value_map_[name] =
"";
55 int sts = mkfifo(pipe_.c_str(), 0777);
56 if (sts != 0) { perror(
"ProcFileMetric mkfifo"); }
57 TLOG(10) <<
"ProcFileMetric mkfifo()" << pipe_ <<
" sts=" << sts;
65 TLOG(11) <<
"~ProcFileMetric" ;
73 std::string
getLibName()
const override {
return "procFile"; }
80 void sendMetric_(
const std::string& name,
const std::string& value,
const std::string&)
override {
81 if (value_map_.count(name)) {
82 TLOG(12) <<
"sendMetric_ setting value=" << value;
83 value_map_[name] = value;
93 void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit)
override {
103 void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit)
override {
113 void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit)
override {
123 void sendMetric_(
const std::string& name,
const unsigned long int& value,
const std::string& unit)
override
137 boost::thread::attributes attrs;
138 attrs.set_stack_size(4096 * 2000);
142 catch (boost::exception
const& e)
144 std::cerr <<
"Creating ProcFile Metric thread failed! e: " << boost::diagnostic_information(e) << std::endl;
159 TLOG(11) <<
"stopMetrics_ before open " << pipe_;
160 int fd = open(pipe_.c_str(), O_RDONLY | O_NONBLOCK);
161 if (fd == -1) { perror(
"stopMetrics_ open(\"r\")"); exit(1); }
162 TLOG(10) <<
"stopMetrics_ between open and unlink" << pipe_ <<
" fd=" << fd;
163 unlink(pipe_.c_str());
164 TLOG(11) <<
"stopMetrics_ unlinked " << pipe_;
167 read(fd, buf,
sizeof(buf));
171 TLOG(11) <<
"stopMetrics_ after close " << pipe_;
172 if (thread_.joinable()) thread_.join();
183 TLOG(11) <<
"writePipe before open";
184 int fd = open(pipe_.c_str(), O_WRONLY);
186 for (
auto value : value_map_) {
187 TLOG(10) <<
"writePipe open fd=" << fd <<
" name=" << value.first <<
" value=" << value.second;
188 str += value.first +
": " + value.second +
"\n";
191 int sts = write(fd, str.c_str(), str.size());
192 TLOG(11) <<
"writePipe write complete sts=" << sts;
194 TLOG(11) <<
"writePipe after close -- about to usleep";
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 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.