]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: make dynamic osd perf counters accessible from modules
authorMykola Golub <mgolub@suse.com>
Wed, 14 Nov 2018 07:33:01 +0000 (09:33 +0200)
committerMykola Golub <mgolub@suse.com>
Tue, 20 Nov 2018 11:18:30 +0000 (13:18 +0200)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/mgr/ActivePyModules.cc
src/mgr/ActivePyModules.h
src/mgr/BaseMgrModule.cc
src/mgr/DaemonServer.cc
src/mgr/DaemonServer.h

index ba281bddca0921989a925701ccf7d5e06a6dc505..595ac7d7e977e08a636726d1ce56aa89486450ac 100644 (file)
@@ -916,6 +916,48 @@ void ActivePyModules::remove_osd_perf_query(OSDPerfMetricQueryID query_id)
   }
 }
 
+PyObject *ActivePyModules::get_osd_perf_counters(OSDPerfMetricQueryID query_id)
+{
+  std::map<OSDPerfMetricKey, PerformanceCounters> counters;
+
+  int r = server.get_osd_perf_counters(query_id, &counters);
+  if (r < 0) {
+    dout(0) << "get_osd_perf_counters for query_id=" << query_id << " failed: "
+            << cpp_strerror(r) << dendl;
+    Py_RETURN_NONE;
+  }
+
+  PyFormatter f;
+
+  f.open_array_section("counters");
+  for (auto &it : counters) {
+    auto &key = it.first;
+    auto  &instance_counters = it.second;
+    f.open_object_section("i");
+    f.open_array_section("k");
+    for (auto &sub_key : key) {
+      f.open_array_section("s");
+      for (size_t i = 0; i < sub_key.size(); i++) {
+        f.dump_string(stringify(i).c_str(), sub_key[i]);
+      }
+      f.close_section(); // s
+    }
+    f.close_section(); // k
+    f.open_array_section("c");
+    for (auto &c : instance_counters) {
+      f.open_array_section("p");
+      f.dump_unsigned("0", c.first);
+      f.dump_unsigned("1", c.second);
+      f.close_section(); // p
+    }
+    f.close_section(); // c
+    f.close_section(); // i
+  }
+  f.close_section(); // counters
+
+  return f.get();
+}
+
 void ActivePyModules::cluster_log(const std::string &channel, clog_type prio,
   const std::string &message)
 {
index bccf821aee0b8ae490538c63a1ff73124a49a3ad..03f0ee2d5fd0124bb6e7f76d1eee6969493917a3 100644 (file)
@@ -94,6 +94,7 @@ public:
 
   OSDPerfMetricQueryID add_osd_perf_query(const OSDPerfMetricQuery &query);
   void remove_osd_perf_query(OSDPerfMetricQueryID query_id);
+  PyObject *get_osd_perf_counters(OSDPerfMetricQueryID query_id);
 
   bool get_store(const std::string &module_name,
       const std::string &key, std::string *val) const;
index 0aee22318b4d92171c48467c5b40305626abc7b5..013d44756173c807314c4f0972352a3c1582256e 100644 (file)
@@ -695,6 +695,18 @@ ceph_remove_osd_perf_query(BaseMgrModule *self, PyObject *args)
   Py_RETURN_NONE;
 }
 
+static PyObject*
+ceph_get_osd_perf_counters(BaseMgrModule *self, PyObject *args)
+{
+  OSDPerfMetricQueryID query_id;
+  if (!PyArg_ParseTuple(args, "i:ceph_get_osd_perf_counters", &query_id)) {
+    derr << "Invalid args!" << dendl;
+    return nullptr;
+  }
+
+  return self->py_modules->get_osd_perf_counters(query_id);
+}
+
 PyMethodDef BaseMgrModule_methods[] = {
   {"_ceph_get", (PyCFunction)ceph_state_get, METH_VARARGS,
    "Get a cluster object"},
@@ -775,6 +787,9 @@ PyMethodDef BaseMgrModule_methods[] = {
   {"_ceph_remove_osd_perf_query", (PyCFunction)ceph_remove_osd_perf_query,
     METH_VARARGS, "Remove an osd perf query"},
 
+  {"_ceph_get_osd_perf_counters", (PyCFunction)ceph_get_osd_perf_counters,
+    METH_VARARGS, "Get osd perf counters"},
+
   {NULL, NULL, 0, NULL}
 };
 
index e3c622d913614fc7e64634f92e9cdd807d009cb1..4069715e8b7944a429296fab0d587a78742530af 100644 (file)
@@ -2691,3 +2691,10 @@ int DaemonServer::remove_osd_perf_query(OSDPerfMetricQueryID query_id)
 {
   return osd_perf_metric_collector.remove_query(query_id);
 }
+
+int DaemonServer::get_osd_perf_counters(
+    OSDPerfMetricQueryID query_id,
+    std::map<OSDPerfMetricKey, PerformanceCounters> *counters)
+{
+  return osd_perf_metric_collector.get_counters(query_id, counters);
+}
index 6ccab441cf54b7884db3a1d4892e6f568b7231b8..47020a884b4b8aff301195492474242f2d2cd8b1 100644 (file)
@@ -167,6 +167,8 @@ public:
 
   OSDPerfMetricQueryID add_osd_perf_query(const OSDPerfMetricQuery &query);
   int remove_osd_perf_query(OSDPerfMetricQueryID query_id);
+  int get_osd_perf_counters(OSDPerfMetricQueryID query_id,
+                            std::map<OSDPerfMetricKey, PerformanceCounters> *c);
 
   virtual const char** get_tracked_conf_keys() const override;
   virtual void handle_conf_change(const ConfigProxy& conf,