From fc4d64489663fbaafe5cbe5ba70897fcd2a8a7fe Mon Sep 17 00:00:00 2001 From: Zhonghao Zhao Date: Wed, 6 Nov 2024 23:18:38 +0000 Subject: [PATCH] Reformate code. --- exporter/awsemfexporter/datapoint.go | 212 +++++++++++----------- exporter/awsemfexporter/datapoint_test.go | 125 +++++++++++++ 2 files changed, 233 insertions(+), 104 deletions(-) diff --git a/exporter/awsemfexporter/datapoint.go b/exporter/awsemfexporter/datapoint.go index 5f4dd3673dc2..6eb5d317b5cf 100644 --- a/exporter/awsemfexporter/datapoint.go +++ b/exporter/awsemfexporter/datapoint.go @@ -228,17 +228,13 @@ func (dps histogramDataPointSlice) IsStaleNaNInf(i int) (bool, pcommon.Map) { // - Count is accumulated based on the bucket counts within each split. func (dps exponentialHistogramDataPointSlice) CalculateDeltaDatapoints(idx int, _ string, _ bool, _ *emfCalculators) ([]dataPoint, bool) { metric := dps.ExponentialHistogramDataPointSlice.At(idx) - scale := metric.Scale() - base := math.Pow(2, math.Pow(2, float64(-scale))) - var bucketBegin float64 - var bucketEnd float64 const splitThreshold = 100 var currentBucketIndex = 0 - var datapoints []dataPoint var currentPositiveIndex = metric.Positive().BucketCounts().Len() - 1 var currentZeroIndex = 0 var currentNegativeIndex = 0 + var datapoints []dataPoint totalBucketLen := metric.Positive().BucketCounts().Len() + metric.Negative().BucketCounts().Len() if metric.ZeroCount() > 0 { totalBucketLen++ @@ -285,107 +281,11 @@ func (dps exponentialHistogramDataPointSlice) CalculateDeltaDatapoints(idx int, } // Set mid-point of positive buckets in values/counts array. - positiveBuckets := metric.Positive() - positiveOffset := positiveBuckets.Offset() - positiveBucketCounts := positiveBuckets.BucketCounts() - bucketBegin = 0 - bucketEnd = 0 - - for split.length < split.capacity && currentPositiveIndex >= 0 { - index := currentPositiveIndex + int(positiveOffset) - if bucketEnd == 0 { - bucketEnd = math.Pow(base, float64(index+1)) - } else { - bucketEnd = bucketBegin - } - bucketBegin = math.Pow(base, float64(index)) - metricVal := (bucketBegin + bucketEnd) / 2 - count := positiveBucketCounts.At(currentPositiveIndex) - if count > 0 { - split.cWMetricHistogram.Values = append(split.cWMetricHistogram.Values, metricVal) - split.cWMetricHistogram.Counts = append(split.cWMetricHistogram.Counts, float64(count)) - split.length++ - split.cWMetricHistogram.Count += count - if split.length == 1 && currentBucketIndex != 0 { - if bucketBegin < bucketEnd { - split.cWMetricHistogram.Max = bucketEnd - } else { - split.cWMetricHistogram.Max = bucketBegin - } - } - if split.length == split.capacity && currentBucketIndex != totalBucketLen-1 { - if bucketBegin < bucketEnd { - split.cWMetricHistogram.Min = bucketBegin - } else { - split.cWMetricHistogram.Min = bucketEnd - } - } - } - currentBucketIndex++ - currentPositiveIndex-- - } - + currentBucketIndex, currentPositiveIndex = iteratePositiveBuckets(&split, metric, currentBucketIndex, currentPositiveIndex, totalBucketLen) // Set count of zero bucket in values/counts array. - if metric.ZeroCount() > 0 && split.length < split.capacity && currentZeroIndex == 0 { - split.cWMetricHistogram.Values = append(split.cWMetricHistogram.Values, 0) - split.cWMetricHistogram.Counts = append(split.cWMetricHistogram.Counts, float64(metric.ZeroCount())) - split.length++ - split.cWMetricHistogram.Count += metric.ZeroCount() - if split.length == 1 && currentBucketIndex != 0 { - split.cWMetricHistogram.Max = 0 - } - if split.length == split.capacity && currentBucketIndex != totalBucketLen-1 { - split.cWMetricHistogram.Min = 0 - } - currentZeroIndex++ - currentBucketIndex++ - } - + currentBucketIndex, currentZeroIndex = iterateZeroBucket(&split, metric, currentBucketIndex, currentZeroIndex, totalBucketLen) // Set mid-point of negative buckets in values/counts array. - // According to metrics spec, the value in histogram is expected to be non-negative. - // https://opentelemetry.io/docs/specs/otel/metrics/api/#histogram - // However, the negative support is defined in metrics data model. - // https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exponentialhistogram - // The negative is also supported but only verified with unit test. - negativeBuckets := metric.Negative() - negativeOffset := negativeBuckets.Offset() - negativeBucketCounts := negativeBuckets.BucketCounts() - bucketBegin = 0 - bucketEnd = 0 - - for split.length < split.capacity && currentNegativeIndex < metric.Negative().BucketCounts().Len() { - index := currentNegativeIndex + int(negativeOffset) - if bucketEnd == 0 { - bucketEnd = -math.Pow(base, float64(index)) - } else { - bucketEnd = bucketBegin - } - bucketBegin = -math.Pow(base, float64(index+1)) - metricVal := (bucketBegin + bucketEnd) / 2 - count := negativeBucketCounts.At(currentNegativeIndex) - if count > 0 { - split.cWMetricHistogram.Values = append(split.cWMetricHistogram.Values, metricVal) - split.cWMetricHistogram.Counts = append(split.cWMetricHistogram.Counts, float64(count)) - split.length++ - split.cWMetricHistogram.Count += count - if split.length == 1 && currentBucketIndex != 0 { - if bucketBegin < bucketEnd { - split.cWMetricHistogram.Max = bucketEnd - } else { - split.cWMetricHistogram.Max = bucketBegin - } - } - if split.length == split.capacity && currentBucketIndex != totalBucketLen-1 { - if bucketBegin < bucketEnd { - split.cWMetricHistogram.Min = bucketBegin - } else { - split.cWMetricHistogram.Min = bucketEnd - } - } - } - currentBucketIndex++ - currentNegativeIndex++ - } + currentBucketIndex, currentNegativeIndex = iterateNegativeBuckets(&split, metric, currentBucketIndex, currentNegativeIndex, totalBucketLen) // Add the current split to the datapoints list datapoints = append(datapoints, dataPoint{ @@ -396,9 +296,113 @@ func (dps exponentialHistogramDataPointSlice) CalculateDeltaDatapoints(idx int, }) } + //Override the min and max values of the first and last splits with the raw data of the metric. + datapoints[0].value.(*cWMetricHistogram).Max = metric.Max() + datapoints[len(datapoints)-1].value.(*cWMetricHistogram).Min = metric.Min() + return datapoints, true } +func iteratePositiveBuckets(split *dataPointSplit, metric pmetric.ExponentialHistogramDataPoint, currentBucketIndex int, currentPositiveIndex int, totalBucketLen int) (int, int) { + scale := metric.Scale() + base := math.Pow(2, math.Pow(2, float64(-scale))) + positiveBuckets := metric.Positive() + positiveOffset := positiveBuckets.Offset() + positiveBucketCounts := positiveBuckets.BucketCounts() + bucketBegin := 0.0 + bucketEnd := 0.0 + + for split.length < split.capacity && currentPositiveIndex >= 0 { + index := currentPositiveIndex + int(positiveOffset) + if bucketEnd == 0 { + bucketEnd = math.Pow(base, float64(index+1)) + } else { + bucketEnd = bucketBegin + } + bucketBegin = math.Pow(base, float64(index)) + metricVal := (bucketBegin + bucketEnd) / 2 + count := positiveBucketCounts.At(currentPositiveIndex) + if count > 0 { + split.cWMetricHistogram.Values = append(split.cWMetricHistogram.Values, metricVal) + split.cWMetricHistogram.Counts = append(split.cWMetricHistogram.Counts, float64(count)) + split.length++ + split.cWMetricHistogram.Count += count + if split.length == 1 { + split.cWMetricHistogram.Max = bucketEnd + } + if split.length == split.capacity { + split.cWMetricHistogram.Min = bucketBegin + } + } + currentBucketIndex++ + currentPositiveIndex-- + } + + return currentBucketIndex, currentPositiveIndex +} + +func iterateZeroBucket(split *dataPointSplit, metric pmetric.ExponentialHistogramDataPoint, currentBucketIndex int, currentZeroIndex int, totalBucketLen int) (int, int) { + if metric.ZeroCount() > 0 && split.length < split.capacity && currentZeroIndex == 0 { + split.cWMetricHistogram.Values = append(split.cWMetricHistogram.Values, 0) + split.cWMetricHistogram.Counts = append(split.cWMetricHistogram.Counts, float64(metric.ZeroCount())) + split.length++ + split.cWMetricHistogram.Count += metric.ZeroCount() + if split.length == 1 { + split.cWMetricHistogram.Max = 0 + } + if split.length == split.capacity { + split.cWMetricHistogram.Min = 0 + } + currentZeroIndex++ + currentBucketIndex++ + } + + return currentBucketIndex, currentZeroIndex +} + +func iterateNegativeBuckets(split *dataPointSplit, metric pmetric.ExponentialHistogramDataPoint, currentBucketIndex int, currentNegativeIndex int, totalBucketLen int) (int, int) { + // According to metrics spec, the value in histogram is expected to be non-negative. + // https://opentelemetry.io/docs/specs/otel/metrics/api/#histogram + // However, the negative support is defined in metrics data model. + // https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exponentialhistogram + // The negative is also supported but only verified with unit test. + scale := metric.Scale() + base := math.Pow(2, math.Pow(2, float64(-scale))) + negativeBuckets := metric.Negative() + negativeOffset := negativeBuckets.Offset() + negativeBucketCounts := negativeBuckets.BucketCounts() + bucketBegin := 0.0 + bucketEnd := 0.0 + + for split.length < split.capacity && currentNegativeIndex < metric.Negative().BucketCounts().Len() { + index := currentNegativeIndex + int(negativeOffset) + if bucketEnd == 0 { + bucketEnd = -math.Pow(base, float64(index)) + } else { + bucketEnd = bucketBegin + } + bucketBegin = -math.Pow(base, float64(index+1)) + metricVal := (bucketBegin + bucketEnd) / 2 + count := negativeBucketCounts.At(currentNegativeIndex) + if count > 0 { + split.cWMetricHistogram.Values = append(split.cWMetricHistogram.Values, metricVal) + split.cWMetricHistogram.Counts = append(split.cWMetricHistogram.Counts, float64(count)) + split.length++ + split.cWMetricHistogram.Count += count + if split.length == 1 { + split.cWMetricHistogram.Max = bucketEnd + } + if split.length == split.capacity { + split.cWMetricHistogram.Min = bucketBegin + } + } + currentBucketIndex++ + currentNegativeIndex++ + } + + return currentBucketIndex, currentNegativeIndex +} + func (dps exponentialHistogramDataPointSlice) IsStaleNaNInf(i int) (bool, pcommon.Map) { metric := dps.ExponentialHistogramDataPointSlice.At(i) if metric.Flags().NoRecordedValue() { diff --git a/exporter/awsemfexporter/datapoint_test.go b/exporter/awsemfexporter/datapoint_test.go index 2a2bc5836d9e..e71602b0916f 100644 --- a/exporter/awsemfexporter/datapoint_test.go +++ b/exporter/awsemfexporter/datapoint_test.go @@ -1207,6 +1207,86 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSliceWithSplitDat }, }, }, + { + name: "Exponential histogram with exact 200 buckets, including positive, negative buckets", + histogramDPS: func() pmetric.ExponentialHistogramDataPointSlice { + histogramDPS := pmetric.NewExponentialHistogramDataPointSlice() + histogramDP := histogramDPS.AppendEmpty() + posBucketCounts := make([]uint64, 100) + for i := range posBucketCounts { + posBucketCounts[i] = uint64(i + 1) + } + histogramDP.Positive().BucketCounts().FromRaw(posBucketCounts) + negBucketCounts := make([]uint64, 100) + for i := range negBucketCounts { + negBucketCounts[i] = uint64(i + 1) + } + histogramDP.Negative().BucketCounts().FromRaw(negBucketCounts) + histogramDP.SetSum(100000) + histogramDP.SetMin(-9e+36) + histogramDP.SetMax(9e+36) + histogramDP.SetCount(uint64(3662)) + histogramDP.Attributes().PutStr("label1", "value1") + return histogramDPS + }(), + expectedDatapoints: []dataPoint{ + { + name: "foo", + value: &cWMetricHistogram{ + Values: []float64{ + 9.50737950171172e+29, 4.75368975085586e+29, 2.37684487542793e+29, 1.188422437713965e+29, 5.942112188569825e+28, + 2.9710560942849127e+28, 1.4855280471424563e+28, 7.427640235712282e+27, 3.713820117856141e+27, 1.8569100589280704e+27, + 9.284550294640352e+26, 4.642275147320176e+26, 2.321137573660088e+26, 1.160568786830044e+26, 5.80284393415022e+25, + 2.90142196707511e+25, 1.450710983537555e+25, 7.253554917687775e+24, 3.6267774588438875e+24, 1.8133887294219438e+24, + 9.066943647109719e+23, 4.5334718235548594e+23, 2.2667359117774297e+23, 1.1333679558887149e+23, 5.666839779443574e+22, + 2.833419889721787e+22, 1.4167099448608936e+22, 7.083549724304468e+21, 3.541774862152234e+21, 1.770887431076117e+21, + 8.854437155380585e+20, 4.4272185776902924e+20, 2.2136092888451462e+20, 1.1068046444225731e+20, 5.5340232221128655e+19, + 2.7670116110564327e+19, 1.3835058055282164e+19, 6.917529027641082e+18, 3.458764513820541e+18, 1.7293822569102705e+18, + 8.646911284551352e+17, 4.323455642275676e+17, 2.161727821137838e+17, 1.080863910568919e+17, 5.404319552844595e+16, + 2.7021597764222976e+16, 1.3510798882111488e+16, 6.755399441055744e+15, 3.377699720527872e+15, 1.688849860263936e+15, + 8.44424930131968e+14, 4.22212465065984e+14, 2.11106232532992e+14, 1.05553116266496e+14, 5.2776558133248e+13, + 2.6388279066624e+13, 1.3194139533312e+13, 6.597069766656e+12, 3.298534883328e+12, 1.649267441664e+12, 8.24633720832e+11, + 4.12316860416e+11, 2.06158430208e+11, 1.03079215104e+11, 5.1539607552e+10, 2.5769803776e+10, 1.2884901888e+10, 6.442450944e+09, + 3.221225472e+09, 1.610612736e+09, 8.05306368e+08, 4.02653184e+08, 2.01326592e+08, 1.00663296e+08, 5.0331648e+07, + 2.5165824e+07, 1.2582912e+07, 6.291456e+06, 3.145728e+06, 1.572864e+06, 786432, 393216, 196608, 98304, 49152, 24576, 12288, + 6144, 3072, 1536, 768, 384, 192, 96, 48, 24, 12, 6, 3, 1.5}, + Counts: []float64{ + 100, 99, 98, 97, 96, 95, 94, + 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, + 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, + Sum: 100000, Count: 5050, Min: 1, Max: 9e+36}, + labels: map[string]string{"label1": "value1"}, + }, + { + name: "foo", + value: &cWMetricHistogram{ + Values: []float64{ + -1.5, -3, -6, -12, -24, -48, -96, -192, -384, -768, -1536, -3072, -6144, -12288, -24576, -49152, -98304, -196608, -393216, + -786432, -1.572864e+06, -3.145728e+06, -6.291456e+06, -1.2582912e+07, -2.5165824e+07, -5.0331648e+07, -1.00663296e+08, + -2.01326592e+08, -4.02653184e+08, -8.05306368e+08, -1.610612736e+09, -3.221225472e+09, -6.442450944e+09, -1.2884901888e+10, + -2.5769803776e+10, -5.1539607552e+10, -1.03079215104e+11, -2.06158430208e+11, -4.12316860416e+11, -8.24633720832e+11, + -1.649267441664e+12, -3.298534883328e+12, -6.597069766656e+12, -1.3194139533312e+13, -2.6388279066624e+13, -5.2776558133248e+13, + -1.05553116266496e+14, -2.11106232532992e+14, -4.22212465065984e+14, -8.44424930131968e+14, -1.688849860263936e+15, + -3.377699720527872e+15, -6.755399441055744e+15, -1.3510798882111488e+16, -2.7021597764222976e+16, + -5.404319552844595e+16, -1.080863910568919e+17, -2.161727821137838e+17, -4.323455642275676e+17, -8.646911284551352e+17, + -1.7293822569102705e+18, -3.458764513820541e+18, -6.917529027641082e+18, -1.3835058055282164e+19, -2.7670116110564327e+19, + -5.5340232221128655e+19, -1.1068046444225731e+20, -2.2136092888451462e+20, -4.4272185776902924e+20, -8.854437155380585e+20, + -1.770887431076117e+21, -3.541774862152234e+21, -7.083549724304468e+21, -1.4167099448608936e+22, -2.833419889721787e+22, + -5.666839779443574e+22, -1.1333679558887149e+23, -2.2667359117774297e+23, -4.5334718235548594e+23, -9.066943647109719e+23, + -1.8133887294219438e+24, -3.6267774588438875e+24, -7.253554917687775e+24, -1.450710983537555e+25, -2.90142196707511e+25, + -5.80284393415022e+25, -1.160568786830044e+26, -2.321137573660088e+26, -4.642275147320176e+26, -9.284550294640352e+26, + -1.8569100589280704e+27, -3.713820117856141e+27, -7.427640235712282e+27, -1.4855280471424563e+28, -2.9710560942849127e+28, + -5.942112188569825e+28, -1.188422437713965e+29, -2.37684487542793e+29, -4.75368975085586e+29, -9.50737950171172e+29}, + Counts: []float64{ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100}, + Sum: 0, Count: 5050, Min: -9e+36, Max: -1}, + labels: map[string]string{"label1": "value1"}, + }, + }, + }, { name: "Exponential histogram with more than 200 buckets, including positive, negative and zero buckets", histogramDPS: func() pmetric.ExponentialHistogramDataPointSlice { @@ -1311,6 +1391,51 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSliceWithSplitDat }, }, }, + { + name: "Exponential histogram with more than 100 buckets, including positive, negative and zero buckets with zero counts", + histogramDPS: func() pmetric.ExponentialHistogramDataPointSlice { + histogramDPS := pmetric.NewExponentialHistogramDataPointSlice() + histogramDP := histogramDPS.AppendEmpty() + posBucketCounts := make([]uint64, 60) + for i := range posBucketCounts { + posBucketCounts[i] = uint64(i % 5) + } + histogramDP.Positive().BucketCounts().FromRaw(posBucketCounts) + histogramDP.SetZeroCount(2) + negBucketCounts := make([]uint64, 60) + for i := range negBucketCounts { + negBucketCounts[i] = uint64(i % 5) + } + histogramDP.Negative().BucketCounts().FromRaw(negBucketCounts) + histogramDP.SetSum(1000) + histogramDP.SetMin(-9e+17) + histogramDP.SetMax(9e+17) + histogramDP.SetCount(uint64(3662)) + histogramDP.Attributes().PutStr("label1", "value1") + return histogramDPS + }(), + expectedDatapoints: []dataPoint{ + { + name: "foo", + value: &cWMetricHistogram{ + Values: []float64{8.646911284551352e+17, 4.323455642275676e+17, 2.161727821137838e+17, 1.080863910568919e+17, 2.7021597764222976e+16, + 1.3510798882111488e+16, 6.755399441055744e+15, 3.377699720527872e+15, 8.44424930131968e+14, 4.22212465065984e+14, 2.11106232532992e+14, + 1.05553116266496e+14, 2.6388279066624e+13, 1.3194139533312e+13, 6.597069766656e+12, 3.298534883328e+12, 8.24633720832e+11, 4.12316860416e+11, + 2.06158430208e+11, 1.03079215104e+11, 2.5769803776e+10, 1.2884901888e+10, 6.442450944e+09, 3.221225472e+09, 8.05306368e+08, 4.02653184e+08, + 2.01326592e+08, 1.00663296e+08, 2.5165824e+07, 1.2582912e+07, 6.291456e+06, 3.145728e+06, 786432, 393216, 196608, 98304, 24576, 12288, 6144, 3072, + 768, 384, 192, 96, 24, 12, 6, 3, 0, -3, -6, -12, -24, -96, -192, -384, -768, -3072, -6144, -12288, -24576, -98304, -196608, -393216, -786432, + -3.145728e+06, -6.291456e+06, -1.2582912e+07, -2.5165824e+07, -1.00663296e+08, -2.01326592e+08, -4.02653184e+08, -8.05306368e+08, -3.221225472e+09, + -6.442450944e+09, -1.2884901888e+10, -2.5769803776e+10, -1.03079215104e+11, -2.06158430208e+11, -4.12316860416e+11, -8.24633720832e+11, -3.298534883328e+12, + -6.597069766656e+12, -1.3194139533312e+13, -2.6388279066624e+13, -1.05553116266496e+14, -2.11106232532992e+14, -4.22212465065984e+14, -8.44424930131968e+14, + -3.377699720527872e+15, -6.755399441055744e+15, -1.3510798882111488e+16, -2.7021597764222976e+16, -1.080863910568919e+17, -2.161727821137838e+17, + -4.323455642275676e+17, -8.646911284551352e+17}, + Counts: []float64{4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, + 2, 1, 2, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}, + Sum: 1000, Count: 242, Min: -9e+17, Max: 9e+17}, + labels: map[string]string{"label1": "value1"}, + }, + }, + }, } for _, tc := range testCases {