diff --git a/storage/metric/leveldb.go b/storage/metric/leveldb.go index c3e7bbb64f..f74ca8f70c 100644 --- a/storage/metric/leveldb.go +++ b/storage/metric/leveldb.go @@ -345,8 +345,14 @@ func (l *LevelDBMetricPersistence) AppendSamples(samples clientmodel.Samples) (e samplesBatch := leveldb.NewBatch() defer samplesBatch.Close() + key := new(SampleKey) + keyDto := new(dto.SampleKey) + value := new(dto.SampleValueSeries) + for fingerprint, group := range fingerprintToSamples { for { + value.Reset() + lengthOfGroup := len(group) if lengthOfGroup == 0 { @@ -361,24 +367,21 @@ func (l *LevelDBMetricPersistence) AppendSamples(samples clientmodel.Samples) (e chunk := group[0:take] group = group[take:lengthOfGroup] - key := SampleKey{ - Fingerprint: &fingerprint, - FirstTimestamp: chunk[0].Timestamp, - LastTimestamp: chunk[take-1].Timestamp, - SampleCount: uint32(take), - } + key.Fingerprint = &fingerprint + key.FirstTimestamp = chunk[0].Timestamp + key.LastTimestamp = chunk[take-1].Timestamp + key.SampleCount = uint32(take) - value := &dto.SampleValueSeries{} for _, sample := range chunk { + // XXX: Candidate for allocation reduction. value.Value = append(value.Value, &dto.SampleValueSeries_Value{ Timestamp: proto.Int64(sample.Timestamp.Unix()), Value: proto.Float64(float64(sample.Value)), }) } - k := &dto.SampleKey{} - key.Dump(k) - samplesBatch.Put(k, value) + key.Dump(keyDto) + samplesBatch.Put(keyDto, value) } }