From 6f74f6f0e9f85d55f7c9b5d217d583f9bba308db Mon Sep 17 00:00:00 2001 From: Jason Chan Date: Wed, 6 Jan 2021 21:13:38 +0000 Subject: SERVER-53609 Filter out serverStatus.transactions.lastCommittedTransaction from FTDC (cherry picked from commit 3e5fc29b410b4a0e999f190de5f035e3119f6565) --- .../server_transaction_metrics_last_committed_transaction.js | 7 +++++++ src/mongo/db/ftdc/ftdc_server.cpp | 4 ++++ src/mongo/db/server_transactions_metrics.cpp | 11 ++++++++--- src/mongo/db/server_transactions_metrics.h | 3 ++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/jstests/noPassthrough/server_transaction_metrics_last_committed_transaction.js b/jstests/noPassthrough/server_transaction_metrics_last_committed_transaction.js index bbbd0741c46..d04c697ed00 100644 --- a/jstests/noPassthrough/server_transaction_metrics_last_committed_transaction.js +++ b/jstests/noPassthrough/server_transaction_metrics_last_committed_transaction.js @@ -61,6 +61,13 @@ assert(!res.transactions.hasOwnProperty("lastCommittedTransaction"), () => tojso assert.commandWorked(PrepareHelpers.commitTransaction(session, prepareTimestampForCommit)); checkLastCommittedTransaction(1, {}); +// Check that we are able to exclude 'lastCommittedTransaction'. FTDC uses this to filter out +// the section as it frequently triggers scheme changes. +let filteredRes = assert.commandWorked( + primary.adminCommand({serverStatus: 1, transactions: {includeLastCommitted: false}})); +assert(!filteredRes.transactions.hasOwnProperty("lastCommittedTransaction"), + () => tojson(filteredRes)); + function runTests(prepare) { jsTestLog("Testing server transaction metrics with prepare=" + prepare); diff --git a/src/mongo/db/ftdc/ftdc_server.cpp b/src/mongo/db/ftdc/ftdc_server.cpp index 0026ccf5864..9068f480a8d 100644 --- a/src/mongo/db/ftdc/ftdc_server.cpp +++ b/src/mongo/db/ftdc/ftdc_server.cpp @@ -218,6 +218,10 @@ public: commandBuilder.append("defaultRWConcern", false); commandBuilder.append(MirrorMaestro::kServerStatusSectionName, true); + // Exclude 'serverStatus.transactions.lastCommittedTransactions' because it triggers + // frequent schema changes. + commandBuilder.append("transactions", BSON("includeLastCommitted" << false)); + if (gDiagnosticDataCollectionEnableLatencyHistograms.load()) { BSONObjBuilder subObjBuilder(commandBuilder.subobjStart("opLatencies")); subObjBuilder.append("histograms", true); diff --git a/src/mongo/db/server_transactions_metrics.cpp b/src/mongo/db/server_transactions_metrics.cpp index a51ecc0345c..411e898dbe3 100644 --- a/src/mongo/db/server_transactions_metrics.cpp +++ b/src/mongo/db/server_transactions_metrics.cpp @@ -161,7 +161,7 @@ void ServerTransactionsMetrics::updateLastTransaction(size_t operationCount, _lastCommittedTransaction->setWriteConcern(std::move(writeConcern)); } -void ServerTransactionsMetrics::updateStats(TransactionsStats* stats) { +void ServerTransactionsMetrics::updateStats(TransactionsStats* stats, bool includeLastCommitted) { stats->setCurrentActive(_currentActive.load()); stats->setCurrentInactive(_currentInactive.load()); stats->setCurrentOpen(_currentOpen.load()); @@ -174,7 +174,7 @@ void ServerTransactionsMetrics::updateStats(TransactionsStats* stats) { stats->setCurrentPrepared(_currentPrepared.load()); stdx::lock_guard lg(_mutex); - if (_lastCommittedTransaction) { + if (_lastCommittedTransaction && includeLastCommitted) { stats->setLastCommittedTransaction(*_lastCommittedTransaction); } } @@ -194,12 +194,17 @@ public: const BSONElement& configElement) const override { TransactionsStats stats; + bool includeLastCommitted = true; + if (configElement.type() == BSONType::Object) { + includeLastCommitted = configElement.Obj()["includeLastCommitted"].trueValue(); + } + // Retryable writes and multi-document transactions metrics are both included in the same // serverStatus section because both utilize similar internal machinery for tracking their // lifecycle within a session. Both are assigned transaction numbers, and so both are often // referred to as “transactions”. RetryableWritesStats::get(opCtx)->updateStats(&stats); - ServerTransactionsMetrics::get(opCtx)->updateStats(&stats); + ServerTransactionsMetrics::get(opCtx)->updateStats(&stats, includeLastCommitted); return stats.toBSON(); } diff --git a/src/mongo/db/server_transactions_metrics.h b/src/mongo/db/server_transactions_metrics.h index 78523e5fa36..d17742dd5b6 100644 --- a/src/mongo/db/server_transactions_metrics.h +++ b/src/mongo/db/server_transactions_metrics.h @@ -94,8 +94,9 @@ public: /** * Appends the accumulated stats to a transactions stats object. + * Include the 'lastCommittedTransactions' field if 'includeLastCommitted' is true. */ - void updateStats(TransactionsStats* stats); + void updateStats(TransactionsStats* stats, bool includeLastCommitted); private: // The number of multi-document transactions currently active. -- cgit v1.2.1