https://github.com/ceph/ceph/blob/2a724a2ff313701fd7f6278ce8ed7f440bb355e0/src/mon/Monitor.cc
ceph -s 会执行get_cluster_status函数, 在函数的最后会调用打印
mgrstatmon()->print_summary函数
void Monitor::get_cluster_status(stringstream &ss, Formatter *f) { if (f) f->open_object_section("status"); if (f) { f->dump_stream("fsid") << monmap->get_fsid(); get_health_status(false, f, nullptr); 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, string(12, ' ')); f->close_section(); f->open_object_section("pgmap"); mgrstatmon()->print_summary(f, NULL); f->close_section(); f->open_object_section("fsmap"); mdsmon()->get_fsmap().print_summary(f, NULL); f->close_section(); f->open_object_section("mgrmap"); mgrmon()->get_map().print_summary(f, nullptr); f->close_section(); f->dump_object("servicemap", mgrstatmon()->get_service_map()); f->close_section(); } else { ss << " cluster:\n"; ss << " id: " << monmap->get_fsid() << "\n"; string health; get_health_status(false, nullptr, &health, "\n ", "\n "); ss << " health: " << health << "\n"; ss << "\n \n services:\n"; { size_t maxlen = 3; auto& service_map = mgrstatmon()->get_service_map(); for (auto& p : service_map.services) { maxlen = std::max(maxlen, p.first.size()); } string spacing(maxlen - 3, ' '); const auto quorum_names = get_quorum_names(); const auto mon_count = monmap->mon_info.size(); ss << " mon: " << spacing << mon_count << " daemons, quorum " << quorum_names; if (quorum_names.size() != mon_count) { std::list<std::string> out_of_q; for (size_t i = 0; i < monmap->ranks.size(); ++i) { if (quorum.count(i) == 0) { out_of_q.push_back(monmap->ranks[i]); } } ss << ", out of quorum: " << joinify(out_of_q.begin(), out_of_q.end(), std::string(", ")); } ss << "\n"; if (mgrmon()->in_use()) { ss << " mgr: " << spacing; mgrmon()->get_map().print_summary(nullptr, &ss); ss << "\n"; } if (mdsmon()->get_fsmap().filesystem_count() > 0) { ss << " mds: " << spacing << mdsmon()->get_fsmap() << "\n"; } ss << " osd: " << spacing; osdmon()->osdmap.print_summary(NULL, ss, string(maxlen + 6, ' ')); ss << "\n"; for (auto& p : service_map.services) { ss << " " << p.first << ": " << string(maxlen - p.first.size(), ' ') << p.second.get_summary() << "\n"; } } ss << "\n \n data:\n"; mgrstatmon()->print_summary(NULL, &ss); ss << "\n "; } }
https://github.com/ceph/ceph/blob/6c9d937828910664032fd58959a2ae8dd8678588/src/mon/PGMap.cc
print_summary函数进行计算,统计相关指标
void PGMapDigest::print_summary(Formatter *f, ostream *out) const { if (f) f->open_array_section("pgs_by_state"); // list is descending numeric order (by count) multimap<int,int> state_by_count; // count -> state for (auto p = num_pg_by_state.begin(); p != num_pg_by_state.end(); ++p) { state_by_count.insert(make_pair(p->second, p->first)); } if (f) { for (auto p = state_by_count.rbegin(); p != state_by_count.rend(); ++p) { f->open_object_section("pgs_by_state_element"); f->dump_string("state_name", pg_state_string(p->second)); f->dump_unsigned("count", p->first); f->close_section(); } } if (f) f->close_section(); if (f) { f->dump_unsigned("num_pgs", num_pg); f->dump_unsigned("num_pools", pg_pool_sum.size()); f->dump_unsigned("num_objects", pg_sum.stats.sum.num_objects); f->dump_unsigned("data_bytes", pg_sum.stats.sum.num_bytes); f->dump_unsigned("bytes_used", osd_sum.kb_used * 1024ull); f->dump_unsigned("bytes_avail", osd_sum.kb_avail * 1024ull); f->dump_unsigned("bytes_total", osd_sum.kb * 1024ull); } else { *out << " pools: " << pg_pool_sum.size() << " pools, " << num_pg << " pgs\n"; *out << " objects: " << si_u_t(pg_sum.stats.sum.num_objects) << " objects, " << byte_u_t(pg_sum.stats.sum.num_bytes) << "\n"; *out << " usage: " << byte_u_t(osd_sum.kb_used << 10) << " used, " << byte_u_t(osd_sum.kb_avail << 10) << " / " << byte_u_t(osd_sum.kb << 10) << " avail\n"; *out << " pgs: "; } bool pad = false; if (num_pg_unknown > 0) { float p = (float)num_pg_unknown / (float)num_pg; if (f) { f->dump_float("unknown_pgs_ratio", p); } else { char b[20]; snprintf(b, sizeof(b), "%.3lf", p * 100.0); *out << b << "% pgs unknown\n"; pad = true; } } int num_pg_inactive = num_pg - num_pg_active - num_pg_unknown; if (num_pg_inactive > 0) { float p = (float)num_pg_inactive / (float)num_pg; if (f) { f->dump_float("inactive_pgs_ratio", p); } else { if (pad) { *out << " "; } char b[20]; snprintf(b, sizeof(b), "%.3f", p * 100.0); *out << b << "% pgs not active\n"; pad = true; } } list<string> sl; overall_recovery_summary(f, &sl); if (!f && !sl.empty()) { for (auto p = sl.begin(); p != sl.end(); ++p) { if (pad) { *out << " "; } *out << *p << "\n"; pad = true; } } sl.clear(); if (!f) { unsigned max_width = 1; for (multimap<int,int>::reverse_iterator p = state_by_count.rbegin(); p != state_by_count.rend(); ++p) { std::stringstream ss; ss << p->first; max_width = std::max<size_t>(ss.str().size(), max_width); } for (multimap<int,int>::reverse_iterator p = state_by_count.rbegin(); p != state_by_count.rend(); ++p) { if (pad) { *out << " "; } pad = true; out->setf(std::ios::left); *out << std::setw(max_width) << p->first << " " << pg_state_string(p->second) << "\n"; out->unsetf(std::ios::left); } } ostringstream ss_rec_io; overall_recovery_rate_summary(f, &ss_rec_io); ostringstream ss_client_io; overall_client_io_rate_summary(f, &ss_client_io); ostringstream ss_cache_io; overall_cache_io_rate_summary(f, &ss_cache_io); if (!f && (ss_client_io.str().length() || ss_rec_io.str().length() || ss_cache_io.str().length())) { *out << "\n \n"; *out << " io:\n"; } if (!f && ss_client_io.str().length()) *out << " client: " << ss_client_io.str() << "\n"; if (!f && ss_rec_io.str().length()) *out << " recovery: " << ss_rec_io.str() << "\n"; if (!f && ss_cache_io.str().length()) *out << " cache: " << ss_cache_io.str() << "\n"; }
void PGMapDigest::overall_client_io_rate_summary(Formatter *f, ostream *out) const { client_io_rate_summary(f, out, pg_sum_delta, stamp_delta); } void PGMapDigest::pool_client_io_rate_summary(Formatter *f, ostream *out, uint64_t poolid) const { auto p = per_pool_sum_delta.find(poolid); if (p == per_pool_sum_delta.end()) return; auto ts = per_pool_sum_deltas_stamps.find(p->first); assert(ts != per_pool_sum_deltas_stamps.end()); client_io_rate_summary(f, out, p->second.first, ts->second); }