diff options
author | Lingzhi Deng <lingzhi.deng@mongodb.com> | 2020-04-28 21:20:45 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-04-29 23:05:43 +0000 |
commit | f674117136f9b2699ab42a32f6f08f6c0b5a84b3 (patch) | |
tree | 35bb9b210eafa2aff85568cd245100b3a8d4e245 /src/mongo/db/stats | |
parent | f950ce6ca8e360becb502a09b7f371b2f2c807da (diff) | |
download | mongo-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.idl | 37 | ||||
-rw-r--r-- | src/mongo/db/stats/server_read_concern_metrics.cpp | 59 | ||||
-rw-r--r-- | src/mongo/db/stats/server_read_concern_metrics.h | 19 |
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 |