vmalert: unittest support stale datapoint (#4696)

* vmalert: unittest support stale datapoint

* add stale ut case
This commit is contained in:
Haleygo 2023-07-24 21:40:14 +08:00 committed by GitHub
parent 8e8c225068
commit 0b44df7ec8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 13 deletions

View file

@ -813,16 +813,17 @@ external_labels:
series: <string> series: <string>
# values support several special equations: # values support several special equations:
# 'a+bxc' becomes 'a a+b a+(2*b) a+(3*b) … a+(c*b)' # 'a+bxc' becomes 'a a+b a+(2*b) a+(3*b) … a+(c*b)'
# Read this as series starts at a, then c further samples incrementing by b. # Read this as series starts at a, then c further samples incrementing by b.
# 'a-bxc' becomes 'a a-b a-(2*b) a-(3*b) … a-(c*b)' # 'a-bxc' becomes 'a a-b a-(2*b) a-(3*b) … a-(c*b)'
# Read this as series starts at a, then c further samples decrementing by b (or incrementing by negative b). # Read this as series starts at a, then c further samples decrementing by b (or incrementing by negative b).
# '_' represents a missing sample from scrape # '_' represents a missing sample from scrape
# 'stale' indicates a stale sample
# Examples: # Examples:
# 1. '-2+4x3' becomes '-2 2 6 10' - series starts at -2, then 3 further samples incrementing by 4. # 1. '-2+4x3' becomes '-2 2 6 10' - series starts at -2, then 3 further samples incrementing by 4.
# 2. ' 1-2x4' becomes '1 -1 -3 -5 -7' - series starts at 1, then 4 further samples decrementing by 2. # 2. ' 1-2x4' becomes '1 -1 -3 -5 -7' - series starts at 1, then 4 further samples decrementing by 2.
# 3. ' 1x4' becomes '1 1 1 1 1' - shorthand for '1+0x4', series starts at 1, then 4 further samples incrementing by 0. # 3. ' 1x4' becomes '1 1 1 1 1' - shorthand for '1+0x4', series starts at 1, then 4 further samples incrementing by 0.
# 4. ' 1 _x3' becomes '1 _ _ _ ' - the missing sample cannot increment, so 3 missing samples are produced by the '_x3' expression. # 4. ' 1 _x3 stale' becomes '1 _ _ _ stale' - the missing sample cannot increment, so 3 missing samples are produced by the '_x3' expression.
values: <string> values: <string>
``` ```

View file

@ -12,6 +12,7 @@ import (
testutil "github.com/VictoriaMetrics/VictoriaMetrics/app/victoria-metrics/test" testutil "github.com/VictoriaMetrics/VictoriaMetrics/app/victoria-metrics/test"
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmstorage" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmstorage"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/decimal"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
"github.com/VictoriaMetrics/metricsql" "github.com/VictoriaMetrics/metricsql"
@ -85,9 +86,13 @@ func WriteInputSeries(input []Series, interval *promutils.Duration, startStamp t
func parseInputValue(input string, origin bool) ([]sequenceValue, error) { func parseInputValue(input string, origin bool) ([]sequenceValue, error) {
var res []sequenceValue var res []sequenceValue
items := strings.Split(input, " ") items := strings.Split(input, " ")
reg2 := regexp.MustCompile(`\D?\d*\D?`) reg := regexp.MustCompile(`\D?\d*\D?`)
for _, item := range items { for _, item := range items {
vals := reg2.FindAllString(item, -1) if item == "stale" {
res = append(res, sequenceValue{Value: decimal.StaleNaN})
continue
}
vals := reg.FindAllString(item, -1)
switch len(vals) { switch len(vals) {
case 1: case 1:
if vals[0] == "_" { if vals[0] == "_" {

View file

@ -1,8 +1,9 @@
package unittest package unittest
import ( import (
"reflect"
"testing" "testing"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/decimal"
) )
func TestParseInputValue(t *testing.T) { func TestParseInputValue(t *testing.T) {
@ -21,6 +22,12 @@ func TestParseInputValue(t *testing.T) {
nil, nil,
true, true,
}, },
// stale doesn't support operations
{
"stalex3",
nil,
true,
},
{ {
"-4", "-4",
[]sequenceValue{{Value: -4}}, []sequenceValue{{Value: -4}},
@ -31,6 +38,11 @@ func TestParseInputValue(t *testing.T) {
[]sequenceValue{{Omitted: true}}, []sequenceValue{{Omitted: true}},
false, false,
}, },
{
"stale",
[]sequenceValue{{Value: decimal.StaleNaN}},
false,
},
{ {
"-4x1", "-4x1",
[]sequenceValue{{Value: -4}, {Value: -4}}, []sequenceValue{{Value: -4}, {Value: -4}},
@ -52,8 +64,8 @@ func TestParseInputValue(t *testing.T) {
false, false,
}, },
{ {
"1+1x1 _ -4 3+20x1", "1+1x1 _ -4 stale 3+20x1",
[]sequenceValue{{Value: 1}, {Value: 2}, {Omitted: true}, {Value: -4}, {Value: 3}, {Value: 23}}, []sequenceValue{{Value: 1}, {Value: 2}, {Omitted: true}, {Value: -4}, {Value: decimal.StaleNaN}, {Value: 3}, {Value: 23}},
false, false,
}, },
} }
@ -63,8 +75,19 @@ func TestParseInputValue(t *testing.T) {
if err != nil != tc.failed { if err != nil != tc.failed {
t.Fatalf("failed to parse %s, expect %t, got %t", tc.input, tc.failed, err != nil) t.Fatalf("failed to parse %s, expect %t, got %t", tc.input, tc.failed, err != nil)
} }
if !reflect.DeepEqual(tc.exp, output) { if len(tc.exp) != len(output) {
t.Fatalf("expect %v, got %v", tc.exp, output) t.Fatalf("expect %v, got %v", tc.exp, output)
} }
for i := 0; i < len(tc.exp); i++ {
if tc.exp[i].Omitted != output[i].Omitted {
t.Fatalf("expect %v, got %v", tc.exp, output)
}
if tc.exp[i].Value != output[i].Value {
if decimal.IsStaleNaN(tc.exp[i].Value) && decimal.IsStaleNaN(output[i].Value) {
continue
}
t.Fatalf("expect %v, got %v", tc.exp, output)
}
}
} }
} }

View file

@ -9,7 +9,7 @@ tests:
name: "basic test" name: "basic test"
input_series: input_series:
- series: "test" - series: "test"
values: "_x5 1x5" values: "_x5 1x5 _ stale"
alert_rule_test: alert_rule_test:
- eval_time: 1m - eval_time: 1m
@ -26,6 +26,16 @@ tests:
alertname: SameAlertNameWithDifferentGroup alertname: SameAlertNameWithDifferentGroup
exp_alerts: [] exp_alerts: []
metricsql_expr_test:
- expr: test
eval_time: 11m
exp_samples:
- labels: '{__name__="test"}'
value: 1
- expr: test
eval_time: 12m
exp_samples: []
- interval: 1m - interval: 1m
name: "basic test2" name: "basic test2"
input_series: input_series:

View file

@ -824,16 +824,17 @@ external_labels:
series: <string> series: <string>
# values support several special equations: # values support several special equations:
# 'a+bxc' becomes 'a a+b a+(2*b) a+(3*b) … a+(c*b)' # 'a+bxc' becomes 'a a+b a+(2*b) a+(3*b) … a+(c*b)'
# Read this as series starts at a, then c further samples incrementing by b. # Read this as series starts at a, then c further samples incrementing by b.
# 'a-bxc' becomes 'a a-b a-(2*b) a-(3*b) … a-(c*b)' # 'a-bxc' becomes 'a a-b a-(2*b) a-(3*b) … a-(c*b)'
# Read this as series starts at a, then c further samples decrementing by b (or incrementing by negative b). # Read this as series starts at a, then c further samples decrementing by b (or incrementing by negative b).
# '_' represents a missing sample from scrape # '_' represents a missing sample from scrape
# 'stale' indicates a stale sample
# Examples: # Examples:
# 1. '-2+4x3' becomes '-2 2 6 10' - series starts at -2, then 3 further samples incrementing by 4. # 1. '-2+4x3' becomes '-2 2 6 10' - series starts at -2, then 3 further samples incrementing by 4.
# 2. ' 1-2x4' becomes '1 -1 -3 -5 -7' - series starts at 1, then 4 further samples decrementing by 2. # 2. ' 1-2x4' becomes '1 -1 -3 -5 -7' - series starts at 1, then 4 further samples decrementing by 2.
# 3. ' 1x4' becomes '1 1 1 1 1' - shorthand for '1+0x4', series starts at 1, then 4 further samples incrementing by 0. # 3. ' 1x4' becomes '1 1 1 1 1' - shorthand for '1+0x4', series starts at 1, then 4 further samples incrementing by 0.
# 4. ' 1 _x3' becomes '1 _ _ _ ' - the missing sample cannot increment, so 3 missing samples are produced by the '_x3' expression. # 4. ' 1 _x3 stale' becomes '1 _ _ _ stale' - the missing sample cannot increment, so 3 missing samples are produced by the '_x3' expression.
values: <string> values: <string>
``` ```