in processor/lsmintervalprocessor/internal/data/add.go [109:165]
func (add Adder) Exponential(state, dp pmetric.ExponentialHistogramDataPoint) error {
type H = pmetric.ExponentialHistogramDataPoint
if state.Scale() != dp.Scale() {
hi, lo := expo.HiLo(state, dp, H.Scale)
from, to := expo.Scale(hi.Scale()), expo.Scale(lo.Scale())
expo.Downscale(hi.Positive(), from, to)
expo.Downscale(hi.Negative(), from, to)
hi.SetScale(lo.Scale())
}
// Downscale if an expected number of buckets after the merge is too large.
from := expo.Scale(state.Scale())
to := min(
expo.Limit(add.maxExponentialHistogramBuckets, from, state.Positive(), dp.Positive()),
expo.Limit(add.maxExponentialHistogramBuckets, from, state.Negative(), dp.Negative()),
)
if from != to {
expo.Downscale(state.Positive(), from, to)
expo.Downscale(state.Negative(), from, to)
expo.Downscale(dp.Positive(), from, to)
expo.Downscale(dp.Negative(), from, to)
state.SetScale(int32(to))
dp.SetScale(int32(to))
}
if state.ZeroThreshold() != dp.ZeroThreshold() {
hi, lo := expo.HiLo(state, dp, H.ZeroThreshold)
expo.WidenZero(lo, hi.ZeroThreshold())
}
expo.Merge(state.Positive(), dp.Positive())
expo.Merge(state.Negative(), dp.Negative())
state.SetCount(state.Count() + dp.Count())
state.SetZeroCount(state.ZeroCount() + dp.ZeroCount())
if state.HasSum() && dp.HasSum() {
state.SetSum(state.Sum() + dp.Sum())
} else {
state.RemoveSum()
}
if state.HasMin() && dp.HasMin() {
state.SetMin(math.Min(state.Min(), dp.Min()))
} else {
state.RemoveMin()
}
if state.HasMax() && dp.HasMax() {
state.SetMax(math.Max(state.Max(), dp.Max()))
} else {
state.RemoveMax()
}
return nil
}