summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/server_status.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands/server_status.cpp')
-rw-r--r--src/mongo/db/commands/server_status.cpp462
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;
+}
+}