]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: factor out metric helpers from osd_admin
authorSamuel Just <sjust@redhat.com>
Tue, 22 Jul 2025 22:22:44 +0000 (15:22 -0700)
committerSamuel Just <sjust@redhat.com>
Thu, 21 Aug 2025 16:01:33 +0000 (09:01 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/admin/osd_admin.cc
src/crimson/common/metrics_helpers.h [new file with mode: 0644]

index 56fa45417e761f9b6d31fc8bbbc320482c0d7906..a604d84718f27fa29a70a4fb7be3d24e0f04840a 100644 (file)
@@ -14,6 +14,7 @@
 #include "common/config.h"
 #include "crimson/admin/admin_socket.h"
 #include "crimson/common/log.h"
+#include "crimson/common/metrics_helpers.h"
 #include "crimson/common/perf_counters_collection.h"
 #include "crimson/osd/exceptions.h"
 #include "crimson/osd/osd.h"
@@ -342,82 +343,17 @@ public:
     fref->open_object_section("metrics");
     fref->open_array_section("metrics");
     co_await crimson::invoke_on_all_seq([f = fref.get(), &prefix] {
-      for (const auto& [full_name, metric_family]: seastar::scollectd::get_value_map()) {
-        if (!prefix.empty() && full_name.compare(0, prefix.size(), prefix) != 0) {
-          continue;
-        }
-        for (const auto& [labels, metric] : metric_family) {
-          if (metric && metric->is_enabled()) {
-           f->open_object_section(""); // enclosed by array
-            DumpMetricsHook::dump_metric_value(f, full_name, *metric, labels.labels());
-           f->close_section();
-          }
-        }
-      }
+      crimson::metrics::dump_metric_value_map(
+       seastar::scollectd::get_value_map(),
+       f,
+       [prefix](const auto &full_name) {
+         return prefix.empty() || full_name.compare(0, prefix.size(), prefix) != 0;
+       });
     });
     fref->close_section();
     fref->close_section();
     co_return std::move(fref);
   }
-private:
-  using registered_metric = seastar::metrics::impl::registered_metric;
-  using data_type = seastar::metrics::impl::data_type;
-
-  static void dump_metric_value(Formatter* f,
-                                string_view full_name,
-                                const registered_metric& metric,
-                                const seastar::metrics::impl::labels_type& labels)
-  {
-    f->open_object_section(full_name);
-    for (const auto& [key, value] : labels) {
-      f->dump_string(key, value);
-    }
-    auto value_name = "value";
-    switch (auto v = metric(); v.type()) {
-    case data_type::GAUGE:
-      f->dump_float(value_name, v.d());
-      break;
-    case data_type::REAL_COUNTER:
-      f->dump_float(value_name, v.d());
-      break;
-    case data_type::COUNTER:
-      double val;
-      try {
-       val = v.ui();
-      } catch (std::range_error&) {
-       // seastar's cpu steal time may be negative
-       val = 0;
-      }
-      f->dump_unsigned(value_name, val);
-      break;
-    case data_type::HISTOGRAM: {
-      f->open_object_section(value_name);
-      auto&& h = v.get_histogram();
-      f->dump_float("sum", h.sample_sum);
-      f->dump_unsigned("count", h.sample_count);
-      f->open_array_section("buckets");
-      for (auto i : h.buckets) {
-        f->open_object_section("bucket");
-        f->dump_float("le", i.upper_bound);
-        f->dump_unsigned("count", i.count);
-        f->close_section(); // "bucket"
-      }
-      {
-        f->open_object_section("bucket");
-        f->dump_string("le", "+Inf");
-        f->dump_unsigned("count", h.sample_count);
-        f->close_section();
-      }
-      f->close_section(); // "buckets"
-      f->close_section(); // value_name
-    }
-      break;
-    default:
-      std::abort();
-      break;
-    }
-    f->close_section(); // full_name
-  }
 };
 template std::unique_ptr<AdminSocketHook> make_asok_hook<DumpMetricsHook>();
 
diff --git a/src/crimson/common/metrics_helpers.h b/src/crimson/common/metrics_helpers.h
new file mode 100644 (file)
index 0000000..f372738
--- /dev/null
@@ -0,0 +1,98 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+#pragma once
+
+#include <string>
+
+#include <seastar/core/scollectd_api.hh>
+
+#include "common/Formatter.h"
+
+namespace crimson {
+namespace metrics {
+
+using registered_metric = seastar::metrics::impl::registered_metric;
+using data_type = seastar::metrics::impl::data_type;
+using value_map = seastar::metrics::impl::value_map;
+
+void dump_metric_value(
+  Formatter* f,
+  std::string_view full_name,
+  const registered_metric& metric,
+  const seastar::metrics::impl::labels_type& labels)
+{
+  f->open_object_section(full_name);
+  for (const auto& [key, value] : labels) {
+    f->dump_string(key, value);
+  }
+  auto value_name = "value";
+  switch (auto v = metric(); v.type()) {
+  case data_type::GAUGE:
+    f->dump_float(value_name, v.d());
+    break;
+  case data_type::REAL_COUNTER:
+    f->dump_float(value_name, v.d());
+    break;
+  case data_type::COUNTER:
+    double val;
+    try {
+      val = v.ui();
+    } catch (std::range_error&) {
+      // seastar's cpu steal time may be negative
+      val = 0;
+    }
+    f->dump_unsigned(value_name, val);
+    break;
+  case data_type::HISTOGRAM: {
+    f->open_object_section(value_name);
+    auto&& h = v.get_histogram();
+    f->dump_float("sum", h.sample_sum);
+    f->dump_unsigned("count", h.sample_count);
+    f->open_array_section("buckets");
+    for (auto i : h.buckets) {
+      f->open_object_section("bucket");
+      f->dump_float("le", i.upper_bound);
+      f->dump_unsigned("count", i.count);
+      f->close_section(); // "bucket"
+    }
+    {
+      f->open_object_section("bucket");
+      f->dump_string("le", "+Inf");
+      f->dump_unsigned("count", h.sample_count);
+      f->close_section();
+    }
+    f->close_section(); // "buckets"
+    f->close_section(); // value_name
+  }
+    break;
+  default:
+    std::abort();
+    break;
+  }
+  f->close_section(); // full_name
+}
+
+template <typename F>
+void dump_metric_value_map(
+  const value_map &vmap,
+  Formatter *f,
+  F &&filter)
+{
+  assert(f);
+  for (const auto& [full_name, metric_family]: seastar::scollectd::get_value_map()) {
+    if (!std::invoke(filter, full_name)) {
+      continue;
+    }
+    for (const auto& [labels, metric] : metric_family) {
+      if (metric && metric->is_enabled()) {
+       f->open_object_section(""); // enclosed by array
+       dump_metric_value(
+         f, full_name, *metric, labels.labels());
+       f->close_section();
+      }
+    }
+  }
+}
+
+}
+}