Files
mongo/db/stats/top.cpp
Eliot Horowitz 9d3e50fbd7 basic top command
2010-02-01 13:56:52 -05:00

117 lines
3.4 KiB
C++

// top.cpp
#include "stdafx.h"
#include "top.h"
#include "../../util/message.h"
#include "../commands.h"
namespace mongo {
void Top::record( const string& ns , int op , int lockType , long long micros ){
boostlock lk(_lock);
CollectionData& coll = _usage[ns];
coll.total.inc( micros );
if ( lockType > 0 )
coll.writeLock.inc( micros );
else if ( lockType < 0 )
coll.readLock.inc( micros );
switch ( op ){
case 0:
// use 0 for unknown, non-specific
break;
case dbUpdate:
coll.update.inc( micros );
break;
case dbInsert:
coll.insert.inc( micros );
break;
case dbQuery:
coll.queries.inc( micros );
break;
case dbGetMore:
coll.getmore.inc( micros );
break;
case dbDelete:
coll.remove.inc( micros );
break;
case opReply:
case dbMsg:
case dbKillCursors:
log() << "unexpected op in Top::record: " << op << endl;
break;
default:
log() << "unknown op in Top::record: " << op << endl;
}
}
void Top::append( BSONObjBuilder& b ){
boostlock lk( _lock );
append( b , _usage );
}
void Top::append( BSONObjBuilder& b , const char * name , const UsageData& map ){
BSONObjBuilder bb( b.subobjStart( name ) );
bb.appendIntOrLL( "time" , map.time );
bb.appendIntOrLL( "count" , map.count );
bb.done();
}
void Top::append( BSONObjBuilder& b , const UsageMap& map ){
for ( UsageMap::const_iterator i=map.begin(); i!=map.end(); i++ ){
BSONObjBuilder bb( b.subobjStart( i->first.c_str() ) );
const CollectionData& coll = i->second;
append( b , "total" , coll.total );
append( b , "readLock" , coll.readLock );
append( b , "writeLock" , coll.writeLock );
append( b , "queries" , coll.queries );
append( b , "getmore" , coll.getmore );
append( b , "insert" , coll.insert );
append( b , "update" , coll.update );
append( b , "remove" , coll.remove );
bb.done();
}
}
class TopCmd : public Command {
public:
TopCmd() : Command( "top" ){}
virtual bool slaveOk(){ return true; }
virtual bool readOnly(){ return true; }
virtual bool adminOnly(){ return true; }
virtual void help( stringstream& help ) const { help << "usage by collection"; }
virtual bool run(const char *ns, BSONObj& cmdObj, string& errmsg, BSONObjBuilder& result, bool fromRepl){
{
BSONObjBuilder b( result.subobjStart( "totals" ) );
Top::global.append( b );
b.done();
}
return true;
}
} topCmd;
Top Top::global;
TopOld::T TopOld::_snapshotStart = TopOld::currentTime();
TopOld::D TopOld::_snapshotDuration;
TopOld::UsageMap TopOld::_totalUsage;
TopOld::UsageMap TopOld::_snapshotA;
TopOld::UsageMap TopOld::_snapshotB;
TopOld::UsageMap &TopOld::_snapshot = TopOld::_snapshotA;
TopOld::UsageMap &TopOld::_nextSnapshot = TopOld::_snapshotB;
boost::mutex TopOld::topMutex;
}