summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMihai Andrei <mihai.andrei@10gen.com>2022-01-31 18:06:17 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-01-31 18:37:17 +0000
commitf5dbab9f268eae5471fdbf2c2660fdec240f80ec (patch)
tree9fb21ca8936008f7b16f9d667d396f46480e6270 /src
parent539ce23761785a90ac28da2ab40203ea0fdf59b1 (diff)
downloadmongo-f5dbab9f268eae5471fdbf2c2660fdec240f80ec.tar.gz
SERVER-62674 Add stats tracking for multiple collections
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/db_raii.cpp16
-rw-r--r--src/mongo/db/db_raii.h5
-rw-r--r--src/mongo/db/stats/top.cpp12
-rw-r--r--src/mongo/db/stats/top.h11
4 files changed, 38 insertions, 6 deletions
diff --git a/src/mongo/db/db_raii.cpp b/src/mongo/db/db_raii.cpp
index 86099c1b145..aaab7666d87 100644
--- a/src/mongo/db/db_raii.cpp
+++ b/src/mongo/db/db_raii.cpp
@@ -238,14 +238,21 @@ AutoStatsTracker::AutoStatsTracker(OperationContext* opCtx,
Top::LockType lockType,
LogMode logMode,
int dbProfilingLevel,
- Date_t deadline)
- : _opCtx(opCtx), _lockType(lockType), _nss(nss), _logMode(logMode) {
+ Date_t deadline,
+ const std::vector<NamespaceString>& secondaryNssVector)
+ : _opCtx(opCtx), _lockType(lockType), _logMode(logMode) {
+ // Deduplicate all namespaces for Top reporting on destruct.
+ _nssSet.insert(nss);
+ for (auto&& secondaryNss : secondaryNssVector) {
+ _nssSet.insert(secondaryNss);
+ }
+
if (_logMode == LogMode::kUpdateTop) {
return;
}
stdx::lock_guard<Client> clientLock(*_opCtx->getClient());
- CurOp::get(_opCtx)->enter_inlock(_nss.ns().c_str(), dbProfilingLevel);
+ CurOp::get(_opCtx)->enter_inlock(nss.ns().c_str(), dbProfilingLevel);
}
AutoStatsTracker::~AutoStatsTracker() {
@@ -253,10 +260,11 @@ AutoStatsTracker::~AutoStatsTracker() {
return;
}
+ // Update stats for each namespace.
auto curOp = CurOp::get(_opCtx);
Top::get(_opCtx->getServiceContext())
.record(_opCtx,
- _nss.ns(),
+ _nssSet,
curOp->getLogicalOp(),
_lockType,
durationCount<Microseconds>(curOp->elapsedTimeExcludingPauses()),
diff --git a/src/mongo/db/db_raii.h b/src/mongo/db/db_raii.h
index 47717a3d236..dca7dc62f8c 100644
--- a/src/mongo/db/db_raii.h
+++ b/src/mongo/db/db_raii.h
@@ -69,7 +69,8 @@ public:
Top::LockType lockType,
LogMode logMode,
int dbProfilingLevel,
- Date_t deadline = Date_t::max());
+ Date_t deadline = Date_t::max(),
+ const std::vector<NamespaceString>& secondaryNssVector = {});
/**
* Records stats about the current operation via Top, if 'logMode' is 'kUpdateTop' or
@@ -80,8 +81,8 @@ public:
private:
OperationContext* _opCtx;
Top::LockType _lockType;
- const NamespaceString _nss;
const LogMode _logMode;
+ std::set<NamespaceString> _nssSet;
};
/**
diff --git a/src/mongo/db/stats/top.cpp b/src/mongo/db/stats/top.cpp
index 1674fe394d6..513b7fae754 100644
--- a/src/mongo/db/stats/top.cpp
+++ b/src/mongo/db/stats/top.cpp
@@ -88,6 +88,18 @@ void Top::record(OperationContext* opCtx,
_record(opCtx, coll, logicalOp, lockType, micros, readWriteType);
}
+void Top::record(OperationContext* opCtx,
+ const std::set<NamespaceString>& nssSet,
+ LogicalOp logicalOp,
+ LockType lockType,
+ long long micros,
+ bool command,
+ Command::ReadWriteType readWriteType) {
+ for (const auto& nss : nssSet) {
+ record(opCtx, nss.ns(), logicalOp, lockType, micros, command, readWriteType);
+ }
+}
+
void Top::_record(OperationContext* opCtx,
CollectionData& c,
LogicalOp logicalOp,
diff --git a/src/mongo/db/stats/top.h b/src/mongo/db/stats/top.h
index 5aa3034688b..358dc5d7164 100644
--- a/src/mongo/db/stats/top.h
+++ b/src/mongo/db/stats/top.h
@@ -104,6 +104,17 @@ public:
bool command,
Command::ReadWriteType readWriteType);
+ /**
+ * Same as the above, but for multiple namespaces.
+ */
+ void record(OperationContext* opCtx,
+ const std::set<NamespaceString>& nssSet,
+ LogicalOp logicalOp,
+ LockType lockType,
+ long long micros,
+ bool command,
+ Command::ReadWriteType readWriteType);
+
void append(BSONObjBuilder& b);
void cloneMap(UsageMap& out) const;