diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 8bde9ac7fea..c023e6ba628 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -6,8 +6,10 @@ ([#2949](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2949/) [#2897](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2897)) -* Perf improvement for Histogram, by implementing lock-free updates. - ([#2951](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2951)) +* Perf improvement for Histogram and HistogramSumCount by implementing lock-free + updates. + ([2951](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2951)) + ([2961](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2961)) ## 1.2.0-rc2 diff --git a/src/OpenTelemetry/Metrics/MetricPoint.cs b/src/OpenTelemetry/Metrics/MetricPoint.cs index f27219af55c..8094249326d 100644 --- a/src/OpenTelemetry/Metrics/MetricPoint.cs +++ b/src/OpenTelemetry/Metrics/MetricPoint.cs @@ -347,10 +347,22 @@ internal void Update(double number) case AggregationType.HistogramSumCount: { - lock (this.histogramBuckets.LockObject) + var sw = default(SpinWait); + while (true) { - this.runningValue.AsLong++; - this.histogramBuckets.RunningSum += number; + if (Interlocked.Exchange(ref this.histogramBuckets.IsCriticalSectionOccupied, 1) == 0) + { + unchecked + { + this.runningValue.AsLong++; + this.histogramBuckets.RunningSum += number; + } + + this.histogramBuckets.IsCriticalSectionOccupied = 0; + break; + } + + sw.SpinOnce(); } break;