2021-06-29 01:37:41 -07:00
|
|
|
// Copyright 2021 The Prometheus Authors
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package chunkenc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/prometheus/prometheus/pkg/histogram"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestHistoChunkSameBuckets(t *testing.T) {
|
|
|
|
|
|
|
|
c := NewHistoChunk()
|
|
|
|
|
2021-06-29 06:57:59 -07:00
|
|
|
type res struct {
|
|
|
|
t int64
|
|
|
|
h histogram.SparseHistogram
|
|
|
|
}
|
|
|
|
|
|
|
|
// create fresh appender and add the first histogram
|
|
|
|
|
2021-06-29 01:37:41 -07:00
|
|
|
app, err := c.Appender()
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, c.NumSamples(), 0)
|
|
|
|
|
2021-06-29 06:57:59 -07:00
|
|
|
ts := int64(1234567890)
|
|
|
|
|
2021-06-29 01:37:41 -07:00
|
|
|
h := histogram.SparseHistogram{
|
|
|
|
Count: 5,
|
|
|
|
ZeroCount: 2,
|
|
|
|
Sum: 18.4,
|
|
|
|
//ZeroThreshold: 1, TODO
|
|
|
|
Schema: 1,
|
|
|
|
PositiveSpans: []histogram.Span{
|
|
|
|
{Offset: 0, Length: 2},
|
|
|
|
{Offset: 1, Length: 2},
|
|
|
|
},
|
|
|
|
NegativeSpans: []histogram.Span{},
|
|
|
|
PositiveBuckets: []int64{1, 1, -1, 0},
|
|
|
|
NegativeBuckets: []int64{},
|
|
|
|
}
|
|
|
|
|
2021-06-29 06:57:59 -07:00
|
|
|
app.AppendHistogram(ts, h)
|
2021-06-29 01:37:41 -07:00
|
|
|
require.Equal(t, c.NumSamples(), 1)
|
|
|
|
|
2021-06-29 06:57:59 -07:00
|
|
|
exp := []res{
|
|
|
|
{t: ts, h: h},
|
2021-06-29 01:37:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO add an update
|
|
|
|
// h.Count = 9
|
|
|
|
// h.Sum = 61
|
|
|
|
|
|
|
|
// TODO add update with new appender
|
|
|
|
// Start with a new appender every 10th sample. This emulates starting
|
|
|
|
// appending to a partially filled chunk.
|
|
|
|
// app, err = c.Appender()
|
|
|
|
// require.NoError(t, err)
|
|
|
|
|
|
|
|
// app.Append(ts, v)
|
|
|
|
|
|
|
|
// 1. Expand iterator in simple case.
|
|
|
|
it1 := c.iterator(nil)
|
|
|
|
require.NoError(t, it1.Err())
|
2021-06-29 06:57:59 -07:00
|
|
|
var res1 []res
|
2021-06-29 01:37:41 -07:00
|
|
|
for it1.Next() {
|
2021-06-29 07:38:46 -07:00
|
|
|
ts, h := it1.AtHistogram()
|
2021-06-29 06:57:59 -07:00
|
|
|
res1 = append(res1, res{t: ts, h: h})
|
2021-06-29 01:37:41 -07:00
|
|
|
}
|
|
|
|
require.NoError(t, it1.Err())
|
|
|
|
require.Equal(t, exp, res1)
|
|
|
|
|
|
|
|
// 2. Expand second iterator while reusing first one.
|
|
|
|
//it2 := c.Iterator(it1)
|
|
|
|
//var res2 []pair
|
|
|
|
//for it2.Next() {
|
|
|
|
// ts, v := it2.At()
|
|
|
|
// res2 = append(res2, pair{t: ts, v: v})
|
|
|
|
// }
|
|
|
|
// require.NoError(t, it2.Err())
|
|
|
|
// require.Equal(t, exp, res2)
|
|
|
|
|
|
|
|
// 3. Test iterator Seek.
|
|
|
|
// mid := len(exp) / 2
|
|
|
|
|
|
|
|
// it3 := c.Iterator(nil)
|
|
|
|
// var res3 []pair
|
|
|
|
// require.Equal(t, true, it3.Seek(exp[mid].t))
|
|
|
|
// Below ones should not matter.
|
|
|
|
// require.Equal(t, true, it3.Seek(exp[mid].t))
|
|
|
|
// require.Equal(t, true, it3.Seek(exp[mid].t))
|
|
|
|
// ts, v = it3.At()
|
|
|
|
// res3 = append(res3, pair{t: ts, v: v})
|
|
|
|
|
|
|
|
// for it3.Next() {
|
|
|
|
// ts, v := it3.At()
|
|
|
|
// res3 = append(res3, pair{t: ts, v: v})
|
|
|
|
// }
|
|
|
|
// require.NoError(t, it3.Err())
|
|
|
|
// require.Equal(t, exp[mid:], res3)
|
|
|
|
// require.Equal(t, false, it3.Seek(exp[len(exp)-1].t+1))
|
|
|
|
}
|