fix(observability): finish abandoned transactions

This commit is contained in:
Alexandre Brandizzi 2026-09-03 21:51:40 -03:00
parent a0abb76da3
commit 94a297d144
2 changed files with 42 additions and 1 deletions

View file

@ -152,6 +152,43 @@ public class SentryObservabilityTests
transaction.Verify(t => t.Finish(SpanStatus.Cancelled), Times.Never);
}
[Fact]
public void Dispose_UnfinishedTransaction_FinishesOnceWithUnknownErrorStatus()
{
var (hub, _) = CreateHub();
var transaction = new Mock<ITransactionTracer>();
hub.Setup(h => h.StartTransaction(
It.IsAny<ITransactionContext>(),
It.IsAny<IReadOnlyDictionary<string, object?>>()))
.Returns(transaction.Object);
var handle = SentryObservability.BeginBackgroundTransaction(hub.Object, "job", "Fn");
handle.Dispose();
handle.Dispose();
transaction.Verify(t => t.Finish(SpanStatus.UnknownError), Times.Once);
transaction.Verify(t => t.Finish(It.IsAny<SpanStatus>()), Times.Once);
}
[Fact]
public void Dispose_AfterFinish_DoesNotFinishAgain()
{
var (hub, _) = CreateHub();
var transaction = new Mock<ITransactionTracer>();
hub.Setup(h => h.StartTransaction(
It.IsAny<ITransactionContext>(),
It.IsAny<IReadOnlyDictionary<string, object?>>()))
.Returns(transaction.Object);
var handle = SentryObservability.BeginBackgroundTransaction(hub.Object, "job", "Fn");
handle.FinishOk();
handle.Dispose();
transaction.Verify(t => t.Finish(SpanStatus.Ok), Times.Once);
transaction.Verify(t => t.Finish(SpanStatus.UnknownError), Times.Never);
transaction.Verify(t => t.Finish(It.IsAny<SpanStatus>()), Times.Once);
}
[Fact]
public void TelemetryScrubber_RemovesRequestSecrets_AndKeepsOnlyOpaqueUserId()
{

View file

@ -264,5 +264,9 @@ public sealed class SentryBackgroundTransactionHandle : IDisposable
finish();
}
public void Dispose() => _scope.Dispose();
public void Dispose()
{
Finish(() => _transaction.Finish(SpanStatus.UnknownError));
_scope.Dispose();
}
}