From 5059eb280fd6ad07a70e3c34057b39409301393f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 21 Jul 2011 13:33:20 -0700 Subject: [PATCH] mon: rewrite pgmap json dump using Formatter Signed-off-by: Sage Weil --- src/mon/PGMap.h | 65 ++++++++++++------------ src/mon/PGMonitor.cc | 7 ++- src/osd/osd_types.h | 115 +++++++++++++++++++++++-------------------- 3 files changed, 101 insertions(+), 86 deletions(-) diff --git a/src/mon/PGMap.h b/src/mon/PGMap.h index b10295898568d..c08f9610bc3b7 100644 --- a/src/mon/PGMap.h +++ b/src/mon/PGMap.h @@ -277,43 +277,44 @@ public: redo_full_sets(); } - void dump_json(ostream& ss) const { - ss << "{ \"version\": " << version << ",\n"; - ss << " \"last_osdmap_epoch\": " << last_osdmap_epoch << ",\n"; - ss << " \"last_pg_scan\": " << last_pg_scan << ",\n"; - ss << " \"full_ratio\": " << full_ratio << ",\n"; - ss << " \"nearfull_ratio\": " << nearfull_ratio << ",\n"; - - ss << " \"pg_stat\": [\n"; - hash_map::const_iterator i = pg_stat.begin(); - while (i != pg_stat.end()) { - i->second.dump_json(ss, i->first, " "); - if (++i == pg_stat.end()) - break; - ss << ",\n"; + void dump(Formatter *f) const { + f->dump_unsigned("version", version); + f->dump_unsigned("last_osdmap_epoch", last_osdmap_epoch); + f->dump_unsigned("last_pg_scan", last_pg_scan); + f->dump_float("full_ratio", full_ratio); + f->dump_float("near_full_ratio", nearfull_ratio); + f->open_array_section("pg_stats"); + for (hash_map::const_iterator i = pg_stat.begin(); + i != pg_stat.end(); + ++i) { + f->open_object_section("pg_stat"); + f->dump_stream("pgid") << i->first; + i->second.dump(f); + f->close_section(); } - ss << "\n ],\n"; + f->close_section(); - ss << " \"pool_stat\": [\n"; - hash_map::const_iterator p = pg_pool_sum.begin(); - while (p != pg_pool_sum.end()) { - p->second.dump_json(ss, p->first, " "); - if (++p == pg_pool_sum.end()) - break; - ss << ",\n"; + f->open_array_section("pool_stats"); + for (hash_map::const_iterator p = pg_pool_sum.begin(); + p != pg_pool_sum.end(); + ++p) { + f->open_object_section("pool_stat"); + f->dump_int("poolid", p->first); + p->second.dump(f); + f->close_section(); } - ss << "\n ],\n"; + f->close_section(); - ss << " \"osd_stat\": [\n"; - hash_map::const_iterator q = osd_stat.begin(); - while (q != osd_stat.end()) { - q->second.dump_json(ss, q->first, " "); - if (++q == osd_stat.end()) - break; - ss << ",\n"; + f->open_array_section("osd_stats"); + for (hash_map::const_iterator q = osd_stat.begin(); + q != osd_stat.end(); + ++q) { + f->open_object_section("osd_stat"); + f->dump_int("osd", q->first); + q->second.dump(f); + f->close_section(); } - ss << "\n ]\n"; - ss << "}\n"; + f->close_section(); } diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index fe8d0ad269d2b..abf5d672ff10b 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -31,6 +31,7 @@ #include "messages/MOSDScrub.h" #include "common/Timer.h" +#include "common/Formatter.h" #include "osd/osd_types.h" #include "osd/PG.h" // yuck @@ -773,8 +774,12 @@ bool PGMonitor::preprocess_command(MMonCommand *m) else if (m->cmd[1] == "dump_json") { ss << "ok"; r = 0; + JSONFormatter jsf(true); + jsf.open_object_section("pg_map"); + pg_map.dump(&jsf); + jsf.close_section(); stringstream ds; - pg_map.dump_json(ds); + jsf.flush(ds); rdata.append(ds); } else if (m->cmd[1] == "map" && m->cmd.size() == 3) { diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 8abf7e0656cba..97c9dceffa64b 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -465,15 +465,20 @@ struct osd_stat_t { osd_stat_t() : kb(0), kb_used(0), kb_avail(0), snap_trim_queue_len(0), num_snap_trimming(0) {} - void dump_json(ostream& o, int osd, string prefix) const { - o << prefix << "{ \"osd\": " << osd << ",\n" - << prefix << " \"kb\": " << kb << ",\n" - << prefix << " \"kb_used\": " << kb_used << ",\n" - << prefix << " \"kb_avail\": " << kb_avail << ",\n" - << prefix << " \"hb_in\": [" << hb_in << "],\n" - << prefix << " \"hb_out\": [" << hb_out << "],\n" - << prefix << " \"snap_trim_queue_len\": " << snap_trim_queue_len << ",\n" - << prefix << " \"num_snap_trimming\": " << num_snap_trimming << "}"; + void dump(Formatter *f) const { + f->dump_unsigned("kb", kb); + f->dump_unsigned("kb_used", kb_used); + f->dump_unsigned("kb_avail", kb_avail); + f->open_array_section("hb_in"); + for (vector::const_iterator p = hb_in.begin(); p != hb_in.end(); ++p) + f->dump_int("osd", *p); + f->close_section(); + f->open_array_section("hb_out"); + for (vector::const_iterator p = hb_out.begin(); p != hb_out.end(); ++p) + f->dump_int("osd", *p); + f->close_section(); + f->dump_int("snap_trim_queue_len", snap_trim_queue_len); + f->dump_int("num_snap_trimming", num_snap_trimming); } void encode(bufferlist &bl) const { @@ -919,34 +924,39 @@ struct pg_stat_t { num_rd(0), num_rd_kb(0), num_wr(0), num_wr_kb(0) { } - void dump_json(ostream& o, pg_t pgid, string prefix) const { - o << prefix << "{ \"pgid\": \"" << pgid << "\",\n" - << prefix << " \"version\": \"" << version << "\",\n" - << prefix << " \"reported\": \"" << reported << "\",\n" - << prefix << " \"state\": \"" << pg_state_string(state) << "\",\n" - << prefix << " \"log_start\": \"" << log_start << "\",\n" - << prefix << " \"ondisk_log_start\": \"" << ondisk_log_start << "\",\n" - << prefix << " \"created\": " << created << ",\n" - << prefix << " \"parent\": \"" << parent << "\",\n" - << prefix << " \"parent_split_bits\": " << parent_split_bits << ",\n" - << prefix << " \"last_scrub\": \"" << last_scrub << "\",\n" - << prefix << " \"last_scrub_stamp\": \"" << last_scrub_stamp << "\",\n" - << prefix << " \"num_bytes\": " << num_bytes << ",\n" - << prefix << " \"num_kb\": " << num_kb << ",\n" - << prefix << " \"num_objects\": " << num_objects << ",\n" - << prefix << " \"num_object_clones\": " << num_object_clones << ",\n" - << prefix << " \"num_object_copies\": " << num_object_copies << ",\n" - << prefix << " \"num_objects_missing_on_primary\": " << num_objects_missing_on_primary << ",\n" - << prefix << " \"num_objects_degraded\": " << num_objects_degraded << ",\n" - << prefix << " \"num_objects_unfound\": " << num_objects_unfound << ",\n" - << prefix << " \"log_size\": " << log_size << ",\n" - << prefix << " \"ondisk_log_size\": " << ondisk_log_size << ",\n" - << prefix << " \"num_read\": " << num_rd << ",\n" - << prefix << " \"num_read_kb\": " << num_rd_kb << ",\n" - << prefix << " \"num_write\": " << num_wr << ",\n" - << prefix << " \"num_write_kb\": " << num_wr_kb << ",\n" - << prefix << " \"up\": " << up << ",\n" - << prefix << " \"acting\": " << acting << " }"; + void dump(Formatter *f) const { + f->dump_stream("version") << version; + f->dump_stream("reported") << reported; + f->dump_string("state", pg_state_string(state)); + f->dump_stream("log_start") << log_start; + f->dump_stream("ondisk_log_start") << ondisk_log_start; + f->dump_unsigned("created", created); + f->dump_stream("parent") << parent; + f->dump_unsigned("parent_split_bits", parent_split_bits); + f->dump_stream("last_scrub") << last_scrub; + f->dump_stream("last_scrub_stamp") << last_scrub_stamp; + f->dump_unsigned("num_bytes", num_bytes); + f->dump_unsigned("num_kb", num_kb); + f->dump_unsigned("num_objects", num_objects); + f->dump_unsigned("num_object_clones", num_object_clones); + f->dump_unsigned("num_object_copies", num_object_copies); + f->dump_unsigned("num_objects_missing_on_primary", num_objects_missing_on_primary); + f->dump_unsigned("num_objects_degraded", num_objects_degraded); + f->dump_unsigned("num_objects_unfound", num_objects_unfound); + f->dump_unsigned("log_size", log_size); + f->dump_unsigned("ondisk_log_size", ondisk_log_size); + f->dump_unsigned("num_read", num_rd); + f->dump_unsigned("num_read_kb", num_rd_kb); + f->dump_unsigned("num_write", num_wr); + f->dump_unsigned("num_write_kb", num_wr_kb); + f->open_array_section("up"); + for (vector::const_iterator p = up.begin(); p != up.end(); ++p) + f->dump_int("osd", *p); + f->close_section(); + f->open_array_section("acting"); + for (vector::const_iterator p = acting.begin(); p != acting.end(); ++p) + f->dump_int("osd", *p); + f->close_section(); } void encode(bufferlist &bl) const { @@ -1077,22 +1087,21 @@ struct pool_stat_t { num_rd(0), num_rd_kb(0), num_wr(0), num_wr_kb(0) { } - void dump_json(ostream& o, int pool, string prefix) const { - o << prefix << "{ \"pool\": " << pool << ",\n" - << prefix << " \"num_bytes\": " << num_bytes << ",\n" - << prefix << " \"num_kb\": " << num_kb << ",\n" - << prefix << " \"num_objects\": " << num_objects << ",\n" - << prefix << " \"num_object_clones\": " << num_object_clones << ",\n" - << prefix << " \"num_object_copies\": " << num_object_copies << ",\n" - << prefix << " \"num_objects_missing_on_primary\": " << num_objects_missing_on_primary << ",\n" - << prefix << " \"num_objects_degraded\": " << num_objects_degraded << ",\n" - << prefix << " \"num_objects_unfound\": " << num_objects_unfound << ",\n" - << prefix << " \"log_size\": " << log_size << ",\n" - << prefix << " \"ondisk_log_size\": " << ondisk_log_size << ",\n" - << prefix << " \"num_read\": " << num_rd << ",\n" - << prefix << " \"num_read_kb\": " << num_rd_kb << ",\n" - << prefix << " \"num_write\": " << num_wr << ",\n" - << prefix << " \"num_write_kb\": " << num_wr_kb << "}"; + void dump(Formatter *f) const { + f->dump_unsigned("num_bytes", num_bytes); + f->dump_unsigned("num_kb", num_kb); + f->dump_unsigned("num_objects", num_objects); + f->dump_unsigned("num_object_clones", num_object_clones); + f->dump_unsigned("num_object_copies", num_object_copies); + f->dump_unsigned("num_objects_missing_on_primary", num_objects_missing_on_primary); + f->dump_unsigned("num_objects_degraded", num_objects_degraded); + f->dump_unsigned("num_objects_unfound", num_objects_unfound); + f->dump_unsigned("log_size", log_size); + f->dump_unsigned("ondisk_log_size", ondisk_log_size); + f->dump_unsigned("num_read", num_rd); + f->dump_unsigned("num_read_kb", num_rd_kb); + f->dump_unsigned("num_write", num_wr); + f->dump_unsigned("num_write_kb", num_wr_kb); } void encode(bufferlist &bl) const { -- 2.39.5