mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-15 01:54:06 -08:00
df59320886
This implementation is based on this design doc: https://docs.google.com/document/d/1Kppm7qL9C-BJB1j6yb6-9ObG3AbdZnFUBYPNNWwDBYM/edit?usp=sharing This commit adds support to accept out-of-order ("OOO") sample into the TSDB up to a configurable time allowance. If OOO is enabled, overlapping querying are automatically enabled. Signed-off-by: Ganesh Vernekar <ganeshvern@gmail.com> Co-authored-by: Jesus Vazquez <jesus.vazquez@grafana.com> Co-authored-by: Ganesh Vernekar <ganeshvern@gmail.com> Co-authored-by: Dieter Plaetinck <dieter@grafana.com>
81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package chunkenc
|
|
|
|
import (
|
|
"sort"
|
|
)
|
|
|
|
type sample struct {
|
|
t int64
|
|
v float64
|
|
}
|
|
|
|
// OOOChunk maintains samples in time-ascending order.
|
|
// Inserts for timestamps already seen, are dropped.
|
|
// Samples are stored uncompressed to allow easy sorting.
|
|
// Perhaps we can be more efficient later.
|
|
type OOOChunk struct {
|
|
samples []sample
|
|
}
|
|
|
|
func NewOOOChunk(capacity int) *OOOChunk {
|
|
return &OOOChunk{samples: make([]sample, 0, capacity)}
|
|
}
|
|
|
|
// Insert inserts the sample such that order is maintained.
|
|
// Returns false if insert was not possible due to the same timestamp already existing.
|
|
func (o *OOOChunk) Insert(t int64, v float64) bool {
|
|
// find index of sample we should replace
|
|
i := sort.Search(len(o.samples), func(i int) bool { return o.samples[i].t >= t })
|
|
|
|
if i >= len(o.samples) {
|
|
// none found. append it at the end
|
|
o.samples = append(o.samples, sample{t, v})
|
|
return true
|
|
}
|
|
|
|
if o.samples[i].t == t {
|
|
return false
|
|
}
|
|
|
|
// expand length by 1 to make room. use a zero sample, we will overwrite it anyway
|
|
o.samples = append(o.samples, sample{})
|
|
copy(o.samples[i+1:], o.samples[i:])
|
|
o.samples[i] = sample{t, v}
|
|
|
|
return true
|
|
}
|
|
|
|
func (o *OOOChunk) NumSamples() int {
|
|
return len(o.samples)
|
|
}
|
|
|
|
func (o *OOOChunk) ToXor() (*XORChunk, error) {
|
|
x := NewXORChunk()
|
|
app, err := x.Appender()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, s := range o.samples {
|
|
app.Append(s.t, s.v)
|
|
}
|
|
return x, nil
|
|
}
|
|
|
|
func (o *OOOChunk) ToXorBetweenTimestamps(mint, maxt int64) (*XORChunk, error) {
|
|
x := NewXORChunk()
|
|
app, err := x.Appender()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, s := range o.samples {
|
|
if s.t < mint {
|
|
continue
|
|
}
|
|
if s.t > maxt {
|
|
break
|
|
}
|
|
app.Append(s.t, s.v)
|
|
}
|
|
return x, nil
|
|
}
|