Skip to content

Commit 92b48e1

Browse files
authored
Added changes to AWSXRayPropagator (#2359)
1 parent 5811e1d commit 92b48e1

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

src/OpenTelemetry.Extensions.AWS/Trace/AWSXRayPropagator.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4+
#if NETFRAMEWORK
5+
using System.Net;
6+
#endif
47
using System.Diagnostics;
58
using System.Globalization;
69
using System.Numerics;
@@ -99,6 +102,34 @@ public override void Inject<T>(PropagationContext context, T carrier, Action<T,
99102
return;
100103
}
101104

105+
#if !NETFRAMEWORK
106+
if (carrier.GetType() == typeof(HttpRequestMessage))
107+
{
108+
var httpRequestMessage = (HttpRequestMessage)(object)carrier;
109+
110+
// If X-Amzn-Trace-Id already exists in the headers and the carrier is of HttpRequestMessage,
111+
// This means that the request is coming from the AWS SDK Instrumentation library and in this
112+
// case, we don't want to overwrite the propagation context from the AWS SDK Span with the
113+
// context from the outgoing HttpRequest
114+
if (httpRequestMessage.Headers.Contains(AWSXRayTraceHeaderKey))
115+
{
116+
return;
117+
}
118+
}
119+
#endif
120+
121+
#if NETFRAMEWORK
122+
if (carrier.GetType() == typeof(HttpWebRequest))
123+
{
124+
var httpWebRequest = (HttpWebRequest)(object)carrier;
125+
126+
if (httpWebRequest.Headers.Get(AWSXRayTraceHeaderKey) != null)
127+
{
128+
return;
129+
}
130+
}
131+
#endif
132+
102133
var sb = new StringBuilder();
103134
sb.Append(RootKey);
104135
sb.Append(KeyValueDelimiter);

test/OpenTelemetry.Extensions.AWS.Tests/Trace/AWSXRayPropagatorTests.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4+
#if NETFRAMEWORK
5+
using System.Net;
6+
#endif
47
using System.Diagnostics;
58
using OpenTelemetry.Context.Propagation;
69
using OpenTelemetry.Extensions.AWS.Trace;
@@ -26,8 +29,20 @@ public class AWSXRayPropagatorTests
2629
carrier[name] = value;
2730
};
2831

32+
#if NETFRAMEWORK
33+
private static readonly Action<HttpWebRequest, string, string> HeaderValueSetter = (request, name, value) => request.Headers.Add(name, value);
34+
#endif
35+
2936
private readonly AWSXRayPropagator awsXRayPropagator = new();
3037

38+
#if !NETFRAMEWORK
39+
private static Action<HttpRequestMessage, string, string> HeaderValueSetter => (request, name, value) =>
40+
{
41+
request.Headers.Remove(name);
42+
request.Headers.Add(name, value);
43+
};
44+
#endif
45+
3146
[Fact]
3247
public void TestInjectTraceHeader()
3348
{
@@ -56,6 +71,49 @@ public void TestInjectTraceHeaderNotSampled()
5671
Assert.Equal("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=0", carrier[AWSXRayTraceHeaderKey]);
5772
}
5873

74+
[Fact]
75+
public void TestInjectTraceHeaderAlreadyExists()
76+
{
77+
var traceIdHeader = "Root=1-00000-00000000000000000;Parent=123456789;Sampled=0";
78+
79+
#if !NETFRAMEWORK
80+
var carrier = new HttpRequestMessage();
81+
#else
82+
var carrier = (HttpWebRequest)WebRequest.Create(new Uri("http://www.google.com/"));
83+
#endif
84+
carrier.Headers.Add(AWSXRayTraceHeaderKey, traceIdHeader);
85+
var traceId = ActivityTraceId.CreateFromString(TraceId.AsSpan());
86+
var parentId = ActivitySpanId.CreateFromString(ParentId.AsSpan());
87+
var traceFlags = ActivityTraceFlags.None;
88+
var activityContext = new ActivityContext(traceId, parentId, traceFlags);
89+
this.awsXRayPropagator.Inject(new PropagationContext(activityContext, default), carrier, HeaderValueSetter);
90+
91+
#if !NETFRAMEWORK
92+
Assert.True(carrier.Headers.Contains(AWSXRayTraceHeaderKey));
93+
Assert.Equal(traceIdHeader, carrier.Headers.GetValues(AWSXRayTraceHeaderKey).FirstOrDefault());
94+
#else
95+
Assert.Equal(traceIdHeader, carrier.Headers.Get(AWSXRayTraceHeaderKey));
96+
#endif
97+
}
98+
99+
[Fact]
100+
public void TestInjectTraceHeaderAlreadyExistsButNotHttpRequestMessage()
101+
{
102+
var traceIdHeader = "Root=1-00000-00000000000000000;Parent=123456789;Sampled=0";
103+
var carrier = new Dictionary<string, string>()
104+
{
105+
{ AWSXRayTraceHeaderKey, traceIdHeader },
106+
};
107+
var traceId = ActivityTraceId.CreateFromString(TraceId.AsSpan());
108+
var parentId = ActivitySpanId.CreateFromString(ParentId.AsSpan());
109+
var traceFlags = ActivityTraceFlags.None;
110+
var activityContext = new ActivityContext(traceId, parentId, traceFlags);
111+
this.awsXRayPropagator.Inject(new PropagationContext(activityContext, default), carrier, Setter);
112+
113+
Assert.True(carrier.ContainsKey(AWSXRayTraceHeaderKey));
114+
Assert.Equal("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=0", carrier[AWSXRayTraceHeaderKey]);
115+
}
116+
59117
[Fact]
60118
public void TestExtractTraceHeader()
61119
{

0 commit comments

Comments
 (0)