Skip to content

Commit fc9f61f

Browse files
committed
Integrate tracing configuration into MongoClientSettings
1 parent e863c98 commit fc9f61f

File tree

7 files changed

+67
-15
lines changed

7 files changed

+67
-15
lines changed

src/MongoDB.Driver/ClusterKey.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ internal sealed class ClusterKey
4242
private readonly bool _loadBalanced;
4343
private readonly TimeSpan _localThreshold;
4444
private readonly LoggingSettings _loggingSettings;
45+
private readonly TracingOptions _tracingOptions;
4546
private readonly int _maxConnecting;
4647
private readonly TimeSpan _maxConnectionIdleTime;
4748
private readonly TimeSpan _maxConnectionLifeTime;
@@ -81,6 +82,7 @@ public ClusterKey(
8182
bool loadBalanced,
8283
TimeSpan localThreshold,
8384
LoggingSettings loggingSettings,
85+
TracingOptions tracingOptions,
8486
int maxConnecting,
8587
TimeSpan maxConnectionIdleTime,
8688
TimeSpan maxConnectionLifeTime,
@@ -118,6 +120,7 @@ public ClusterKey(
118120
_loadBalanced = loadBalanced;
119121
_localThreshold = localThreshold;
120122
_loggingSettings = loggingSettings;
123+
_tracingOptions = tracingOptions;
121124
_maxConnecting = maxConnecting;
122125
_maxConnectionIdleTime = maxConnectionIdleTime;
123126
_maxConnectionLifeTime = maxConnectionLifeTime;
@@ -159,6 +162,7 @@ public ClusterKey(
159162
public bool LoadBalanced => _loadBalanced;
160163
public TimeSpan LocalThreshold { get { return _localThreshold; } }
161164
public LoggingSettings LoggingSettings { get { return _loggingSettings; } }
165+
public TracingOptions TracingOptions { get { return _tracingOptions; } }
162166
public int MaxConnecting{ get { return _maxConnecting; } }
163167
public TimeSpan MaxConnectionIdleTime { get { return _maxConnectionIdleTime; } }
164168
public TimeSpan MaxConnectionLifeTime { get { return _maxConnectionLifeTime; } }

src/MongoDB.Driver/ClusterRegistry.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ private IClusterInternal CreateCluster(ClusterKey clusterKey)
6262
.ConfigureConnectionPool(settings => ConfigureConnectionPool(settings, clusterKey))
6363
.ConfigureConnection(settings => ConfigureConnection(settings, clusterKey))
6464
.ConfigureTcp(settings => ConfigureTcp(settings, clusterKey))
65-
.ConfigureLoggingSettings(_ => clusterKey.LoggingSettings);
65+
.ConfigureLoggingSettings(_ => clusterKey.LoggingSettings)
66+
.ConfigureTracingOptions(_ => clusterKey.TracingOptions);
6667
#pragma warning restore CS0618 // Type or member is obsolete
6768

6869
if (clusterKey.UseTls)

src/MongoDB.Driver/Core/Configuration/ClusterBuilder.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class ClusterBuilder
3636
private ConnectionPoolSettings _connectionPoolSettings;
3737
private ConnectionSettings _connectionSettings;
3838
private LoggingSettings _loggingSettings;
39+
private TracingOptions _tracingOptions;
3940
private ServerSettings _serverSettings;
4041
private SslStreamSettings _sslStreamSettings;
4142
private Func<IStreamFactory, IStreamFactory> _streamFactoryWrapper;
@@ -123,6 +124,19 @@ public ClusterBuilder ConfigureLoggingSettings(Func<LoggingSettings, LoggingSett
123124
return this;
124125
}
125126

127+
/// <summary>
128+
/// Configures the tracing options.
129+
/// </summary>
130+
/// <param name="configurator">The tracing options configurator delegate.</param>
131+
/// <returns>A reconfigured cluster builder.</returns>
132+
public ClusterBuilder ConfigureTracingOptions(Func<TracingOptions, TracingOptions> configurator)
133+
{
134+
Ensure.IsNotNull(configurator, nameof(configurator));
135+
136+
_tracingOptions = configurator(_tracingOptions);
137+
return this;
138+
}
139+
126140
/// <summary>
127141
/// Configures the server settings.
128142
/// </summary>
@@ -228,6 +242,7 @@ private IConnectionPoolFactory CreateConnectionPoolFactory()
228242
_eventAggregator,
229243
_clusterSettings.ServerApi,
230244
_loggingSettings.ToInternalLoggerFactory(),
245+
_tracingOptions,
231246
_tcpStreamSettings.ReadTimeout,
232247
_tcpStreamSettings.WriteTimeout);
233248

@@ -290,6 +305,7 @@ private IServerMonitorFactory CreateServerMonitorFactory()
290305
new EventAggregator(),
291306
_clusterSettings.ServerApi,
292307
loggerFactory: null,
308+
tracingOptions: new TracingOptions { Disabled = true },
293309
_tcpStreamSettings.ReadTimeout,
294310
_tcpStreamSettings.WriteTimeout);
295311

src/MongoDB.Driver/MongoClient.cs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public ClientBulkWriteResult BulkWrite(IClientSessionHandle session, IReadOnlyLi
144144
Ensure.IsNotNull(session, nameof(session));
145145
ThrowIfDisposed();
146146
var operation = CreateClientBulkWriteOperation(models, options);
147-
return ExecuteWriteOperation<ClientBulkWriteResult>(session, operation, options?.Timeout, cancellationToken);
147+
return ExecuteWriteOperation<ClientBulkWriteResult>(session, operation, options?.Timeout, cancellationToken, "bulkWrite");
148148
}
149149

150150
/// <inheritdoc/>
@@ -161,7 +161,7 @@ public Task<ClientBulkWriteResult> BulkWriteAsync(IClientSessionHandle session,
161161
Ensure.IsNotNull(session, nameof(session));
162162
ThrowIfDisposed();
163163
var operation = CreateClientBulkWriteOperation(models, options);
164-
return ExecuteWriteOperationAsync<ClientBulkWriteResult>(session, operation, options?.Timeout, cancellationToken);
164+
return ExecuteWriteOperationAsync<ClientBulkWriteResult>(session, operation, options?.Timeout, cancellationToken, "bulkWrite");
165165
}
166166

167167
/// <inheritdoc/>
@@ -341,7 +341,7 @@ public IAsyncCursor<BsonDocument> ListDatabases(
341341
ThrowIfDisposed();
342342
Ensure.IsNotNull(session, nameof(session));
343343
var operation = CreateListDatabasesOperation(options);
344-
return ExecuteReadOperation(session, operation, options?.Timeout, cancellationToken);
344+
return ExecuteReadOperation(session, operation, options?.Timeout, cancellationToken, "listDatabases");
345345
}
346346

347347
/// <inheritdoc/>
@@ -377,7 +377,7 @@ public Task<IAsyncCursor<BsonDocument>> ListDatabasesAsync(
377377
Ensure.IsNotNull(session, nameof(session));
378378
ThrowIfDisposed();
379379
var operation = CreateListDatabasesOperation(options);
380-
return ExecuteReadOperationAsync(session, operation, options?.Timeout, cancellationToken);
380+
return ExecuteReadOperationAsync(session, operation, options?.Timeout, cancellationToken, "listDatabases");
381381
}
382382

383383
/// <inheritdoc/>
@@ -563,40 +563,51 @@ private ChangeStreamOperation<TResult> CreateChangeStreamOperation<TResult>(
563563
_settings.RetryReads,
564564
_settings.TranslationOptions);
565565

566-
private OperationContext CreateOperationContext(IClientSessionHandle session, TimeSpan? timeout, CancellationToken cancellationToken)
566+
private OperationContext CreateOperationContext(IClientSessionHandle session, TimeSpan? timeout, CancellationToken cancellationToken, string operationName = null)
567567
{
568568
var operationContext = session.WrappedCoreSession.CurrentTransaction?.OperationContext;
569569
if (operationContext != null && timeout != null)
570570
{
571571
throw new InvalidOperationException("Cannot specify per operation timeout inside transaction.");
572572
}
573573

574-
return operationContext?.Fork() ?? new OperationContext(timeout ?? _settings.Timeout, cancellationToken);
574+
var context = operationContext?.Fork() ?? new OperationContext(timeout ?? _settings.Timeout, cancellationToken);
575+
576+
// Set operation metadata for OpenTelemetry tracing
577+
// Client-level operations (like bulkWrite) use "admin" as database name
578+
if (operationName != null)
579+
{
580+
var tracingOptions = _settings.TracingOptions;
581+
var isTracingEnabled = tracingOptions == null || !tracingOptions.Disabled;
582+
context = context.WithOperationMetadata(operationName, "admin", null, isTracingEnabled);
583+
}
584+
585+
return context;
575586
}
576587

577-
private TResult ExecuteReadOperation<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken)
588+
private TResult ExecuteReadOperation<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken, string operationName = null)
578589
{
579590
var readPreference = session.GetEffectiveReadPreference(_settings.ReadPreference);
580-
using var operationContext = CreateOperationContext(session, timeout, cancellationToken);
591+
using var operationContext = CreateOperationContext(session, timeout, cancellationToken, operationName);
581592
return _operationExecutor.ExecuteReadOperation(operationContext, session, operation, readPreference, false);
582593
}
583594

584-
private async Task<TResult> ExecuteReadOperationAsync<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken)
595+
private async Task<TResult> ExecuteReadOperationAsync<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken, string operationName = null)
585596
{
586597
var readPreference = session.GetEffectiveReadPreference(_settings.ReadPreference);
587-
using var operationContext = CreateOperationContext(session, timeout, cancellationToken);
598+
using var operationContext = CreateOperationContext(session, timeout, cancellationToken, operationName);
588599
return await _operationExecutor.ExecuteReadOperationAsync(operationContext, session, operation, readPreference, false).ConfigureAwait(false);
589600
}
590601

591-
private TResult ExecuteWriteOperation<TResult>(IClientSessionHandle session, IWriteOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken)
602+
private TResult ExecuteWriteOperation<TResult>(IClientSessionHandle session, IWriteOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken, string operationName = null)
592603
{
593-
using var operationContext = CreateOperationContext(session, timeout, cancellationToken);
604+
using var operationContext = CreateOperationContext(session, timeout, cancellationToken, operationName);
594605
return _operationExecutor.ExecuteWriteOperation(operationContext, session, operation, false);
595606
}
596607

597-
private async Task<TResult> ExecuteWriteOperationAsync<TResult>(IClientSessionHandle session, IWriteOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken)
608+
private async Task<TResult> ExecuteWriteOperationAsync<TResult>(IClientSessionHandle session, IWriteOperation<TResult> operation, TimeSpan? timeout, CancellationToken cancellationToken, string operationName = null)
598609
{
599-
using var operationContext = CreateOperationContext(session, timeout, cancellationToken);
610+
using var operationContext = CreateOperationContext(session, timeout, cancellationToken, operationName);
600611
return await _operationExecutor.ExecuteWriteOperationAsync(operationContext, session, operation, false).ConfigureAwait(false);
601612
}
602613

src/MongoDB.Driver/MongoClientSettings.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public class MongoClientSettings : IEquatable<MongoClientSettings>, IInheritable
7676
private string _srvServiceName;
7777
private SslSettings _sslSettings;
7878
private TimeSpan? _timeout;
79+
private TracingOptions _tracingOptions;
7980
private ExpressionTranslationOptions _translationOptions;
8081
private bool _useTls;
8182
private int _waitQueueSize;
@@ -367,6 +368,19 @@ public LoggingSettings LoggingSettings
367368
}
368369
}
369370

371+
/// <summary>
372+
/// Gets or sets the tracing options for OpenTelemetry instrumentation.
373+
/// </summary>
374+
public TracingOptions TracingOptions
375+
{
376+
get { return _tracingOptions; }
377+
set
378+
{
379+
if (_isFrozen) { throw new InvalidOperationException("MongoClientSettings is frozen."); }
380+
_tracingOptions = value;
381+
}
382+
}
383+
370384
/// <summary>
371385
/// Gets or sets the maximum concurrently connecting connections.
372386
/// </summary>
@@ -952,6 +966,7 @@ public MongoClientSettings Clone()
952966
clone._loadBalanced = _loadBalanced;
953967
clone._localThreshold = _localThreshold;
954968
clone._loggingSettings = _loggingSettings;
969+
clone._tracingOptions = _tracingOptions?.Clone();
955970
clone._maxConnecting = _maxConnecting;
956971
clone._maxConnectionIdleTime = _maxConnectionIdleTime;
957972
clone._maxConnectionLifeTime = _maxConnectionLifeTime;
@@ -1023,6 +1038,7 @@ public override bool Equals(object obj)
10231038
_loadBalanced == rhs._loadBalanced &&
10241039
_localThreshold == rhs._localThreshold &&
10251040
_loggingSettings == rhs._loggingSettings &&
1041+
object.Equals(_tracingOptions, rhs._tracingOptions) &&
10261042
_maxConnecting == rhs._maxConnecting &&
10271043
_maxConnectionIdleTime == rhs._maxConnectionIdleTime &&
10281044
_maxConnectionLifeTime == rhs._maxConnectionLifeTime &&
@@ -1258,6 +1274,7 @@ internal ClusterKey ToClusterKey()
12581274
_loadBalanced,
12591275
_localThreshold,
12601276
_loggingSettings,
1277+
_tracingOptions,
12611278
_maxConnecting,
12621279
_maxConnectionIdleTime,
12631280
_maxConnectionLifeTime,

tests/MongoDB.Driver.Tests/ClusterKeyTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ private ClusterKey CreateSubject(string notEqualFieldName = null)
258258
loadBalanced,
259259
localThreshold,
260260
loggingSettings,
261+
tracingOptions: null,
261262
maxConnecting,
262263
maxConnectionIdleTime,
263264
maxConnectionLifeTime,
@@ -345,6 +346,7 @@ internal ClusterKey CreateSubjectWith(
345346
loadBalanced,
346347
localThreshold,
347348
loggingSettings,
349+
tracingOptions: null,
348350
maxConnecting,
349351
maxConnectionIdleTime,
350352
maxConnectionLifeTime,

tests/MongoDB.Driver.Tests/ClusterRegistryTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ public void GetOrCreateCluster_should_return_a_cluster_with_the_correct_settings
128128
loadBalanced: false,
129129
localThreshold: TimeSpan.FromSeconds(4),
130130
loggingSettings: null,
131+
tracingOptions: null,
131132
maxConnecting: 3,
132133
maxConnectionIdleTime: TimeSpan.FromSeconds(5),
133134
maxConnectionLifeTime: TimeSpan.FromSeconds(6),

0 commit comments

Comments
 (0)