mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-25 05:34:05 -08:00
Merge pull request #9138 from darshanime/duration_number_duality
Making durations and number literals the same
This commit is contained in:
commit
58963f7b2e
|
@ -81,6 +81,16 @@ Examples:
|
|||
0x8f
|
||||
-Inf
|
||||
NaN
|
||||
|
||||
|
||||
As of version 2.54, float literals can also be represented using the syntax of time durations, where the time duration is converted into a float value corresponding to the number of seconds the time duration represents. This is an experimental feature and might still change.
|
||||
|
||||
Examples:
|
||||
|
||||
1s # Equivalent to 1.0
|
||||
2m # Equivalent to 120.0
|
||||
1ms # Equivalent to 0.001
|
||||
|
||||
|
||||
## Time series selectors
|
||||
|
||||
|
@ -224,6 +234,15 @@ Here are some examples of valid time durations:
|
|||
5m
|
||||
10s
|
||||
|
||||
|
||||
As of version 2.54, time durations can also be represented using the syntax of float literals, implying the number of seconds of the time duration. This is an experimental feature and might still change.
|
||||
|
||||
Examples:
|
||||
|
||||
1.0 # Equivalent to 1s
|
||||
0.001 # Equivalent to 1ms
|
||||
120 # Equivalent to 2m
|
||||
|
||||
### Offset modifier
|
||||
|
||||
The `offset` modifier allows changing the time offset for individual
|
||||
|
|
|
@ -43,7 +43,6 @@ import (
|
|||
int int64
|
||||
uint uint64
|
||||
float float64
|
||||
duration time.Duration
|
||||
}
|
||||
|
||||
|
||||
|
@ -176,8 +175,7 @@ START_METRIC_SELECTOR
|
|||
%type <int> int
|
||||
%type <uint> uint
|
||||
%type <float> number series_value signed_number signed_or_unsigned_number
|
||||
%type <node> step_invariant_expr aggregate_expr aggregate_modifier bin_modifier binary_expr bool_modifier expr function_call function_call_args function_call_body group_modifiers label_matchers matrix_selector number_literal offset_expr on_or_ignoring paren_expr string_literal subquery_expr unary_expr vector_selector
|
||||
%type <duration> duration maybe_duration
|
||||
%type <node> step_invariant_expr aggregate_expr aggregate_modifier bin_modifier binary_expr bool_modifier expr function_call function_call_args function_call_body group_modifiers label_matchers matrix_selector number_duration_literal offset_expr on_or_ignoring paren_expr string_literal subquery_expr unary_expr vector_selector
|
||||
|
||||
%start start
|
||||
|
||||
|
@ -218,7 +216,7 @@ expr :
|
|||
| binary_expr
|
||||
| function_call
|
||||
| matrix_selector
|
||||
| number_literal
|
||||
| number_duration_literal
|
||||
| offset_expr
|
||||
| paren_expr
|
||||
| string_literal
|
||||
|
@ -415,18 +413,22 @@ paren_expr : LEFT_PAREN expr RIGHT_PAREN
|
|||
* Offset modifiers.
|
||||
*/
|
||||
|
||||
offset_expr: expr OFFSET duration
|
||||
offset_expr: expr OFFSET number_duration_literal
|
||||
{
|
||||
yylex.(*parser).addOffset($1, $3)
|
||||
$$ = $1
|
||||
numLit, _ := $3.(*NumberLiteral)
|
||||
dur := time.Duration(numLit.Val * 1000) * time.Millisecond
|
||||
yylex.(*parser).addOffset($1, dur)
|
||||
$$ = $1
|
||||
}
|
||||
| expr OFFSET SUB duration
|
||||
| expr OFFSET SUB number_duration_literal
|
||||
{
|
||||
yylex.(*parser).addOffset($1, -$4)
|
||||
$$ = $1
|
||||
numLit, _ := $4.(*NumberLiteral)
|
||||
dur := time.Duration(numLit.Val * 1000) * time.Millisecond
|
||||
yylex.(*parser).addOffset($1, -dur)
|
||||
$$ = $1
|
||||
}
|
||||
| expr OFFSET error
|
||||
{ yylex.(*parser).unexpected("offset", "duration"); $$ = $1 }
|
||||
{ yylex.(*parser).unexpected("offset", "number or duration"); $$ = $1 }
|
||||
;
|
||||
/*
|
||||
* @ modifiers.
|
||||
|
@ -452,7 +454,7 @@ at_modifier_preprocessors: START | END;
|
|||
* Subquery and range selectors.
|
||||
*/
|
||||
|
||||
matrix_selector : expr LEFT_BRACKET duration RIGHT_BRACKET
|
||||
matrix_selector : expr LEFT_BRACKET number_duration_literal RIGHT_BRACKET
|
||||
{
|
||||
var errMsg string
|
||||
vs, ok := $1.(*VectorSelector)
|
||||
|
@ -469,32 +471,44 @@ matrix_selector : expr LEFT_BRACKET duration RIGHT_BRACKET
|
|||
yylex.(*parser).addParseErrf(errRange, errMsg)
|
||||
}
|
||||
|
||||
numLit, _ := $3.(*NumberLiteral)
|
||||
$$ = &MatrixSelector{
|
||||
VectorSelector: $1.(Expr),
|
||||
Range: $3,
|
||||
Range: time.Duration(numLit.Val * 1000) * time.Millisecond,
|
||||
EndPos: yylex.(*parser).lastClosing,
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
subquery_expr : expr LEFT_BRACKET duration COLON maybe_duration RIGHT_BRACKET
|
||||
subquery_expr : expr LEFT_BRACKET number_duration_literal COLON number_duration_literal RIGHT_BRACKET
|
||||
{
|
||||
numLitRange, _ := $3.(*NumberLiteral)
|
||||
numLitStep, _ := $5.(*NumberLiteral)
|
||||
$$ = &SubqueryExpr{
|
||||
Expr: $1.(Expr),
|
||||
Range: $3,
|
||||
Step: $5,
|
||||
|
||||
Range: time.Duration(numLitRange.Val * 1000) * time.Millisecond,
|
||||
Step: time.Duration(numLitStep.Val * 1000) * time.Millisecond,
|
||||
EndPos: $6.Pos + 1,
|
||||
}
|
||||
}
|
||||
| expr LEFT_BRACKET duration COLON duration error
|
||||
| expr LEFT_BRACKET number_duration_literal COLON RIGHT_BRACKET
|
||||
{
|
||||
numLitRange, _ := $3.(*NumberLiteral)
|
||||
$$ = &SubqueryExpr{
|
||||
Expr: $1.(Expr),
|
||||
Range: time.Duration(numLitRange.Val * 1000) * time.Millisecond,
|
||||
Step: 0,
|
||||
EndPos: $5.Pos + 1,
|
||||
}
|
||||
}
|
||||
| expr LEFT_BRACKET number_duration_literal COLON number_duration_literal error
|
||||
{ yylex.(*parser).unexpected("subquery selector", "\"]\""); $$ = $1 }
|
||||
| expr LEFT_BRACKET duration COLON error
|
||||
{ yylex.(*parser).unexpected("subquery selector", "duration or \"]\""); $$ = $1 }
|
||||
| expr LEFT_BRACKET duration error
|
||||
| expr LEFT_BRACKET number_duration_literal COLON error
|
||||
{ yylex.(*parser).unexpected("subquery selector", "number or duration or \"]\""); $$ = $1 }
|
||||
| expr LEFT_BRACKET number_duration_literal error
|
||||
{ yylex.(*parser).unexpected("subquery or range", "\":\" or \"]\""); $$ = $1 }
|
||||
| expr LEFT_BRACKET error
|
||||
{ yylex.(*parser).unexpected("subquery selector", "duration"); $$ = $1 }
|
||||
{ yylex.(*parser).unexpected("subquery selector", "number or duration"); $$ = $1 }
|
||||
;
|
||||
|
||||
/*
|
||||
|
@ -866,16 +880,43 @@ match_op : EQL | NEQ | EQL_REGEX | NEQ_REGEX ;
|
|||
* Literals.
|
||||
*/
|
||||
|
||||
number_literal : NUMBER
|
||||
number_duration_literal : NUMBER
|
||||
{
|
||||
$$ = &NumberLiteral{
|
||||
$$ = &NumberLiteral{
|
||||
Val: yylex.(*parser).number($1.Val),
|
||||
PosRange: $1.PositionRange(),
|
||||
}
|
||||
}
|
||||
| DURATION
|
||||
{
|
||||
var err error
|
||||
var dur time.Duration
|
||||
dur, err = parseDuration($1.Val)
|
||||
if err != nil {
|
||||
yylex.(*parser).addParseErr($1.PositionRange(), err)
|
||||
}
|
||||
$$ = &NumberLiteral{
|
||||
Val: dur.Seconds(),
|
||||
PosRange: $1.PositionRange(),
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
number : NUMBER { $$ = yylex.(*parser).number($1.Val) } ;
|
||||
number : NUMBER
|
||||
{
|
||||
$$ = yylex.(*parser).number($1.Val)
|
||||
}
|
||||
| DURATION
|
||||
{
|
||||
var err error
|
||||
var dur time.Duration
|
||||
dur, err = parseDuration($1.Val)
|
||||
if err != nil {
|
||||
yylex.(*parser).addParseErr($1.PositionRange(), err)
|
||||
}
|
||||
$$ = dur.Seconds()
|
||||
}
|
||||
;
|
||||
|
||||
signed_number : ADD number { $$ = $2 }
|
||||
| SUB number { $$ = -$2 }
|
||||
|
@ -897,17 +938,6 @@ int : SUB uint { $$ = -int64($2) }
|
|||
| uint { $$ = int64($1) }
|
||||
;
|
||||
|
||||
duration : DURATION
|
||||
{
|
||||
var err error
|
||||
$$, err = parseDuration($1.Val)
|
||||
if err != nil {
|
||||
yylex.(*parser).addParseErr($1.PositionRange(), err)
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
string_literal : STRING
|
||||
{
|
||||
$$ = &StringLiteral{
|
||||
|
@ -931,11 +961,6 @@ string_identifier : STRING
|
|||
* Wrappers for optional arguments.
|
||||
*/
|
||||
|
||||
maybe_duration : /* empty */
|
||||
{$$ = 0}
|
||||
| duration
|
||||
;
|
||||
|
||||
maybe_grouping_labels: /* empty */ { $$ = nil }
|
||||
| grouping_labels
|
||||
;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -478,7 +478,7 @@ func lexStatements(l *Lexer) stateFn {
|
|||
skipSpaces(l)
|
||||
}
|
||||
l.bracketOpen = true
|
||||
return lexDuration
|
||||
return lexNumberOrDuration
|
||||
case r == ']':
|
||||
if !l.bracketOpen {
|
||||
return l.errorf("unexpected right bracket %q", r)
|
||||
|
@ -846,18 +846,6 @@ func lexLineComment(l *Lexer) stateFn {
|
|||
return lexStatements
|
||||
}
|
||||
|
||||
func lexDuration(l *Lexer) stateFn {
|
||||
if l.scanNumber() {
|
||||
return l.errorf("missing unit character in duration")
|
||||
}
|
||||
if !acceptRemainingDuration(l) {
|
||||
return l.errorf("bad duration syntax: %q", l.input[l.start:l.pos])
|
||||
}
|
||||
l.backup()
|
||||
l.emit(DURATION)
|
||||
return lexStatements
|
||||
}
|
||||
|
||||
// lexNumber scans a number: decimal, hex, oct or float.
|
||||
func lexNumber(l *Lexer) stateFn {
|
||||
if !l.scanNumber() {
|
||||
|
@ -909,6 +897,7 @@ func acceptRemainingDuration(l *Lexer) bool {
|
|||
// scanNumber scans numbers of different formats. The scanned Item is
|
||||
// not necessarily a valid number. This case is caught by the parser.
|
||||
func (l *Lexer) scanNumber() bool {
|
||||
initialPos := l.pos
|
||||
// Modify the digit pattern if the number is hexadecimal.
|
||||
digitPattern := "0123456789"
|
||||
// Disallow hexadecimal in series descriptions as the syntax is ambiguous.
|
||||
|
@ -980,7 +969,10 @@ func (l *Lexer) scanNumber() bool {
|
|||
// Handle digits at the end since we already consumed before this loop.
|
||||
l.acceptRun(digitPattern)
|
||||
}
|
||||
|
||||
// Empty string is not a valid number.
|
||||
if l.pos == initialPos {
|
||||
return false
|
||||
}
|
||||
// Next thing must not be alphanumeric unless it's the times token
|
||||
// for series repetitions.
|
||||
if r := l.peek(); (l.seriesDesc && r == 'x') || !isAlphaNumeric(r) {
|
||||
|
|
|
@ -2133,6 +2133,115 @@ var testExpr = []struct {
|
|||
EndPos: 25,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `test{a="b"}[5m] OFFSET 3600`,
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "test",
|
||||
OriginalOffset: 1 * time.Hour,
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, "a", "b"),
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "test"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 11,
|
||||
},
|
||||
},
|
||||
Range: 5 * time.Minute,
|
||||
EndPos: 27,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `foo[3ms] @ 2.345`,
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "foo",
|
||||
Timestamp: makeInt64Pointer(2345),
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "foo"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 3,
|
||||
},
|
||||
},
|
||||
Range: 3 * time.Millisecond,
|
||||
EndPos: 16,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `foo[4s180ms] @ 2.345`,
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "foo",
|
||||
Timestamp: makeInt64Pointer(2345),
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "foo"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 3,
|
||||
},
|
||||
},
|
||||
Range: 4*time.Second + 180*time.Millisecond,
|
||||
EndPos: 20,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `foo[4.18] @ 2.345`,
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "foo",
|
||||
Timestamp: makeInt64Pointer(2345),
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "foo"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 3,
|
||||
},
|
||||
},
|
||||
Range: 4*time.Second + 180*time.Millisecond,
|
||||
EndPos: 17,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `foo[4s18ms] @ 2.345`,
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "foo",
|
||||
Timestamp: makeInt64Pointer(2345),
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "foo"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 3,
|
||||
},
|
||||
},
|
||||
Range: 4*time.Second + 18*time.Millisecond,
|
||||
EndPos: 19,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `foo[4.018] @ 2.345`,
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "foo",
|
||||
Timestamp: makeInt64Pointer(2345),
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "foo"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 3,
|
||||
},
|
||||
},
|
||||
Range: 4*time.Second + 18*time.Millisecond,
|
||||
EndPos: 18,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `test{a="b"}[5y] @ 1603774699`,
|
||||
expected: &MatrixSelector{
|
||||
|
@ -2152,15 +2261,50 @@ var testExpr = []struct {
|
|||
EndPos: 28,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: "test[5]",
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "test",
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "test"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 4,
|
||||
},
|
||||
},
|
||||
Range: 5 * time.Second,
|
||||
EndPos: 7,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `some_metric[5m] @ 1m`,
|
||||
expected: &MatrixSelector{
|
||||
VectorSelector: &VectorSelector{
|
||||
Name: "some_metric",
|
||||
Timestamp: makeInt64Pointer(60000),
|
||||
LabelMatchers: []*labels.Matcher{
|
||||
MustLabelMatcher(labels.MatchEqual, model.MetricNameLabel, "some_metric"),
|
||||
},
|
||||
PosRange: posrange.PositionRange{
|
||||
Start: 0,
|
||||
End: 11,
|
||||
},
|
||||
},
|
||||
Range: 5 * time.Minute,
|
||||
EndPos: 20,
|
||||
},
|
||||
},
|
||||
{
|
||||
input: `foo[5mm]`,
|
||||
fail: true,
|
||||
errMsg: "bad duration syntax: \"5mm\"",
|
||||
errMsg: "bad number or duration syntax: \"5mm\"",
|
||||
},
|
||||
{
|
||||
input: `foo[5m1]`,
|
||||
fail: true,
|
||||
errMsg: "bad duration syntax: \"5m1\"",
|
||||
errMsg: "bad number or duration syntax: \"5m1\"",
|
||||
},
|
||||
{
|
||||
input: `foo[5m:1m1]`,
|
||||
|
@ -2194,17 +2338,12 @@ var testExpr = []struct {
|
|||
{
|
||||
input: `foo[]`,
|
||||
fail: true,
|
||||
errMsg: "missing unit character in duration",
|
||||
errMsg: "bad number or duration syntax: \"\"",
|
||||
},
|
||||
{
|
||||
input: `foo[1]`,
|
||||
input: `foo[-1]`,
|
||||
fail: true,
|
||||
errMsg: "missing unit character in duration",
|
||||
},
|
||||
{
|
||||
input: `some_metric[5m] OFFSET 1`,
|
||||
fail: true,
|
||||
errMsg: "unexpected number \"1\" in offset, expected duration",
|
||||
errMsg: "bad number or duration syntax: \"\"",
|
||||
},
|
||||
{
|
||||
input: `some_metric[5m] OFFSET 1mm`,
|
||||
|
@ -2214,18 +2353,13 @@ var testExpr = []struct {
|
|||
{
|
||||
input: `some_metric[5m] OFFSET`,
|
||||
fail: true,
|
||||
errMsg: "unexpected end of input in offset, expected duration",
|
||||
errMsg: "unexpected end of input in offset, expected number or duration",
|
||||
},
|
||||
{
|
||||
input: `some_metric OFFSET 1m[5m]`,
|
||||
fail: true,
|
||||
errMsg: "1:22: parse error: no offset modifiers allowed before range",
|
||||
},
|
||||
{
|
||||
input: `some_metric[5m] @ 1m`,
|
||||
fail: true,
|
||||
errMsg: "1:19: parse error: unexpected duration \"1m\" in @, expected timestamp",
|
||||
},
|
||||
{
|
||||
input: `some_metric[5m] @`,
|
||||
fail: true,
|
||||
|
@ -2910,6 +3044,11 @@ var testExpr = []struct {
|
|||
errMsg: "illegal character U+002E '.' in escape sequence",
|
||||
},
|
||||
// Subquery.
|
||||
{
|
||||
input: `foo{bar="baz"}[`,
|
||||
fail: true,
|
||||
errMsg: `1:16: parse error: bad number or duration syntax: ""`,
|
||||
},
|
||||
{
|
||||
input: `foo{bar="baz"}[10m:6s]`,
|
||||
expected: &SubqueryExpr{
|
||||
|
|
45
promql/promqltest/testdata/at_modifier.test
vendored
45
promql/promqltest/testdata/at_modifier.test
vendored
|
@ -10,22 +10,54 @@ eval instant at 10s metric @ 100
|
|||
metric{job="1"} 10
|
||||
metric{job="2"} 20
|
||||
|
||||
eval instant at 10s metric @ 100s
|
||||
metric{job="1"} 10
|
||||
metric{job="2"} 20
|
||||
|
||||
eval instant at 10s metric @ 1m40s
|
||||
metric{job="1"} 10
|
||||
metric{job="2"} 20
|
||||
|
||||
eval instant at 10s metric @ 100 offset 50s
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric @ 100 offset 50
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric offset 50s @ 100
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric offset 50 @ 100
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric @ 0 offset -50s
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric @ 0 offset -50
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric offset -50s @ 0
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric offset -50 @ 0
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric @ 0 offset -50s
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s metric @ 0 offset -50
|
||||
metric{job="1"} 5
|
||||
metric{job="2"} 10
|
||||
|
||||
eval instant at 10s -metric @ 100
|
||||
{job="1"} -10
|
||||
{job="2"} -20
|
||||
|
@ -48,6 +80,12 @@ eval instant at 25s sum_over_time(metric{job="1"}[100s] @ 100 offset 50s)
|
|||
eval instant at 25s sum_over_time(metric{job="1"}[100s] offset 50s @ 100)
|
||||
{job="1"} 15
|
||||
|
||||
eval instant at 25s sum_over_time(metric{job="1"}[100] @ 100 offset 50)
|
||||
{job="1"} 15
|
||||
|
||||
eval instant at 25s sum_over_time(metric{job="1"}[100] offset 50s @ 100)
|
||||
{job="1"} 15
|
||||
|
||||
# Different timestamps.
|
||||
eval instant at 25s metric{job="1"} @ 50 + metric{job="1"} @ 100
|
||||
{job="1"} 15
|
||||
|
@ -58,6 +96,9 @@ eval instant at 25s rate(metric{job="1"}[100s] @ 100) + label_replace(rate(metri
|
|||
eval instant at 25s sum_over_time(metric{job="1"}[100s] @ 100) + label_replace(sum_over_time(metric{job="2"}[100s] @ 100), "job", "1", "", "")
|
||||
{job="1"} 165
|
||||
|
||||
eval instant at 25s sum_over_time(metric{job="1"}[100] @ 100) + label_replace(sum_over_time(metric{job="2"}[100] @ 100), "job", "1", "", "")
|
||||
{job="1"} 165
|
||||
|
||||
# Subqueries.
|
||||
|
||||
# 10*(1+2+...+9) + 10.
|
||||
|
@ -72,6 +113,10 @@ eval instant at 25s sum_over_time(metric{job="1"}[100s:1s] @ 100 offset 20s)
|
|||
eval instant at 25s sum_over_time(metric{job="1"}[100s:1s] offset 20s @ 100)
|
||||
{job="1"} 288
|
||||
|
||||
# 10*(1+2+...+7) + 8.
|
||||
eval instant at 25s sum_over_time(metric{job="1"}[100:1] offset 20 @ 100)
|
||||
{job="1"} 288
|
||||
|
||||
# Subquery with different timestamps.
|
||||
|
||||
# Since vector selector has timestamp, the result value does not depend on the timestamp of subqueries.
|
||||
|
|
11
promql/promqltest/testdata/functions.test
vendored
11
promql/promqltest/testdata/functions.test
vendored
|
@ -10,6 +10,11 @@ eval instant at 50m resets(http_requests[5m])
|
|||
{path="/bar"} 0
|
||||
{path="/biz"} 0
|
||||
|
||||
eval instant at 50m resets(http_requests[300])
|
||||
{path="/foo"} 0
|
||||
{path="/bar"} 0
|
||||
{path="/biz"} 0
|
||||
|
||||
eval instant at 50m resets(http_requests[20m])
|
||||
{path="/foo"} 1
|
||||
{path="/bar"} 0
|
||||
|
@ -239,10 +244,16 @@ eval instant at 50m deriv(testcounter_reset_middle[100m])
|
|||
eval instant at 50m predict_linear(testcounter_reset_middle[50m], 3600)
|
||||
{} 76.81818181818181
|
||||
|
||||
eval instant at 50m predict_linear(testcounter_reset_middle[50m], 1h)
|
||||
{} 76.81818181818181
|
||||
|
||||
# intercept at t = 3000+3600 = 6600
|
||||
eval instant at 50m predict_linear(testcounter_reset_middle[50m] @ 3000, 3600)
|
||||
{} 76.81818181818181
|
||||
|
||||
eval instant at 50m predict_linear(testcounter_reset_middle[50m] @ 3000, 1h)
|
||||
{} 76.81818181818181
|
||||
|
||||
# intercept at t = 600+3600 = 4200
|
||||
eval instant at 10m predict_linear(testcounter_reset_middle[50m] @ 3000, 3600)
|
||||
{} 51.36363636363637
|
||||
|
|
3
promql/promqltest/testdata/staleness.test
vendored
3
promql/promqltest/testdata/staleness.test
vendored
|
@ -32,6 +32,9 @@ eval instant at 20s count_over_time(metric[1s])
|
|||
eval instant at 20s count_over_time(metric[10s])
|
||||
{} 1
|
||||
|
||||
eval instant at 20s count_over_time(metric[10])
|
||||
{} 1
|
||||
|
||||
|
||||
clear
|
||||
|
||||
|
|
15
promql/promqltest/testdata/subquery.test
vendored
15
promql/promqltest/testdata/subquery.test
vendored
|
@ -76,6 +76,21 @@ eval instant at 1010s sum_over_time(metric1[30s:10s] offset 3s)
|
|||
eval instant at 1010s sum_over_time((metric1)[30s:10s] offset 3s)
|
||||
{} 297
|
||||
|
||||
eval instant at 1010s sum_over_time(metric1[30:10] offset 3)
|
||||
{} 297
|
||||
|
||||
eval instant at 1010s sum_over_time((metric1)[30:10s] offset 3s)
|
||||
{} 297
|
||||
|
||||
eval instant at 1010s sum_over_time((metric1)[30:10s] offset 3s)
|
||||
{} 297
|
||||
|
||||
eval instant at 1010s sum_over_time((metric1)[30:10] offset 3s)
|
||||
{} 297
|
||||
|
||||
eval instant at 1010s sum_over_time((metric1)[30:10] offset 3)
|
||||
{} 297
|
||||
|
||||
# Nested subqueries
|
||||
eval instant at 1000s rate(sum_over_time(metric1[30s:10s])[50s:10s])
|
||||
{} 0.4
|
||||
|
|
Loading…
Reference in a new issue