7 #include "TRACE/tracemf.h"
8 #define TRACE_NAME (app_name_ + "_graphite_metric").c_str()
10 #include "artdaq-utilities/Plugins/MetricMacros.hh"
11 #include "fhiclcpp/ParameterSet.h"
12 #include "messagefacility/MessageLogger/MessageLogger.h"
15 #include <boost/asio.hpp>
21 using boost::asio::ip::tcp;
39 std::string namespace_;
40 boost::asio::io_service io_service_;
44 std::chrono::steady_clock::time_point waitStart_;
60 explicit GraphiteMetric(fhicl::ParameterSet
const& config, std::string
const& app_name, std::string
const& metric_name)
62 , host_(
pset.get<std::string>(
"host",
"localhost"))
63 , port_(
pset.get<int>(
"port", 2003))
64 , namespace_(
pset.get<std::string>(
"namespace",
"artdaq."))
66 , socket_(io_service_)
70 METLOG(TLVL_TRACE) <<
"GraphiteMetric ctor";
83 std::string
getLibName()
const override {
return "graphite"; }
91 void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& ,
const std::chrono::system_clock::time_point& time)
override
95 boost::asio::streambuf data;
97 std::replace(nameTemp.begin(), nameTemp.end(),
' ',
'_');
98 std::ostream out(&data);
99 out << namespace_ << nameTemp <<
" "
101 << std::chrono::system_clock::to_time_t(time) << std::endl;
103 boost::system::error_code error;
104 boost::asio::write(socket_, data, error);
120 void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit,
const std::chrono::system_clock::time_point& time)
override
122 sendMetric_(name, std::to_string(value), unit, time);
132 void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit,
const std::chrono::system_clock::time_point& time)
override
134 sendMetric_(name, std::to_string(value), unit, time);
144 void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit,
const std::chrono::system_clock::time_point& time)
override
146 sendMetric_(name, std::to_string(value), unit, time);
156 void sendMetric_(
const std::string& name,
const uint64_t& value,
const std::string& unit,
const std::chrono::system_clock::time_point& time)
override
158 sendMetric_(name, std::to_string(value), unit, time);
182 socket_.shutdown(boost::asio::socket_base::shutdown_send);
186 catch (boost::system::system_error& err)
188 METLOG(TLVL_WARNING) <<
"In destructor of GraphiteMetric instance associated with " << host_ <<
":" << port_ <<
", the following boost::system::system_error exception was thrown out of a call to stopMetrics() and caught: " << err.code() <<
", \"" << err.what() <<
"\"";
192 METLOG(TLVL_WARNING) <<
"In destructor of GraphiteMetric instance associated with " << host_ <<
":" << port_ <<
", an *unknown* exception was thrown out of a call to stopMetrics() and caught!";
210 boost::system::error_code error;
211 tcp::resolver resolver(io_service_);
212 tcp::resolver::query query(host_, std::to_string(port_));
213 boost::asio::connect(socket_, resolver.resolve(query), error);
214 if (!error) { errorCount_ = 0; }
217 METLOG(TLVL_WARNING) <<
"Error reconnecting socket, attempt #" << errorCount_;
219 waitStart_ = std::chrono::steady_clock::now();
221 else if (std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - waitStart_).count() >= 5)
void sendMetric_(const std::string &name, const float &value, const std::string &unit, const std::chrono::system_clock::time_point &time) override
Send a metric to Graphite.
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.
fhicl::ParameterSet pset
The ParameterSet used to configure the MetricPlugin.
std::string getLibName() const override
Get the library name for the Graphite metric.
void startMetrics_() override
Perform startup actions. For Graphite, this means reconnecting the socket.
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, const std::chrono::system_clock::time_point &time) override
Send a metric to Graphite.
void sendMetric_(const std::string &name, const uint64_t &value, const std::string &unit, const std::chrono::system_clock::time_point &time) override
Send a metric to Graphite.
void sendMetric_(const std::string &name, const std::string &value, const std::string &, const std::chrono::system_clock::time_point &time) override
Send a metric to Graphite.
GraphiteMetric(fhicl::ParameterSet const &config, std::string const &app_name, std::string const &metric_name)
GraphiteMetric Constructor.
void stopMetrics_() override
Perform shutdown actions. This shuts down the socket and closes it.
~GraphiteMetric() override
GraphiteMetric Destructor. Calls stopMetrics()
Send a metric to Graphite.
void sendMetric_(const std::string &name, const double &value, const std::string &unit, const std::chrono::system_clock::time_point &time) override
Send a metric to Graphite.