Skip to content

Commit 177c381

Browse files
authored
Merge branch 'main' into interlocked-volatile
2 parents e9da2e3 + 796f49b commit 177c381

File tree

22 files changed

+117
-138
lines changed

22 files changed

+117
-138
lines changed

.editorconfig

+4
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ dotnet_diagnostic.IDE0005.severity = warning
156156
# RS0041: Public members should not use oblivious types
157157
dotnet_diagnostic.RS0041.severity = suggestion
158158

159+
[*Tests.cs]
160+
# CA1515: Disable making types internal for Tests classes. It is required by xunit
161+
dotnet_diagnostic.CA1515.severity = none
162+
159163
[**/obj/**.cs]
160164
generated_code = true
161165

Directory.Packages.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
5-
<OTelLatestStableVer>1.11.1</OTelLatestStableVer>
5+
<OTelLatestStableVer>1.11.2</OTelLatestStableVer>
66

77
<!--
88
This is typically the latest annual release of .NET. Use this wherever

src/OpenTelemetry.Api.ProviderBuilderExtensions/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ Notes](../../RELEASENOTES.md).
77

88
## Unreleased
99

10+
## 1.11.2
11+
12+
Released 2025-Mar-04
13+
1014
## 1.11.1
1115

1216
Released 2025-Jan-22

src/OpenTelemetry.Api/CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ Notes](../../RELEASENOTES.md).
66

77
## Unreleased
88

9+
## 1.11.2
10+
11+
Released 2025-Mar-04
12+
13+
* Revert optimize performance of `TraceContextPropagator.Extract` introduced
14+
in #5749 to resolve [GHSA-8785-wc3w-h8q6](https://github.com/open-telemetry/opentelemetry-dotnet/security/advisories/GHSA-8785-wc3w-h8q6).
15+
([#6161](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6161))
16+
917
## 1.11.1
1018

1119
Released 2025-Jan-22

src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs

+24-112
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4-
using System.Buffers;
54
using System.Diagnostics;
65
using System.Runtime.CompilerServices;
6+
using System.Text;
77
using OpenTelemetry.Internal;
88

99
namespace OpenTelemetry.Context.Propagation;
@@ -76,7 +76,7 @@ public override PropagationContext Extract<T>(PropagationContext context, T carr
7676
var tracestateCollection = getter(carrier, TraceState);
7777
if (tracestateCollection?.Any() ?? false)
7878
{
79-
TryExtractTracestate(tracestateCollection, out tracestate);
79+
TryExtractTracestate(tracestateCollection.ToArray(), out tracestate);
8080
}
8181

8282
return new PropagationContext(
@@ -220,37 +220,31 @@ internal static bool TryExtractTraceparent(string traceparent, out ActivityTrace
220220
return true;
221221
}
222222

223-
internal static bool TryExtractTracestate(IEnumerable<string> tracestateCollection, out string tracestateResult)
223+
internal static bool TryExtractTracestate(string[] tracestateCollection, out string tracestateResult)
224224
{
225225
tracestateResult = string.Empty;
226226

227-
char[]? rentedArray = null;
228-
Span<char> traceStateBuffer = stackalloc char[128]; // 256B
229-
Span<char> keyLookupBuffer = stackalloc char[96]; // 192B (3x32 keys)
230-
int keys = 0;
231-
int charsWritten = 0;
232-
233-
try
227+
if (tracestateCollection != null)
234228
{
235-
foreach (var tracestateItem in tracestateCollection)
229+
var keySet = new HashSet<string>();
230+
var result = new StringBuilder();
231+
for (int i = 0; i < tracestateCollection.Length; ++i)
236232
{
237-
var tracestate = tracestateItem.AsSpan();
238-
int position = 0;
239-
240-
while (position < tracestate.Length)
233+
var tracestate = tracestateCollection[i].AsSpan();
234+
int begin = 0;
235+
while (begin < tracestate.Length)
241236
{
242-
int length = tracestate.Slice(position).IndexOf(',');
237+
int length = tracestate.Slice(begin).IndexOf(',');
243238
ReadOnlySpan<char> listMember;
244-
245239
if (length != -1)
246240
{
247-
listMember = tracestate.Slice(position, length).Trim();
248-
position += length + 1;
241+
listMember = tracestate.Slice(begin, length).Trim();
242+
begin += length + 1;
249243
}
250244
else
251245
{
252-
listMember = tracestate.Slice(position).Trim();
253-
position = tracestate.Length;
246+
listMember = tracestate.Slice(begin).Trim();
247+
begin = tracestate.Length;
254248
}
255249

256250
// https://github.com/w3c/trace-context/blob/master/spec/20-http_request_header_format.md#tracestate-header-field-values
@@ -261,7 +255,7 @@ internal static bool TryExtractTracestate(IEnumerable<string> tracestateCollecti
261255
continue;
262256
}
263257

264-
if (keys >= 32)
258+
if (keySet.Count >= 32)
265259
{
266260
// https://github.com/w3c/trace-context/blob/master/spec/20-http_request_header_format.md#list
267261
// test_tracestate_member_count_limit
@@ -292,107 +286,25 @@ internal static bool TryExtractTracestate(IEnumerable<string> tracestateCollecti
292286
}
293287

294288
// ValidateKey() call above has ensured the key does not contain upper case letters.
295-
296-
var duplicationCheckLength = Math.Min(key.Length, 3);
297-
298-
if (keys > 0)
299-
{
300-
// Fast path check of first three chars for potential duplicated keys
301-
var potentialMatchingKeyPosition = 1;
302-
var found = false;
303-
for (int i = 0; i < keys * 3; i += 3)
304-
{
305-
if (keyLookupBuffer.Slice(i, duplicationCheckLength).SequenceEqual(key.Slice(0, duplicationCheckLength)))
306-
{
307-
found = true;
308-
break;
309-
}
310-
311-
potentialMatchingKeyPosition++;
312-
}
313-
314-
// If the fast check has found a possible duplicate, we need to do a full check
315-
if (found)
316-
{
317-
var bufferToCompare = traceStateBuffer.Slice(0, charsWritten);
318-
319-
// We know which key is the first possible duplicate, so skip to that key
320-
// by slicing to the position after the appropriate comma.
321-
for (int i = 1; i < potentialMatchingKeyPosition; i++)
322-
{
323-
var commaIndex = bufferToCompare.IndexOf(',');
324-
325-
if (commaIndex > -1)
326-
{
327-
bufferToCompare.Slice(commaIndex);
328-
}
329-
}
330-
331-
int existingIndex = -1;
332-
while ((existingIndex = bufferToCompare.IndexOf(key)) > -1)
333-
{
334-
if ((existingIndex > 0 && bufferToCompare[existingIndex - 1] != ',') || bufferToCompare[existingIndex + key.Length] != '=')
335-
{
336-
continue; // this is not a key
337-
}
338-
339-
return false; // test_tracestate_duplicated_keys
340-
}
341-
}
342-
}
343-
344-
// Store up to the first three characters of the key for use in the duplicate lookup fast path
345-
var startKeyLookupIndex = keys > 0 ? keys * 3 : 0;
346-
key.Slice(0, duplicationCheckLength).CopyTo(keyLookupBuffer.Slice(startKeyLookupIndex));
347-
348-
// Check we have capacity to write the key and value
349-
var requiredCapacity = charsWritten > 0 ? listMember.Length + 1 : listMember.Length;
350-
351-
while (charsWritten + requiredCapacity > traceStateBuffer.Length)
289+
if (!keySet.Add(key.ToString()))
352290
{
353-
GrowBuffer(ref rentedArray, ref traceStateBuffer);
291+
// test_tracestate_duplicated_keys
292+
return false;
354293
}
355294

356-
if (charsWritten > 0)
295+
if (result.Length > 0)
357296
{
358-
traceStateBuffer[charsWritten++] = ',';
297+
result.Append(',');
359298
}
360299

361-
listMember.CopyTo(traceStateBuffer.Slice(charsWritten));
362-
charsWritten += listMember.Length;
363-
364-
keys++;
300+
result.Append(listMember.ToString());
365301
}
366302
}
367303

368-
tracestateResult = traceStateBuffer.Slice(0, charsWritten).ToString();
369-
370-
return true;
304+
tracestateResult = result.ToString();
371305
}
372-
finally
373-
{
374-
if (rentedArray is not null)
375-
{
376-
ArrayPool<char>.Shared.Return(rentedArray);
377-
rentedArray = null;
378-
}
379-
}
380-
381-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
382-
static void GrowBuffer(ref char[]? array, ref Span<char> buffer)
383-
{
384-
var newBuffer = ArrayPool<char>.Shared.Rent(buffer.Length * 2);
385306

386-
buffer.CopyTo(newBuffer.AsSpan());
387-
388-
if (array is not null)
389-
{
390-
ArrayPool<char>.Shared.Return(array);
391-
}
392-
393-
array = newBuffer;
394-
buffer = array.AsSpan();
395-
}
307+
return true;
396308
}
397309

398310
private static byte HexCharToByte(char c)

src/OpenTelemetry.Exporter.Console/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ Notes](../../RELEASENOTES.md).
66

77
## Unreleased
88

9+
## 1.11.2
10+
11+
Released 2025-Mar-04
12+
913
## 1.11.1
1014

1115
Released 2025-Jan-22

src/OpenTelemetry.Exporter.InMemory/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ Notes](../../RELEASENOTES.md).
66

77
## Unreleased
88

9+
## 1.11.2
10+
11+
Released 2025-Mar-04
12+
913
## 1.11.1
1014

1115
Released 2025-Jan-22

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ Notes](../../RELEASENOTES.md).
77

88
## Unreleased
99

10+
## 1.11.2
11+
12+
Released 2025-Mar-04
13+
1014
* Fixed a bug in .NET Framework gRPC export client where the default success
1115
export response was incorrectly marked as false, now changed to true, ensuring
1216
exports are correctly marked as successful.

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpGrpcExportClient.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public override ExportClientResponse SendExportRequest(byte[] buffer, int conten
9393
grpcStatusDetailsHeader = GrpcProtocolHelpers.GetHeaderValue(trailingHeaders, GrpcStatusDetailsHeader);
9494
}
9595

96-
OpenTelemetryProtocolExporterEventSource.Log.ExportFailure(this.Endpoint.ToString(), "Export failed due to unexpected status code.");
96+
OpenTelemetryProtocolExporterEventSource.Log.ExportFailure(this.Endpoint, "Export failed due to unexpected status code.", status);
9797

9898
return new ExportClientGrpcResponse(
9999
success: false,

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OpenTelemetryProtocolExporterEventSource.cs

+13-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Diagnostics.Tracing;
55
using Microsoft.Extensions.Configuration;
6+
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.Grpc;
67
using OpenTelemetry.Internal;
78

89
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation;
@@ -94,6 +95,15 @@ public void GrpcRetryDelayParsingFailed(string? grpcStatusDetailsHeader, Excepti
9495
}
9596
}
9697

98+
[NonEvent]
99+
public void ExportFailure(Uri endpoint, string message, Status status)
100+
{
101+
if (Log.IsEnabled(EventLevel.Error, EventKeywords.All))
102+
{
103+
this.ExportFailure(endpoint.ToString(), message, status.ToString());
104+
}
105+
}
106+
97107
[Event(2, Message = "Exporter failed send data to collector to {0} endpoint. Data will not be sent. Exception: {1}", Level = EventLevel.Error)]
98108
public void FailedToReachCollector(string rawCollectorUri, string ex)
99109
{
@@ -208,10 +218,10 @@ public void GrpcStatusWarning(string endpoint, string statusCode)
208218
this.WriteEvent(22, endpoint, statusCode);
209219
}
210220

211-
[Event(23, Message = "Export failed for {0}. Message: {1}", Level = EventLevel.Error)]
212-
public void ExportFailure(string endpoint, string message)
221+
[Event(23, Message = "Export failed for {0}. Message: {1}. {2}.", Level = EventLevel.Error)]
222+
public void ExportFailure(string endpoint, string message, string statusString)
213223
{
214-
this.WriteEvent(23, endpoint, message);
224+
this.WriteEvent(23, endpoint, message, statusString);
215225
}
216226

217227
[Event(24, Message = "Failed to parse gRPC retry delay from header grpcStatusDetailsHeader: '{0}'. Exception: {1}", Level = EventLevel.Warning)]

src/OpenTelemetry.Exporter.Prometheus.AspNetCore/CHANGELOG.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ Notes](../../RELEASENOTES.md).
77

88
## Unreleased
99

10-
* Updated OpenTelemetry core component version(s) to `1.11.1`.
11-
([#6088](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6088))
10+
## 1.11.2-beta.1
11+
12+
Released 2025-Mar-05
13+
14+
* Updated OpenTelemetry core component version(s) to `1.11.2`.
15+
([#6169](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6169))
1216

1317
## 1.11.0-beta.1
1418

src/OpenTelemetry.Exporter.Prometheus.HttpListener/CHANGELOG.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ Notes](../../RELEASENOTES.md).
77

88
## Unreleased
99

10-
* Updated OpenTelemetry core component version(s) to `1.11.1`.
11-
([#6088](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6088))
10+
## 1.11.2-beta.1
11+
12+
Released 2025-Mar-05
13+
14+
* Updated OpenTelemetry core component version(s) to `1.11.2`.
15+
([#6169](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6169))
1216

1317
## 1.11.0-beta.1
1418

src/OpenTelemetry.Exporter.Zipkin/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ Notes](../../RELEASENOTES.md).
66

77
## Unreleased
88

9+
## 1.11.2
10+
11+
Released 2025-Mar-04
12+
913
## 1.11.1
1014

1115
Released 2025-Jan-22

src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ Notes](../../RELEASENOTES.md).
66

77
## Unreleased
88

9+
## 1.11.2
10+
11+
Released 2025-Mar-04
12+
913
## 1.11.1
1014

1115
Released 2025-Jan-22

src/OpenTelemetry.Extensions.Propagators/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ covering all components see: [Release Notes](../../RELEASENOTES.md).
66

77
## Unreleased
88

9+
## 1.11.2
10+
11+
Released 2025-Mar-04
12+
913
## 1.11.1
1014

1115
Released 2025-Jan-22

src/OpenTelemetry.Shims.OpenTracing/CHANGELOG.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ Notes](../../RELEASENOTES.md).
66

77
## Unreleased
88

9-
* Updated OpenTelemetry core component version(s) to `1.11.1`.
10-
([#6088](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6088))
9+
## 1.11.2-beta.1
10+
11+
Released 2025-Mar-05
12+
13+
* Updated OpenTelemetry core component version(s) to `1.11.2`.
14+
([#6169](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6169))
1115

1216
## 1.11.0-beta.1
1317

0 commit comments

Comments
 (0)