in internal/coreinternal/aggregateutil/aggregate.go [152:235]
func mergeNumberDataPoints(dpsMap map[string]pmetric.NumberDataPointSlice, agg AggregationType, to pmetric.NumberDataPointSlice) {
for _, dps := range dpsMap {
dp := to.AppendEmpty()
dps.At(0).MoveTo(dp)
switch dp.ValueType() {
case pmetric.NumberDataPointValueTypeDouble:
medianNumbers := []float64{dp.DoubleValue()}
for i := 1; i < dps.Len(); i++ {
switch agg {
case Sum, Mean:
dp.SetDoubleValue(dp.DoubleValue() + doubleVal(dps.At(i)))
case Max:
dp.SetDoubleValue(math.Max(dp.DoubleValue(), doubleVal(dps.At(i))))
case Min:
dp.SetDoubleValue(math.Min(dp.DoubleValue(), doubleVal(dps.At(i))))
case Median:
medianNumbers = append(medianNumbers, doubleVal(dps.At(i)))
case Count:
dp.SetDoubleValue(float64(dps.Len()))
}
if dps.At(i).StartTimestamp() < dp.StartTimestamp() {
dp.SetStartTimestamp(dps.At(i).StartTimestamp())
}
}
if agg == Mean {
dp.SetDoubleValue(dp.DoubleValue() / float64(dps.Len()))
}
if agg == Median {
if len(medianNumbers) == 1 {
dp.SetDoubleValue(medianNumbers[0])
} else {
sort.Float64s(medianNumbers)
mNumber := len(medianNumbers) / 2
if math.Mod(float64(len(medianNumbers)), 2) != 0 {
dp.SetDoubleValue(medianNumbers[mNumber])
} else {
dp.SetDoubleValue((medianNumbers[mNumber-1] + medianNumbers[mNumber]) / 2)
}
}
}
case pmetric.NumberDataPointValueTypeInt:
medianNumbers := []int64{dp.IntValue()}
for i := 1; i < dps.Len(); i++ {
switch agg {
case Sum, Mean:
dp.SetIntValue(dp.IntValue() + dps.At(i).IntValue())
case Max:
if dp.IntValue() < intVal(dps.At(i)) {
dp.SetIntValue(intVal(dps.At(i)))
}
case Min:
if dp.IntValue() > intVal(dps.At(i)) {
dp.SetIntValue(intVal(dps.At(i)))
}
case Median:
medianNumbers = append(medianNumbers, intVal(dps.At(i)))
case Count:
dp.SetIntValue(int64(dps.Len()))
}
if dps.At(i).StartTimestamp() < dp.StartTimestamp() {
dp.SetStartTimestamp(dps.At(i).StartTimestamp())
}
}
if agg == Median {
if len(medianNumbers) == 1 {
dp.SetIntValue(medianNumbers[0])
} else {
sort.Slice(medianNumbers, func(i, j int) bool {
return medianNumbers[i] < medianNumbers[j]
})
mNumber := len(medianNumbers) / 2
if math.Mod(float64(len(medianNumbers)), 2) != 0 {
dp.SetIntValue(medianNumbers[mNumber])
} else {
dp.SetIntValue((medianNumbers[mNumber-1] + medianNumbers[mNumber]) / 2)
}
}
}
if agg == Mean {
dp.SetIntValue(dp.IntValue() / int64(dps.Len()))
}
}
}
}