Skip to content

Commit 94a78bd

Browse files
authored
Fix delayed message null activity - v9.1 (#7281)
1 parent 2b3b1e8 commit 94a78bd

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
{
@@ -120,6 +138,10 @@ class Context : ScenarioContext
120138
public string IncomingMessageId { get; set; }
121139
public string ReplyMessageId { get; set; }
122140
public bool IncomingMessageReceived { get; set; }
141+
public bool DelayedMessageReceived { get; set; }
142+
#nullable enable
143+
public string? DelayedMessageCurrentActivityId { get; set; }
144+
#nullable disable
123145
}
124146
class SagaContext : ScenarioContext
125147
{
@@ -141,6 +163,7 @@ public Task Handle(IncomingMessage message, IMessageHandlerContext context)
141163
{
142164
testContext.IncomingMessageId = context.MessageId;
143165
testContext.IncomingMessageReceived = true;
166+
//testContext.IncomingMessageCurrentActivityId = Activity.Current?.Id;
144167
return context.Reply(new ReplyMessage());
145168
}
146169
}
@@ -177,6 +200,20 @@ public Task Handle(ReplyMessage message, IMessageHandlerContext context)
177200
return Task.CompletedTask;
178201
}
179202
}
203+
204+
class DelayedMessageHandler : IHandleMessages<DelayedMessage>
205+
{
206+
Context testContext;
207+
208+
public DelayedMessageHandler(Context testContext) => this.testContext = testContext;
209+
210+
public Task Handle(DelayedMessage message, IMessageHandlerContext context)
211+
{
212+
testContext.DelayedMessageReceived = true;
213+
testContext.DelayedMessageCurrentActivityId = Activity.Current?.Id;
214+
return Task.CompletedTask;
215+
}
216+
}
180217
}
181218

182219
class SagaOtelEndpoint : EndpointConfigurationBuilder
@@ -265,6 +302,10 @@ public class MessageToBeRetried : IMessage
265302
{
266303
}
267304

305+
public class DelayedMessage : IMessage
306+
{
307+
}
308+
268309
public class IncomingMessage : IMessage
269310
{
270311
}

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)