// Copyright Epic Games, Inc. All Rights Reserved. using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; using MongoDB.Driver.Search; using OpenTelemetry.Trace; #pragma warning disable VSTHRD002 // Synchronous waits namespace HordeServer.Utilities { /// /// Wrap a IMongoCollection with trace scopes /// /// Will capture the entire invocation of MongoDB calls, including serialization. /// The other command logging (not in this file) only deals with queries sent to the server at the protocol level. /// /// A MongoDB document public class MongoTracingCollection : IMongoCollection { private readonly IMongoCollection _collection; private readonly Task _upgradeTask; private readonly Tracer _tracer; /// /// Constructor /// /// Collection to wrap with tracing /// Task which creates indexes /// Tracer public MongoTracingCollection(IMongoCollection collection, Task indexCreationTask, Tracer tracer) { _collection = collection; _upgradeTask = indexCreationTask; _tracer = tracer; } #pragma warning disable CS0618 /// public IAsyncCursor Aggregate(PipelineDefinition pipeline, AggregateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Aggregate(pipeline, options, cancellationToken); } /// public IAsyncCursor Aggregate(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Aggregate(session, pipeline, options, cancellationToken); } /// public async Task> AggregateAsync(PipelineDefinition pipeline, AggregateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(AggregateAsync), _collection); return await _collection.AggregateAsync(pipeline, options, cancellationToken); } /// public async Task> AggregateAsync(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(AggregateAsync), _collection); return await _collection.AggregateAsync(session, pipeline, options, cancellationToken); } /// public void AggregateToCollection(PipelineDefinition pipeline, AggregateOptions? options = null, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); _collection.AggregateToCollection(pipeline, options, cancellationToken); } /// public void AggregateToCollection(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions? options = null, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); _collection.AggregateToCollection(session, pipeline, options, cancellationToken); } /// public async Task AggregateToCollectionAsync(PipelineDefinition pipeline, AggregateOptions? options = null, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(AggregateToCollectionAsync), _collection); await _collection.AggregateToCollectionAsync(pipeline, options, cancellationToken); } /// public async Task AggregateToCollectionAsync(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions? options = null, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(AggregateToCollectionAsync), _collection); await _collection.AggregateToCollectionAsync(session, pipeline, options, cancellationToken); } /// public BulkWriteResult BulkWrite(IEnumerable> requests, BulkWriteOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.BulkWrite(requests, options, cancellationToken); } /// public BulkWriteResult BulkWrite(IClientSessionHandle session, IEnumerable> requests, BulkWriteOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.BulkWrite(session, requests, options, cancellationToken); } /// public async Task> BulkWriteAsync(IEnumerable> requests, BulkWriteOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(BulkWriteAsync), _collection); return await _collection.BulkWriteAsync(requests, options, cancellationToken); } /// public async Task> BulkWriteAsync(IClientSessionHandle session, IEnumerable> requests, BulkWriteOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(BulkWriteAsync), _collection); return await _collection.BulkWriteAsync(session, requests, options, cancellationToken); } /// public long Count(FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Count(filter, options, cancellationToken); } /// public long Count(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Count(session, filter, options, cancellationToken); } /// public async Task CountAsync(FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(CountAsync), _collection); return await _collection.CountAsync(filter, options, cancellationToken); } /// public async Task CountAsync(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(CountAsync), _collection); return await _collection.CountAsync(session, filter, options, cancellationToken); } /// public long CountDocuments(FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.CountDocuments(filter, options, cancellationToken); } /// public long CountDocuments(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.CountDocuments(session, filter, options, cancellationToken); } /// public async Task CountDocumentsAsync(FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask; using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(CountDocumentsAsync), _collection, filter); return await _collection.CountDocumentsAsync(filter, options, cancellationToken); } /// public async Task CountDocumentsAsync(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(CountDocumentsAsync), _collection, filter); return await _collection.CountDocumentsAsync(session, filter, options, cancellationToken); } /// public DeleteResult DeleteMany(FilterDefinition filter, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.DeleteMany(filter, cancellationToken); } /// public DeleteResult DeleteMany(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.DeleteMany(filter, options, cancellationToken); } /// public DeleteResult DeleteMany(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.DeleteMany(session, filter, options, cancellationToken); } /// public async Task DeleteManyAsync(FilterDefinition filter, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DeleteManyAsync), _collection, filter); return await _collection.DeleteManyAsync(filter, cancellationToken); } /// public async Task DeleteManyAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DeleteManyAsync), _collection, filter); return await _collection.DeleteManyAsync(filter, options, cancellationToken); } /// public async Task DeleteManyAsync(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask; using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DeleteManyAsync), _collection, filter); return await _collection.DeleteManyAsync(session, filter, options, cancellationToken); } /// public DeleteResult DeleteOne(FilterDefinition filter, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.DeleteOne(filter, cancellationToken); } /// public DeleteResult DeleteOne(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.DeleteOne(filter, options, cancellationToken); } /// public DeleteResult DeleteOne(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.DeleteOne(session, filter, options, cancellationToken); } /// public async Task DeleteOneAsync(FilterDefinition filter, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DeleteOneAsync), _collection, filter); return await _collection.DeleteOneAsync(filter, cancellationToken); } /// public async Task DeleteOneAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DeleteOneAsync), _collection, filter); return await _collection.DeleteOneAsync(filter, options, cancellationToken); } /// public async Task DeleteOneAsync(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DeleteOneAsync), _collection, filter); return await _collection.DeleteOneAsync(session, filter, options, cancellationToken); } /// public IAsyncCursor Distinct(FieldDefinition field, FilterDefinition filter, DistinctOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Distinct(field, filter, options, cancellationToken); } /// public IAsyncCursor Distinct(IClientSessionHandle session, FieldDefinition field, FilterDefinition filter, DistinctOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Distinct(session, field, filter, options, cancellationToken); } /// public async Task> DistinctAsync(FieldDefinition field, FilterDefinition filter, DistinctOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DistinctAsync), _collection, filter); return await _collection.DistinctAsync(field, filter, options, cancellationToken); } /// public async Task> DistinctAsync(IClientSessionHandle session, FieldDefinition field, FilterDefinition filter, DistinctOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(DistinctAsync), _collection, filter); return await _collection.DistinctAsync(session, field, filter, options, cancellationToken); } /// public long EstimatedDocumentCount(EstimatedDocumentCountOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.EstimatedDocumentCount(options, cancellationToken); } /// public async Task EstimatedDocumentCountAsync(EstimatedDocumentCountOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(EstimatedDocumentCountAsync), _collection); return await _collection.EstimatedDocumentCountAsync(options, cancellationToken); } /// public IAsyncCursor FindSync(FilterDefinition filter, FindOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindSync(filter, options, cancellationToken); } /// public IAsyncCursor FindSync(IClientSessionHandle session, FilterDefinition filter, FindOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindSync(session, filter, options, cancellationToken); } /// public async Task> FindAsync(FilterDefinition filter, FindOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindAsync), _collection, filter); return await _collection.FindAsync(filter, options, cancellationToken); } /// public async Task> FindAsync(IClientSessionHandle session, FilterDefinition filter, FindOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindAsync), _collection, filter); return await _collection.FindAsync(session, filter, options, cancellationToken); } /// public TProjection FindOneAndDelete(FilterDefinition filter, FindOneAndDeleteOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindOneAndDelete(filter, options, cancellationToken); } /// public TProjection FindOneAndDelete(IClientSessionHandle session, FilterDefinition filter, FindOneAndDeleteOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindOneAndDelete(session, filter, options, cancellationToken); } /// public async Task FindOneAndDeleteAsync(FilterDefinition filter, FindOneAndDeleteOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindOneAndDeleteAsync), _collection, filter); return await _collection.FindOneAndDeleteAsync(filter, options, cancellationToken); } /// public async Task FindOneAndDeleteAsync(IClientSessionHandle session, FilterDefinition filter, FindOneAndDeleteOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindOneAndDeleteAsync), _collection, filter); return await _collection.FindOneAndDeleteAsync(session, filter, options, cancellationToken); } /// public TProjection FindOneAndReplace(FilterDefinition filter, T replacement, FindOneAndReplaceOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindOneAndReplace(filter, replacement, options, cancellationToken); } /// public TProjection FindOneAndReplace(IClientSessionHandle session, FilterDefinition filter, T replacement, FindOneAndReplaceOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindOneAndReplace(session, filter, replacement, options, cancellationToken); } /// public async Task FindOneAndReplaceAsync(FilterDefinition filter, T replacement, FindOneAndReplaceOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindOneAndReplaceAsync), _collection, filter, document: replacement); return await _collection.FindOneAndReplaceAsync(filter, replacement, options, cancellationToken); } /// public async Task FindOneAndReplaceAsync(IClientSessionHandle session, FilterDefinition filter, T replacement, FindOneAndReplaceOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindOneAndReplaceAsync), _collection, filter, document: replacement); return await _collection.FindOneAndReplaceAsync(session, filter, replacement, options, cancellationToken); } /// public TProjection FindOneAndUpdate(FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindOneAndUpdate(filter, update, options, cancellationToken); } /// public TProjection FindOneAndUpdate(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.FindOneAndUpdate(session, filter, update, options, cancellationToken); } /// public async Task FindOneAndUpdateAsync(FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindOneAndUpdateAsync), _collection, filter, update); return await _collection.FindOneAndUpdateAsync(filter, update, options, cancellationToken); } /// public async Task FindOneAndUpdateAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(FindOneAndUpdateAsync), _collection, filter, update); return await _collection.FindOneAndUpdateAsync(session, filter, update, options, cancellationToken); } /// public void InsertOne(T document, InsertOneOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); _collection.InsertOne(document, options, cancellationToken); } /// public void InsertOne(IClientSessionHandle session, T document, InsertOneOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); _collection.InsertOne(session, document, options, cancellationToken); } /// public async Task InsertOneAsync(T document, CancellationToken cancellationToken) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(InsertOneAsync), _collection, document: document); await _collection.InsertOneAsync(document, cancellationToken); } /// public async Task InsertOneAsync(T document, InsertOneOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(InsertOneAsync), _collection, document: document); await _collection.InsertOneAsync(document, options, cancellationToken); } /// public async Task InsertOneAsync(IClientSessionHandle session, T document, InsertOneOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(InsertOneAsync), _collection, document: document); await _collection.InsertOneAsync(session, document, options, cancellationToken); } /// public void InsertMany(IEnumerable documents, InsertManyOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); _collection.InsertMany(documents, options, cancellationToken); } /// public void InsertMany(IClientSessionHandle session, IEnumerable documents, InsertManyOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); _collection.InsertMany(session, documents, options, cancellationToken); } /// public async Task InsertManyAsync(IEnumerable documents, InsertManyOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(InsertManyAsync), _collection); await _collection.InsertManyAsync(documents, options, cancellationToken); } /// public async Task InsertManyAsync(IClientSessionHandle session, IEnumerable documents, InsertManyOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(InsertManyAsync), _collection); await _collection.InsertManyAsync(session, documents, options, cancellationToken); } /// public IAsyncCursor MapReduce(BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.MapReduce(map, reduce, options, cancellationToken); } /// public IAsyncCursor MapReduce(IClientSessionHandle session, BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.MapReduce(session, map, reduce, options, cancellationToken); } /// public async Task> MapReduceAsync(BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(MapReduceAsync), _collection); return await _collection.MapReduceAsync(map, reduce, options, cancellationToken); } /// public async Task> MapReduceAsync(IClientSessionHandle session, BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(MapReduceAsync), _collection); return await _collection.MapReduceAsync(session, map, reduce, options, cancellationToken); } /// public IFilteredMongoCollection OfType() where TDerivedDocument : T { return _collection.OfType(); } /// public ReplaceOneResult ReplaceOne(FilterDefinition filter, T replacement, ReplaceOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.ReplaceOne(filter, replacement, options, cancellationToken); } /// public ReplaceOneResult ReplaceOne(FilterDefinition filter, T replacement, UpdateOptions options, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.ReplaceOne(filter, replacement, options, cancellationToken); } /// public ReplaceOneResult ReplaceOne(IClientSessionHandle session, FilterDefinition filter, T replacement, ReplaceOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.ReplaceOne(session, filter, replacement, options, cancellationToken); } /// public ReplaceOneResult ReplaceOne(IClientSessionHandle session, FilterDefinition filter, T replacement, UpdateOptions options, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.ReplaceOne(session, filter, replacement, options, cancellationToken); } /// public async Task ReplaceOneAsync(FilterDefinition filter, T replacement, ReplaceOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(ReplaceOneAsync), _collection, filter, document: replacement); return await _collection.ReplaceOneAsync(filter, replacement, options, cancellationToken); } /// public async Task ReplaceOneAsync(FilterDefinition filter, T replacement, UpdateOptions options, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(ReplaceOneAsync), _collection, filter, document: replacement); return await _collection.ReplaceOneAsync(filter, replacement, options, cancellationToken); } /// public async Task ReplaceOneAsync(IClientSessionHandle session, FilterDefinition filter, T replacement, ReplaceOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(ReplaceOneAsync), _collection, filter, document: replacement); return await _collection.ReplaceOneAsync(session, filter, replacement, options, cancellationToken); } /// public async Task ReplaceOneAsync(IClientSessionHandle session, FilterDefinition filter, T replacement, UpdateOptions options, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(ReplaceOneAsync), _collection, filter, document: replacement); return await _collection.ReplaceOneAsync(session, filter, replacement, options, cancellationToken); } /// public UpdateResult UpdateMany(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.UpdateMany(filter, update, options, cancellationToken); } /// public UpdateResult UpdateMany(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.UpdateMany(session, filter, update, options, cancellationToken); } /// public async Task UpdateManyAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(UpdateManyAsync), _collection, filter, update); return await _collection.UpdateManyAsync(filter, update, options, cancellationToken); } /// public async Task UpdateManyAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(UpdateManyAsync), _collection); return await _collection.UpdateManyAsync(session, filter, update, options, cancellationToken); } /// public UpdateResult UpdateOne(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.UpdateOne(filter, update, options, cancellationToken); } /// public UpdateResult UpdateOne(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.UpdateOne(session, filter, update, options, cancellationToken); } /// public async Task UpdateOneAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(UpdateOneAsync), _collection, filter, update); return await _collection.UpdateOneAsync(filter, update, options, cancellationToken); } /// public async Task UpdateOneAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(UpdateOneAsync), _collection, filter, update); return await _collection.UpdateOneAsync(session, filter, update, options, cancellationToken); } /// public IChangeStreamCursor Watch(PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Watch(pipeline, options, cancellationToken); } /// public IChangeStreamCursor Watch(IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null!, CancellationToken cancellationToken = default) { _upgradeTask.Wait(cancellationToken); return _collection.Watch(session, pipeline, options, cancellationToken); } /// public async Task> WatchAsync(PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(WatchAsync), _collection); return await _collection.WatchAsync(pipeline, options, cancellationToken); } /// public async Task> WatchAsync(IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null!, CancellationToken cancellationToken = default) { await _upgradeTask.WaitAsync(cancellationToken); using TelemetrySpan span = _tracer.StartMongoDbSpan(nameof(WatchAsync), _collection); return await _collection.WatchAsync(session, pipeline, options, cancellationToken); } /// public IMongoCollection WithReadConcern(ReadConcern readConcern) { return _collection.WithReadConcern(readConcern); } /// public IMongoCollection WithReadPreference(ReadPreference readPreference) { return _collection.WithReadPreference(readPreference); } /// public IMongoCollection WithWriteConcern(WriteConcern writeConcern) { return _collection.WithWriteConcern(writeConcern); } #pragma warning restore CS0618 /// public CollectionNamespace CollectionNamespace => _collection.CollectionNamespace; /// public IMongoDatabase Database => _collection.Database; /// public IBsonSerializer DocumentSerializer => _collection.DocumentSerializer; /// public IMongoIndexManager Indexes => _collection.Indexes; /// public MongoCollectionSettings Settings => _collection.Settings; /// public IMongoSearchIndexManager SearchIndexes => _collection.SearchIndexes; } }