in processor/lsmintervalprocessor/internal/merger/limits/tracker.go [324:367]
func (t *Trackers) Unmarshal(d []byte) error {
if len(d) == 0 {
return nil
}
var (
offset int
latestScopeTracker *ScopeTracker
latestMetricTracker *MetricTracker
)
for offset < len(d) {
trackerTyp := trackerType(d[offset])
offset += 1
// The below code will panic with NPE if the binary encoding is
// unexpected. The expected binary encoding must have one resource
// tracker then scope tracker followed by metric tracker followed by
// datapoint tracker.
var tracker *Tracker
switch trackerTyp {
case resourceTrackerType:
tracker = t.GetResourceTracker()
case scopeTrackerType:
latestScopeTracker = t.NewScopeTracker()
tracker = latestScopeTracker.Tracker
// Nil the previous metric tracker as we expect a new metric
// tracker for the new scope.
latestMetricTracker = nil
case metricTrackerType:
latestMetricTracker = latestScopeTracker.NewMetricTracker()
tracker = latestMetricTracker.Tracker
case dpTrackerType:
tracker = latestMetricTracker.NewDatapointTracker()
default:
return errors.New("invalid tracker found")
}
n, err := tracker.Unmarshal(d[offset:])
if err != nil {
return err
}
offset += n
}
return nil
}