From 2bc4922614790fe0010d88363213fb463f93e299 Mon Sep 17 00:00:00 2001 From: Shraddha Agrawal Date: Thu, 11 Sep 2025 20:14:51 +0530 Subject: [PATCH] mon/OSDMonitor.cc: optionally display availability status in json This commit enables users to specify the format option for the data availability feature. Now if the users specific json-pretty, output will be displayed in the given format. Fixes: https://tracker.ceph.com/issues/71546 Signed-off-by: Shraddha Agrawal --- src/mon/OSDMonitor.cc | 78 ++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 97c632cd7e9..ad636c2b573 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -14443,33 +14443,59 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, ss << "availability tracking is disabled; you can enable it by setting the config option enable_availability_tracking"; err = -EOPNOTSUPP; goto reply_no_propose; - } - TextTable tbl; - tbl.define_column("POOL", TextTable::LEFT, TextTable::LEFT); - tbl.define_column("UPTIME", TextTable::LEFT, TextTable::RIGHT); - tbl.define_column("DOWNTIME", TextTable::LEFT, TextTable::RIGHT); - tbl.define_column("NUMFAILURES", TextTable::LEFT, TextTable::RIGHT); - tbl.define_column("MTBF", TextTable::LEFT, TextTable::RIGHT); - tbl.define_column("MTTR", TextTable::LEFT, TextTable::RIGHT); - tbl.define_column("SCORE", TextTable::LEFT, TextTable::RIGHT); - tbl.define_column("AVAILABLE", TextTable::LEFT, TextTable::RIGHT); + } + std::map pool_availability = mon.mgrstatmon()->get_pool_availability(); - for (const auto& i : pool_availability) { - const auto& p = i.second; - double mtbf = p.num_failures > 0 ? (p.uptime / p.num_failures) : 0; - double mttr = p.num_failures > 0 ? (p.downtime / p.num_failures) : 0; - double score = mtbf > 0 ? mtbf / (mtbf + mttr): 1.0; - tbl << p.pool_name; - tbl << timespan_str(make_timespan(p.uptime)); - tbl << timespan_str(make_timespan(p.downtime)); - tbl << p.num_failures; - tbl << timespan_str(make_timespan(mtbf)); - tbl << timespan_str(make_timespan(mttr)); - tbl << score; - tbl << p.is_avail; - tbl << TextTable::endrow; - } - rdata.append(stringify(tbl)); + + if (f) { + f->open_array_section("pools"); + for (const auto& i : pool_availability) { + const auto& p = i.second; + double mtbf = p.num_failures > 0 ? (p.uptime / p.num_failures) : 0; + double mttr = p.num_failures > 0 ? (p.downtime / p.num_failures) : 0; + double score = mtbf > 0 ? mtbf / (mtbf + mttr): 1.0; + + f->open_object_section("pool"); + f->dump_string("pool", p.pool_name); + f->dump_unsigned("uptime", p.uptime); + f->dump_unsigned("downtime", p.downtime); + f->dump_float("mtbf", mtbf); + f->dump_float("mttr", mttr); + f->dump_unsigned("num_failures", p.num_failures); + f->dump_float("score", score); + f->dump_bool("available", p.is_avail); + f->close_section(); + } + f->close_section(); + f->flush(rdata); + } else { + TextTable tbl; + tbl.define_column("POOL", TextTable::LEFT, TextTable::LEFT); + tbl.define_column("UPTIME", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("DOWNTIME", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("NUMFAILURES", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("MTBF", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("MTTR", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("SCORE", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("AVAILABLE", TextTable::LEFT, TextTable::RIGHT); + + for (const auto& i : pool_availability) { + const auto& p = i.second; + double mtbf = p.num_failures > 0 ? (p.uptime / p.num_failures) : 0; + double mttr = p.num_failures > 0 ? (p.downtime / p.num_failures) : 0; + double score = mtbf > 0 ? mtbf / (mtbf + mttr): 1.0; + tbl << p.pool_name; + tbl << timespan_str(make_timespan(p.uptime)); + tbl << timespan_str(make_timespan(p.downtime)); + tbl << p.num_failures; + tbl << timespan_str(make_timespan(mtbf)); + tbl << timespan_str(make_timespan(mttr)); + tbl << score; + tbl << p.is_avail; + tbl << TextTable::endrow; + } + rdata.append(stringify(tbl)); + } } else if (prefix == "osd force-create-pg") { pg_t pgid; string pgidstr; -- 2.39.5