|
|
|
@ -49,7 +49,6 @@ func TestRuleEval(t *testing.T) { |
|
|
|
|
name string |
|
|
|
|
expr parser.Expr |
|
|
|
|
labels labels.Labels |
|
|
|
|
limit int |
|
|
|
|
result promql.Vector |
|
|
|
|
err string |
|
|
|
|
}{ |
|
|
|
@ -71,38 +70,11 @@ func TestRuleEval(t *testing.T) { |
|
|
|
|
Point: promql.Point{V: 1, T: timestamp.FromTime(now)}, |
|
|
|
|
}}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "underlimit", |
|
|
|
|
expr: &parser.NumberLiteral{Val: 1}, |
|
|
|
|
labels: labels.FromStrings("foo", "bar"), |
|
|
|
|
limit: 2, |
|
|
|
|
result: promql.Vector{promql.Sample{ |
|
|
|
|
Metric: labels.FromStrings("__name__", "underlimit", "foo", "bar"), |
|
|
|
|
Point: promql.Point{V: 1, T: timestamp.FromTime(now)}, |
|
|
|
|
}}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "atlimit", |
|
|
|
|
expr: &parser.NumberLiteral{Val: 1}, |
|
|
|
|
labels: labels.FromStrings("foo", "bar"), |
|
|
|
|
limit: 1, |
|
|
|
|
result: promql.Vector{promql.Sample{ |
|
|
|
|
Metric: labels.FromStrings("__name__", "atlimit", "foo", "bar"), |
|
|
|
|
Point: promql.Point{V: 1, T: timestamp.FromTime(now)}, |
|
|
|
|
}}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "overlimit", |
|
|
|
|
expr: &parser.NumberLiteral{Val: 1}, |
|
|
|
|
labels: labels.FromStrings("foo", "bar"), |
|
|
|
|
limit: -1, |
|
|
|
|
err: "exceeded limit -1 with 1 samples", |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, test := range suite { |
|
|
|
|
rule := NewRecordingRule(test.name, test.expr, test.labels) |
|
|
|
|
result, err := rule.Eval(ctx, now, EngineQueryFunc(engine, storage), nil, test.limit) |
|
|
|
|
result, err := rule.Eval(ctx, now, EngineQueryFunc(engine, storage), nil, 0) |
|
|
|
|
if test.err == "" { |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
} else { |
|
|
|
@ -151,3 +123,52 @@ func TestRuleEvalDuplicate(t *testing.T) { |
|
|
|
|
require.Error(t, err) |
|
|
|
|
require.EqualError(t, err, "vector contains metrics with the same labelset after applying rule labels") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestRecordingRuleLimit(t *testing.T) { |
|
|
|
|
suite, err := promql.NewTest(t, ` |
|
|
|
|
load 1m |
|
|
|
|
metric{label="1"} 1 |
|
|
|
|
metric{label="2"} 1 |
|
|
|
|
`) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer suite.Close() |
|
|
|
|
|
|
|
|
|
require.NoError(t, suite.Run()) |
|
|
|
|
|
|
|
|
|
tests := []struct { |
|
|
|
|
limit int |
|
|
|
|
err string |
|
|
|
|
}{ |
|
|
|
|
{ |
|
|
|
|
limit: 0, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
limit: -1, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
limit: 2, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
limit: 1, |
|
|
|
|
err: "exceeded limit of 1 with 2 series", |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
expr, _ := parser.ParseExpr(`metric > 0`) |
|
|
|
|
rule := NewRecordingRule( |
|
|
|
|
"foo", |
|
|
|
|
expr, |
|
|
|
|
labels.FromStrings("test", "test"), |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
evalTime := time.Unix(0, 0) |
|
|
|
|
|
|
|
|
|
for _, test := range tests { |
|
|
|
|
_, err := rule.Eval(suite.Context(), evalTime, EngineQueryFunc(suite.QueryEngine(), suite.Storage()), nil, test.limit) |
|
|
|
|
if err != nil { |
|
|
|
|
require.EqualError(t, err, test.err) |
|
|
|
|
} else if test.err != "" { |
|
|
|
|
t.Errorf("Expected error %s, got none", test.err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|