diff --git a/src/Sentry/SentryClient.cs b/src/Sentry/SentryClient.cs index c3c88a062e..d694425feb 100644 --- a/src/Sentry/SentryClient.cs +++ b/src/Sentry/SentryClient.cs @@ -212,7 +212,7 @@ public void CaptureTransaction(SentryTransaction transaction, Scope? scope, Sent var processedTransaction = transaction; foreach (var processor in scope.GetAllTransactionProcessors()) { - processedTransaction = processor.DoProcessTransaction(transaction, hint); + processedTransaction = processor.DoProcessTransaction(processedTransaction, hint); if (processedTransaction == null) // Rejected transaction { _options.ClientReportRecorder.RecordDiscardedEvent(DiscardReason.EventProcessor, DataCategory.Transaction); diff --git a/test/Sentry.Tests/SentryClientTests.cs b/test/Sentry.Tests/SentryClientTests.cs index 8329dad9a1..91af7baeeb 100644 --- a/test/Sentry.Tests/SentryClientTests.cs +++ b/test/Sentry.Tests/SentryClientTests.cs @@ -1638,6 +1638,42 @@ public void CaptureTransaction_AddedTransactionProcessor_ReceivesHint() processor.Received(1).Process(Arg.Any(), Arg.Any()); } + [Fact] + public void CaptureTransaction_MultipleTransactionProcessors_EachReceivesThePreviousResult() + { + // Arrange + var first = Substitute.For(); + var second = Substitute.For(); + var replacement = new SentryTransaction("replaced by first", "operation") + { + IsSampled = true, + EndTimestamp = DateTimeOffset.Now + }; + first.Process(Arg.Any()).Returns(replacement); + second.Process(Arg.Any()).Returns(callInfo => callInfo.Arg()); + _fixture.SentryOptions.AddTransactionProcessor(first); + _fixture.SentryOptions.AddTransactionProcessor(second); + + var transaction = new SentryTransaction("original", "operation") + { + IsSampled = true, + EndTimestamp = DateTimeOffset.Now + }; + + Envelope envelope = null; + _fixture.BackgroundWorker.EnqueueEnvelope(Arg.Do(arg => envelope = arg)).Returns(true); + + // Act + _fixture.GetSut().CaptureTransaction(transaction); + + // Assert + second.Received(1).Process(replacement); + envelope.Should().NotBeNull(); + var sent = envelope.Items.Select(i => i.Payload).OfType() + .Select(p => p.Source).OfType().Single(); + sent.Name.Should().Be("replaced by first"); + } + [Fact] public void CaptureTransaction_TransactionProcessor_ReceivesScopeAttachments() {