Skip to content

Commit c1e219d

Browse files
committed
Refactor OtlpExporterOptions to use instance StandardHeaders and update related tests
1 parent 0908333 commit c1e219d

File tree

6 files changed

+25
-47
lines changed

6 files changed

+25
-47
lines changed

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright The OpenTelemetry Authors
1+
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System.Diagnostics;
@@ -32,11 +32,10 @@ public class OtlpExporterOptions : IOtlpExporterOptions
3232
internal const OtlpExportProtocol DefaultOtlpExportProtocol = OtlpExportProtocol.Grpc;
3333
#endif
3434

35-
internal static KeyValuePair<string, string>[] StandardHeaders => standardHeaders;
35+
internal KeyValuePair<string, string>[] StandardHeaders => [new("User-Agent", this.GetUserAgentString())];
3636

3737
internal readonly Func<HttpClient> DefaultHttpClientFactory;
3838

39-
private static KeyValuePair<string, string>[]? standardHeaders;
4039
private OtlpExportProtocol? protocol;
4140
private Uri? endpoint;
4241
private int? timeoutMilliseconds;
@@ -71,17 +70,9 @@ internal OtlpExporterOptions(
7170

7271
this.DefaultHttpClientFactory = () =>
7372
{
74-
return new HttpClient
75-
{
76-
Timeout = TimeSpan.FromMilliseconds(this.TimeoutMilliseconds),
77-
};
73+
return new HttpClient { Timeout = TimeSpan.FromMilliseconds(this.TimeoutMilliseconds), };
7874
};
7975

80-
standardHeaders =
81-
[
82-
new("User-Agent", this.GetUserAgentString())
83-
];
84-
8576
this.BatchExportProcessorOptions = defaultBatchOptions!;
8677
}
8778

@@ -134,15 +125,7 @@ public OtlpExportProtocol Protocol
134125
public string UserAgentProductIdentifier
135126
{
136127
get => this.userAgentProductIdentifier ?? string.Empty;
137-
set
138-
{
139-
this.userAgentProductIdentifier = string.IsNullOrWhiteSpace(value) ? string.Empty : value;
140-
141-
standardHeaders =
142-
[
143-
new("User-Agent", this.GetUserAgentString())
144-
];
145-
}
128+
set => this.userAgentProductIdentifier = string.IsNullOrWhiteSpace(value) ? string.Empty : value;
146129
}
147130

148131
/// <summary>
@@ -252,12 +235,7 @@ private string GetUserAgentString()
252235
var assembly = typeof(OtlpExporterOptions).Assembly;
253236
var baseUserAgent = $"OTel-OTLP-Exporter-Dotnet/{assembly.GetPackageVersion()}";
254237

255-
if (!string.IsNullOrEmpty(this.userAgentProductIdentifier))
256-
{
257-
return $"{this.userAgentProductIdentifier} {baseUserAgent}";
258-
}
259-
260-
return baseUserAgent;
238+
return !string.IsNullOrEmpty(this.userAgentProductIdentifier) ? $"{this.userAgentProductIdentifier} {baseUserAgent}" : baseUserAgent;
261239
}
262240

263241
private void ApplyConfiguration(

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static THeaders GetHeaders<THeaders>(this OtlpExporterOptions options, Ac
6060
}
6161
}
6262

63-
foreach (var header in OtlpExporterOptions.StandardHeaders)
63+
foreach (var header in options.StandardHeaders)
6464
{
6565
addHeader(headers, header.Key, header.Value);
6666
}

test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ public void NewOtlpHttpTraceExportClient_OtlpExporterOptions_ExporterHasCorrectP
5757

5858
Assert.NotNull(client.HttpClient);
5959

60-
Assert.Equal(2 + OtlpExporterOptions.StandardHeaders.Length, client.Headers.Count);
60+
Assert.Equal(2 + options.StandardHeaders.Length, client.Headers.Count);
6161
Assert.Contains(client.Headers, kvp => kvp.Key == header1.Name && kvp.Value == header1.Value);
6262
Assert.Contains(client.Headers, kvp => kvp.Key == header2.Name && kvp.Value == header2.Value);
6363

64-
for (int i = 0; i < OtlpExporterOptions.StandardHeaders.Length; i++)
64+
for (int i = 0; i < options.StandardHeaders.Length; i++)
6565
{
66-
Assert.Contains(client.Headers, entry => entry.Key == OtlpExporterOptions.StandardHeaders[i].Key && entry.Value == OtlpExporterOptions.StandardHeaders[i].Value);
66+
Assert.Contains(client.Headers, entry => entry.Key == options.StandardHeaders[i].Key && entry.Value == options.StandardHeaders[i].Value);
6767
}
6868
}
6969

@@ -156,13 +156,13 @@ void RunTest(Batch<Activity> batch)
156156
Assert.Equal(HttpMethod.Post, httpRequest.Method);
157157
Assert.NotNull(httpRequest.RequestUri);
158158
Assert.Equal("http://localhost:4317/", httpRequest.RequestUri.AbsoluteUri);
159-
Assert.Equal(OtlpExporterOptions.StandardHeaders.Length + 2, httpRequest.Headers.Count());
159+
Assert.Equal(options.StandardHeaders.Length + 2, httpRequest.Headers.Count());
160160
Assert.Contains(httpRequest.Headers, h => h.Key == header1.Name && h.Value.First() == header1.Value);
161161
Assert.Contains(httpRequest.Headers, h => h.Key == header2.Name && h.Value.First() == header2.Value);
162162

163-
for (int i = 0; i < OtlpExporterOptions.StandardHeaders.Length; i++)
163+
for (int i = 0; i < options.StandardHeaders.Length; i++)
164164
{
165-
Assert.Contains(httpRequest.Headers, entry => entry.Key == OtlpExporterOptions.StandardHeaders[i].Key && entry.Value.First() == OtlpExporterOptions.StandardHeaders[i].Value);
165+
Assert.Contains(httpRequest.Headers, entry => entry.Key == options.StandardHeaders[i].Key && entry.Value.First() == options.StandardHeaders[i].Value);
166166
}
167167

168168
Assert.NotNull(testHttpHandler.HttpRequestContent);

test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ public void GetHeaders_NoOptionHeaders_ReturnsStandardHeaders(string? optionHead
2525

2626
var headers = options.GetHeaders<Dictionary<string, string>>((d, k, v) => d.Add(k, v));
2727

28-
Assert.Equal(OtlpExporterOptions.StandardHeaders.Length, headers.Count);
28+
Assert.Equal(options.StandardHeaders.Length, headers.Count);
2929

30-
for (int i = 0; i < OtlpExporterOptions.StandardHeaders.Length; i++)
30+
for (int i = 0; i < options.StandardHeaders.Length; i++)
3131
{
32-
Assert.Contains(headers, entry => entry.Key == OtlpExporterOptions.StandardHeaders[i].Key && entry.Value == OtlpExporterOptions.StandardHeaders[i].Value);
32+
Assert.Contains(headers, entry => entry.Key == options.StandardHeaders[i].Key && entry.Value == options.StandardHeaders[i].Value);
3333
}
3434
}
3535

@@ -185,14 +185,14 @@ private static void VerifyHeaders(string inputOptionHeaders, string expectedNorm
185185
}
186186
}
187187

188-
Assert.Equal(OtlpExporterOptions.StandardHeaders.Length + expectedOptional.Count, headers.Count);
188+
Assert.Equal(options.StandardHeaders.Length + expectedOptional.Count, headers.Count);
189189

190190
foreach (var kvp in expectedOptional)
191191
{
192192
Assert.Contains(headers, h => h.Key == kvp.Key && h.Value == kvp.Value);
193193
}
194194

195-
foreach (var std in OtlpExporterOptions.StandardHeaders)
195+
foreach (var std in options.StandardHeaders)
196196
{
197197
Assert.Contains(headers, h => h.Key == std.Key && h.Value == std.Value);
198198
}

test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ public void UserAgentProductIdentifier_DefaultUserAgent_ContainsExporterInfo()
276276
{
277277
var options = new OtlpExporterOptions();
278278

279-
var userAgentHeader = OtlpExporterOptions.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent");
279+
var userAgentHeader = options.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent");
280280

281281
Assert.NotNull(userAgentHeader.Key);
282282
Assert.StartsWith("OTel-OTLP-Exporter-Dotnet/", userAgentHeader.Value, StringComparison.OrdinalIgnoreCase);
@@ -292,7 +292,7 @@ public void UserAgentProductIdentifier_WithProductIdentifier_IsPrepended()
292292

293293
Assert.Equal("MyDistribution/1.2.3", options.UserAgentProductIdentifier);
294294

295-
var userAgentHeader = OtlpExporterOptions.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent");
295+
var userAgentHeader = options.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent");
296296

297297
Assert.NotNull(userAgentHeader.Key);
298298
Assert.StartsWith("MyDistribution/1.2.3 OTel-OTLP-Exporter-Dotnet/", userAgentHeader.Value, StringComparison.OrdinalIgnoreCase);
@@ -303,12 +303,12 @@ public void UserAgentProductIdentifier_UpdatesStandardHeaders()
303303
{
304304
var options = new OtlpExporterOptions();
305305

306-
var initialUserAgent = OtlpExporterOptions.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
306+
var initialUserAgent = options.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
307307
Assert.StartsWith("OTel-OTLP-Exporter-Dotnet/", initialUserAgent, StringComparison.OrdinalIgnoreCase);
308308

309309
options.UserAgentProductIdentifier = "MyProduct/1.0.0";
310310

311-
var updatedUserAgent = OtlpExporterOptions.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
311+
var updatedUserAgent = options.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
312312
Assert.StartsWith("MyProduct/1.0.0 OTel-OTLP-Exporter-Dotnet/", updatedUserAgent, StringComparison.OrdinalIgnoreCase);
313313
Assert.NotEqual(initialUserAgent, updatedUserAgent);
314314
}
@@ -321,7 +321,7 @@ public void UserAgentProductIdentifier_Rfc7231Compliance_SpaceSeparatedTokens()
321321
UserAgentProductIdentifier = "MyProduct/1.0.0",
322322
};
323323

324-
var userAgentHeader = OtlpExporterOptions.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
324+
var userAgentHeader = options.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
325325

326326
// Should have two product tokens separated by a space
327327
var tokens = userAgentHeader.Split(' ');
@@ -341,7 +341,7 @@ public void UserAgentProductIdentifier_EmptyOrWhitespace_UsesDefaultUserAgent(st
341341
UserAgentProductIdentifier = identifier,
342342
};
343343

344-
var userAgentHeader = OtlpExporterOptions.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
344+
var userAgentHeader = options.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
345345

346346
// Should only contain the default exporter identifier, no leading space
347347
Assert.StartsWith("OTel-OTLP-Exporter-Dotnet/", userAgentHeader, StringComparison.OrdinalIgnoreCase);
@@ -356,7 +356,7 @@ public void UserAgentProductIdentifier_MultipleProducts_CorrectFormat()
356356
UserAgentProductIdentifier = "MySDK/2.0.0 MyDistribution/1.0.0",
357357
};
358358

359-
var userAgentHeader = OtlpExporterOptions.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
359+
var userAgentHeader = options.StandardHeaders.FirstOrDefault(h => h.Key == "User-Agent").Value;
360360

361361
Assert.StartsWith("MySDK/2.0.0 MyDistribution/1.0.0 OTel-OTLP-Exporter-Dotnet/", userAgentHeader, StringComparison.OrdinalIgnoreCase);
362362
}

test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void UseOtlpExporterDefaultTest()
3838
var exporterOptions = sp.GetRequiredService<IOptionsMonitor<OtlpExporterBuilderOptions>>().CurrentValue;
3939

4040
#if NETFRAMEWORK || NETSTANDARD2_0
41-
Assert.Equal(new Uri(OtlpExporterOptions.DefaultHttpEndpoint), exporterOptions.DefaultOptions.Endpoint);
41+
Assert.Equal(new Uri(options.DefaultHttpEndpoint), exporterOptions.DefaultOptions.Endpoint);
4242
#else
4343
Assert.Equal(new Uri(OtlpExporterOptions.DefaultGrpcEndpoint), exporterOptions.DefaultOptions.Endpoint);
4444
#endif

0 commit comments

Comments
 (0)