From: Samuel Just Date: Tue, 22 Jul 2025 22:22:44 +0000 (-0700) Subject: crimson: factor out metric helpers from osd_admin X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ff659b1771b8437cac7fe51d174c7954d3a520a4;p=ceph.git crimson: factor out metric helpers from osd_admin Signed-off-by: Samuel Just --- diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index 56fa45417e7..a604d84718f 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -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 make_asok_hook(); diff --git a/src/crimson/common/metrics_helpers.h b/src/crimson/common/metrics_helpers.h new file mode 100644 index 00000000000..f3727389cd1 --- /dev/null +++ b/src/crimson/common/metrics_helpers.h @@ -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 + +#include + +#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 +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(); + } + } + } +} + +} +}