]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
exporter: expose perf_counters at http endpoint
authorAvan Thakkar <athakkar@redhat.com>
Sun, 13 Mar 2022 21:17:15 +0000 (02:47 +0530)
committerAvan Thakkar <athakkar@redhat.com>
Mon, 20 Jun 2022 18:20:46 +0000 (23:50 +0530)
Signed-off-by: Avan Thakkar <athakkar@redhat.com>
src/ceph_exporter.cc
src/mgr/DaemonMetricCollector.cc
src/mgr/DaemonMetricCollector.h

index af8da01e29f95ac7da5698f716f122aaf3e000f0..8621ca4e51a2b5d4b2b370e7521718003dec5fe1 100644 (file)
@@ -46,9 +46,9 @@ public:
     }
 
     // Initiate the asynchronous operations associated with the connection.
-    void start()
+    void start(std::string& response)
     {
-        read_request();
+        read_request(response);
         check_deadline();
     }
 
@@ -62,25 +62,25 @@ private:
         socket_.get_executor(), std::chrono::seconds(60)};
 
     // Asynchronously receive a complete request message.
-    void read_request()
+    void read_request(std::string& response)
     {
-        auto self = shared_from_this();
+        // auto self = shared_from_this();
 
         http::async_read(
             socket_,
             buffer_,
             request_,
-            [self](beast::error_code ec,
+            [&](beast::error_code ec,
                 std::size_t bytes_transferred)
             {
                 boost::ignore_unused(bytes_transferred);
                 if(!ec)
-                    self->process_request();
+                    process_request(response);
             });
     }
 
     // Determine what needs to be done with the request message.
-    void process_request()
+    void process_request(std::string& response)
     {
         response_.version(request_.version());
         response_.keep_alive(false);
@@ -90,7 +90,7 @@ private:
         case http::verb::get:
             response_.result(http::status::ok);
             response_.set(http::field::server, "Beast");
-            create_response();
+            create_response(response);
             break;
 
         default:
@@ -109,12 +109,12 @@ private:
     }
 
     // Construct a response message based on the program state.
-    void create_response()
+    void create_response(std::string& response)
     {
         if(request_.target() == "/perf_counters")
         {
             response_.set(http::field::content_type, "text/plain");
-            beast::ostream(response_.body()) << "Perf Counters\n";
+            beast::ostream(response_.body()) << "Perf Counters\n" << response << std::endl;
         }
         else
         {
@@ -159,40 +159,51 @@ private:
 };
 
 // "Loop" forever accepting new connections.
-void http_server(tcp::acceptor& acceptor, tcp::socket& socket)
+void http_server(tcp::acceptor& acceptor, tcp::socket& socket, std::string& response)
 {
   acceptor.async_accept(socket,
       [&](beast::error_code ec)
       {
           if(!ec)
-              std::make_shared<http_connection>(std::move(socket))->start();
-          http_server(acceptor, socket);
+              std::make_shared<http_connection>(std::move(socket))->start(response);
+          http_server(acceptor, socket, response);
       });
 }
 
+std::string dns_lookup(std::string hostname) {
+    boost::asio::io_service io_service;
+    boost::asio::ip::tcp::resolver resolver(io_service);
+    boost::asio::ip::tcp::resolver::query query(hostname, "9085");
+    boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);
+    boost::asio::ip::tcp::endpoint endpoint = iter->endpoint();
+    std::string ip_address = endpoint.address().to_string();
+
+    return ip_address;
+}
+
 int main(int argc, char** argv) {
   // TODO: daemonize
   std::cout << "inside exporter" << std::endl;
-  // std::map<std::string,std::string> defaults = {
-  //   { "keyring", "$mgr_data/keyring" }
-  // };
-  // auto args = argv_to_vec(argc, argv);
-  // auto cct = global_init(&defaults, args, CEPH_ENTITY_TYPE_EXPORTER,
-       //               CODE_ENVIRONMENT_DAEMON, 0);
+
   DaemonMetricCollector collector;
-  collector.main();
+  int stats_period = 5;
+  std::string response;
+  response = collector.main();
+  std::cout << "response: " << std::endl;
 
   try
     {
-        std::cout << "hostname: " << ceph_get_short_hostname() << std::endl;
-        auto const address = net::ip::make_address("127.0.0.1");
-        unsigned short port = static_cast<unsigned short>(std::atoi("8080"));
+        std::string hostname = ceph_get_short_hostname();
+        
+        std::string ip_address = dns_lookup(hostname);
+        auto const address = net::ip::make_address(ip_address);
+        unsigned short port = static_cast<unsigned short>(std::atoi("9085"));
 
         net::io_context ioc{1};
 
         tcp::acceptor acceptor{ioc, {address, port}};
         tcp::socket socket{ioc};
-        http_server(acceptor, socket);
+        http_server(acceptor, socket, response);
 
         ioc.run();
     }
index 2823f2084d00425f3aa41c5325d6e4f1bde45dab..173333b9439b4b9e26b7fcba3de158f8e246a15c 100644 (file)
@@ -13,14 +13,12 @@ using json_object = boost::json::object;
 using json_value = boost::json::value;
 using json_array = boost::json::array;
 
-void DaemonMetricCollector::main() {
-  std::cout << "metric" << std::endl;
-  // start server
-  int times = 1;
-  while (times--) {
-    update_sockets();
-    send_requests();
-   }
+std::string DaemonMetricCollector::main() {
+  update_sockets();
+  send_requests();
+  // result.push_back(reqs);
+
+  return result;
 }
 
 template <class T>
@@ -48,21 +46,18 @@ std::string boost_string_to_std(boost::json::string js) {
   return res;
 }
 
-void DaemonMetricCollector::send_requests() {
+std::string DaemonMetricCollector::send_requests() {
   for(auto client : clients) {
     AdminSocketClient &sock_client = client.second;
     std::string daemon_name = client.first;
     std::string request("{\"prefix\":\"perf dump\"}");
     std::string response;
     sock_client.do_request(request, &response);
-    std::cout << client.first << std::endl;
-    std::cout << response << std::endl;
     if (response.size() > 0) {
       json_object dump = boost::json::parse(response).as_object();
       request = "{\"prefix\":\"perf schema\"}";
       response = "";
       sock_client.do_request(request, &response);
-      std::cout << response << std::endl;
       json_object schema = boost::json::parse(response).as_object();
       for (auto perf : schema) {
         std::string perf_group = perf.key().to_string();
@@ -117,15 +112,16 @@ void DaemonMetricCollector::send_requests() {
           } else {
             add_double_or_int_metric(ss, perf_values, name, description, mtype, labels);
           }
-          std::cout << ss.str() << std::endl;
+          result += ss.str() + "\n";
         }
       }
     }
   }
+  return result;
 }
 
 void DaemonMetricCollector::update_sockets() {
-  std::string path = "/tmp/ceph-asok.YY0Vnr/";
+  std::string path = "/tmp/ceph-asok.Qcdpny/";
   for (const auto & entry : std::filesystem::directory_iterator(path)) {
     std::string daemon_socket_name = entry.path().filename().string();
     // remove .asok
index fa397d6c699f833f9ce839d630f081725bd3d1ee..ce4bf63f5343d88a5ad48a508eef2fa95dea1a6d 100644 (file)
 class DaemonMetricCollector {
  public:
   int i;
-  void main();
+  std::string main();
 
 private:
   // TODO: add clients
   //       check removed sockets
   //       list dir of sockets
   std::map<std::string, AdminSocketClient> clients;
+  std::string result;
   void update_sockets();
-  void send_requests();
+  std::string send_requests();
   void start_mgr_connection();
 };