From 94a297d1447cd16467feacc7a21299d1aae8f114 Mon Sep 17 00:00:00 2001 From: Alexandre Brandizzi Date: Thu, 3 Sep 2026 21:51:40 -0300 Subject: [PATCH] fix(observability): finish abandoned transactions --- .../SentryObservabilityTests.cs | 37 +++++++++++++++++++ .../Observability/SentryObservability.cs | 6 ++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Api.SeaHavenIndustries.Tests/SentryObservabilityTests.cs b/Api.SeaHavenIndustries.Tests/SentryObservabilityTests.cs index 7190018..cb760e8 100644 --- a/Api.SeaHavenIndustries.Tests/SentryObservabilityTests.cs +++ b/Api.SeaHavenIndustries.Tests/SentryObservabilityTests.cs @@ -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(); + hub.Setup(h => h.StartTransaction( + It.IsAny(), + It.IsAny>())) + .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()), Times.Once); + } + + [Fact] + public void Dispose_AfterFinish_DoesNotFinishAgain() + { + var (hub, _) = CreateHub(); + var transaction = new Mock(); + hub.Setup(h => h.StartTransaction( + It.IsAny(), + It.IsAny>())) + .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()), Times.Once); + } + [Fact] public void TelemetryScrubber_RemovesRequestSecrets_AndKeepsOnlyOpaqueUserId() { diff --git a/Api.SeaHavenIndustries/Observability/SentryObservability.cs b/Api.SeaHavenIndustries/Observability/SentryObservability.cs index fbb6604..0a1ec56 100644 --- a/Api.SeaHavenIndustries/Observability/SentryObservability.cs +++ b/Api.SeaHavenIndustries/Observability/SentryObservability.cs @@ -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(); + } }