Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@
<PackageVersion Include="OpenTelemetry" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Api" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.InMemory" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.15.2" />
Expand Down
17 changes: 17 additions & 0 deletions src/Testing/CoreTests/ErrorHandling/RequeueContinuationTester.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Diagnostics;
using CoreTests.Runtime;
using NSubstitute;
using Shouldly;
Expand Down Expand Up @@ -39,4 +40,20 @@ public void singleton_requeue_continuation_rejects_jitter()

((IJitterable)RequeueContinuation.Instance).TrySetJitter(strategy).ShouldBeFalse();
}

[Fact]
public async Task records_the_failed_attempt_so_the_next_attempt_can_link_to_it()
{
var envelope = ObjectMother.Envelope();

var context = Substitute.For<IEnvelopeLifecycle>();
context.Envelope.Returns(envelope);

using var activity = new Activity("process").Start();

await RequeueContinuation.Instance.ExecuteAsync(context, new MockWolverineRuntime(), DateTime.Now, activity);

envelope.TryGetHeader(EnvelopeConstants.PreviousAttemptActivityIdKey, out var previous).ShouldBeTrue();
previous.ShouldBe(activity.Id);
}
}
17 changes: 17 additions & 0 deletions src/Testing/CoreTests/ErrorHandling/RetryNowContinuationTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,21 @@ public void singleton_retry_inline_continuation_rejects_jitter()

((IJitterable)RetryInlineContinuation.Instance).TrySetJitter(strategy).ShouldBeFalse();
}

[Fact]
public async Task records_the_failed_attempt_so_the_next_attempt_can_link_to_it()
{
var envelope = ObjectMother.Envelope();
envelope.Attempts = 1;

var context = Substitute.For<IEnvelopeLifecycle>();
context.Envelope.Returns(envelope);

using var activity = new Activity("process").Start();

await RetryInlineContinuation.Instance.ExecuteAsync(context, new MockWolverineRuntime(), DateTimeOffset.Now, activity);

envelope.TryGetHeader(EnvelopeConstants.PreviousAttemptActivityIdKey, out var previous).ShouldBeTrue();
previous.ShouldBe(activity.Id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,39 @@ public async Task uses_base_delay_when_no_jitter_configured()

await lifecycle.Received(1).ReScheduleAsync(now.AddSeconds(10));
}

[Fact]
public async Task records_the_failed_attempt_so_the_next_attempt_can_link_to_it()
{
var continuation = new ScheduledRetryContinuation(TimeSpan.FromSeconds(10));

var envelope = ObjectMother.Envelope();
envelope.Attempts = 1;

var lifecycle = Substitute.For<IEnvelopeLifecycle>();
lifecycle.Envelope.Returns(envelope);

using var activity = new Activity("process").Start();

await continuation.ExecuteAsync(lifecycle, new MockWolverineRuntime(), DateTimeOffset.UtcNow, activity);

envelope.TryGetHeader(EnvelopeConstants.PreviousAttemptActivityIdKey, out var previous).ShouldBeTrue();
previous.ShouldBe(activity.Id);
}

[Fact]
public async Task records_nothing_when_there_is_no_activity()
{
var continuation = new ScheduledRetryContinuation(TimeSpan.FromSeconds(10));

var envelope = ObjectMother.Envelope();
envelope.Attempts = 1;

var lifecycle = Substitute.For<IEnvelopeLifecycle>();
lifecycle.Envelope.Returns(envelope);

await continuation.ExecuteAsync(lifecycle, new MockWolverineRuntime(), DateTimeOffset.UtcNow, null);

envelope.TryGetHeader(EnvelopeConstants.PreviousAttemptActivityIdKey, out _).ShouldBeFalse();
}
}
57 changes: 57 additions & 0 deletions src/Testing/CoreTests/Runtime/WolverineTracingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,63 @@ public void use_parent_id_from_envelope_when_exists()

activity.ParentId.ShouldBe(envelope.ParentId);
}

[Fact]
public void links_to_the_previous_attempt_and_consumes_the_header()
{
var envelope = ObjectMother.Envelope();
envelope.Headers[EnvelopeConstants.PreviousAttemptActivityIdKey] =
"00-25d8f5709b569a1f61bcaf79b9450ed4-f293c0545fc237a1-01";

using var activity = new Activity("process").Start();

WolverineTracing.LinkToPreviousAttempt(activity, envelope);

var link = activity.Links.ShouldHaveSingleItem();
link.Context.TraceId.ToString().ShouldBe("25d8f5709b569a1f61bcaf79b9450ed4");
link.Context.SpanId.ToString().ShouldBe("f293c0545fc237a1");

// Single-use: nothing this attempt sends or schedules next may carry it onward
envelope.TryGetHeader(EnvelopeConstants.PreviousAttemptActivityIdKey, out _).ShouldBeFalse();
}

[Fact]
public void no_link_for_an_envelope_that_was_never_retried()
{
var envelope = ObjectMother.Envelope();

using var activity = new Activity("process").Start();

WolverineTracing.LinkToPreviousAttempt(activity, envelope);

activity.Links.ShouldBeEmpty();
}

[Fact]
public void drops_the_header_when_there_is_no_activity_to_link()
{
var envelope = ObjectMother.Envelope();
envelope.Headers[EnvelopeConstants.PreviousAttemptActivityIdKey] =
"00-25d8f5709b569a1f61bcaf79b9450ed4-f293c0545fc237a1-01";

WolverineTracing.LinkToPreviousAttempt(null, envelope);

envelope.TryGetHeader(EnvelopeConstants.PreviousAttemptActivityIdKey, out _).ShouldBeFalse();
}

[Fact]
public void ignores_a_malformed_previous_attempt_id()
{
var envelope = ObjectMother.Envelope();
envelope.Headers[EnvelopeConstants.PreviousAttemptActivityIdKey] = "not-a-traceparent";

using var activity = new Activity("process").Start();

WolverineTracing.LinkToPreviousAttempt(activity, envelope);

activity.Links.ShouldBeEmpty();
envelope.TryGetHeader(EnvelopeConstants.PreviousAttemptActivityIdKey, out _).ShouldBeFalse();
}
}

public class when_creating_an_execution_activity
Expand Down
1 change: 1 addition & 0 deletions src/Testing/OpenTelemetry/TracingTests/TracingTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<ItemGroup>
<PackageReference Include="Alba" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="OpenTelemetry.Exporter.InMemory" />
<PackageReference Include="Shouldly" />
<PackageReference Include="xunit.v3" />
<PackageReference Include="xunit.runner.visualstudio">
Expand Down
Loading
Loading