Skip to content

Commit

Permalink
Fix delayed message null activity - v9.2 (#7280)
Browse files Browse the repository at this point in the history
  • Loading branch information
jpalac authored Feb 4, 2025
1 parent 09b7cf2 commit c748417
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,24 @@

public class When_incoming_message_was_delayed : OpenTelemetryAcceptanceTest // assuming W3C trace!
{
[Test]
public async Task By_sendoptions_Should_create_new_trace_and_set_current_activity()
{
var context = await Scenario.Define<Context>()
.WithEndpoint<TestEndpoint>(b => b
.When(s =>
{
var sendOptions = new SendOptions();
sendOptions.DelayDeliveryWith(TimeSpan.FromMilliseconds(100));
sendOptions.RouteToThisEndpoint();
return s.Send(new DelayedMessage(), sendOptions);
}))
.Done(c => c.DelayedMessageReceived)
.Run();

Assert.That(context.DelayedMessageCurrentActivityId, Is.Not.Null, "delayed message current activityId is not null");
}

[Test]
public async Task By_sendoptions_Should_create_new_trace_and_link_to_send()
{
Expand Down Expand Up @@ -141,6 +159,10 @@ class Context : ScenarioContext
public string IncomingMessageId { get; set; }
public string ReplyMessageId { get; set; }
public bool IncomingMessageReceived { get; set; }
public bool DelayedMessageReceived { get; set; }
#nullable enable
public string? DelayedMessageCurrentActivityId { get; set; }
#nullable disable
}
class SagaContext : ScenarioContext
{
Expand All @@ -162,6 +184,7 @@ public Task Handle(IncomingMessage message, IMessageHandlerContext context)
{
testContext.IncomingMessageId = context.MessageId;
testContext.IncomingMessageReceived = true;
//testContext.IncomingMessageCurrentActivityId = Activity.Current?.Id;
return context.Reply(new ReplyMessage());
}
}
Expand Down Expand Up @@ -198,6 +221,20 @@ public Task Handle(ReplyMessage message, IMessageHandlerContext context)
return Task.CompletedTask;
}
}

class DelayedMessageHandler : IHandleMessages<DelayedMessage>
{
Context testContext;

public DelayedMessageHandler(Context testContext) => this.testContext = testContext;

public Task Handle(DelayedMessage message, IMessageHandlerContext context)
{
testContext.DelayedMessageReceived = true;
testContext.DelayedMessageCurrentActivityId = Activity.Current?.Id;
return Task.CompletedTask;
}
}
}

class SagaOtelEndpoint : EndpointConfigurationBuilder
Expand Down Expand Up @@ -286,6 +323,10 @@ public class MessageToBeRetried : IMessage
{
}

public class DelayedMessage : IMessage
{
}

public class IncomingMessage : IMessage
{
}
Expand Down
9 changes: 3 additions & 6 deletions src/NServiceBus.Core/OpenTelemetry/Tracing/ActivityFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ public Activity StartIncomingPipelineActivity(MessageContext context)
{
// create a new trace or root activity
ActivityLink[] links = [new ActivityLink(sendSpanContext)];
activity = ActivitySources.Main.StartActivity(name: ActivityNames.IncomingMessageActivityName, ActivityKind.Consumer, CreateNewRootActivityContext(), tags: null, links: links);
//null the current activity so that the new one is created as root https://github.com/dotnet/runtime/issues/65528#issuecomment-2613486896
Activity.Current = null;
activity = ActivitySources.Main.StartActivity(name: ActivityNames.IncomingMessageActivityName, ActivityKind.Consumer, parentContext: default, tags: null, links: links);
}
else
{
Expand Down Expand Up @@ -66,11 +68,6 @@ public Activity StartIncomingPipelineActivity(MessageContext context)
return activity;
}

/// <summary>
/// This could be cleaned up once a dedicated API is created, see https://github.com/dotnet/runtime/issues/65528
/// </summary>
static ActivityContext CreateNewRootActivityContext() => new(Activity.TraceIdGenerator is null ? ActivityTraceId.CreateRandom() : Activity.TraceIdGenerator(), default, default, default);

public Activity StartOutgoingPipelineActivity(string activityName, string displayName, IBehaviorContext outgoingContext)
{
var activity = ActivitySources.Main.CreateActivity(activityName, ActivityKind.Producer);
Expand Down

0 comments on commit c748417

Please sign in to comment.