@@ -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
0 commit comments