summaryrefslogtreecommitdiff
path: root/src/mongo/db/stats
diff options
context:
space:
mode:
authorLingzhi Deng <lingzhi.deng@mongodb.com>2020-04-28 21:20:45 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-04-29 23:05:43 +0000
commitf674117136f9b2699ab42a32f6f08f6c0b5a84b3 (patch)
tree35bb9b210eafa2aff85568cd245100b3a8d4e245 /src/mongo/db/stats
parentf950ce6ca8e360becb502a09b7f371b2f2c807da (diff)
downloadmongo-f674117136f9b2699ab42a32f6f08f6c0b5a84b3.tar.gz
SERVER-47577: readConcernCounters metric in serverStatus
Diffstat (limited to 'src/mongo/db/stats')
-rw-r--r--src/mongo/db/stats/read_concern_stats.idl37
-rw-r--r--src/mongo/db/stats/server_read_concern_metrics.cpp59
-rw-r--r--src/mongo/db/stats/server_read_concern_metrics.h19
3 files changed, 82 insertions, 33 deletions
diff --git a/src/mongo/db/stats/read_concern_stats.idl b/src/mongo/db/stats/read_concern_stats.idl
index 60636cf0c08..30ec3c47a05 100644
--- a/src/mongo/db/stats/read_concern_stats.idl
+++ b/src/mongo/db/stats/read_concern_stats.idl
@@ -38,26 +38,45 @@ imports:
structs:
- ReadConcernStats:
- description: "A struct representing the section of the server status
- command with information about readConcern levels used by operations"
+ SnapshotOps:
+ description: "A struct representing the number of operations used with snapshot readConcern"
strict: true
fields:
- available:
+ withClusterTime:
type: long
default: 0
- linearizable:
+ withoutClusterTime:
+ type: long
+ default: 0
+
+ ReadConcernOps:
+ description: "A struct representing readConcern level usages by read operations"
+ strict: true
+ fields:
+ none:
type: long
default: 0
local:
type: long
default: 0
+ available:
+ type: long
+ optional: true
majority:
type: long
default: 0
snapshot:
+ type: SnapshotOps
+ linearizable:
type: long
- default: 0
- none:
- type: long
- default: 0
+ optional: true
+
+ ReadConcernStats:
+ description: "A struct representing the section of the server status
+ command with information about readConcern levels used by operations"
+ strict: true
+ fields:
+ nonTransactionOps:
+ type: ReadConcernOps
+ transactionOps:
+ type: ReadConcernOps
diff --git a/src/mongo/db/stats/server_read_concern_metrics.cpp b/src/mongo/db/stats/server_read_concern_metrics.cpp
index 1dd4c9fff8e..a29b7ab781a 100644
--- a/src/mongo/db/stats/server_read_concern_metrics.cpp
+++ b/src/mongo/db/stats/server_read_concern_metrics.cpp
@@ -50,31 +50,41 @@ ServerReadConcernMetrics* ServerReadConcernMetrics::get(OperationContext* opCtx)
return get(opCtx->getServiceContext());
}
-void ServerReadConcernMetrics::recordReadConcern(const repl::ReadConcernArgs& readConcernArgs) {
+void ServerReadConcernMetrics::recordReadConcern(const repl::ReadConcernArgs& readConcernArgs,
+ bool isTransaction) {
+ auto& ops = isTransaction ? _transactionOps : _nonTransactionOps;
+
if (!readConcernArgs.hasLevel()) {
- _noLevelCount.fetchAndAdd(1);
+ ops.noLevelCount.fetchAndAdd(1);
return;
}
switch (readConcernArgs.getLevel()) {
case repl::ReadConcernLevel::kAvailableReadConcern:
- _levelAvailableCount.fetchAndAdd(1);
+ invariant(!isTransaction);
+ ops.levelAvailableCount.fetchAndAdd(1);
break;
case repl::ReadConcernLevel::kLinearizableReadConcern:
- _levelLinearizableCount.fetchAndAdd(1);
+ invariant(!isTransaction);
+ ops.levelLinearizableCount.fetchAndAdd(1);
break;
case repl::ReadConcernLevel::kLocalReadConcern:
- _levelLocalCount.fetchAndAdd(1);
+ ops.levelLocalCount.fetchAndAdd(1);
break;
case repl::ReadConcernLevel::kMajorityReadConcern:
- _levelMajorityCount.fetchAndAdd(1);
+ ops.levelMajorityCount.fetchAndAdd(1);
break;
case repl::ReadConcernLevel::kSnapshotReadConcern:
- _levelSnapshotCount.fetchAndAdd(1);
+ if (readConcernArgs.getArgsAtClusterTime() &&
+ !readConcernArgs.wasAtClusterTimeSelected()) {
+ ops.atClusterTimeCount.fetchAndAdd(1);
+ } else {
+ ops.levelSnapshotCount.fetchAndAdd(1);
+ }
break;
default:
@@ -83,20 +93,35 @@ void ServerReadConcernMetrics::recordReadConcern(const repl::ReadConcernArgs& re
}
void ServerReadConcernMetrics::updateStats(ReadConcernStats* stats, OperationContext* opCtx) {
- stats->setAvailable(_levelAvailableCount.load());
- stats->setLinearizable(_levelLinearizableCount.load());
- stats->setLocal(_levelLocalCount.load());
- stats->setMajority(_levelMajorityCount.load());
- stats->setSnapshot(_levelSnapshotCount.load());
- stats->setNone(_noLevelCount.load());
+ ReadConcernOps nonTransactionOps;
+ SnapshotOps nonTransactionSnapshotOps;
+ nonTransactionSnapshotOps.setWithoutClusterTime(_nonTransactionOps.levelSnapshotCount.load());
+ nonTransactionSnapshotOps.setWithClusterTime(_nonTransactionOps.atClusterTimeCount.load());
+ nonTransactionOps.setNone(_nonTransactionOps.noLevelCount.load());
+ nonTransactionOps.setAvailable(_nonTransactionOps.levelAvailableCount.load());
+ nonTransactionOps.setLinearizable(_nonTransactionOps.levelLinearizableCount.load());
+ nonTransactionOps.setLocal(_nonTransactionOps.levelLocalCount.load());
+ nonTransactionOps.setMajority(_nonTransactionOps.levelMajorityCount.load());
+ nonTransactionOps.setSnapshot(nonTransactionSnapshotOps);
+ stats->setNonTransactionOps(nonTransactionOps);
+
+ ReadConcernOps transactionOps;
+ SnapshotOps transactionSnapshotOps;
+ transactionSnapshotOps.setWithoutClusterTime(_transactionOps.levelSnapshotCount.load());
+ transactionSnapshotOps.setWithClusterTime(_transactionOps.atClusterTimeCount.load());
+ transactionOps.setNone(_transactionOps.noLevelCount.load());
+ transactionOps.setLocal(_transactionOps.levelLocalCount.load());
+ transactionOps.setMajority(_transactionOps.levelMajorityCount.load());
+ transactionOps.setSnapshot(transactionSnapshotOps);
+ stats->setTransactionOps(transactionOps);
}
namespace {
-class OpReadConcernCountersSSS : public ServerStatusSection {
+class ReadConcernCountersSSS : public ServerStatusSection {
public:
- OpReadConcernCountersSSS() : ServerStatusSection("opReadConcernCounters") {}
+ ReadConcernCountersSSS() : ServerStatusSection("readConcernCounters") {}
- ~OpReadConcernCountersSSS() override = default;
+ ~ReadConcernCountersSSS() override = default;
bool includeByDefault() const override {
return true;
@@ -109,7 +134,7 @@ public:
return stats.toBSON();
}
-} opReadConcernCountersSSS;
+} ReadConcernCountersSSS;
} // namespace
} // namespace mongo
diff --git a/src/mongo/db/stats/server_read_concern_metrics.h b/src/mongo/db/stats/server_read_concern_metrics.h
index 1a247f79df6..7782b959bfd 100644
--- a/src/mongo/db/stats/server_read_concern_metrics.h
+++ b/src/mongo/db/stats/server_read_concern_metrics.h
@@ -52,7 +52,7 @@ public:
/**
* Updates counter for the level of 'readConcernArgs'.
*/
- void recordReadConcern(const repl::ReadConcernArgs& readConcernArgs);
+ void recordReadConcern(const repl::ReadConcernArgs& readConcernArgs, bool isTransaction);
/**
* Appends the accumulated stats to a readConcern stats object.
@@ -60,12 +60,17 @@ public:
void updateStats(ReadConcernStats* stats, OperationContext* opCtx);
private:
- AtomicWord<unsigned long long> _levelAvailableCount{0};
- AtomicWord<unsigned long long> _levelLinearizableCount{0};
- AtomicWord<unsigned long long> _levelLocalCount{0};
- AtomicWord<unsigned long long> _levelMajorityCount{0};
- AtomicWord<unsigned long long> _levelSnapshotCount{0};
- AtomicWord<unsigned long long> _noLevelCount{0};
+ struct readConcernCounters {
+ AtomicWord<unsigned long long> levelAvailableCount{0};
+ AtomicWord<unsigned long long> levelLinearizableCount{0};
+ AtomicWord<unsigned long long> levelLocalCount{0};
+ AtomicWord<unsigned long long> levelMajorityCount{0};
+ AtomicWord<unsigned long long> levelSnapshotCount{0};
+ AtomicWord<unsigned long long> atClusterTimeCount{0};
+ AtomicWord<unsigned long long> noLevelCount{0};
+ };
+ readConcernCounters _nonTransactionOps;
+ readConcernCounters _transactionOps;
};
} // namespace mongo