7 #include "artdaq-utilities/Plugins/MetricMacros.hh"
8 #include "fhiclcpp/ParameterSet.h"
9 #include "messagefacility/MessageLogger/MessageLogger.h"
15 #include <boost/asio.hpp>
18 using boost::asio::ip::tcp;
27 std::string namespace_;
28 boost::asio::io_service io_service_;
32 std::chrono::steady_clock::time_point waitStart_;
35 , host_(pset.get<std::string>(
"host",
"localhost"))
36 , port_(pset.get<
int>(
"port", 2003))
37 , namespace_(pset.get<std::string>(
"namespace",
"artdaq."))
39 , socket_(io_service_)
47 virtual std::string getLibName()
const {
return "graphite"; }
49 virtual void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& unit)
53 std::string unitWarn = unit;
54 const std::time_t result = std::time(0);
55 boost::asio::streambuf data;
56 std::string nameTemp(name);
57 std::replace(nameTemp.begin(), nameTemp.end(),
' ',
'_');
58 std::ostream out(&data);
59 out << namespace_ << nameTemp <<
" "
61 << result << std::endl;
63 boost::system::error_code error;
64 boost::asio::write(socket_, data, error);
73 virtual void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit)
75 sendMetric(name, std::to_string(value), unit);
78 virtual void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit)
80 sendMetric(name, std::to_string(value), unit);
83 virtual void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit)
85 sendMetric(name, std::to_string(value), unit);
88 virtual void sendMetric_(
const std::string& name,
const unsigned long int& value,
const std::string& unit)
90 sendMetric(name, std::to_string(value), unit);
93 virtual void startMetrics_()
102 virtual void stopMetrics_()
106 socket_.shutdown(boost::asio::socket_base::shutdown_send);
116 boost::system::error_code error;
117 tcp::resolver resolver(io_service_);
118 tcp::resolver::query query(host_, std::to_string(port_));
119 boost::asio::connect(socket_, resolver.resolve(query), error);
120 if (!error) { errorCount_ = 0; }
121 else { mf::LogWarning(
"GraphiteMetric") <<
"Error reconnecting socket, attempt #" << errorCount_; }
122 waitStart_ = std::chrono::steady_clock::now();
124 else if (std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - waitStart_).count() >= 5)