Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
2d57966
Finish idle transaction using timeout option
SeanFeldman Jun 27, 2023
8f9e7a5
Ensure timer is cancelled when either triggered or transaction ends n…
SeanFeldman Jun 27, 2023
7254d6e
Add verification
SeanFeldman Jun 27, 2023
fc734ed
Remove destructor
SeanFeldman Jun 27, 2023
b625620
Update CHANGELOG.md
SeanFeldman Jun 27, 2023
1a03d78
Approve API changes
SeanFeldman Jun 27, 2023
5ca5599
Fix .NET 3.1 approval
SeanFeldman Jun 27, 2023
29ce332
Move idle timeout handling to the correct constructor
SeanFeldman Jun 27, 2023
8a1d79b
Add support for IdleTimeout to SentryOptions
SeanFeldman Jun 27, 2023
81950f9
Use SentryOptions configured IdleTimeout with TransactionTracer
SeanFeldman Jun 27, 2023
b653afc
Approve API changes for SentryOptions and updated TransactionTracer
SeanFeldman Jun 27, 2023
c36453c
Remove overload constructor in favor of resolving options from the hub
SeanFeldman Jul 5, 2023
908bdc1
Use explicit cast to determine if Hub type is used
SeanFeldman Jul 5, 2023
59101b2
Remove unnecessary member field
SeanFeldman Jul 5, 2023
af05fee
Avoid race condition
SeanFeldman Jul 5, 2023
e1dfb95
Remove IDisposable and dispose timer if the idle timeout timer has be…
SeanFeldman Jul 5, 2023
5262161
Merge remote-tracking branch 'origin/main' into 1074-transacton-idle-…
SeanFeldman Jul 10, 2023
1695110
Update src/Sentry/TransactionTracer.cs
SeanFeldman Jul 10, 2023
4c691b8
Do not finish transaction that is marked as a Sentry OTel transaction
SeanFeldman Jul 11, 2023
3db4a20
Do not complete OTel transaction
SeanFeldman Jul 12, 2023
696f636
Remove duplicated AssertionScope
SeanFeldman Jul 12, 2023
7e88587
Verify transaction was marked as a sentry request
SeanFeldman Jul 14, 2023
6701ad7
Remove redundant test (covered by TransactionTests)
SeanFeldman Jul 14, 2023
31f7826
Allow transaction idle timeout override
SeanFeldman Jul 17, 2023
dba21ec
Defer first execution until idle timeout kicks in
SeanFeldman Jul 17, 2023
f32c63a
Verify idle timeout override works
SeanFeldman Jul 17, 2023
060a8b9
Fix test name and tweak times
SeanFeldman Jul 18, 2023
3242e07
EXPERIMENTAL - increase delay to a few seconds
SeanFeldman Jul 18, 2023
6f49243
Apply suggestions from code review
SeanFeldman Jul 18, 2023
432b594
Update public API
SeanFeldman Jul 18, 2023
bdb7ed7
Take into consideration Sentry options provided idle timeout (acciden…
SeanFeldman Jul 18, 2023
76bf453
Simplification
SeanFeldman Jul 19, 2023
f8c5913
Apply suggestions from code review
SeanFeldman Jul 20, 2023
ea7db6f
Update src/Sentry/TransactionTracer.cs
SeanFeldman Jul 20, 2023
ebd70ff
Fix code review suggestions
SeanFeldman Jul 20, 2023
6d9e1d1
Update CONTRIBUTING.md
jamescrosswell Jul 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions src/Sentry/TransactionTracer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,10 +215,16 @@ public TransactionTracer(IHub hub, string name, string operation, TransactionNam
/// <summary>
/// Initializes an instance of <see cref="TransactionTracer"/>.
/// </summary>
public TransactionTracer(IHub hub, ITransactionContext context)
public TransactionTracer(IHub hub, ITransactionContext context) : this(hub, context, null)
{
}

/// <summary>
/// Initializes an instance of <see cref="TransactionTracer"/>.
/// </summary>
internal TransactionTracer(IHub hub, ITransactionContext context, TimeSpan? idleTimeoutOverride)
{
_hub = hub;
var idleTimeout = hub.GetSentryOptions()?.IdleTimeout;
Name = context.Name;
NameSource = context is IHasTransactionNameSource c ? c.NameSource : TransactionNameSource.Custom;
Operation = context.Operation;
Expand All @@ -234,6 +240,8 @@ public TransactionTracer(IHub hub, ITransactionContext context)
_instrumenter = transactionContext.Instrumenter;
}

var idleTimeout = idleTimeoutOverride ?? hub.GetSentryOptions()?.IdleTimeout;

if (idleTimeout != null)
{
_idleTimer = new Timer(state =>
Expand All @@ -244,7 +252,7 @@ public TransactionTracer(IHub hub, ITransactionContext context)
}

transactionTracer.Finish(Status ?? SpanStatus.Ok);
}, this, TimeSpan.Zero, idleTimeout.Value);
}, this, idleTimeout.Value, Timeout.InfiniteTimeSpan);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,6 @@ public void OnEnd_does_not_finish_transaction_marked_as_IsSentryRequest()
return;
}

transaction.Contexts.ContainsKey("otel").Should().BeFalse();
transaction.IsSentryRequest.Should().BeTrue();
}
}
28 changes: 0 additions & 28 deletions test/Sentry.Tests/HubTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1376,32 +1376,4 @@ public async Task WithScopeAsyncT_Works()
}

private static Scope GetCurrentScope(Hub hub) => hub.ScopeManager.GetCurrent().Key;

[Fact]
public async Task IdleTimeout_auto_finishes_transaction()
{
// Arrange
_fixture.Options.IdleTimeout = TimeSpan.FromMilliseconds(2);
var hub = _fixture.GetSut();
var context = new TransactionContext(
SpanId.Create(),
SpanId.Create(),
SentryId.Create(),
"name",
"operation",
"description",
SpanStatus.Ok,
null,
true,
TransactionNameSource.Component
);

// Act
var transaction = hub.StartTransaction(context);

await Task.Delay(TimeSpan.FromMilliseconds(5));

// Assert
transaction.IsFinished.Should().BeTrue();
}
}
33 changes: 33 additions & 0 deletions test/Sentry.Tests/Protocol/TransactionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -595,4 +595,37 @@ public async Task Idle_transaction_should_finish_with_idle_timeout_specified()
// Assert
transaction.IsFinished.Should().BeTrue();
}

[Fact]
public async Task IdleTimeoutOverride_should_override_SentryOptions_IdleTimeout()
{
// Arrange
var client = Substitute.For<ISentryClient>();
var options = new SentryOptions
{
Dsn = ValidDsn,
IdleTimeout = TimeSpan.FromMilliseconds(2)
};
var hub = new Hub(options, client);
var context = new TransactionContext(
SpanId.Create(),
SpanId.Create(),
SentryId.Create(),
"my name",
"my operation",
"description",
SpanStatus.Ok,
null,
true,
TransactionNameSource.Component
);

var transaction = new TransactionTracer(hub, context, TimeSpan.FromMilliseconds(30));

// Act
await Task.Delay(5);

// Assert
transaction.IsFinished.Should().BeFalse();
}
}