Skip to content

Commit c748417

Browse files
authored
Fix delayed message null activity - v9.2 (#7280)
1 parent 09b7cf2 commit c748417

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

src/NServiceBus.AcceptanceTests/Core/OpenTelemetry/Traces/When_incoming_message_was_delayed.cs

+41
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,24 @@
1111

1212
public class When_incoming_message_was_delayed : OpenTelemetryAcceptanceTest // assuming W3C trace!
1313
{
14+
[Test]
15+
public async Task By_sendoptions_Should_create_new_trace_and_set_current_activity()
16+
{
17+
var context = await Scenario.Define<Context>()
18+
.WithEndpoint<TestEndpoint>(b => b
19+
.When(s =>
20+
{
21+
var sendOptions = new SendOptions();
22+
sendOptions.DelayDeliveryWith(TimeSpan.FromMilliseconds(100));
23+
sendOptions.RouteToThisEndpoint();
24+
return s.Send(new DelayedMessage(), sendOptions);
25+
}))
26+
.Done(c => c.DelayedMessageReceived)
27+
.Run();
28+
29+
Assert.That(context.DelayedMessageCurrentActivityId, Is.Not.Null, "delayed message current activityId is not null");
30+
}
31+
1432
[Test]
1533
public async Task By_sendoptions_Should_create_new_trace_and_link_to_send()
1634
{
@@ -141,6 +159,10 @@ class Context : ScenarioContext
141159
public string IncomingMessageId { get; set; }
142160
public string ReplyMessageId { get; set; }
143161
public bool IncomingMessageReceived { get; set; }
162+
public bool DelayedMessageReceived { get; set; }
163+
#nullable enable
164+
public string? DelayedMessageCurrentActivityId { get; set; }
165+
#nullable disable
144166
}
145167
class SagaContext : ScenarioContext
146168
{
@@ -162,6 +184,7 @@ public Task Handle(IncomingMessage message, IMessageHandlerContext context)
162184
{
163185
testContext.IncomingMessageId = context.MessageId;
164186
testContext.IncomingMessageReceived = true;
187+
//testContext.IncomingMessageCurrentActivityId = Activity.Current?.Id;
165188
return context.Reply(new ReplyMessage());
166189
}
167190
}
@@ -198,6 +221,20 @@ public Task Handle(ReplyMessage message, IMessageHandlerContext context)
198221
return Task.CompletedTask;
199222
}
200223
}
224+
225+
class DelayedMessageHandler : IHandleMessages<DelayedMessage>
226+
{
227+
Context testContext;
228+
229+
public DelayedMessageHandler(Context testContext) => this.testContext = testContext;
230+
231+
public Task Handle(DelayedMessage message, IMessageHandlerContext context)
232+
{
233+
testContext.DelayedMessageReceived = true;
234+
testContext.DelayedMessageCurrentActivityId = Activity.Current?.Id;
235+
return Task.CompletedTask;
236+
}
237+
}
201238
}
202239

203240
class SagaOtelEndpoint : EndpointConfigurationBuilder
@@ -286,6 +323,10 @@ public class MessageToBeRetried : IMessage
286323
{
287324
}
288325

326+
public class DelayedMessage : IMessage
327+
{
328+
}
329+
289330
public class IncomingMessage : IMessage
290331
{
291332
}

src/NServiceBus.Core/OpenTelemetry/Tracing/ActivityFactory.cs

+3-6
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ public Activity StartIncomingPipelineActivity(MessageContext context)
3535
{
3636
// create a new trace or root activity
3737
ActivityLink[] links = [new ActivityLink(sendSpanContext)];
38-
activity = ActivitySources.Main.StartActivity(name: ActivityNames.IncomingMessageActivityName, ActivityKind.Consumer, CreateNewRootActivityContext(), tags: null, links: links);
38+
//null the current activity so that the new one is created as root https://github.com/dotnet/runtime/issues/65528#issuecomment-2613486896
39+
Activity.Current = null;
40+
activity = ActivitySources.Main.StartActivity(name: ActivityNames.IncomingMessageActivityName, ActivityKind.Consumer, parentContext: default, tags: null, links: links);
3941
}
4042
else
4143
{
@@ -66,11 +68,6 @@ public Activity StartIncomingPipelineActivity(MessageContext context)
6668
return activity;
6769
}
6870

69-
/// <summary>
70-
/// This could be cleaned up once a dedicated API is created, see https://github.com/dotnet/runtime/issues/65528
71-
/// </summary>
72-
static ActivityContext CreateNewRootActivityContext() => new(Activity.TraceIdGenerator is null ? ActivityTraceId.CreateRandom() : Activity.TraceIdGenerator(), default, default, default);
73-
7471
public Activity StartOutgoingPipelineActivity(string activityName, string displayName, IBehaviorContext outgoingContext)
7572
{
7673
var activity = ActivitySources.Main.CreateActivity(activityName, ActivityKind.Producer);

0 commit comments

Comments
 (0)