Skip to content

Commit b78ed9d

Browse files
authored
[RFR] fix vector() function produces wrong timestamp on instant query (#8370)
1 parent b94c8aa commit b78ed9d

File tree

3 files changed

+53
-16
lines changed

3 files changed

+53
-16
lines changed

pkg/logql/engine.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,10 @@ func (q *query) evalVector(_ context.Context, expr *syntax.VectorExpr) (promql_p
430430
}
431431

432432
if GetRangeType(q.params) == InstantType {
433-
return s, nil
433+
return promql.Vector{promql.Sample{
434+
Point: promql.Point{T: q.params.Start().UnixMilli(), V: value},
435+
Metric: labels.Labels{},
436+
}}, nil
434437
}
435438

436439
return PopulateMatrixFromScalar(s, q.params), nil

pkg/logql/engine_test.go

+35-1
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,10 @@ func TestEngine_LogsInstantQuery(t *testing.T) {
643643
time.Unix(60, 0), logproto.FORWARD, 100,
644644
nil,
645645
nil,
646-
promql.Scalar{T: 60 * 1000, V: 2},
646+
promql.Vector{promql.Sample{
647+
Point: promql.Point{T: 60 * 1000, V: 2},
648+
Metric: labels.Labels{},
649+
}},
647650
},
648651
{
649652
// single comparison
@@ -2302,6 +2305,37 @@ func TestEngine_LogsInstantQuery_IllegalLogql(t *testing.T) {
23022305
require.EqualError(t, err, expectEvalSampleErr.Error())
23032306
}
23042307

2308+
func TestEngine_LogsInstantQuery_Vector(t *testing.T) {
2309+
eng := NewEngine(EngineOpts{}, &statsQuerier{}, NoLimits, log.NewNopLogger())
2310+
now := time.Now()
2311+
queueTime := 2 * time.Nanosecond
2312+
logqlVector := `vector(5)`
2313+
q := eng.Query(LiteralParams{
2314+
qs: logqlVector,
2315+
start: now,
2316+
end: now,
2317+
step: 0,
2318+
interval: time.Second * 30,
2319+
direction: logproto.BACKWARD,
2320+
limit: 1000,
2321+
})
2322+
ctx := context.WithValue(context.Background(), httpreq.QueryQueueTimeHTTPHeader, queueTime)
2323+
_, err := q.Exec(user.InjectOrgID(ctx, "fake"))
2324+
2325+
require.NoError(t, err)
2326+
2327+
qry, ok := q.(*query)
2328+
require.Equal(t, ok, true)
2329+
vectorExpr := syntax.NewVectorExpr("5")
2330+
2331+
data, err := qry.evalSample(ctx, vectorExpr)
2332+
require.NoError(t, err)
2333+
result, ok := data.(promql.Vector)
2334+
require.Equal(t, ok, true)
2335+
require.Equal(t, result[0].V, float64(5))
2336+
require.Equal(t, result[0].T, now.UnixNano()/int64(time.Millisecond))
2337+
}
2338+
23052339
type errorIteratorQuerier struct {
23062340
samples []iter.SampleIterator
23072341
entries []iter.EntryIterator

pkg/logql/evaluator.go

+14-14
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ func (ev *DefaultEvaluator) StepEvaluator(
232232
if err != nil {
233233
return nil, err
234234
}
235-
return newVectorIterator(val, q.Step().Nanoseconds(), q.Start().UnixNano(), q.End().UnixNano()), nil
235+
return newVectorIterator(val, q.Step().Milliseconds(), q.Start().UnixMilli(), q.End().UnixMilli()), nil
236236
default:
237237
return nil, EvaluatorUnsupportedType(e, ev)
238238
}
@@ -944,34 +944,34 @@ func literalStepEvaluator(
944944

945945
// vectorIterator return simple vector like (1).
946946
type vectorIterator struct {
947-
step, end, current int64
948-
val float64
947+
stepMs, endMs, currentMs int64
948+
val float64
949949
}
950950

951951
func newVectorIterator(val float64,
952-
step, start, end int64) *vectorIterator {
953-
if step == 0 {
954-
step = 1
952+
stepMs, startMs, endMs int64) *vectorIterator {
953+
if stepMs == 0 {
954+
stepMs = 1
955955
}
956956
return &vectorIterator{
957-
val: val,
958-
step: step,
959-
end: end,
960-
current: start - step,
957+
val: val,
958+
stepMs: stepMs,
959+
endMs: endMs,
960+
currentMs: startMs - stepMs,
961961
}
962962
}
963963

964964
func (r *vectorIterator) Next() (bool, int64, promql.Vector) {
965-
r.current = r.current + r.step
966-
if r.current > r.end {
965+
r.currentMs = r.currentMs + r.stepMs
966+
if r.currentMs > r.endMs {
967967
return false, 0, nil
968968
}
969969
results := make(promql.Vector, 0)
970970
vectorPoint := promql.Sample{
971-
Point: promql.Point{T: r.current, V: r.val},
971+
Point: promql.Point{T: r.currentMs, V: r.val},
972972
}
973973
results = append(results, vectorPoint)
974-
return true, r.current, results
974+
return true, r.currentMs, results
975975
}
976976

977977
func (r *vectorIterator) Close() error {

0 commit comments

Comments
 (0)