diff options
-rw-r--r-- | jstests/sharding/egress_connection_acquisition_to_wire_metrics.js | 29 | ||||
-rw-r--r-- | src/mongo/client/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/client/async_client.cpp | 16 | ||||
-rw-r--r-- | src/mongo/client/async_client.h | 8 |
4 files changed, 21 insertions, 33 deletions
diff --git a/jstests/sharding/egress_connection_acquisition_to_wire_metrics.js b/jstests/sharding/egress_connection_acquisition_to_wire_metrics.js index 831305ee000..ba8bbee1aca 100644 --- a/jstests/sharding/egress_connection_acquisition_to_wire_metrics.js +++ b/jstests/sharding/egress_connection_acquisition_to_wire_metrics.js @@ -16,13 +16,17 @@ function getConnAcquiredToWireMicros(conn) { .metrics.network.totalTimeForEgressConnectionAcquiredToWireMicros; } -// Set it so that we log the intended metrics only on the mongos. -const paramsDoc = { - mongosOptions: {setParameter: {connectionAcquisitionToWireLoggingRate: 1.0}}, - shardOptions: {setParameter: {connectionAcquisitionToWireLoggingRate: 0.0}}, - configOptions: {setParameter: {connectionAcquisitionToWireLoggingRate: 0.0}}, +const setParamOptions = { + "failpoint.alwaysLogConnAcquisitionToWireTime": tojson({mode: "alwaysOn"}), + logComponentVerbosity: tojson({network: {verbosity: 2}}) }; -const st = new ShardingTest({shards: 1, mongos: 1, other: paramsDoc}); + +const st = new ShardingTest({ + shards: 1, + rs: {nodes: 1, setParameter: setParamOptions}, + mongos: 1, + mongosOptions: {setParameter: setParamOptions} +}); let initialConnAcquiredToWireTime = getConnAcquiredToWireMicros(st.s); jsTestLog(`Initial metric value for mongos totalTimeForEgressConnectionAcquiredToWireMicros: ${ tojson(initialConnAcquiredToWireTime)}`); @@ -39,22 +43,9 @@ assert.gt(afterConnAcquiredToWireTime, initialConnAcquiredToWireTime, st.s.adminCommand({serverStatus: 1})); -// Test that setting the logging rate to 0 results in silencing of the logs. -st.s.adminCommand({setParameter: 1, connectionAcquisitionToWireLoggingRate: 0.0}); -assert.commandWorked(st.s.adminCommand({clearLog: 'global'})); -assert.commandWorked(st.s.getDB(jsTestName())["test"].insert({x: 2})); -try { - checkLog.containsJson(st.s, 6496702, null, 5 * 1000); - assert(false); -} catch (e) { - jsTestLog("Waited long enough to believe logs were correctly silenced."); -} - // Test with mirrored reads to execute the 'fireAndForget' path and verify logs are still correctly // printed. const shardPrimary = st.rs0.getPrimary(); -assert.commandWorked( - shardPrimary.adminCommand({setParameter: 1, connectionAcquisitionToWireLoggingRate: 1.0})); assert.commandWorked(shardPrimary.adminCommand({clearLog: 'global'})); initialConnAcquiredToWireTime = getConnAcquiredToWireMicros(shardPrimary); jsTestLog(`Initial metric value for mongod totalTimeForEgressConnectionAcquiredToWireMicros: ${ diff --git a/src/mongo/client/SConscript b/src/mongo/client/SConscript index deae2e6f0aa..857482505a7 100644 --- a/src/mongo/client/SConscript +++ b/src/mongo/client/SConscript @@ -255,7 +255,6 @@ env.Library( target='async_client', source=[ 'async_client.cpp', - env.Idlc('async_client.idl')[0], ], LIBDEPS=[ '$BUILD_DIR/mongo/db/wire_version', diff --git a/src/mongo/client/async_client.cpp b/src/mongo/client/async_client.cpp index 48368e139ee..95597cdfcaa 100644 --- a/src/mongo/client/async_client.cpp +++ b/src/mongo/client/async_client.cpp @@ -35,7 +35,6 @@ #include <memory> #include "mongo/bson/bsonobjbuilder.h" -#include "mongo/client/async_client_gen.h" #include "mongo/client/authenticate.h" #include "mongo/client/sasl_client_authenticate.h" #include "mongo/config.h" @@ -63,6 +62,7 @@ namespace mongo { MONGO_FAIL_POINT_DEFINE(pauseBeforeMarkKeepOpen); +MONGO_FAIL_POINT_DEFINE(alwaysLogConnAcquisitionToWireTime) namespace { bool connHealthMetricsEnabled() { @@ -316,14 +316,14 @@ Future<rpc::UniqueReply> AsyncDBClient::runCommand( durationCount<Microseconds>(fromConnAcquiredTimer.get()->elapsed()); totalTimeForEgressConnectionAcquiredToWireMicros.increment(timeElapsedMicros); if (timeElapsedMicros >= 1000 || - _random.nextCanonicalDouble() <= gConnectionAcquisitionToWireLoggingRate.load()) { - LOGV2_INFO(6496702, - "Acquired connection for remote operation and completed writing to wire", - "durationMicros"_attr = timeElapsedMicros); - } else { + MONGO_unlikely(alwaysLogConnAcquisitionToWireTime.shouldFail())) { + // Log slow acquisition times at info level but rate limit it to prevent spamming + // users. + static auto& logSeverity = *new logv2::SeveritySuppressor{ + Seconds{1}, logv2::LogSeverity::Info(), logv2::LogSeverity::Debug(2)}; LOGV2_DEBUG( - 6496701, - 2, + 6496702, + logSeverity().toInt(), "Acquired connection for remote operation and completed writing to wire", "durationMicros"_attr = timeElapsedMicros); } diff --git a/src/mongo/client/async_client.h b/src/mongo/client/async_client.h index bef816727ac..cf589e07ad3 100644 --- a/src/mongo/client/async_client.h +++ b/src/mongo/client/async_client.h @@ -37,6 +37,7 @@ #include "mongo/executor/network_connection_hook.h" #include "mongo/executor/remote_command_request.h" #include "mongo/executor/remote_command_response.h" +#include "mongo/logv2/log_severity_suppressor.h" #include "mongo/rpc/unique_message.h" #include "mongo/transport/baton.h" #include "mongo/transport/message_compressor_manager.h" @@ -51,10 +52,7 @@ public: explicit AsyncDBClient(const HostAndPort& peer, transport::SessionHandle session, ServiceContext* svcCtx) - : _peer(std::move(peer)), - _session(std::move(session)), - _svcCtx(svcCtx), - _random{PseudoRandom(SecureRandom().nextInt64())} {} + : _peer(std::move(peer)), _session(std::move(session)), _svcCtx(svcCtx) {} using Handle = std::shared_ptr<AsyncDBClient>; @@ -104,6 +102,7 @@ public: const HostAndPort& remote() const; const HostAndPort& local() const; + static constexpr Seconds kSlowConnAcquiredToWireLogSuppresionPeriod{5}; private: Future<executor::RemoteCommandResponse> _continueReceiveExhaustResponse( @@ -123,7 +122,6 @@ private: transport::SessionHandle _session; ServiceContext* const _svcCtx; MessageCompressorManager _compressorManager; - PseudoRandom _random; }; } // namespace mongo |