desc: Time to wait before sending requests again to exporter server (seconds)
default: 5
services:
- - ceph-exporter
\ No newline at end of file
+ - ceph-exporter
void DaemonMetricCollector::request_loop(boost::asio::steady_timer &timer) {
timer.async_wait([&](const boost::system::error_code &e) {
std::cerr << e << std::endl;
+ const auto start = std::chrono::system_clock::now();
update_sockets();
dump_asok_metrics();
- timer.expires_from_now(std::chrono::seconds(stats_period));
+ const std::chrono::duration<double> end = std::chrono::system_clock::now() - start;
+ timer.expires_from_now(std::chrono::seconds(std::max(stats_period, (int)std::round(end.count()))));
request_loop(timer);
});
}
-void DaemonMetricCollector::set_sock_dir(std::string sock_dir) {
- SOCKETDIR = sock_dir;
+void DaemonMetricCollector::set_sock_dir() {
+ SOCKETDIR = g_conf().get_val<std::string>("sock_dir");
}
void DaemonMetricCollector::main() {
- // TODO: let's do 5 for now and expose this to change in the future
stats_period = g_conf().get_val<int64_t>("exporter_stats_period");;
boost::asio::io_service io;
boost::asio::steady_timer timer{io, std::chrono::seconds(stats_period)};
for (auto &perf_counter : perf_group_object) {
std::string perf_name = perf_counter.key().to_string();
json_object perf_info = perf_counter.value().as_object();
- int plimit = g_conf().get_val<int64_t>("exporter_prio_limit");
+ int prio_limit = g_conf().get_val<int64_t>("exporter_prio_limit");
+ // std::cout << prio_limit << std::endl;
if (perf_info["priority"].as_int64() <
- plimit) {
+ prio_limit) {
continue;
}
std::string name = "ceph_" + perf_group + "_" + perf_name;
}
}
void DaemonMetricCollector::update_sockets() {
+ // std:: cout << SOCKETDIR << std::endl;
clients.clear();
for (const auto &entry :
std::filesystem::directory_iterator(SOCKETDIR)) {
std::string daemon_name =
daemon_socket_name.substr(0, daemon_socket_name.size() - 5);
if (clients.find(daemon_name) == clients.end() &&
- !(daemon_name.find("mgr") != std::string::npos)) {
+ !(daemon_name.find("mgr") != std::string::npos) &&
+ !(daemon_name.find("client") != std::string::npos)) {
AdminSocketClient sock(entry.path().string());
+ std::cout << entry.path().string() << std::endl;
clients.insert({daemon_name, std::move(sock)});
}
}
class DaemonMetricCollector {
public:
void main();
- void set_sock_dir(std::string sock_path);
+ void set_sock_dir();
std::string get_metrics();
std::string SOCKETDIR = "/var/run/ceph/";
static void usage() {
std::cout << "usage: ceph-exporter [options]\n"
<< "options:\n"
- " --sock-dir: The path to ceph daemons socket files dir\n"
- " --addrs: Host ip address where exporter is deployed\n"
- " --port: Port to deploy exporter on. Default is 9926\n"
- " --prio-limit: Only perf counters greater than or equal to exporter_prio_limit are fetched\n"
+ " --sock-dir: The path to ceph daemons socket files dir\n"
+ " --addrs: Host ip address where exporter is deployed\n"
+ " --port: Port to deploy exporter on. Default is 9926\n"
+ " --prio-limit: Only perf counters greater than or equal to exporter_prio_limit are fetched\n"
" --stats-period: Time to wait before sending requests again to exporter server (seconds)"
<< std::endl;
generic_server_usage();
auto cct = global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT,
CODE_ENVIRONMENT_DAEMON, 0);
- std::string val, sock_dir, exporter_addrs, exporter_port, exporter_prio_limit;
+ std::string val, sock_dir, exporter_addrs, exporter_prio_limit;
for (auto i = args.begin(); i != args.end();) {
if (ceph_argparse_double_dash(args, i)) {
break;
exporter_addrs = val;
cct->_conf.set_val("exporter_addrs", val);
} else if (ceph_argparse_witharg(args, i, &val, "--port", (char *)NULL)) {
- exporter_port = val;
cct->_conf.set_val("exporter_port", val);
} else if (ceph_argparse_witharg(args, i, &val, "--prio-limit", (char *)NULL)) {
exporter_prio_limit = val;
}
common_init_finish(g_ceph_context);
- boost::thread server_thread(http_server_thread_entrypoint, exporter_addrs, exporter_port);
+ boost::thread server_thread(http_server_thread_entrypoint, exporter_addrs);
DaemonMetricCollector &collector = collector_instance();
- collector.set_sock_dir(sock_dir);
+ collector.set_sock_dir();
collector.main();
server_thread.join();
}
});
}
-void http_server_thread_entrypoint(std::string exporter_addrs, std::string exporter_port) {
+void http_server_thread_entrypoint(std::string exporter_addrs) {
try {
exporter_addrs = !exporter_addrs.empty() ? exporter_addrs : g_conf().get_val<std::string>("exporter_addrs");
auto const address = net::ip::make_address(exporter_addrs);
tcp::acceptor acceptor{ioc, {address, port}};
tcp::socket socket{ioc};
http_server(acceptor, socket);
- std::cout << "Http server running on " << std::quoted(exporter_addrs + ":" + exporter_port) << std::endl;
+ std::cout << "Http server running on " << exporter_addrs + ":" << port << std::endl;
ioc.run();
} catch (std::exception const &e) {
std::cerr << "Error: " << e.what() << std::endl;
#include <string>
-void http_server_thread_entrypoint(std::string exporter_addrs, std::string exporter_port);
+void http_server_thread_entrypoint(std::string exporter_addrs);