in processor/lsmintervalprocessor/internal/merger/value.go [501:544]
func (s *Value) addScopeMetrics(
resID identity.Resource,
rm pdataResourceMetrics,
otherSm pmetric.ScopeMetrics,
) (identity.Scope, pdataScopeMetrics, error) {
scopeID := identity.OfScope(resID, otherSm.Scope())
if sm, ok := s.scopeLookup[scopeID]; ok {
return scopeID, sm, nil
}
if rm.scopeTracker.CheckOverflow(scopeID.Hash) {
// Overflow, get/prepare an overflow bucket
overflowScopeID, err := s.getOverflowScopeIdentity(resID)
if err != nil {
return identity.Scope{}, pdataScopeMetrics{}, err
}
if sm, ok := s.scopeLookup[overflowScopeID]; ok {
return overflowScopeID, sm, nil
}
overflowScope := rm.ScopeMetrics().AppendEmpty()
overflowScope.SetSchemaUrl(otherSm.SchemaUrl())
if err := decorate(
overflowScope.Scope().Attributes(),
s.scopeLimitCfg.Overflow.Attributes,
); err != nil {
return identity.Scope{}, pdataScopeMetrics{}, err
}
sm := pdataScopeMetrics{
ScopeMetrics: overflowScope,
metricTracker: rm.scopeTracker.NewMetricTracker(),
}
s.scopeLookup[overflowScopeID] = sm
return overflowScopeID, sm, nil
}
// Clone it *without* the MetricSlice data
smOrig := rm.ScopeMetrics().AppendEmpty()
otherSm.Scope().CopyTo(smOrig.Scope())
smOrig.SetSchemaUrl(otherSm.SchemaUrl())
sm := pdataScopeMetrics{
ScopeMetrics: smOrig,
metricTracker: rm.scopeTracker.NewMetricTracker(),
}
s.scopeLookup[scopeID] = sm
return scopeID, sm, nil
}