-void MDSMap::print_summary(ostream& out)
+void MDSMap::print_summary(Formatter *f, ostream *out)
{
map<int,string> by_rank;
map<string,int> by_state;
+ if (f) {
+ f->dump_unsigned("epoch", get_epoch());
+ f->dump_unsigned("up", up.size());
+ f->dump_unsigned("in", in.size());
+ f->dump_unsigned("max", max_mds);
+ } else {
+ *out << "e" << get_epoch() << ": " << up.size() << "/" << in.size() << "/" << max_mds << " up";
+ }
+
+ if (f)
+ f->open_array_section("by_rank");
for (map<uint64_t,mds_info_t>::iterator p = mds_info.begin();
p != mds_info.end();
++p) {
if (p->second.laggy())
s += "(laggy or crashed)";
- if (p->second.rank >= 0)
- by_rank[p->second.rank] = p->second.name + "=" + s;
- else
+ if (p->second.rank >= 0) {
+ if (f) {
+ f->open_object_section("mds");
+ f->dump_unsigned("rank", p->second.rank);
+ f->dump_string("name", p->second.name);
+ f->dump_string("status", s);
+ f->close_section();
+ } else {
+ by_rank[p->second.rank] = p->second.name + "=" + s;
+ }
+ } else {
by_state[s]++;
+ }
+ }
+ if (f) {
+ f->close_section();
+ } else {
+ if (!by_rank.empty())
+ *out << " " << by_rank;
}
- out << "e" << get_epoch() << ": " << up.size() << "/" << in.size() << "/" << max_mds << " up";
-
- if (!by_rank.empty())
- out << " " << by_rank;
+ for (map<string,int>::reverse_iterator p = by_state.rbegin(); p != by_state.rend(); ++p) {
+ if (f) {
+ f->dump_unsigned(p->first.c_str(), p->second);
+ } else {
+ *out << ", " << p->second << " " << p->first;
+ }
+ }
- for (map<string,int>::reverse_iterator p = by_state.rbegin(); p != by_state.rend(); ++p)
- out << ", " << p->second << " " << p->first;
-
- if (!failed.empty())
- out << ", " << failed.size() << " failed";
+ if (!failed.empty()) {
+ if (f) {
+ f->dump_unsigned("failed", failed.size());
+ } else {
+ *out << ", " << failed.size() << " failed";
+ }
+ }
//if (stopped.size())
//out << ", " << stopped.size() << " stopped";
}
if (f) {
f->dump_stream("fsid") << monmap->get_fsid();
- f->dump_stream("monmap") << *monmap;
- f->dump_stream("election_epoch") << get_epoch();
- f->dump_stream("quorum") << get_quorum();
- f->dump_stream("quorum_names") << get_quorum_names();
- f->dump_stream("osdmap") << osdmon()->osdmap;
- f->dump_stream("pgmap") << pgmon()->pg_map;
- f->dump_stream("mdsmap") << mdsmon()->mdsmap;
+ f->dump_unsigned("election_epoch", get_epoch());
+ {
+ f->open_array_section("quorum");
+ for (set<int>::iterator p = quorum.begin(); p != quorum.end(); ++p)
+ f->dump_int("rank", *p);
+ f->close_section();
+ f->open_array_section("quorum_names");
+ for (set<int>::iterator p = quorum.begin(); p != quorum.end(); ++p)
+ f->dump_string("id", monmap->get_name(*p));
+ f->close_section();
+ }
+ f->open_object_section("monmap");
+ monmap->dump(f);
+ f->close_section();
+ f->open_object_section("osdmap");
+ osdmon()->osdmap.print_summary(f, cout);
+ f->close_section();
+ f->open_object_section("pgmap");
+ pgmon()->pg_map.print_summary(f, NULL);
+ f->close_section();
+ f->open_object_section("mdsmap");
+ mdsmon()->mdsmap.print_summary(f, NULL);
f->close_section();
} else {
ss << " cluster " << monmap->get_fsid() << "\n";
dump_pg_stats_plain(ss, stuck_pg_stats);
}
-void PGMap::state_summary(ostream& ss) const
-{
- for (hash_map<int,int>::const_iterator p = num_pg_by_state.begin();
- p != num_pg_by_state.end();
- ++p) {
- if (p != num_pg_by_state.begin())
- ss << ", ";
- ss << p->second << " " << pg_state_string(p->first);
- }
-}
-
-void PGMap::recovery_summary(ostream& out) const
+void PGMap::recovery_summary(Formatter *f, ostream *out) const
{
bool first = true;
if (pg_sum.stats.sum.num_objects_degraded) {
double pc = (double)pg_sum.stats.sum.num_objects_degraded / (double)pg_sum.stats.sum.num_object_copies * (double)100.0;
char b[20];
snprintf(b, sizeof(b), "%.3lf", pc);
- out << pg_sum.stats.sum.num_objects_degraded
- << "/" << pg_sum.stats.sum.num_object_copies << " degraded (" << b << "%)";
+ if (f) {
+ f->dump_unsigned("degraded_objects", pg_sum.stats.sum.num_objects_degraded);
+ f->dump_unsigned("degraded_total", pg_sum.stats.sum.num_object_copies);
+ f->dump_string("degrated_ratio", b);
+ } else {
+ *out << pg_sum.stats.sum.num_objects_degraded
+ << "/" << pg_sum.stats.sum.num_object_copies << " degraded (" << b << "%)";
+ }
first = false;
}
if (pg_sum.stats.sum.num_objects_unfound) {
double pc = (double)pg_sum.stats.sum.num_objects_unfound / (double)pg_sum.stats.sum.num_objects * (double)100.0;
char b[20];
snprintf(b, sizeof(b), "%.3lf", pc);
- if (!first)
- out << "; ";
- out << pg_sum.stats.sum.num_objects_unfound
- << "/" << pg_sum.stats.sum.num_objects << " unfound (" << b << "%)";
+ if (f) {
+ f->dump_unsigned("unfound_objects", pg_sum.stats.sum.num_objects_unfound);
+ f->dump_unsigned("unfound_total", pg_sum.stats.sum.num_objects);
+ f->dump_string("unfound_ratio", b);
+ } else {
+ if (!first)
+ *out << "; ";
+ *out << pg_sum.stats.sum.num_objects_unfound
+ << "/" << pg_sum.stats.sum.num_objects << " unfound (" << b << "%)";
+ }
first = false;
}
if (pg_sum_delta.stats.sum.num_objects_recovered ||
pg_sum_delta.stats.sum.num_bytes_recovered ||
pg_sum_delta.stats.sum.num_keys_recovered) {
- if (!first)
- out << "; ";
- out << " recovering "
- << si_t(pg_sum_delta.stats.sum.num_objects_recovered / (double)stamp_delta) << " o/s, "
- << si_t(pg_sum_delta.stats.sum.num_bytes_recovered / (double)stamp_delta) << "B/s";
- if (pg_sum_delta.stats.sum.num_keys_recovered)
- out << ", " << si_t(pg_sum_delta.stats.sum.num_keys_recovered / (double)stamp_delta) << " key/s";
+ uint64_t objps = pg_sum_delta.stats.sum.num_objects_recovered / (double)stamp_delta;
+ uint64_t bps = pg_sum_delta.stats.sum.num_bytes_recovered / (double)stamp_delta;
+ uint64_t kps = pg_sum_delta.stats.sum.num_keys_recovered / (double)stamp_delta;
+ if (f) {
+ f->dump_unsigned("recovering_objects_per_sec", objps);
+ f->dump_unsigned("recovering_bytes_per_sec", bps);
+ f->dump_unsigned("recovering_keys_per_sec", kps);
+ } else {
+ if (!first)
+ *out << "; ";
+ *out << " recovering "
+ << si_t(objps) << " o/s, "
+ << si_t(bps) << "B/s";
+ if (pg_sum_delta.stats.sum.num_keys_recovered)
+ *out << ", " << si_t(kps) << " key/s";
+ }
}
}
stamp_delta = ceph_clock_now(g_ceph_context);
}
-void PGMap::print_summary(ostream& out) const
+void PGMap::print_summary(Formatter *f, ostream *out) const
{
std::stringstream ss;
- state_summary(ss);
- string states = ss.str();
- out << "v" << version << ": "
- << pg_stat.size() << " pgs: "
- << states << "; "
- << prettybyte_t(pg_sum.stats.sum.num_bytes) << " data, "
- << kb_t(osd_sum.kb_used) << " used, "
- << kb_t(osd_sum.kb_avail) << " / "
- << kb_t(osd_sum.kb) << " avail";
+ if (f)
+ f->open_object_section("pgs_by_state");
+ for (hash_map<int,int>::const_iterator p = num_pg_by_state.begin();
+ p != num_pg_by_state.end();
+ ++p) {
+ if (f) {
+ f->dump_unsigned(pg_state_string(p->first).c_str(), p->second);
+ } else {
+ if (p != num_pg_by_state.begin())
+ ss << ", ";
+ ss << p->second << " " << pg_state_string(p->first);
+ }
+ }
+ if (f)
+ f->close_section();
+
+ if (f) {
+ f->dump_unsigned("version", version);
+ f->dump_unsigned("num_pgs", pg_stat.size());
+ f->dump_unsigned("data_bytes", pg_sum.stats.sum.num_bytes);
+ f->dump_unsigned("bytes_used", osd_sum.kb_used * 4096ull);
+ f->dump_unsigned("bytes_avail", osd_sum.kb_avail * 4096ull);
+ f->dump_unsigned("bytes_total", osd_sum.kb * 4096ull);
+ } else {
+ string states = ss.str();
+ *out << "v" << version << ": "
+ << pg_stat.size() << " pgs: "
+ << states << "; "
+ << prettybyte_t(pg_sum.stats.sum.num_bytes) << " data, "
+ << kb_t(osd_sum.kb_used) << " used, "
+ << kb_t(osd_sum.kb_avail) << " / "
+ << kb_t(osd_sum.kb) << " avail";
+ }
if (pg_sum_delta.stats.sum.num_rd ||
pg_sum_delta.stats.sum.num_wr) {
- out << "; ";
- if (pg_sum_delta.stats.sum.num_rd)
- out << si_t((pg_sum_delta.stats.sum.num_rd_kb << 10) / (double)stamp_delta) << "B/s rd, ";
- if (pg_sum_delta.stats.sum.num_wr)
- out << si_t((pg_sum_delta.stats.sum.num_wr_kb << 10) / (double)stamp_delta) << "B/s wr, ";
- out << si_t((pg_sum_delta.stats.sum.num_rd + pg_sum_delta.stats.sum.num_wr) / (double)stamp_delta) << "op/s";
+ if (!f)
+ *out << "; ";
+ if (pg_sum_delta.stats.sum.num_rd) {
+ uint64_t rd = (pg_sum_delta.stats.sum.num_rd_kb << 10) / (double)stamp_delta;
+ if (f) {
+ f->dump_unsigned("read_bytes_sec", rd);
+ } else {
+ *out << si_t(rd) << "B/s rd, ";
+ }
+ }
+ if (pg_sum_delta.stats.sum.num_wr) {
+ uint64_t wr = (pg_sum_delta.stats.sum.num_wr_kb << 10) / (double)stamp_delta;
+ if (f) {
+ f->dump_unsigned("write_bytes_sec", wr);
+ } else {
+ *out << si_t(wr) << "B/s wr, ";
+ }
+ }
+ uint64_t iops = (pg_sum_delta.stats.sum.num_rd + pg_sum_delta.stats.sum.num_wr) / (double)stamp_delta;
+ if (f) {
+ f->dump_unsigned("op_per_sec", iops);
+ } else {
+ *out << si_t(iops) << "op/s";
+ }
}
std::stringstream ssr;
- recovery_summary(ssr);
- if (ssr.str().length())
- out << "; " << ssr.str();
+ recovery_summary(f, &ssr);
+ if (!f && ssr.str().length())
+ *out << "; " << ssr.str();
}
void PGMap::generate_test_instances(list<PGMap*>& o)