diff options
Diffstat (limited to 'src/mongo/db/commands/server_status.cpp')
-rw-r--r-- | src/mongo/db/commands/server_status.cpp | 462 |
1 files changed, 229 insertions, 233 deletions
diff --git a/src/mongo/db/commands/server_status.cpp b/src/mongo/db/commands/server_status.cpp index d2bf917f6c4..d7b3324efe6 100644 --- a/src/mongo/db/commands/server_status.cpp +++ b/src/mongo/db/commands/server_status.cpp @@ -54,273 +54,269 @@ namespace mongo { - using std::endl; - using std::map; - using std::string; - using std::stringstream; - - class CmdServerStatus : public Command { - public: - - CmdServerStatus() - : Command("serverStatus", true), - _started( curTimeMillis64() ), - _runCalled( false ) { - } - - virtual bool isWriteCommandForConfigServer() const { return false; } - virtual bool slaveOk() const { return true; } +using std::endl; +using std::map; +using std::string; +using std::stringstream; + +class CmdServerStatus : public Command { +public: + CmdServerStatus() + : Command("serverStatus", true), _started(curTimeMillis64()), _runCalled(false) {} + + virtual bool isWriteCommandForConfigServer() const { + return false; + } + virtual bool slaveOk() const { + return true; + } - virtual void help( stringstream& help ) const { - help << "returns lots of administrative server statistics"; - } - virtual void addRequiredPrivileges(const std::string& dbname, - const BSONObj& cmdObj, - std::vector<Privilege>* out) { - ActionSet actions; - actions.addAction(ActionType::serverStatus); - out->push_back(Privilege(ResourcePattern::forClusterResource(), actions)); - } - bool run(OperationContext* txn, - const string& dbname, - BSONObj& cmdObj, - int, - string& errmsg, - BSONObjBuilder& result) { - - _runCalled = true; - - long long start = Listener::getElapsedTimeMillis(); - BSONObjBuilder timeBuilder(256); - - const auto authSession = AuthorizationSession::get(ClientBasic::getCurrent()); - - // --- basic fields that are global - - result.append("host", prettyHostName() ); - result.append("version", versionString); - result.append("process", serverGlobalParams.binaryName); - result.append("pid", ProcessId::getCurrent().asLongLong()); - result.append("uptime", (double) (time(0) - serverGlobalParams.started)); - result.append("uptimeMillis", (long long)(curTimeMillis64()-_started)); - result.append("uptimeEstimate",(double) (start/1000)); - result.appendDate( "localTime" , jsTime() ); - - timeBuilder.appendNumber( "after basic" , Listener::getElapsedTimeMillis() - start ); - - // --- all sections - - for ( SectionMap::const_iterator i = _sections->begin(); i != _sections->end(); ++i ) { - ServerStatusSection* section = i->second; - - std::vector<Privilege> requiredPrivileges; - section->addRequiredPrivileges(&requiredPrivileges); - if (!authSession->isAuthorizedForPrivileges(requiredPrivileges)) - continue; - - bool include = section->includeByDefault(); - - BSONElement e = cmdObj[section->getSectionName()]; - if ( e.type() ) { - include = e.trueValue(); - } - - if ( ! include ) - continue; - - BSONObj data = section->generateSection(txn, e); - if ( data.isEmpty() ) - continue; - - result.append( section->getSectionName(), data ); - timeBuilder.appendNumber( static_cast<string>(str::stream() << "after " << section->getSectionName()), - Listener::getElapsedTimeMillis() - start ); - } + virtual void help(stringstream& help) const { + help << "returns lots of administrative server statistics"; + } + virtual void addRequiredPrivileges(const std::string& dbname, + const BSONObj& cmdObj, + std::vector<Privilege>* out) { + ActionSet actions; + actions.addAction(ActionType::serverStatus); + out->push_back(Privilege(ResourcePattern::forClusterResource(), actions)); + } + bool run(OperationContext* txn, + const string& dbname, + BSONObj& cmdObj, + int, + string& errmsg, + BSONObjBuilder& result) { + _runCalled = true; - // --- counters - bool includeMetricTree = MetricTree::theMetricTree != NULL; - if ( cmdObj["metrics"].type() && !cmdObj["metrics"].trueValue() ) - includeMetricTree = false; + long long start = Listener::getElapsedTimeMillis(); + BSONObjBuilder timeBuilder(256); - if ( includeMetricTree ) { - MetricTree::theMetricTree->appendTo( result ); - } + const auto authSession = AuthorizationSession::get(ClientBasic::getCurrent()); - // --- some hard coded global things hard to pull out + // --- basic fields that are global - { - RamLog::LineIterator rl(RamLog::get("warnings")); - if (rl.lastWrite() >= time(0)-(10*60)){ // only show warnings from last 10 minutes - BSONArrayBuilder arr(result.subarrayStart("warnings")); - while (rl.more()) { - arr.append(rl.next()); - } - arr.done(); - } - } + result.append("host", prettyHostName()); + result.append("version", versionString); + result.append("process", serverGlobalParams.binaryName); + result.append("pid", ProcessId::getCurrent().asLongLong()); + result.append("uptime", (double)(time(0) - serverGlobalParams.started)); + result.append("uptimeMillis", (long long)(curTimeMillis64() - _started)); + result.append("uptimeEstimate", (double)(start / 1000)); + result.appendDate("localTime", jsTime()); + + timeBuilder.appendNumber("after basic", Listener::getElapsedTimeMillis() - start); + + // --- all sections + + for (SectionMap::const_iterator i = _sections->begin(); i != _sections->end(); ++i) { + ServerStatusSection* section = i->second; + + std::vector<Privilege> requiredPrivileges; + section->addRequiredPrivileges(&requiredPrivileges); + if (!authSession->isAuthorizedForPrivileges(requiredPrivileges)) + continue; + + bool include = section->includeByDefault(); - timeBuilder.appendNumber( "at end" , Listener::getElapsedTimeMillis() - start ); - if ( Listener::getElapsedTimeMillis() - start > 1000 ) { - BSONObj t = timeBuilder.obj(); - log() << "serverStatus was very slow: " << t << endl; - result.append( "timing" , t ); + BSONElement e = cmdObj[section->getSectionName()]; + if (e.type()) { + include = e.trueValue(); } - return true; + if (!include) + continue; + + BSONObj data = section->generateSection(txn, e); + if (data.isEmpty()) + continue; + + result.append(section->getSectionName(), data); + timeBuilder.appendNumber( + static_cast<string>(str::stream() << "after " << section->getSectionName()), + Listener::getElapsedTimeMillis() - start); + } + + // --- counters + bool includeMetricTree = MetricTree::theMetricTree != NULL; + if (cmdObj["metrics"].type() && !cmdObj["metrics"].trueValue()) + includeMetricTree = false; + + if (includeMetricTree) { + MetricTree::theMetricTree->appendTo(result); } - void addSection( ServerStatusSection* section ) { - verify( ! _runCalled ); - if ( _sections == 0 ) { - _sections = new SectionMap(); + // --- some hard coded global things hard to pull out + + { + RamLog::LineIterator rl(RamLog::get("warnings")); + if (rl.lastWrite() >= time(0) - (10 * 60)) { // only show warnings from last 10 minutes + BSONArrayBuilder arr(result.subarrayStart("warnings")); + while (rl.more()) { + arr.append(rl.next()); + } + arr.done(); } - (*_sections)[section->getSectionName()] = section; } - private: - const unsigned long long _started; - bool _runCalled; + timeBuilder.appendNumber("at end", Listener::getElapsedTimeMillis() - start); + if (Listener::getElapsedTimeMillis() - start > 1000) { + BSONObj t = timeBuilder.obj(); + log() << "serverStatus was very slow: " << t << endl; + result.append("timing", t); + } + + return true; + } + + void addSection(ServerStatusSection* section) { + verify(!_runCalled); + if (_sections == 0) { + _sections = new SectionMap(); + } + (*_sections)[section->getSectionName()] = section; + } + +private: + const unsigned long long _started; + bool _runCalled; + + typedef map<string, ServerStatusSection*> SectionMap; + static SectionMap* _sections; +} cmdServerStatus; + + +CmdServerStatus::SectionMap* CmdServerStatus::_sections = 0; - typedef map< string , ServerStatusSection* > SectionMap; - static SectionMap* _sections; - } cmdServerStatus; +ServerStatusSection::ServerStatusSection(const string& sectionName) : _sectionName(sectionName) { + cmdServerStatus.addSection(this); +} + +OpCounterServerStatusSection::OpCounterServerStatusSection(const string& sectionName, + OpCounters* counters) + : ServerStatusSection(sectionName), _counters(counters) {} + +BSONObj OpCounterServerStatusSection::generateSection(OperationContext* txn, + const BSONElement& configElement) const { + return _counters->getObj(); +} + +OpCounterServerStatusSection globalOpCounterServerStatusSection("opcounters", &globalOpCounters); - CmdServerStatus::SectionMap* CmdServerStatus::_sections = 0; +namespace { - ServerStatusSection::ServerStatusSection( const string& sectionName ) - : _sectionName( sectionName ) { - cmdServerStatus.addSection( this ); +// some universal sections + +class Connections : public ServerStatusSection { +public: + Connections() : ServerStatusSection("connections") {} + virtual bool includeByDefault() const { + return true; } - OpCounterServerStatusSection::OpCounterServerStatusSection( const string& sectionName, OpCounters* counters ) - : ServerStatusSection( sectionName ), _counters( counters ){ + BSONObj generateSection(OperationContext* txn, const BSONElement& configElement) const { + BSONObjBuilder bb; + bb.append("current", Listener::globalTicketHolder.used()); + bb.append("available", Listener::globalTicketHolder.available()); + bb.append("totalCreated", Listener::globalConnectionNumber.load()); + return bb.obj(); } - BSONObj OpCounterServerStatusSection::generateSection(OperationContext* txn, - const BSONElement& configElement) const { - return _counters->getObj(); +} connections; + +class ExtraInfo : public ServerStatusSection { +public: + ExtraInfo() : ServerStatusSection("extra_info") {} + virtual bool includeByDefault() const { + return true; } - - OpCounterServerStatusSection globalOpCounterServerStatusSection( "opcounters", &globalOpCounters ); - - - namespace { - - // some universal sections - - class Connections : public ServerStatusSection { - public: - Connections() : ServerStatusSection( "connections" ){} - virtual bool includeByDefault() const { return true; } - - BSONObj generateSection(OperationContext* txn, - const BSONElement& configElement) const { - - BSONObjBuilder bb; - bb.append( "current" , Listener::globalTicketHolder.used() ); - bb.append( "available" , Listener::globalTicketHolder.available() ); - bb.append( "totalCreated" , Listener::globalConnectionNumber.load() ); - return bb.obj(); - } - } connections; - - class ExtraInfo : public ServerStatusSection { - public: - ExtraInfo() : ServerStatusSection( "extra_info" ){} - virtual bool includeByDefault() const { return true; } - - BSONObj generateSection(OperationContext* txn, - const BSONElement& configElement) const { - - BSONObjBuilder bb; - - bb.append("note", "fields vary by platform"); - ProcessInfo p; - p.getExtraInfo(bb); - - return bb.obj(); - } + BSONObj generateSection(OperationContext* txn, const BSONElement& configElement) const { + BSONObjBuilder bb; - } extraInfo; + bb.append("note", "fields vary by platform"); + ProcessInfo p; + p.getExtraInfo(bb); + return bb.obj(); + } - class Asserts : public ServerStatusSection { - public: - Asserts() : ServerStatusSection( "asserts" ){} - virtual bool includeByDefault() const { return true; } - - BSONObj generateSection(OperationContext* txn, - const BSONElement& configElement) const { +} extraInfo; - BSONObjBuilder asserts; - asserts.append( "regular" , assertionCount.regular ); - asserts.append( "warning" , assertionCount.warning ); - asserts.append( "msg" , assertionCount.msg ); - asserts.append( "user" , assertionCount.user ); - asserts.append( "rollovers" , assertionCount.rollovers ); - return asserts.obj(); - } - - } asserts; +class Asserts : public ServerStatusSection { +public: + Asserts() : ServerStatusSection("asserts") {} + virtual bool includeByDefault() const { + return true; + } - class Network : public ServerStatusSection { - public: - Network() : ServerStatusSection( "network" ){} - virtual bool includeByDefault() const { return true; } - - BSONObj generateSection(OperationContext* txn, - const BSONElement& configElement) const { + BSONObj generateSection(OperationContext* txn, const BSONElement& configElement) const { + BSONObjBuilder asserts; + asserts.append("regular", assertionCount.regular); + asserts.append("warning", assertionCount.warning); + asserts.append("msg", assertionCount.msg); + asserts.append("user", assertionCount.user); + asserts.append("rollovers", assertionCount.rollovers); + return asserts.obj(); + } - BSONObjBuilder b; - networkCounter.append( b ); - return b.obj(); - } - - } network; +} asserts; -#ifdef MONGO_CONFIG_SSL - class Security : public ServerStatusSection { - public: - Security() : ServerStatusSection( "security" ) {} - virtual bool includeByDefault() const { return true; } - - BSONObj generateSection(OperationContext* txn, - const BSONElement& configElement) const { - BSONObj result; - if (getSSLManager()) { - result = getSSLManager()->getSSLConfiguration().getServerStatusBSON(); - } - return result; - } - } security; -#endif +class Network : public ServerStatusSection { +public: + Network() : ServerStatusSection("network") {} + virtual bool includeByDefault() const { + return true; + } - class MemBase : public ServerStatusMetric { - public: - MemBase() : ServerStatusMetric(".mem.bits") {} - virtual void appendAtLeaf( BSONObjBuilder& b ) const { - b.append( "bits", sizeof(int*) == 4 ? 32 : 64 ); - - ProcessInfo p; - int v = 0; - if ( p.supported() ) { - b.appendNumber( "resident" , p.getResidentSize() ); - v = p.getVirtualMemorySize(); - b.appendNumber( "virtual" , v ); - b.appendBool( "supported" , true ); - } - else { - b.append( "note" , "not all mem info support on this platform" ); - b.appendBool( "supported" , false ); - } + BSONObj generateSection(OperationContext* txn, const BSONElement& configElement) const { + BSONObjBuilder b; + networkCounter.append(b); + return b.obj(); + } - } - } memBase; +} network; + +#ifdef MONGO_CONFIG_SSL +class Security : public ServerStatusSection { +public: + Security() : ServerStatusSection("security") {} + virtual bool includeByDefault() const { + return true; } -} + BSONObj generateSection(OperationContext* txn, const BSONElement& configElement) const { + BSONObj result; + if (getSSLManager()) { + result = getSSLManager()->getSSLConfiguration().getServerStatusBSON(); + } + + return result; + } +} security; +#endif +class MemBase : public ServerStatusMetric { +public: + MemBase() : ServerStatusMetric(".mem.bits") {} + virtual void appendAtLeaf(BSONObjBuilder& b) const { + b.append("bits", sizeof(int*) == 4 ? 32 : 64); + + ProcessInfo p; + int v = 0; + if (p.supported()) { + b.appendNumber("resident", p.getResidentSize()); + v = p.getVirtualMemorySize(); + b.appendNumber("virtual", v); + b.appendBool("supported", true); + } else { + b.append("note", "not all mem info support on this platform"); + b.appendBool("supported", false); + } + } +} memBase; +} +} |