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
}