in processor/lsmintervalprocessor/internal/merger/value.go [158:198]
func (s *Value) Unmarshal(data []byte) error {
if len(data) == 0 {
return errors.New("failed to unmarshal value, invalid length")
}
if data[0] != version {
return fmt.Errorf("unsupported version: %d", data[0])
}
data = data[1:]
if len(data) == 0 {
return nil
}
if len(data) < 4 {
// For non-nil value, tracker must be marshaled
return errors.New("failed to unmarshal value, invalid length")
}
trackersLen := int(binary.BigEndian.Uint32(data[:4]))
data = data[4:]
if trackersLen > 0 {
// Unmarshal trackers
s.trackers = limits.NewTrackers(
uint64(s.resourceLimitCfg.MaxCardinality),
uint64(s.scopeLimitCfg.MaxCardinality),
uint64(s.metricLimitCfg.MaxCardinality),
uint64(s.datapointLimitCfg.MaxCardinality),
)
err := s.trackers.Unmarshal(data[:trackersLen])
if err != nil {
return fmt.Errorf("failed to unmarshal limits: %w", err)
}
data = data[trackersLen:]
}
// Unmarshal pmetric.Metrics
var unmarshaler pmetric.ProtoUnmarshaler
var err error
s.source, err = unmarshaler.UnmarshalMetrics(data)
if err != nil {
return fmt.Errorf("failed to unmarshal data: %w", err)
}
return nil
}