From 2ec6ff5e3947ad3b88e79bad448172ddc5c6309e Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Wed, 7 Dec 2022 23:48:33 -0800 Subject: [PATCH] crimson/osd: dump each shard seastar metrics Signed-off-by: chunmei-liu Signed-off-by: Samuel Just --- src/crimson/admin/osd_admin.cc | 32 +++++++++++++++++---------- src/crimson/common/smp_helpers.h | 38 +++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index d93e294d28dd2..4f7e149ea0f66 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -226,22 +226,30 @@ public: std::string_view format, ceph::bufferlist&& input) const final { - std::unique_ptr f{Formatter::create(format, "json-pretty", "json-pretty")}; + std::unique_ptr fref{Formatter::create(format, "json-pretty", "json-pretty")}; + auto *f = fref.get(); std::string prefix; cmd_getval(cmdmap, "group", prefix); f->open_object_section("metrics"); - 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()) { - dump_metric_value(f.get(), full_name, *metric, labels); + f->open_array_section("metrics"); + return seastar::do_with(std::move(prefix), [f](auto &prefix) { + return crimson::reactor_map_seq([f, &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()) { + DumpMetricsHook::dump_metric_value(f, full_name, *metric, labels); + } + } } - } - } - f->close_section(); - return seastar::make_ready_future(std::move(f)); + }); + }).then([fref = std::move(fref)]() mutable { + fref->close_section(); + fref->close_section(); + return seastar::make_ready_future(std::move(fref)); + }); } private: using registered_metric = seastar::metrics::impl::registered_metric; diff --git a/src/crimson/common/smp_helpers.h b/src/crimson/common/smp_helpers.h index 165f110b6e8b5..c2b7bd9641a77 100644 --- a/src/crimson/common/smp_helpers.h +++ b/src/crimson/common/smp_helpers.h @@ -41,25 +41,23 @@ auto proxy_method_on_core( } /** - * sharded_map_seq + * reactor_map_seq * - * Invokes f on each shard of t sequentially. Caller may assume that + * Invokes f on each reactor sequentially, Caller may assume that * f will not be invoked concurrently on multiple cores. */ -template -auto sharded_map_seq(T &t, F &&f) { - using ret_type = decltype(f(t.local())); - // seastar::smp::submit_to because sharded::invoke_on doesn't have - // a const overload. +template +auto reactor_map_seq(F &&f) { + using ret_type = decltype(f()); if constexpr (is_errorated_future_v) { auto ret = crimson::do_for_each( seastar::smp::all_cpus().begin(), seastar::smp::all_cpus().end(), - [&t, f=std::move(f)](auto core) mutable { + [f=std::move(f)](auto core) mutable { return seastar::smp::submit_to( core, - [&t, &f] { - return std::invoke(f, t.local()); + [&f] { + return std::invoke(f); }); }); return ret_type(ret); @@ -67,14 +65,28 @@ auto sharded_map_seq(T &t, F &&f) { return seastar::do_for_each( seastar::smp::all_cpus().begin(), seastar::smp::all_cpus().end(), - [&t, f=std::move(f)](auto core) mutable { + [f=std::move(f)](auto core) mutable { return seastar::smp::submit_to( core, - [&t, &f] { - return std::invoke(f, t.local()); + [&f] { + return std::invoke(f); }); }); } } +/** + * sharded_map_seq + * + * Invokes f on each shard of t sequentially. Caller may assume that + * f will not be invoked concurrently on multiple cores. + */ +template +auto sharded_map_seq(T &t, F &&f) { + return reactor_map_seq( + [&t, f=std::forward(f)]() mutable { + return std::invoke(f, t.local()); + }); +} + } -- 2.39.5