diff --git a/src/OpenTelemetry.Contrib.Extensions.AWSXRay/AWSXRayIdGenerator.cs b/src/OpenTelemetry.Contrib.Extensions.AWSXRay/AWSXRayIdGenerator.cs index 4678254ea9..eba7c5b7b0 100644 --- a/src/OpenTelemetry.Contrib.Extensions.AWSXRay/AWSXRayIdGenerator.cs +++ b/src/OpenTelemetry.Contrib.Extensions.AWSXRay/AWSXRayIdGenerator.cs @@ -18,7 +18,6 @@ using System.Diagnostics; using System.Globalization; using System.Linq; -using System.Threading; using OpenTelemetry.Internal; using OpenTelemetry.Trace; @@ -38,16 +37,7 @@ public static class AWSXRayIdGenerator private static readonly DateTime EpochStart = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); private static readonly long UnixEpochMicroseconds = EpochStart.Ticks / TicksPerMicrosecond; private static readonly Random Global = new Random(); - private static readonly ThreadLocal Local = new ThreadLocal(() => - { - int seed; - lock (Global) - { - seed = Global.Next(); - } - - return new Random(seed); - }); + private static object randLock = new object(); internal static void ReplaceTraceId(Sampler sampler = null) { @@ -129,11 +119,17 @@ private static string GenerateHexNumber(int digits) Guard.ThrowIfOutOfRange(digits, min: 0); byte[] bytes = new byte[digits / 2]; - NextBytes(bytes); - string hexNumber = string.Concat(bytes.Select(x => x.ToString("x2", CultureInfo.InvariantCulture)).ToArray()); - if (digits % 2 != 0) + + string hexNumber; + + lock (randLock) { - hexNumber += Next(16).ToString("x", CultureInfo.InvariantCulture); + NextBytes(bytes); + hexNumber = string.Concat(bytes.Select(x => x.ToString("x2", CultureInfo.InvariantCulture)).ToArray()); + if (digits % 2 != 0) + { + hexNumber += Next(16).ToString("x", CultureInfo.InvariantCulture); + } } return hexNumber; @@ -145,7 +141,7 @@ private static string GenerateHexNumber(int digits) /// An array of bytes to contain random numbers. private static void NextBytes(byte[] buffer) { - Local.Value.NextBytes(buffer); + Global.NextBytes(buffer); } /// @@ -155,7 +151,7 @@ private static void NextBytes(byte[] buffer) /// A 32-bit signed integer that is greater than or equal to 0, and less than maxValue. private static int Next(int maxValue) { - return Local.Value.Next(maxValue); + return Global.Next(maxValue); } private static ActivitySamplingResult ComputeRootActivitySamplingResult( diff --git a/src/OpenTelemetry.Contrib.Extensions.AWSXRay/CHANGELOG.md b/src/OpenTelemetry.Contrib.Extensions.AWSXRay/CHANGELOG.md index ad7c981332..67369c91e6 100644 --- a/src/OpenTelemetry.Contrib.Extensions.AWSXRay/CHANGELOG.md +++ b/src/OpenTelemetry.Contrib.Extensions.AWSXRay/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog - OpenTelemetry.Contrib.Extensions.AWSXRay +## 1.3.0 [TBD] + +* Enhancement - AWSXRayIdGenerator - Generate X-Ray IDs with global Random + instance instead of recreating with ThreadLocal + ([#380](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/380)) + ## 1.2.0 [2022-May-18] * Enhancement - AWSEKSResourceDetector - Validate ClusterName/ContainerID