Skip to content

Commit 89cdb52

Browse files
meumlukebakken
authored andcommitted
Allow parent/child linking in opentelemetry spans
Update more tests Change to always link, optionally parent/child Don't create list unless needed Co-authored-by: Liudmila Molkova <[email protected]> Change default to AlwaysParentChildAndLink Remove TracingLinkType enum, use bool UsePublisherAsParent instead
1 parent 1e6f8ab commit 89cdb52

File tree

7 files changed

+211
-82
lines changed

7 files changed

+211
-82
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
~static OpenTelemetry.Trace.OpenTelemetryExtensions.AddRabbitMQInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder builder, System.Action<RabbitMQ.Client.RabbitMQTracingOptions> configure) -> OpenTelemetry.Trace.TracerProviderBuilder

projects/RabbitMQ.Client.OpenTelemetry/TraceProviderBuilderExtensions.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,26 @@
88

99
namespace OpenTelemetry.Trace
1010
{
11+
1112
public static class OpenTelemetryExtensions
1213
{
13-
public static TracerProviderBuilder AddRabbitMQInstrumentation(this TracerProviderBuilder builder)
14+
public static TracerProviderBuilder AddRabbitMQInstrumentation(this TracerProviderBuilder builder, Action<RabbitMQTracingOptions> configure)
1415
{
16+
var options = new RabbitMQTracingOptions();
17+
configure?.Invoke(options);
18+
RabbitMQActivitySource.TracingOptions = options;
19+
1520
RabbitMQActivitySource.ContextExtractor = OpenTelemetryContextExtractor;
1621
RabbitMQActivitySource.ContextInjector = OpenTelemetryContextInjector;
1722
builder.AddSource("RabbitMQ.Client.*");
1823
return builder;
1924
}
2025

26+
public static TracerProviderBuilder AddRabbitMQInstrumentation(this TracerProviderBuilder builder)
27+
{
28+
return AddRabbitMQInstrumentation(builder, null);
29+
}
30+
2131
private static ActivityContext OpenTelemetryContextExtractor(IReadOnlyBasicProperties props)
2232
{
2333
// Extract the PropagationContext of the upstream parent from the message headers.

projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ public static class RabbitMQActivitySource
5151
public static Func<IReadOnlyBasicProperties, ActivityContext> ContextExtractor { get; set; } =
5252
DefaultContextExtractor;
5353

54-
public static bool UseRoutingKeyAsOperationName { get; set; } = true;
54+
public static bool UseRoutingKeyAsOperationName
55+
{
56+
get => TracingOptions.UseRoutingKeyAsOperationName;
57+
set => TracingOptions.UseRoutingKeyAsOperationName = value;
58+
}
59+
public static RabbitMQTracingOptions TracingOptions { get; set; } = new RabbitMQTracingOptions();
5560
internal static bool PublisherHasListeners => s_publisherSource.HasListeners();
5661

5762
internal static readonly IEnumerable<KeyValuePair<string, object?>> CreationTags = new[]
@@ -115,9 +120,14 @@ public static class RabbitMQActivitySource
115120
}
116121

117122
// Extract the PropagationContext of the upstream parent from the message headers.
123+
ActivityContext linkedContext = ContextExtractor(readOnlyBasicProperties);
124+
ActivityContext parentContext = TracingOptions.UsePublisherAsParent ? linkedContext : default;
125+
118126
Activity? activity = s_subscriberSource.StartLinkedRabbitMQActivity(
119127
UseRoutingKeyAsOperationName ? $"{MessagingOperationNameBasicGet} {routingKey}" : MessagingOperationNameBasicGet, ActivityKind.Consumer,
120-
ContextExtractor(readOnlyBasicProperties));
128+
linkedContext, parentContext);
129+
130+
121131
if (activity != null && activity.IsAllDataRequested)
122132
{
123133
PopulateMessagingTags(MessagingOperationTypeReceive, MessagingOperationNameBasicGet, routingKey, exchange, deliveryTag, readOnlyBasicProperties,
@@ -128,21 +138,24 @@ public static class RabbitMQActivitySource
128138
}
129139

130140
internal static Activity? Deliver(string routingKey, string exchange, ulong deliveryTag,
131-
IReadOnlyBasicProperties basicProperties, int bodySize)
141+
IReadOnlyBasicProperties readOnlyBasicProperties, int bodySize)
132142
{
133143
if (!s_subscriberSource.HasListeners())
134144
{
135145
return null;
136146
}
137147

138148
// Extract the PropagationContext of the upstream parent from the message headers.
149+
ActivityContext linkedContext = ContextExtractor(readOnlyBasicProperties);
150+
ActivityContext parentContext = TracingOptions.UsePublisherAsParent ? linkedContext : default;
151+
139152
Activity? activity = s_subscriberSource.StartLinkedRabbitMQActivity(
140153
UseRoutingKeyAsOperationName ? $"{MessagingOperationNameBasicDeliver} {routingKey}" : MessagingOperationNameBasicDeliver,
141-
ActivityKind.Consumer, ContextExtractor(basicProperties));
154+
ActivityKind.Consumer, linkedContext, parentContext);
142155
if (activity != null && activity.IsAllDataRequested)
143156
{
144157
PopulateMessagingTags(MessagingOperationTypeProcess, MessagingOperationNameBasicDeliver, routingKey, exchange,
145-
deliveryTag, basicProperties, bodySize, activity);
158+
deliveryTag, readOnlyBasicProperties, bodySize, activity);
146159
}
147160

148161
return activity;
@@ -157,8 +170,14 @@ public static class RabbitMQActivitySource
157170
private static Activity? StartLinkedRabbitMQActivity(this ActivitySource source, string name, ActivityKind kind,
158171
ActivityContext linkedContext = default, ActivityContext parentContext = default)
159172
{
173+
List<ActivityLink>? links = null;
174+
if (linkedContext != default)
175+
{
176+
links = new List<ActivityLink>();
177+
links.Add(new ActivityLink(linkedContext));
178+
}
160179
return source.CreateActivity(name, kind, parentContext: parentContext,
161-
links: new[] { new ActivityLink(linkedContext) }, idFormat: ActivityIdFormat.W3C,
180+
links: links, idFormat: ActivityIdFormat.W3C,
162181
tags: CreationTags)
163182
?.Start();
164183
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace RabbitMQ.Client
2+
{
3+
public class RabbitMQTracingOptions
4+
{
5+
public bool UseRoutingKeyAsOperationName { get; set; } = true;
6+
public bool UsePublisherAsParent { get; set; } = true;
7+
}
8+
}

projects/RabbitMQ.Client/PublicAPI.Unshipped.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,12 @@ RabbitMQ.Client.Exceptions.PublishReturnException.Exchange.get -> string!
44
RabbitMQ.Client.Exceptions.PublishReturnException.PublishReturnException(ulong publishSequenceNumber, string! message, string? exchange = null, string? routingKey = null, ushort? replyCode = null, string? replyText = null) -> void
55
RabbitMQ.Client.Exceptions.PublishReturnException.ReplyCode.get -> ushort
66
RabbitMQ.Client.Exceptions.PublishReturnException.ReplyText.get -> string!
7-
RabbitMQ.Client.Exceptions.PublishReturnException.RoutingKey.get -> string!
7+
RabbitMQ.Client.Exceptions.PublishReturnException.RoutingKey.get -> string!
8+
RabbitMQ.Client.RabbitMQTracingOptions
9+
RabbitMQ.Client.RabbitMQTracingOptions.RabbitMQTracingOptions() -> void
10+
RabbitMQ.Client.RabbitMQTracingOptions.UsePublisherAsParent.get -> bool
11+
RabbitMQ.Client.RabbitMQTracingOptions.UsePublisherAsParent.set -> void
12+
RabbitMQ.Client.RabbitMQTracingOptions.UseRoutingKeyAsOperationName.get -> bool
13+
RabbitMQ.Client.RabbitMQTracingOptions.UseRoutingKeyAsOperationName.set -> void
14+
static RabbitMQ.Client.RabbitMQActivitySource.TracingOptions.get -> RabbitMQ.Client.RabbitMQTracingOptions!
15+
static RabbitMQ.Client.RabbitMQActivitySource.TracingOptions.set -> void

0 commit comments

Comments
 (0)