Skip to content

Commit 8278945

Browse files
authored
Merge pull request ceph#65489 from shraddhaag/wip-shraddhaag-availability-format
mon/OSDMonitor.cc: optionally display availability status in json Reviewed-by: Nitzan Mordhai<[email protected]>
2 parents 12208e0 + 14412e7 commit 8278945

File tree

2 files changed

+55
-26
lines changed

2 files changed

+55
-26
lines changed

doc/rados/operations/monitoring.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,9 @@ Example output:
761761
cephfs.a.meta 77s 0s 0 0s 0s 1 1
762762
cephfs.a.data 76s 0s 0 0s 0s 1 1
763763

764+
The time values above are rounded for readability. To see the exact second
765+
values, use the option ``--format`` with ``json`` or ``json-pretty`` value.
766+
764767
A pool is considered ``unavailable`` when at least one PG in the pool
765768
becomes inactive or there is at least one unfound object in the pool.
766769
Otherwise the pool is considered ``available``. Depending on the

src/mon/OSDMonitor.cc

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14443,33 +14443,59 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
1444314443
ss << "availability tracking is disabled; you can enable it by setting the config option enable_availability_tracking";
1444414444
err = -EOPNOTSUPP;
1444514445
goto reply_no_propose;
14446-
}
14447-
TextTable tbl;
14448-
tbl.define_column("POOL", TextTable::LEFT, TextTable::LEFT);
14449-
tbl.define_column("UPTIME", TextTable::LEFT, TextTable::RIGHT);
14450-
tbl.define_column("DOWNTIME", TextTable::LEFT, TextTable::RIGHT);
14451-
tbl.define_column("NUMFAILURES", TextTable::LEFT, TextTable::RIGHT);
14452-
tbl.define_column("MTBF", TextTable::LEFT, TextTable::RIGHT);
14453-
tbl.define_column("MTTR", TextTable::LEFT, TextTable::RIGHT);
14454-
tbl.define_column("SCORE", TextTable::LEFT, TextTable::RIGHT);
14455-
tbl.define_column("AVAILABLE", TextTable::LEFT, TextTable::RIGHT);
14446+
}
14447+
1445614448
std::map<uint64_t, PoolAvailability> pool_availability = mon.mgrstatmon()->get_pool_availability();
14457-
for (const auto& i : pool_availability) {
14458-
const auto& p = i.second;
14459-
double mtbf = p.num_failures > 0 ? (p.uptime / p.num_failures) : 0;
14460-
double mttr = p.num_failures > 0 ? (p.downtime / p.num_failures) : 0;
14461-
double score = mtbf > 0 ? mtbf / (mtbf + mttr): 1.0;
14462-
tbl << p.pool_name;
14463-
tbl << timespan_str(make_timespan(p.uptime));
14464-
tbl << timespan_str(make_timespan(p.downtime));
14465-
tbl << p.num_failures;
14466-
tbl << timespan_str(make_timespan(mtbf));
14467-
tbl << timespan_str(make_timespan(mttr));
14468-
tbl << score;
14469-
tbl << p.is_avail;
14470-
tbl << TextTable::endrow;
14471-
}
14472-
rdata.append(stringify(tbl));
14449+
14450+
if (f) {
14451+
f->open_array_section("pools");
14452+
for (const auto& i : pool_availability) {
14453+
const auto& p = i.second;
14454+
double mtbf = p.num_failures > 0 ? (p.uptime / p.num_failures) : 0;
14455+
double mttr = p.num_failures > 0 ? (p.downtime / p.num_failures) : 0;
14456+
double score = mtbf > 0 ? mtbf / (mtbf + mttr): 1.0;
14457+
14458+
f->open_object_section("pool");
14459+
f->dump_string("pool", p.pool_name);
14460+
f->dump_unsigned("uptime", p.uptime);
14461+
f->dump_unsigned("downtime", p.downtime);
14462+
f->dump_float("mtbf", mtbf);
14463+
f->dump_float("mttr", mttr);
14464+
f->dump_unsigned("num_failures", p.num_failures);
14465+
f->dump_float("score", score);
14466+
f->dump_bool("available", p.is_avail);
14467+
f->close_section();
14468+
}
14469+
f->close_section();
14470+
f->flush(rdata);
14471+
} else {
14472+
TextTable tbl;
14473+
tbl.define_column("POOL", TextTable::LEFT, TextTable::LEFT);
14474+
tbl.define_column("UPTIME", TextTable::LEFT, TextTable::RIGHT);
14475+
tbl.define_column("DOWNTIME", TextTable::LEFT, TextTable::RIGHT);
14476+
tbl.define_column("NUMFAILURES", TextTable::LEFT, TextTable::RIGHT);
14477+
tbl.define_column("MTBF", TextTable::LEFT, TextTable::RIGHT);
14478+
tbl.define_column("MTTR", TextTable::LEFT, TextTable::RIGHT);
14479+
tbl.define_column("SCORE", TextTable::LEFT, TextTable::RIGHT);
14480+
tbl.define_column("AVAILABLE", TextTable::LEFT, TextTable::RIGHT);
14481+
14482+
for (const auto& i : pool_availability) {
14483+
const auto& p = i.second;
14484+
double mtbf = p.num_failures > 0 ? (p.uptime / p.num_failures) : 0;
14485+
double mttr = p.num_failures > 0 ? (p.downtime / p.num_failures) : 0;
14486+
double score = mtbf > 0 ? mtbf / (mtbf + mttr): 1.0;
14487+
tbl << p.pool_name;
14488+
tbl << timespan_str(make_timespan(p.uptime));
14489+
tbl << timespan_str(make_timespan(p.downtime));
14490+
tbl << p.num_failures;
14491+
tbl << timespan_str(make_timespan(mtbf));
14492+
tbl << timespan_str(make_timespan(mttr));
14493+
tbl << score;
14494+
tbl << p.is_avail;
14495+
tbl << TextTable::endrow;
14496+
}
14497+
rdata.append(stringify(tbl));
14498+
}
1447314499
} else if (prefix == "osd force-create-pg") {
1447414500
pg_t pgid;
1447514501
string pgidstr;

0 commit comments

Comments
 (0)