Skip to content

Commit 7c18241

Browse files
committed
* Removed the BaggagePropagation configuration value.
* Use the DefaultTextMapPropagator and make it possible for uses to configure their own. * Updated tests to configure the propagator. * Updating README.md with basic instructions for use
1 parent 83e088f commit 7c18241

File tree

4 files changed

+85
-28
lines changed

4 files changed

+85
-28
lines changed
Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,54 @@
1-
# RabbitMQ .NET Client - OAuth2
1+
# RabbitMQ .NET Client - OpenTelemetry Instrumentation
2+
3+
## Introduction
4+
This library makes it easy to instrument your RabbitMQ .NET Client applications with OpenTelemetry.
5+
6+
## Examples
7+
The following examples demonstrate how to use the RabbitMQ .NET Client OpenTelemetry Instrumentation.
8+
9+
### Basic Usage
10+
11+
#### ASP.NET Core Configuration Example
12+
```csharp
13+
using OpenTelemetry.Trace;
14+
15+
// Configure the OpenTelemetry SDK to trace ASP.NET Core, the RabbitMQ .NET Client and export the traces to the console.
16+
// Also configures context propagation to propagate the TraceContext and Baggage using the W3C specification.
17+
18+
var compositeTextMapPropagator = new CompositeTextMapPropagator(new TextMapPropagator[]
19+
{
20+
new TraceContextPropagator(),
21+
new BaggagePropagator()
22+
});
23+
24+
Sdk.SetDefaultTextMapPropagator(compositeTextMapPropagator);
25+
26+
builder.Services.AddOpenTelemetry()
27+
.ConfigureResource(resource => resource
28+
.AddService(serviceName: builder.Environment.ApplicationName))
29+
.WithTracing(tracing => tracing
30+
.AddAspNetCoreInstrumentation()
31+
.AddRabbitMQInstrumentation()
32+
.AddConsoleExporter());
33+
```
34+
35+
#### Console Application Configuration Example
36+
```csharp
37+
using OpenTelemetry.Trace;
38+
39+
// Configure the OpenTelemetry SDK to trace ASP.NET Core, the RabbitMQ .NET Client and export the traces to the console.
40+
// Also configures context propagation to propagate the TraceContext and Baggage using the W3C specification.
41+
42+
var compositeTextMapPropagator = new CompositeTextMapPropagator(new TextMapPropagator[]
43+
{
44+
new TraceContextPropagator(),
45+
new BaggagePropagator()
46+
});
47+
48+
Sdk.SetDefaultTextMapPropagator(compositeTextMapPropagator);
49+
50+
var tracerProvider = Sdk.CreateTracerProviderBuilder()
51+
.AddRabbitMQInstrumentation()
52+
.AddConsoleExporter()
53+
.Build();
54+
```

projects/RabbitMQ.Client.OpenTelemetry/RabbitMQOpenTelemetryConfiguration.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@ namespace RabbitMQ.Client.OpenTelemetry
22
{
33
public class RabbitMQOpenTelemetryConfiguration
44
{
5-
public bool PropagateBaggage { get; set; } = true;
6-
public bool UseRoutingKeyAsOperationName { get; set; } = true;
7-
public bool IncludePublishers { get; set; } = true;
8-
public bool IncludeSubscribers { get; set; } = true;
5+
public RabbitMQOpenTelemetryConfiguration(bool useRoutingKeyAsOperationName = true,
6+
bool includePublishers = true,
7+
bool includeSubscribers = true)
8+
{
9+
UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName;
10+
IncludePublishers = includePublishers;
11+
IncludeSubscribers = includeSubscribers;
12+
}
13+
14+
public bool UseRoutingKeyAsOperationName { get; }
15+
public bool IncludePublishers { get; }
16+
public bool IncludeSubscribers { get; }
17+
public static RabbitMQOpenTelemetryConfiguration Default { get; } = new RabbitMQOpenTelemetryConfiguration();
918
}
1019
}

projects/RabbitMQ.Client.OpenTelemetry/TraceProviderBuilderExtensions.cs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,14 @@ namespace OpenTelemetry.Trace
1111
{
1212
public static class OpenTelemetryExtensions
1313
{
14-
internal static TextMapPropagator s_propagator = Propagators.DefaultTextMapPropagator;
15-
16-
public static TracerProviderBuilder AddRabbitMQ(this TracerProviderBuilder builder,
17-
RabbitMQOpenTelemetryConfiguration configuration)
14+
public static TracerProviderBuilder AddRabbitMQInstrumentation(this TracerProviderBuilder builder,
15+
RabbitMQOpenTelemetryConfiguration configuration = null)
1816
{
19-
if (configuration.PropagateBaggage)
17+
if (configuration == null)
2018
{
21-
s_propagator = new CompositeTextMapPropagator(new TextMapPropagator[]
22-
{
23-
new TraceContextPropagator(), new BaggagePropagator()
24-
});
19+
configuration = RabbitMQOpenTelemetryConfiguration.Default;
2520
}
26-
else
27-
{
28-
s_propagator = new TraceContextPropagator();
29-
}
30-
21+
3122
RabbitMQActivitySource.UseRoutingKeyAsOperationName = configuration.UseRoutingKeyAsOperationName;
3223
RabbitMQActivitySource.ContextExtractor = OpenTelemetryContextExtractor;
3324
RabbitMQActivitySource.ContextInjector = OpenTelemetryContextInjector;
@@ -48,7 +39,7 @@ public static TracerProviderBuilder AddRabbitMQ(this TracerProviderBuilder build
4839
private static ActivityContext OpenTelemetryContextExtractor(IReadOnlyBasicProperties props)
4940
{
5041
// Extract the PropagationContext of the upstream parent from the message headers.
51-
var parentContext = s_propagator.Extract(default, props.Headers, OpenTelemetryContextGetter);
42+
var parentContext = Propagators.DefaultTextMapPropagator.Extract(default, props.Headers, OpenTelemetryContextGetter);
5243
Baggage.Current = parentContext.Baggage;
5344
return parentContext.ActivityContext;
5445
}
@@ -57,9 +48,8 @@ private static IEnumerable<string> OpenTelemetryContextGetter(IDictionary<string
5748
{
5849
try
5950
{
60-
if (carrier.TryGetValue(key, out object value))
51+
if (carrier.TryGetValue(key, out object value) && value is byte[] bytes)
6152
{
62-
byte[] bytes = value as byte[];
6353
return new[] { Encoding.UTF8.GetString(bytes) };
6454
}
6555
}
@@ -74,7 +64,7 @@ private static IEnumerable<string> OpenTelemetryContextGetter(IDictionary<string
7464
private static void OpenTelemetryContextInjector(Activity activity, IDictionary<string, object> props)
7565
{
7666
// Inject the current Activity's context into the message headers.
77-
s_propagator.Inject(new PropagationContext(activity.Context, Baggage.Current), props, OpenTelemetryContextSetter);
67+
Propagators.DefaultTextMapPropagator.Inject(new PropagationContext(activity.Context, Baggage.Current), props, OpenTelemetryContextSetter);
7868
}
7969

8070
private static void OpenTelemetryContextSetter(IDictionary<string, object> carrier, string key, string value)

projects/Test/OTel/TestOpenTelemetry.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
using System.Text;
3737
using System.Threading.Tasks;
3838
using OpenTelemetry;
39+
using OpenTelemetry.Context.Propagation;
3940
using OpenTelemetry.Trace;
4041
using RabbitMQ.Client;
4142
using RabbitMQ.Client.Events;
@@ -51,6 +52,10 @@ public class TestOpenTelemetry : SequentialIntegrationFixture
5152
{
5253
public TestOpenTelemetry(ITestOutputHelper output) : base(output)
5354
{
55+
Sdk.SetDefaultTextMapPropagator(new CompositeTextMapPropagator(new TextMapPropagator[]
56+
{
57+
new TraceContextPropagator(), new BaggagePropagator()
58+
}));
5459
}
5560

5661
void AssertStringTagEquals(Activity activity, string name, string expected)
@@ -86,7 +91,7 @@ public async Task TestPublisherAndConsumerActivityTags(bool useRoutingKeyAsOpera
8691
{
8792
var exportedItems = new List<Activity>();
8893
using (var tracer = Sdk.CreateTracerProviderBuilder()
89-
.AddRabbitMQ(new RabbitMQOpenTelemetryConfiguration())
94+
.AddRabbitMQInstrumentation(new RabbitMQOpenTelemetryConfiguration())
9095
.AddInMemoryExporter(exportedItems)
9196
.Build())
9297
{
@@ -141,7 +146,7 @@ public async Task TestPublisherAndConsumerActivityTagsAsync(bool useRoutingKeyAs
141146
{
142147
var exportedItems = new List<Activity>();
143148
using (var tracer = Sdk.CreateTracerProviderBuilder()
144-
.AddRabbitMQ(new RabbitMQOpenTelemetryConfiguration())
149+
.AddRabbitMQInstrumentation(new RabbitMQOpenTelemetryConfiguration())
145150
.AddInMemoryExporter(exportedItems)
146151
.Build())
147152
{
@@ -197,7 +202,7 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn
197202
{
198203
var exportedItems = new List<Activity>();
199204
using (var tracer = Sdk.CreateTracerProviderBuilder()
200-
.AddRabbitMQ(new RabbitMQOpenTelemetryConfiguration())
205+
.AddRabbitMQInstrumentation(new RabbitMQOpenTelemetryConfiguration())
201206
.AddInMemoryExporter(exportedItems)
202207
.Build())
203208
{
@@ -254,7 +259,7 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(boo
254259
{
255260
var exportedItems = new List<Activity>();
256261
using (var tracer = Sdk.CreateTracerProviderBuilder()
257-
.AddRabbitMQ(new RabbitMQOpenTelemetryConfiguration())
262+
.AddRabbitMQInstrumentation(new RabbitMQOpenTelemetryConfiguration())
258263
.AddInMemoryExporter(exportedItems)
259264
.Build())
260265
{
@@ -312,7 +317,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera
312317
{
313318
var exportedItems = new List<Activity>();
314319
using (var tracer = Sdk.CreateTracerProviderBuilder()
315-
.AddRabbitMQ(new RabbitMQOpenTelemetryConfiguration())
320+
.AddRabbitMQInstrumentation(new RabbitMQOpenTelemetryConfiguration())
316321
.AddInMemoryExporter(exportedItems)
317322
.Build())
318323
{

0 commit comments

Comments
 (0)