func()

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
}