2 #include "artdaq-utilities/Plugins/MetricMacros.hh"
3 #include "fhiclcpp/ParameterSet.h"
4 #include "messagefacility/MessageLogger/MessageLogger.h"
5 #define TRACE_NAME "procFile_metric"
28 std::unordered_map<std::string, std::string> value_map_;
43 , pipe_(
pset.get<std::string>(
"pipe",
"/tmp/eventQueueStat"))
47 auto names =
pset.get<std::vector<std::string>>(
"names", std::vector<std::string>());
49 for (
auto name : names)
51 value_map_[name] =
"";
54 int sts = mkfifo(pipe_.c_str(), 0777);
55 if (sts != 0) { perror(
"ProcFileMetric mkfifo"); }
56 TRACE(10,
"ProcFileMetric mkfifo(" + pipe_ +
") sts=%d", sts);
64 TRACE( 11,
"~ProcFileMetric" );
72 std::string
getLibName()
const override {
return "procFile"; }
79 void sendMetric_(
const std::string& name,
const std::string& value,
const std::string&)
override {
80 if (value_map_.count(name)) {
81 TRACE(12,
"sendMetric_ setting value="+ value);
82 value_map_[name] = value;
92 void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit)
override {
102 void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit)
override {
103 sendMetric(name, std::to_string(value), unit);
112 void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit)
override {
113 sendMetric(name, std::to_string(value), unit);
122 void sendMetric_(
const std::string& name,
const unsigned long int& value,
const std::string& unit)
override
124 sendMetric(name, std::to_string(value), unit);
149 TRACE(11,
"stopMetrics_ before open " + pipe_);
150 int fd = open(pipe_.c_str(), O_RDONLY | O_NONBLOCK);
151 if (fd == -1) { perror(
"stopMetrics_ open(\"r\")"); exit(1); }
152 TRACE(10,
"stopMetrics_ between open and unlink" + pipe_ +
" fd=%d", fd);
153 unlink(pipe_.c_str());
154 TRACE(11,
"stopMetrics_ unlinked " + pipe_);
157 read(fd, buf,
sizeof(buf));
161 TRACE(11,
"stopMetrics_ after close " + pipe_);
162 if (thread_.joinable()) thread_.join();
173 TRACE(11,
"writePipe before open");
174 int fd = open(pipe_.c_str(), O_WRONLY);
176 for (
auto value : value_map_) {
177 TRACE(10,
"writePipe open fd="+std::to_string(fd)+
" name="+value.first+
" value="+value.second );
178 str += value.first +
": " + value.second +
"\n";
181 int sts = write(fd, str.c_str(), str.size());
182 TRACE(11,
"writePipe write complete sts=%d", sts);
184 TRACE(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.
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(fhicl::ParameterSet config)
ProcFileMetric Constructor.
~ProcFileMetric()
ProcFileMetric Destructor.
void sendMetric(const std::string &name, const std::string &value, const std::string &unit, bool accumulate=true)
Send a metric value to the MetricPlugin.
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.