Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
loki/pkg/logql/matrix_test.go

130 lines
3.1 KiB

package logql
import (
"testing"
"time"
"github.com/prometheus/prometheus/model/labels"
"github.com/prometheus/prometheus/promql"
"github.com/stretchr/testify/require"
)
func TestMatrixStepper(t *testing.T) {
var (
start = time.Unix(0, 0)
end = time.Unix(6, 0)
step = time.Second
)
m := promql.Matrix{
promql.Series{
Metric: labels.FromStrings("foo", "bar"),
Floats: []promql.FPoint{
{T: start.UnixNano(), F: 0},
{T: start.Add(step).UnixNano() / int64(time.Millisecond), F: 1},
{T: start.Add(2*step).UnixNano() / int64(time.Millisecond), F: 2},
{T: start.Add(3*step).UnixNano() / int64(time.Millisecond), F: 3},
{T: start.Add(4*step).UnixNano() / int64(time.Millisecond), F: 4},
{T: start.Add(5*step).UnixNano() / int64(time.Millisecond), F: 5},
},
},
promql.Series{
Metric: labels.FromStrings("bazz", "buzz"),
Floats: []promql.FPoint{
{T: start.Add(2*step).UnixNano() / int64(time.Millisecond), F: 2},
{T: start.Add(4*step).UnixNano() / int64(time.Millisecond), F: 4},
},
},
}
s := NewMatrixStepper(start, end, step, m)
expected := []promql.Vector{
{
promql.Sample{
T: start.UnixNano(), F: 0,
Metric: labels.FromStrings("foo", "bar"),
},
},
{
promql.Sample{
T: start.Add(step).UnixNano() / int64(time.Millisecond), F: 1,
Metric: labels.FromStrings("foo", "bar"),
},
},
{
promql.Sample{
T: start.Add(2*step).UnixNano() / int64(time.Millisecond), F: 2,
Metric: labels.FromStrings("foo", "bar"),
},
promql.Sample{
T: start.Add(2*step).UnixNano() / int64(time.Millisecond), F: 2,
Metric: labels.FromStrings("bazz", "buzz"),
},
},
{
promql.Sample{
T: start.Add(3*step).UnixNano() / int64(time.Millisecond), F: 3,
Metric: labels.FromStrings("foo", "bar"),
},
},
{
promql.Sample{
T: start.Add(4*step).UnixNano() / int64(time.Millisecond), F: 4,
Metric: labels.FromStrings("foo", "bar"),
},
promql.Sample{
T: start.Add(4*step).UnixNano() / int64(time.Millisecond), F: 4,
Metric: labels.FromStrings("bazz", "buzz"),
},
},
{
promql.Sample{
T: start.Add(5*step).UnixNano() / int64(time.Millisecond), F: 5,
Metric: labels.FromStrings("foo", "bar"),
},
},
{},
}
for i := 0; i <= int(end.Sub(start)/step); i++ {
ok, ts, vec := s.Next()
require.Equal(t, ok, true)
require.Equal(t, start.Add(step*time.Duration(i)).UnixNano()/int64(time.Millisecond), ts)
require.Equal(t, expected[i], vec)
}
ok, _, _ := s.Next()
require.Equal(t, ok, false)
}
func Test_SingleStepMatrix(t *testing.T) {
var (
start = time.Unix(0, 0)
end = time.Unix(0, 0)
step = time.Second
)
m := promql.Matrix{
promql.Series{
Metric: labels.EmptyLabels(),
Floats: []promql.FPoint{
{T: start.UnixNano(), F: 10},
},
},
}
s := NewMatrixStepper(start, end, step, m)
ok, ts, vec := s.Next()
require.True(t, ok)
require.Equal(t, start.UnixNano(), ts)
require.Equal(t, promql.Vector{promql.Sample{
T: start.UnixNano(), F: 10,
Metric: labels.EmptyLabels(),
}}, vec)
ok, _, _ = s.Next()
require.False(t, ok)
}