func()

in processor/lsmintervalprocessor/internal/merger/value.go [201:264]


func (v *Value) Merge(op *Value) error {
	if op == nil || op.source.DataPointCount() == 0 {
		// Nothing to merge
		return nil
	}
	// Initialize the destination lookup table
	v.initLookupTables()
	// Iterate over the source's pmetric structure and merge into destination
	rmsOther := op.source.ResourceMetrics()
	for i := 0; i < rmsOther.Len(); i++ {
		rmOther := rmsOther.At(i)
		resID, rm, err := v.addResourceMetrics(rmOther)
		if err != nil {
			return fmt.Errorf("failed while merging resource metrics: %w", err)
		}
		scopeTracker := op.trackers.GetScopeTracker(i)
		if scopeTracker != nil {
			if err := rm.scopeTracker.MergeEstimators(scopeTracker.Tracker); err != nil {
				return fmt.Errorf("failed to merge scope overflow estimators: %w", err)
			}
		}
		smsOther := rmOther.ScopeMetrics()
		for j := 0; j < smsOther.Len(); j++ {
			smOther := smsOther.At(j)
			scopeID, sm, err := v.addScopeMetrics(resID, rm, smOther)
			if err != nil {
				return fmt.Errorf("failed while merging scope metrics: %w", err)
			}
			metricTracker := scopeTracker.GetMetricTracker(j)
			if metricTracker != nil {
				if err := sm.metricTracker.MergeEstimators(metricTracker.Tracker); err != nil {
					return fmt.Errorf("failed to merge scope datapoints overflow estimators: %w", err)
				}
			}
			msOther := smOther.Metrics()
			for k := 0; k < msOther.Len(); k++ {
				mOther := msOther.At(k)
				metricID, m, overflow := v.addMetric(scopeID, sm, mOther)
				if overflow {
					// On metric overflow, we discard any datapoint overflow estimator
					// since metric overflow is accounts only for unique metrics.
					continue
				}
				dpTracker := metricTracker.GetDatapointTracker(k)
				if dpTracker != nil {
					if err := m.datapointTracker.MergeEstimators(dpTracker); err != nil {
						return fmt.Errorf("failed to merge datapoint overflow estimators: %w", err)
					}
				}
				if err := v.mergeMetric(metricID, m, mOther); err != nil {
					return fmt.Errorf("failed to merge metric: %w", err)
				}
			}
		}
	}
	if op.trackers != nil {
		if err := v.trackers.GetResourceTracker().MergeEstimators(
			op.trackers.GetResourceTracker(),
		); err != nil {
			return fmt.Errorf("failed to merge resource overflow estimators: %w", err)
		}
	}
	return nil
}