]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
exporter: add ceph_daemon labels to labeled counters as well
authoravanthakkar <avanjohn@gmail.com>
Tue, 19 Sep 2023 08:18:43 +0000 (13:48 +0530)
committeravanthakkar <avanjohn@gmail.com>
Wed, 27 Sep 2023 07:38:43 +0000 (13:08 +0530)
Exporter missed adding the `ceph_daemon` or `instance_id`
labels(in case if rgw metrics) to the new labeled performance counters.

Fixes: https://tracker.ceph.com/issues/62874
Signed-off-by: avanthakkar <avanjohn@gmail.com>
(cherry picked from commit f061955f0beabcaa3dca0dbfb6a8c8e56c764a0b)

src/exporter/DaemonMetricCollector.cc
src/exporter/DaemonMetricCollector.h
src/test/exporter/test_exporter.cc

index 464ec6fdc83d1f208ee34be6de59d114af1822a3..ebe85c3041e5aa76aef799858b2c4d3dc39b5191 100644 (file)
@@ -147,15 +147,13 @@ void DaemonMetricCollector::dump_asok_metrics() {
           std::string counter_name = perf_group + "_" + counter_name_init;
           promethize(counter_name);
 
-          if (counters_labels.empty()) {
-            auto labels_and_name = get_labels_and_metric_name(daemon_name, counter_name);
-            if (labels_and_name.first.empty()) {
-              dout(1) << "Unable to parse instance_id from daemon_name: " << daemon_name << dendl;
-              continue;
-            }
-            labels = labels_and_name.first;
-            counter_name = labels_and_name.second;
+          auto extra_labels = get_extra_labels(daemon_name);
+          if (extra_labels.empty()) {
+            dout(1) << "Unable to parse instance_id from daemon_name: " << daemon_name << dendl;
+            continue;
           }
+          labels.insert(extra_labels.begin(), extra_labels.end());
+
           // For now this is only required for rgw multi-site metrics
           auto multisite_labels_and_name = add_fixed_name_metrics(counter_name);
           if (!multisite_labels_and_name.first.empty()) {
@@ -289,12 +287,8 @@ std::string DaemonMetricCollector::asok_request(AdminSocketClient &asok,
   return response;
 }
 
-std::pair<labels_t, std::string>
-DaemonMetricCollector::get_labels_and_metric_name(std::string daemon_name,
-                                                  std::string metric_name) {
-  std::string new_metric_name;
+labels_t DaemonMetricCollector::get_extra_labels(std::string daemon_name) {
   labels_t labels;
-  new_metric_name = metric_name;
   const std::string ceph_daemon_prefix = "ceph-";
   const std::string ceph_client_prefix = "client.";
   if (daemon_name.rfind(ceph_daemon_prefix, 0) == 0) {
@@ -321,24 +315,12 @@ DaemonMetricCollector::get_labels_and_metric_name(std::string daemon_name,
     if (elems.size() >= 4) {
       labels["instance_id"] = quote(elems[3]);
     } else {
-      return std::make_pair(labels_t(), "");
+      return labels_t();
     }
   } else {
     labels.insert({"ceph_daemon", quote(daemon_name)});
   }
-  if (daemon_name.find("rbd-mirror") != std::string::npos) {
-    std::regex re(
-        "^rbd_mirror_image_([^/]+)/(?:(?:([^/]+)/"
-        ")?)(.*)\\.(replay(?:_bytes|_latency)?)$");
-    std::smatch match;
-    if (std::regex_search(daemon_name, match, re) == true) {
-      new_metric_name = "ceph_rbd_mirror_image_" + match.str(4);
-      labels["pool"] = quote(match.str(1));
-      labels["namespace"] = quote(match.str(2));
-      labels["image"] = quote(match.str(3));
-    }
-  }
-  return {labels, new_metric_name};
+  return labels;
 }
 
 // Add fixed name metrics from existing ones that have details in their names
index 88e827bddae70211afd2938304663462409da5ee..e906fb13a5970c956c3e263b2e7dd462d0b53a77 100644 (file)
@@ -34,8 +34,7 @@ class DaemonMetricCollector {
 public:
   void main();
   std::string get_metrics();
-  std::pair<labels_t, std::string>
-  get_labels_and_metric_name(std::string daemon_name, std::string metric_name);
+  labels_t get_extra_labels(std::string daemon_name);
 
 private:
   std::map<std::string, AdminSocketClient> clients;
index 03b2db917603dfe08f9418ec6002adaeadd3ea30..b607d1afffbed4281a34f42d13a6ca358e0b1819 100644 (file)
@@ -670,27 +670,25 @@ TEST(Exporter, check_labels_and_metric_name) {
   counters_data.emplace_back("ceph-osd.0", "ceph_osd_numpg");
   counters_data.emplace_back("ceph-client.rgw.foo.ceph-node-00.hrgsea.2.94739968030880", "ceph_rgw_get");
 
-  static std::vector<std::pair<labels_t, std::string>> labels_and_name;
-  labels_and_name.emplace_back(labels_t{{"ceph_daemon", "\"osd.0\""}}, "ceph_osd_numpg");
-  labels_and_name.emplace_back(labels_t{{"instance_id", "\"hrgsea\""}}, "ceph_rgw_get");
+  static std::vector<labels_t> labels_vec;
+  labels_vec.emplace_back(labels_t{{"ceph_daemon", "\"osd.0\""}});
+  labels_vec.emplace_back(labels_t{{"instance_id", "\"hrgsea\""}});
   auto counter_data_itr = counters_data.begin();
-  auto labels_and_name_itr = labels_and_name.begin();
-  for (; counter_data_itr != counters_data.end() && labels_and_name_itr != labels_and_name.end();
-         ++counter_data_itr, ++labels_and_name_itr) {
+  auto labels_vec_itr = labels_vec.begin();
+  for (; counter_data_itr != counters_data.end() && labels_vec_itr != labels_vec.end();
+         ++counter_data_itr, ++labels_vec_itr) {
         std::string daemon_name = counter_data_itr->first;
         std::string counter_name = counter_data_itr->second;
         DaemonMetricCollector &collector = collector_instance();
-        std::pair<labels_t, std::string> result = collector.get_labels_and_metric_name(daemon_name, counter_name);
-        ASSERT_EQ(result.first, labels_and_name_itr->first);
-        ASSERT_EQ(result.second, labels_and_name_itr->second);
+        labels_t result = collector.get_extra_labels(daemon_name);
+        ASSERT_EQ(result, *labels_vec_itr);
   }
   // test for fail case with daemon_name.size() < 4
   std::string short_daemon_name = "ceph-client.rgw.foo";
   std::string counter_name = "ceph_rgw_get";
   DaemonMetricCollector &collector = collector_instance();
-  std::pair<labels_t, std::string> fail_result = collector.get_labels_and_metric_name(short_daemon_name, counter_name);
+  labels_t fail_result = collector.get_extra_labels(short_daemon_name);
   // This is a special case, the daemon name is not of the required size for fetching instance_id.
   // So no labels should be added.
-  ASSERT_TRUE(fail_result.first.empty());
-  ASSERT_TRUE(fail_result.second.empty());
+  ASSERT_TRUE(fail_result.empty());
 }