diff --git a/src/OpenTelemetry/Metrics/AggregatorStore.cs b/src/OpenTelemetry/Metrics/AggregatorStore.cs index 65c9c2c2df7..525d3ba7566 100644 --- a/src/OpenTelemetry/Metrics/AggregatorStore.cs +++ b/src/OpenTelemetry/Metrics/AggregatorStore.cs @@ -996,7 +996,7 @@ private void UpdateLongCustomTags(long value, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); @@ -484,15 +476,7 @@ internal void UpdateWithExemplar(long number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); @@ -505,15 +489,7 @@ internal void UpdateWithExemplar(long number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); @@ -522,37 +498,37 @@ internal void UpdateWithExemplar(long number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); @@ -661,15 +629,7 @@ internal void UpdateWithExemplar(double number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); @@ -685,15 +645,7 @@ internal void UpdateWithExemplar(double number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); @@ -702,37 +654,37 @@ internal void UpdateWithExemplar(double number, ReadOnlySpan> tags = default, bool reportExemplar = false, bool isSampled = false) + private void UpdateHistogram(double number, ReadOnlySpan> tags = default, bool isSampled = false) { Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); @@ -1257,20 +1209,12 @@ private void UpdateHistogram(double number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); } - private void UpdateHistogramWithMinMax(double number, ReadOnlySpan> tags = default, bool reportExemplar = false, bool isSampled = false) + private void UpdateHistogramWithMinMax(double number, ReadOnlySpan> tags = default, bool isSampled = false) { Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); @@ -1286,26 +1230,18 @@ private void UpdateHistogramWithMinMax(double number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); } - private void UpdateHistogramWithBuckets(double number, ReadOnlySpan> tags = default, bool reportExemplar = false, bool isSampled = false) + private void UpdateHistogramWithBuckets(double number, ReadOnlySpan> tags = default, bool isSampled = false) { Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); var histogramBuckets = this.mpComponents!.HistogramBuckets; - int i = histogramBuckets!.FindBucketIndex(number); + int bucketIndex = histogramBuckets!.FindBucketIndex(number); this.mpComponents.AcquireLock(); @@ -1313,29 +1249,21 @@ private void UpdateHistogramWithBuckets(double number, ReadOnlySpan(number, tags, i)); - } + this.OfferExplicitBucketHistogramExemplarIfSampled(number, tags, bucketIndex, isSampled); this.mpComponents.ReleaseLock(); } - private void UpdateHistogramWithBucketsAndMinMax(double number, ReadOnlySpan> tags = default, bool reportExemplar = false, bool isSampled = false) + private void UpdateHistogramWithBucketsAndMinMax(double number, ReadOnlySpan> tags = default, bool isSampled = false) { Debug.Assert(this.mpComponents?.HistogramBuckets != null, "histogramBuckets was null"); var histogramBuckets = this.mpComponents!.HistogramBuckets; - int i = histogramBuckets!.FindBucketIndex(number); + int bucketIndex = histogramBuckets!.FindBucketIndex(number); this.mpComponents.AcquireLock(); @@ -1343,26 +1271,18 @@ private void UpdateHistogramWithBucketsAndMinMax(double number, ReadOnlySpan(number, tags, i)); - } + this.OfferExplicitBucketHistogramExemplarIfSampled(number, tags, bucketIndex, isSampled); this.mpComponents.ReleaseLock(); } - private void UpdateBase2ExponentialHistogram(double number, ReadOnlySpan> tags = default, bool reportExemplar = false, bool isSampled = false) + private void UpdateBase2ExponentialHistogram(double number, ReadOnlySpan> tags = default, bool isSampled = false) { if (number < 0) { @@ -1382,20 +1302,12 @@ private void UpdateBase2ExponentialHistogram(double number, ReadOnlySpan(number, tags)); - } + this.OfferExemplarIfSampled(number, tags, isSampled); this.mpComponents.ReleaseLock(); } - private void UpdateBase2ExponentialHistogramWithMinMax(double number, ReadOnlySpan> tags = default, bool reportExemplar = false, bool isSampled = false) + private void UpdateBase2ExponentialHistogramWithMinMax(double number, ReadOnlySpan> tags = default, bool isSampled = false) { if (number < 0) { @@ -1418,17 +1330,56 @@ private void UpdateBase2ExponentialHistogramWithMinMax(double number, ReadOnlySp histogram.RunningMax = Math.Max(histogram.RunningMax, number); } - if (reportExemplar && isSampled) + this.OfferExemplarIfSampled(number, tags, isSampled); + + this.mpComponents.ReleaseLock(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private readonly void OfferExemplarIfSampled(T number, ReadOnlySpan> tags, bool isSampled) + where T : struct + { + if (isSampled) { - Debug.Assert(this.mpComponents.ExemplarReservoir != null, "ExemplarReservoir was null"); + Debug.Assert(this.mpComponents?.ExemplarReservoir != null, "ExemplarReservoir was null"); // TODO: Need to ensure that the lock is always released. // A custom implementation of `ExemplarReservoir.Offer` might throw an exception. - this.mpComponents.ExemplarReservoir!.Offer( - new ExemplarMeasurement(number, tags)); + if (typeof(T) == typeof(long)) + { + this.mpComponents!.ExemplarReservoir!.Offer( + new ExemplarMeasurement((long)(object)number, tags)); + } + else if (typeof(T) == typeof(double)) + { + this.mpComponents!.ExemplarReservoir!.Offer( + new ExemplarMeasurement((double)(object)number, tags)); + } + else + { + Debug.Fail("Unexpected type"); + this.mpComponents!.ExemplarReservoir!.Offer( + new ExemplarMeasurement(Convert.ToDouble(number), tags)); + } } + } - this.mpComponents.ReleaseLock(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private readonly void OfferExplicitBucketHistogramExemplarIfSampled( + double number, + ReadOnlySpan> tags, + int bucketIndex, + bool isSampled) + { + if (isSampled) + { + Debug.Assert(this.mpComponents?.ExemplarReservoir != null, "ExemplarReservoir was null"); + + // TODO: Need to ensure that the lock is always released. + // A custom implementation of `ExemplarReservoir.Offer` might throw an exception. + this.mpComponents!.ExemplarReservoir!.Offer( + new ExemplarMeasurement(number, tags, bucketIndex)); + } } [MethodImpl(MethodImplOptions.AggressiveInlining)]