From 4e4f57b121886e1778c464c4cc84c7941598d482 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 28 Apr 2020 15:28:22 +0300 Subject: [PATCH] lib/metricsql: move it to a separate repository - github.com/VictoriaMetrics/metrics --- app/vmalert/rule.go | 2 +- app/vmselect/prometheus/prometheus.go | 2 +- app/vmselect/promql/aggr.go | 2 +- app/vmselect/promql/aggr_incremental.go | 2 +- app/vmselect/promql/aggr_incremental_test.go | 2 +- app/vmselect/promql/binary_op.go | 4 +- app/vmselect/promql/eval.go | 2 +- app/vmselect/promql/exec.go | 2 +- app/vmselect/promql/parser.go | 2 +- app/vmselect/promql/rollup.go | 2 +- app/vmselect/promql/rollup_result_cache.go | 2 +- .../promql/rollup_result_cache_test.go | 2 +- app/vmselect/promql/rollup_test.go | 2 +- app/vmselect/promql/transform.go | 2 +- docs/MetricsQL.md | 2 +- go.mod | 1 + go.sum | 2 + lib/metricsql/README.md | 3 + lib/metricsql/aggr_test.go | 30 - lib/metricsql/binary_op_test.go | 125 ---- lib/metricsql/doc.go | 14 +- lib/metricsql/lexer_test.go | 401 ----------- lib/metricsql/parser_example_test.go | 35 - lib/metricsql/parser_test.go | 679 ------------------ lib/metricsql/utils_example_test.go | 28 - lib/metricsql/utils_test.go | 43 -- .../VictoriaMetrics/metricsql/LICENSE | 190 +++++ .../VictoriaMetrics/metricsql/README.md | 23 + .../VictoriaMetrics}/metricsql/aggr.go | 0 .../VictoriaMetrics}/metricsql/binary_op.go | 2 +- .../metricsql/binaryop/funcs.go | 0 .../VictoriaMetrics/metricsql/doc.go | 15 + .../VictoriaMetrics/metricsql/go.mod | 5 + .../VictoriaMetrics/metricsql/go.sum | 6 + .../VictoriaMetrics}/metricsql/lexer.go | 0 .../VictoriaMetrics}/metricsql/parser.go | 0 .../metricsql/regexp_cache.go | 0 .../VictoriaMetrics}/metricsql/rollup.go | 0 .../VictoriaMetrics}/metricsql/transform.go | 0 .../VictoriaMetrics}/metricsql/utils.go | 0 vendor/modules.txt | 3 + 41 files changed, 266 insertions(+), 1371 deletions(-) create mode 100644 lib/metricsql/README.md delete mode 100644 lib/metricsql/aggr_test.go delete mode 100644 lib/metricsql/binary_op_test.go delete mode 100644 lib/metricsql/lexer_test.go delete mode 100644 lib/metricsql/parser_example_test.go delete mode 100644 lib/metricsql/parser_test.go delete mode 100644 lib/metricsql/utils_example_test.go delete mode 100644 lib/metricsql/utils_test.go create mode 100644 vendor/github.com/VictoriaMetrics/metricsql/LICENSE create mode 100644 vendor/github.com/VictoriaMetrics/metricsql/README.md rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/aggr.go (100%) rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/binary_op.go (98%) rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/binaryop/funcs.go (100%) create mode 100644 vendor/github.com/VictoriaMetrics/metricsql/doc.go create mode 100644 vendor/github.com/VictoriaMetrics/metricsql/go.mod create mode 100644 vendor/github.com/VictoriaMetrics/metricsql/go.sum rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/lexer.go (100%) rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/parser.go (100%) rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/regexp_cache.go (100%) rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/rollup.go (100%) rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/transform.go (100%) rename {lib => vendor/github.com/VictoriaMetrics}/metricsql/utils.go (100%) diff --git a/app/vmalert/rule.go b/app/vmalert/rule.go index 185705395..9d40a4442 100644 --- a/app/vmalert/rule.go +++ b/app/vmalert/rule.go @@ -12,8 +12,8 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/datasource" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/notifier" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal" + "github.com/VictoriaMetrics/metricsql" ) // Group grouping array of alert diff --git a/app/vmselect/prometheus/prometheus.go b/app/vmselect/prometheus/prometheus.go index 9cf755f45..13cd8e2a7 100644 --- a/app/vmselect/prometheus/prometheus.go +++ b/app/vmselect/prometheus/prometheus.go @@ -16,9 +16,9 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/app/vmselect/netstorage" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmselect/promql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" "github.com/VictoriaMetrics/metrics" + "github.com/VictoriaMetrics/metricsql" "github.com/valyala/fastjson/fastfloat" "github.com/valyala/quicktemplate" ) diff --git a/app/vmselect/promql/aggr.go b/app/vmselect/promql/aggr.go index 684559049..8071da3a0 100644 --- a/app/vmselect/promql/aggr.go +++ b/app/vmselect/promql/aggr.go @@ -8,9 +8,9 @@ import ( "strings" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" "github.com/VictoriaMetrics/metrics" + "github.com/VictoriaMetrics/metricsql" "github.com/valyala/histogram" ) diff --git a/app/vmselect/promql/aggr_incremental.go b/app/vmselect/promql/aggr_incremental.go index 985f35f56..f2599ab27 100644 --- a/app/vmselect/promql/aggr_incremental.go +++ b/app/vmselect/promql/aggr_incremental.go @@ -5,7 +5,7 @@ import ( "strings" "sync" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" + "github.com/VictoriaMetrics/metricsql" ) // callbacks for optimized incremental calculations for aggregate functions diff --git a/app/vmselect/promql/aggr_incremental_test.go b/app/vmselect/promql/aggr_incremental_test.go index e31c9bee9..b517989b3 100644 --- a/app/vmselect/promql/aggr_incremental_test.go +++ b/app/vmselect/promql/aggr_incremental_test.go @@ -8,7 +8,7 @@ import ( "sync" "testing" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" + "github.com/VictoriaMetrics/metricsql" ) func TestIncrementalAggr(t *testing.T) { diff --git a/app/vmselect/promql/binary_op.go b/app/vmselect/promql/binary_op.go index e4ecc658a..7ba5257a8 100644 --- a/app/vmselect/promql/binary_op.go +++ b/app/vmselect/promql/binary_op.go @@ -6,9 +6,9 @@ import ( "strings" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql/binaryop" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" + "github.com/VictoriaMetrics/metricsql" + "github.com/VictoriaMetrics/metricsql/binaryop" ) var binaryOpFuncs = map[string]binaryOpFunc{ diff --git a/app/vmselect/promql/eval.go b/app/vmselect/promql/eval.go index 329b47061..09006e639 100644 --- a/app/vmselect/promql/eval.go +++ b/app/vmselect/promql/eval.go @@ -11,9 +11,9 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/memory" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" "github.com/VictoriaMetrics/metrics" + "github.com/VictoriaMetrics/metricsql" ) var ( diff --git a/app/vmselect/promql/exec.go b/app/vmselect/promql/exec.go index 87db688f3..f42337477 100644 --- a/app/vmselect/promql/exec.go +++ b/app/vmselect/promql/exec.go @@ -11,8 +11,8 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/app/vmselect/netstorage" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/metrics" + "github.com/VictoriaMetrics/metricsql" ) var logSlowQueryDuration = flag.Duration("search.logSlowQueryDuration", 5*time.Second, "Log queries with execution time exceeding this value. Zero disables slow query logging") diff --git a/app/vmselect/promql/parser.go b/app/vmselect/promql/parser.go index d4b581032..5ef1a3432 100644 --- a/app/vmselect/promql/parser.go +++ b/app/vmselect/promql/parser.go @@ -3,8 +3,8 @@ package promql import ( "fmt" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" + "github.com/VictoriaMetrics/metricsql" ) // IsRollup verifies whether s is a rollup with non-empty window. diff --git a/app/vmselect/promql/rollup.go b/app/vmselect/promql/rollup.go index 82d68a779..1e234d810 100644 --- a/app/vmselect/promql/rollup.go +++ b/app/vmselect/promql/rollup.go @@ -9,9 +9,9 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/decimal" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" "github.com/VictoriaMetrics/metrics" + "github.com/VictoriaMetrics/metricsql" "github.com/valyala/histogram" ) diff --git a/app/vmselect/promql/rollup_result_cache.go b/app/vmselect/promql/rollup_result_cache.go index 6769bd15d..32b9070aa 100644 --- a/app/vmselect/promql/rollup_result_cache.go +++ b/app/vmselect/promql/rollup_result_cache.go @@ -12,10 +12,10 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/encoding" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/memory" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/workingsetcache" "github.com/VictoriaMetrics/fastcache" "github.com/VictoriaMetrics/metrics" + "github.com/VictoriaMetrics/metricsql" ) var ( diff --git a/app/vmselect/promql/rollup_result_cache_test.go b/app/vmselect/promql/rollup_result_cache_test.go index 0ca594132..de9a25e71 100644 --- a/app/vmselect/promql/rollup_result_cache_test.go +++ b/app/vmselect/promql/rollup_result_cache_test.go @@ -3,8 +3,8 @@ package promql import ( "testing" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" + "github.com/VictoriaMetrics/metricsql" ) func TestRollupResultCache(t *testing.T) { diff --git a/app/vmselect/promql/rollup_test.go b/app/vmselect/promql/rollup_test.go index 3e506cea9..08a1b055d 100644 --- a/app/vmselect/promql/rollup_test.go +++ b/app/vmselect/promql/rollup_test.go @@ -4,7 +4,7 @@ import ( "math" "testing" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" + "github.com/VictoriaMetrics/metricsql" ) var ( diff --git a/app/vmselect/promql/transform.go b/app/vmselect/promql/transform.go index b65567b6a..b08f9e8a4 100644 --- a/app/vmselect/promql/transform.go +++ b/app/vmselect/promql/transform.go @@ -12,8 +12,8 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/decimal" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" + "github.com/VictoriaMetrics/metricsql" "github.com/valyala/histogram" ) diff --git a/docs/MetricsQL.md b/docs/MetricsQL.md index 08b163e8c..6d0461a53 100644 --- a/docs/MetricsQL.md +++ b/docs/MetricsQL.md @@ -2,7 +2,7 @@ VictoriaMetrics implements MetricsQL - query language inspired by [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/). It is backwards compatible with PromQL, so Grafana dashboards backed by Prometheus datasource should work the same after switching from Prometheus to VictoriaMetrics. -[Standalone MetricsQL package](https://godoc.org/github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql) can be used for parsing MetricsQL in external apps. +[Standalone MetricsQL package](https://godoc.org/github.com/VictoriaMetrics/metricsql) can be used for parsing MetricsQL in external apps. The following functionality is implemented differently in MetricsQL comparing to PromQL in order to improve user experience: * MetricsQL takes into account the previous point before the window in square brackets for range functions such as `rate` and `increase`. diff --git a/go.mod b/go.mod index 2c4bf9f14..8a117dab6 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ require ( cloud.google.com/go/storage v1.6.0 github.com/VictoriaMetrics/fastcache v1.5.7 github.com/VictoriaMetrics/metrics v1.11.2 + github.com/VictoriaMetrics/metricsql v0.1.0 github.com/aws/aws-sdk-go v1.30.13 github.com/cespare/xxhash/v2 v2.1.1 github.com/golang/protobuf v1.4.0 // indirect diff --git a/go.sum b/go.sum index 9e24292d3..62ea2a9de 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,8 @@ github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQu github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= github.com/VictoriaMetrics/metrics v1.11.2 h1:t/ceLP6SvagUqypCKU7cI7+tQn54+TIV/tGoxihHvx8= github.com/VictoriaMetrics/metrics v1.11.2/go.mod h1:LU2j9qq7xqZYXz8tF3/RQnB2z2MbZms5TDiIg9/NHiQ= +github.com/VictoriaMetrics/metricsql v0.1.0 h1:IoyG84PCwFY15rNuxpr2nQ+YZBYIhnd7zTiaGo5BNpc= +github.com/VictoriaMetrics/metricsql v0.1.0/go.mod h1:UIjd9S0W1UnTWlJdM0wLS+2pfuPqjwqKoK8yTos+WyE= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/aws/aws-sdk-go v1.30.13 h1:fBDYaJzInlOHpoKFaTEze5MvZ/pw7mhYkzDE8HAmD74= diff --git a/lib/metricsql/README.md b/lib/metricsql/README.md new file mode 100644 index 000000000..8eb33e341 --- /dev/null +++ b/lib/metricsql/README.md @@ -0,0 +1,3 @@ +# metricsql + +This package has been moved to [github.com/VictoriaMetrics/metricsql](https://github.com/VictoriaMetrics/metricsql). diff --git a/lib/metricsql/aggr_test.go b/lib/metricsql/aggr_test.go deleted file mode 100644 index 5dcdf3f02..000000000 --- a/lib/metricsql/aggr_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package metricsql - -import ( - "testing" -) - -func TestIsAggrFuncModifierSuccess(t *testing.T) { - f := func(s string) { - t.Helper() - if !isAggrFuncModifier(s) { - t.Fatalf("expecting valid funcModifier: %q", s) - } - } - f("by") - f("BY") - f("without") - f("Without") -} - -func TestIsAggrFuncModifierError(t *testing.T) { - f := func(s string) { - t.Helper() - if isAggrFuncModifier(s) { - t.Fatalf("unexpected valid funcModifier: %q", s) - } - } - f("byfix") - f("on") - f("ignoring") -} diff --git a/lib/metricsql/binary_op_test.go b/lib/metricsql/binary_op_test.go deleted file mode 100644 index b847394ca..000000000 --- a/lib/metricsql/binary_op_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package metricsql - -import ( - "testing" -) - -func TestIsBinaryOpSuccess(t *testing.T) { - f := func(s string) { - t.Helper() - if !isBinaryOp(s) { - t.Fatalf("expecting valid binaryOp: %q", s) - } - } - f("and") - f("AND") - f("unless") - f("unleSS") - f("==") - f("!=") - f(">=") - f("<=") - f("or") - f("Or") - f("+") - f("-") - f("*") - f("/") - f("%") - f("^") - f(">") - f("<") -} - -func TestIsBinaryOpError(t *testing.T) { - f := func(s string) { - t.Helper() - if isBinaryOp(s) { - t.Fatalf("unexpected valid binaryOp: %q", s) - } - } - f("foobar") - f("=~") - f("!~") - f("=") - f("<==") - f("234") -} - -func TestIsBinaryOpGroupModifierSuccess(t *testing.T) { - f := func(s string) { - t.Helper() - if !isBinaryOpGroupModifier(s) { - t.Fatalf("expecting valid binaryOpGroupModifier: %q", s) - } - } - f("on") - f("ON") - f("oN") - f("ignoring") - f("IGnoring") -} - -func TestIsBinaryOpGroupModifierError(t *testing.T) { - f := func(s string) { - t.Helper() - if isBinaryOpGroupModifier(s) { - t.Fatalf("unexpected valid binaryOpGroupModifier: %q", s) - } - } - f("off") - f("by") - f("without") - f("123") -} - -func TestIsBinaryOpJoinModifierSuccess(t *testing.T) { - f := func(s string) { - t.Helper() - if !isBinaryOpJoinModifier(s) { - t.Fatalf("expecting valid binaryOpJoinModifier: %q", s) - } - } - f("group_left") - f("group_right") - f("group_LEft") - f("GRoup_RighT") -} - -func TestIsBinaryOpJoinModifierError(t *testing.T) { - f := func(s string) { - t.Helper() - if isBinaryOpJoinModifier(s) { - t.Fatalf("unexpected valid binaryOpJoinModifier: %q", s) - } - } - f("on") - f("by") - f("without") - f("123") -} - -func TestIsBinaryOpBoolModifierSuccess(t *testing.T) { - f := func(s string) { - t.Helper() - if !isBinaryOpBoolModifier(s) { - t.Fatalf("expecting valid binaryOpBoolModifier: %q", s) - } - } - f("bool") - f("bOOL") - f("BOOL") -} - -func TestIsBinaryOpBoolModifierError(t *testing.T) { - f := func(s string) { - t.Helper() - if isBinaryOpBoolModifier(s) { - t.Fatalf("unexpected valid binaryOpBoolModifier: %q", s) - } - } - f("on") - f("by") - f("without") - f("123") -} diff --git a/lib/metricsql/doc.go b/lib/metricsql/doc.go index 55f156849..1c5bc4006 100644 --- a/lib/metricsql/doc.go +++ b/lib/metricsql/doc.go @@ -1,15 +1,3 @@ -// Package metricsql implements MetricsQL parser. -// -// This parser can parse PromQL. Additionally it can parse all the MetricsQL extensions. -// See https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL for details about MetricsQL extensions. -// -// Usage: -// -// expr, err := metricsql.Parse(`sum(rate(foo{bar="baz"}[5m])) by (job)`) -// if err != nil { -// // parse error -// } -// // Now expr contains parsed MetricsQL as `*Expr` structs. -// // See Parse examples for more details. +// Package metricsql has been moved to https://github.com/VictoriaMetrics/metricsql . // package metricsql diff --git a/lib/metricsql/lexer_test.go b/lib/metricsql/lexer_test.go deleted file mode 100644 index 99e4b7483..000000000 --- a/lib/metricsql/lexer_test.go +++ /dev/null @@ -1,401 +0,0 @@ -package metricsql - -import ( - "reflect" - "testing" -) - -func TestUnescapeIdent(t *testing.T) { - f := func(s, resultExpected string) { - t.Helper() - result := unescapeIdent(s) - if result != resultExpected { - t.Fatalf("unexpected result for unescapeIdent(%q); got %q; want %q", s, result, resultExpected) - } - } - f("", "") - f("a", "a") - f("\\", "") - f(`\\`, `\`) - f(`\foo\-bar`, `foo-bar`) - f(`a\\\\b\"c\d`, `a\\b"cd`) - f(`foo.bar:baz_123`, `foo.bar:baz_123`) - f(`foo\ bar`, `foo bar`) - f(`\x21`, `!`) - f(`\xeDfoo\x2Fbar\-\xqw\x`, "\xedfoo\x2fbar-xqwx") -} - -func TestAppendEscapedIdent(t *testing.T) { - f := func(s, resultExpected string) { - t.Helper() - result := appendEscapedIdent(nil, s) - if string(result) != resultExpected { - t.Fatalf("unexpected result for appendEscapedIdent(%q); got %q; want %q", s, result, resultExpected) - } - } - f(`a`, `a`) - f(`a.b:c_23`, `a.b:c_23`) - f(`a b-cd+dd\`, `a\ b\-cd\+dd\\`) - f("a\x1E\x20\xee", `a\x1e\ \xee`) - f("\x2e\x2e", `\x2e.`) -} - -func TestScanIdent(t *testing.T) { - f := func(s, resultExpected string) { - t.Helper() - result := scanIdent(s) - if result != resultExpected { - t.Fatalf("unexpected result for scanIdent(%q): got %q; want %q", s, result, resultExpected) - } - } - f("a", "a") - f("foo.bar:baz_123", "foo.bar:baz_123") - f("a+b", "a") - f("foo()", "foo") - f(`a\-b+c`, `a\-b`) - f(`a\ b\\\ c\`, `a\ b\\\ c\`) -} - -func TestLexerNextPrev(t *testing.T) { - var lex lexer - lex.Init("foo bar baz") - if lex.Token != "" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "") - } - if err := lex.Next(); err != nil { - t.Fatalf("unexpeted error: %s", err) - } - if lex.Token != "foo" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "foo") - } - - // Rewind before the first item. - lex.Prev() - if lex.Token != "" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "") - } - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if lex.Token != "foo" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "foo") - } - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if lex.Token != "bar" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "bar") - } - - // Rewind to the first item. - lex.Prev() - if lex.Token != "foo" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "foo") - } - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if lex.Token != "bar" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "bar") - } - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if lex.Token != "baz" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "baz") - } - - // Go beyond the token stream. - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if lex.Token != "" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "") - } - if !isEOF(lex.Token) { - t.Fatalf("expecting eof") - } - lex.Prev() - if lex.Token != "baz" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "baz") - } - - // Go multiple times lex.Next() beyond token stream. - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if lex.Token != "" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "") - } - if !isEOF(lex.Token) { - t.Fatalf("expecting eof") - } - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if lex.Token != "" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "") - } - if !isEOF(lex.Token) { - t.Fatalf("expecting eof") - } - lex.Prev() - if lex.Token != "" { - t.Fatalf("unexpected token got: %q; want %q", lex.Token, "") - } - if !isEOF(lex.Token) { - t.Fatalf("expecting eof") - } -} - -func TestLexerSuccess(t *testing.T) { - var s string - var expectedTokens []string - - // An empty string - s = "" - expectedTokens = nil - testLexerSuccess(t, s, expectedTokens) - - // String with whitespace - s = " \n\t\r " - expectedTokens = nil - testLexerSuccess(t, s, expectedTokens) - - // Just metric name - s = "metric" - expectedTokens = []string{"metric"} - testLexerSuccess(t, s, expectedTokens) - - // Metric name with spec chars - s = ":foo.bar_" - expectedTokens = []string{":foo.bar_"} - testLexerSuccess(t, s, expectedTokens) - - // Metric name with window - s = "metric[5m] " - expectedTokens = []string{"metric", "[", "5m", "]"} - testLexerSuccess(t, s, expectedTokens) - - // Metric name with tag filters - s = ` metric:12.34{a="foo", b != "bar", c=~ "x.+y", d !~ "zzz"}` - expectedTokens = []string{`metric:12.34`, `{`, `a`, `=`, `"foo"`, `,`, `b`, `!=`, `"bar"`, `,`, `c`, `=~`, `"x.+y"`, `,`, `d`, `!~`, `"zzz"`, `}`} - testLexerSuccess(t, s, expectedTokens) - - // Metric name with offset - s = ` metric offset 10d ` - expectedTokens = []string{`metric`, `offset`, `10d`} - testLexerSuccess(t, s, expectedTokens) - - // Func call - s = `sum ( metric{x="y" } [5m] offset 10h)` - expectedTokens = []string{`sum`, `(`, `metric`, `{`, `x`, `=`, `"y"`, `}`, `[`, `5m`, `]`, `offset`, `10h`, `)`} - testLexerSuccess(t, s, expectedTokens) - - // Binary op - s = `a+b or c % d and e unless f` - expectedTokens = []string{`a`, `+`, `b`, `or`, `c`, `%`, `d`, `and`, `e`, `unless`, `f`} - testLexerSuccess(t, s, expectedTokens) - - // Numbers - s = `3+1.2-.23+4.5e5-78e-6+1.24e+45-NaN+Inf` - expectedTokens = []string{`3`, `+`, `1.2`, `-`, `.23`, `+`, `4.5e5`, `-`, `78e-6`, `+`, `1.24e+45`, `-`, `NaN`, `+`, `Inf`} - testLexerSuccess(t, s, expectedTokens) - - s = `12.34` - expectedTokens = []string{`12.34`} - testLexerSuccess(t, s, expectedTokens) - - // Strings - s = `""''` + "``" + `"\\" '\\' "\"" '\''"\\\"\\"` - expectedTokens = []string{`""`, `''`, "``", `"\\"`, `'\\'`, `"\""`, `'\''`, `"\\\"\\"`} - testLexerSuccess(t, s, expectedTokens) - - s = " `foo\\\\\\`бар` " - expectedTokens = []string{"`foo\\\\\\`бар`"} - testLexerSuccess(t, s, expectedTokens) - - s = `# comment # sdf - foobar # comment - baz - # yet another comment` - expectedTokens = []string{"foobar", "baz"} - testLexerSuccess(t, s, expectedTokens) -} - -func testLexerSuccess(t *testing.T, s string, expectedTokens []string) { - t.Helper() - - var lex lexer - lex.Init(s) - - var tokens []string - for { - if err := lex.Next(); err != nil { - t.Fatalf("unexpected error: %s", err) - } - if isEOF(lex.Token) { - break - } - tokens = append(tokens, lex.Token) - } - if !reflect.DeepEqual(tokens, expectedTokens) { - t.Fatalf("unexected tokens\ngot\n%q\nwant\n%q", tokens, expectedTokens) - } -} - -func TestLexerError(t *testing.T) { - // Invalid identifier - testLexerError(t, ".foo") - - // Incomplete string - testLexerError(t, `"foobar`) - testLexerError(t, `'`) - testLexerError(t, "`") - - // Unrecognized char - testLexerError(t, "тест") - - // Invalid numbers - testLexerError(t, `.`) - testLexerError(t, `123.`) - testLexerError(t, `12e`) - testLexerError(t, `1.2e`) - testLexerError(t, `1.2E+`) - testLexerError(t, `1.2E-`) -} - -func testLexerError(t *testing.T, s string) { - t.Helper() - - var lex lexer - lex.Init(s) - for { - if err := lex.Next(); err != nil { - // Expected error - break - } - if isEOF(lex.Token) { - t.Fatalf("expecting error during parse") - } - } - - // Try calling Next again. It must return error. - if err := lex.Next(); err == nil { - t.Fatalf("expecting non-nil error") - } -} - -func TestPositiveDurationSuccess(t *testing.T) { - f := func(s string, step, expectedD int64) { - t.Helper() - d, err := PositiveDurationValue(s, step) - if err != nil { - t.Fatalf("unexpected error: %s", err) - } - if d != expectedD { - t.Fatalf("unexpected duration; got %d; want %d", d, expectedD) - } - } - - // Integer durations - f("123s", 42, 123*1000) - f("123m", 42, 123*60*1000) - f("1h", 42, 1*60*60*1000) - f("2d", 42, 2*24*60*60*1000) - f("3w", 42, 3*7*24*60*60*1000) - f("4y", 42, 4*365*24*60*60*1000) - f("1i", 42*1000, 42*1000) - f("3i", 42, 3*42) - - // Float durations - f("0.234s", 42, 234) - f("1.5s", 42, 1.5*1000) - f("1.5m", 42, 1.5*60*1000) - f("1.2h", 42, 1.2*60*60*1000) - f("1.1d", 42, 1.1*24*60*60*1000) - f("1.1w", 42, 1.1*7*24*60*60*1000) - f("1.3y", 42, 1.3*365*24*60*60*1000) - f("0.1i", 12340, 0.1*12340) -} - -func TestPositiveDurationError(t *testing.T) { - f := func(s string) { - t.Helper() - if isPositiveDuration(s) { - t.Fatalf("unexpected valid duration %q", s) - } - d, err := PositiveDurationValue(s, 42) - if err == nil { - t.Fatalf("expecting non-nil error for duration %q", s) - } - if d != 0 { - t.Fatalf("expecting zero duration; got %d", d) - } - } - f("") - f("foo") - f("m") - f("12") - f("1.23") - f("1.23mm") - f("123q") - f("-123s") -} - -func TestDurationSuccess(t *testing.T) { - f := func(s string, step, expectedD int64) { - t.Helper() - d, err := DurationValue(s, step) - if err != nil { - t.Fatalf("unexpected error: %s", err) - } - if d != expectedD { - t.Fatalf("unexpected duration; got %d; want %d", d, expectedD) - } - } - - // Integer durations - f("123s", 42, 123*1000) - f("-123s", 42, -123*1000) - f("123m", 42, 123*60*1000) - f("1h", 42, 1*60*60*1000) - f("2d", 42, 2*24*60*60*1000) - f("3w", 42, 3*7*24*60*60*1000) - f("4y", 42, 4*365*24*60*60*1000) - f("1i", 42*1000, 42*1000) - f("3i", 42, 3*42) - f("-3i", 42, -3*42) - - // Float durations - f("0.234s", 42, 234) - f("-0.234s", 42, -234) - f("1.5s", 42, 1.5*1000) - f("1.5m", 42, 1.5*60*1000) - f("1.2h", 42, 1.2*60*60*1000) - f("1.1d", 42, 1.1*24*60*60*1000) - f("1.1w", 42, 1.1*7*24*60*60*1000) - f("1.3y", 42, 1.3*365*24*60*60*1000) - f("-1.3y", 42, -1.3*365*24*60*60*1000) - f("0.1i", 12340, 0.1*12340) -} - -func TestDurationError(t *testing.T) { - f := func(s string) { - t.Helper() - d, err := DurationValue(s, 42) - if err == nil { - t.Fatalf("expecting non-nil error for duration %q", s) - } - if d != 0 { - t.Fatalf("expecting zero duration; got %d", d) - } - } - f("") - f("foo") - f("m") - f("12") - f("1.23") - f("1.23mm") - f("123q") -} diff --git a/lib/metricsql/parser_example_test.go b/lib/metricsql/parser_example_test.go deleted file mode 100644 index b9e7540ce..000000000 --- a/lib/metricsql/parser_example_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package metricsql_test - -import ( - "fmt" - "log" - - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" -) - -func ExampleParse() { - expr, err := metricsql.Parse(`sum(rate(foo{bar="baz"}[5m])) by (x,y)`) - if err != nil { - log.Fatalf("parse error: %s", err) - } - fmt.Printf("parsed expr: %s\n", expr.AppendString(nil)) - - ae := expr.(*metricsql.AggrFuncExpr) - fmt.Printf("aggr func: name=%s, arg=%s, modifier=%s\n", ae.Name, ae.Args[0].AppendString(nil), ae.Modifier.AppendString(nil)) - - fe := ae.Args[0].(*metricsql.FuncExpr) - fmt.Printf("func: name=%s, arg=%s\n", fe.Name, fe.Args[0].AppendString(nil)) - - re := fe.Args[0].(*metricsql.RollupExpr) - fmt.Printf("rollup: expr=%s, window=%s\n", re.Expr.AppendString(nil), re.Window) - - me := re.Expr.(*metricsql.MetricExpr) - fmt.Printf("metric: labelFilter1=%s, labelFilter2=%s", me.LabelFilters[0].AppendString(nil), me.LabelFilters[1].AppendString(nil)) - - // Output: - // parsed expr: sum(rate(foo{bar="baz"}[5m])) by (x, y) - // aggr func: name=sum, arg=rate(foo{bar="baz"}[5m]), modifier=by (x, y) - // func: name=rate, arg=foo{bar="baz"}[5m] - // rollup: expr=foo{bar="baz"}, window=5m - // metric: labelFilter1=__name__="foo", labelFilter2=bar="baz" -} diff --git a/lib/metricsql/parser_test.go b/lib/metricsql/parser_test.go deleted file mode 100644 index 57a3410eb..000000000 --- a/lib/metricsql/parser_test.go +++ /dev/null @@ -1,679 +0,0 @@ -package metricsql - -import ( - "testing" -) - -func TestParseSuccess(t *testing.T) { - another := func(s string, sExpected string) { - t.Helper() - - e, err := Parse(s) - if err != nil { - t.Fatalf("unexpected error when parsing %q: %s", s, err) - } - res := e.AppendString(nil) - if string(res) != sExpected { - t.Fatalf("unexpected string constructed;\ngot\n%q\nwant\n%q", res, sExpected) - } - } - same := func(s string) { - t.Helper() - another(s, s) - } - - // metricExpr - same(`{}`) - same(`{}[5m]`) - same(`{}[5m:]`) - same(`{}[:]`) - another(`{}[: ]`, `{}[:]`) - same(`{}[:3s]`) - another(`{}[: 3s ]`, `{}[:3s]`) - same(`{}[5m:3s]`) - another(`{}[ 5m : 3s ]`, `{}[5m:3s]`) - same(`{} offset 5m`) - same(`{} offset -5m`) - same(`{}[5m] offset 10y`) - same(`{}[5.3m:3.4s] offset 10y`) - same(`{}[:3.4s] offset 10y`) - same(`{}[:3.4s] offset -10y`) - same(`{Foo="bAR"}`) - same(`{foo="bar"}`) - same(`{foo="bar"}[5m]`) - same(`{foo="bar"}[5m:]`) - same(`{foo="bar"}[5m:3s]`) - same(`{foo="bar"} offset 10y`) - same(`{foo="bar"} offset -10y`) - same(`{foo="bar"}[5m] offset 10y`) - same(`{foo="bar"}[5m:3s] offset 10y`) - another(`{foo="bar"}[5m] oFFSEt 10y`, `{foo="bar"}[5m] offset 10y`) - same("METRIC") - same("metric") - same("m_e:tri44:_c123") - another("-metric", "0 - metric") - same(`metric offset 10h`) - same("metric[5m]") - same("metric[5m:3s]") - same("metric[5m] offset 10h") - same("metric[5m:3s] offset 10h") - same("metric[5i:3i] offset 10i") - same(`metric{foo="bar"}`) - same(`metric{foo="bar"} offset 10h`) - same(`metric{foo!="bar"}[2d]`) - same(`metric{foo="bar"}[2d] offset 10h`) - same(`metric{foo="bar", b="sdfsdf"}[2d:3h] offset 10h`) - another(` metric { foo = "bar" } [ 2d ] offset 10h `, `metric{foo="bar"}[2d] offset 10h`) - // metric name matching keywords - same("rate") - same("RATE") - same("by") - same("BY") - same("bool") - same("BOOL") - same("unless") - same("UNLESS") - same("Ignoring") - same("with") - same("WITH") - same("With") - same("alias") - same(`alias{foo="bar"}`) - same(`aLIas{alias="aa"}`) - another(`al\ias`, `alias`) - // identifiers with with escape chars - same(`foo\ bar`) - same(`foo\-bar\{{baz\+bar="aa"}`) - another(`\x2E\x2ef\oo{b\xEF\ar="aa"}`, `\x2e.foo{b\xefar="aa"}`) - // Duplicate filters - same(`foo{__name__="bar"}`) - same(`foo{a="b", a="c", __name__="aaa", b="d"}`) - // Metric filters ending with comma - another(`m{foo="bar",}`, `m{foo="bar"}`) - // String concat in tag value - another(`m{foo="bar" + "baz"}`, `m{foo="barbaz"}`) - - // Valid regexp - same(`foo{bar=~"x"}`) - same(`foo{bar=~"^x"}`) - same(`foo{bar=~"^x$"}`) - same(`foo{bar=~"^(a[bc]|d)$"}`) - same(`foo{bar!~"x"}`) - same(`foo{bar!~"^x"}`) - same(`foo{bar!~"^x$"}`) - same(`foo{bar!~"^(a[bc]|d)$"}`) - - // stringExpr - same(`""`) - same(`"\n\t\r 12:{}[]()44"`) - another(`''`, `""`) - another("``", `""`) - another(" `foo\"b'ar` ", "\"foo\\\"b'ar\"") - another(` 'foo\'bar"BAZ' `, `"foo'bar\"BAZ"`) - // string concat - another(`"foo"+'bar'`, `"foobar"`) - - // numberExpr - same(`1`) - same(`1.23`) - same(`0.23`) - same(`1.2e+45`) - same(`1.2e-45`) - same(`-1`) - same(`-1.23`) - same(`-0.23`) - same(`-1.2e+45`) - same(`-1.2e-45`) - same(`-1.2e-45`) - another(`12.5E34`, `1.25e+35`) - another(`-.2`, `-0.2`) - another(`-.2E-2`, `-0.002`) - same(`NaN`) - another(`nan`, `NaN`) - another(`NAN`, `NaN`) - another(`nAN`, `NaN`) - another(`Inf`, `+Inf`) - another(`INF`, `+Inf`) - another(`inf`, `+Inf`) - another(`+Inf`, `+Inf`) - another(`-Inf`, `-Inf`) - another(`-inF`, `-Inf`) - - // binaryOpExpr - another(`nan == nan`, `NaN`) - another(`nan ==bool nan`, `1`) - another(`nan !=bool nan`, `0`) - another(`nan !=bool 2`, `1`) - another(`2 !=bool nan`, `1`) - another(`nan >bool nan`, `0`) - another(`nan =bool 2`, `1`) - another(`-1 >bool -inf`, `1`) - another(`-1 2`, `NaN`) - another(`1 > bool 2`, `0`) - another(`3 >= 2`, `3`) - another(`3 <= bool 2`, `0`) - another(`1 + -2 - 3`, `-4`) - another(`1 / 0 + 2`, `+Inf`) - another(`2 + -1 / 0`, `-Inf`) - another(`-1 ^ 0.5`, `NaN`) - another(`512.5 - (1 + 3) * (2 ^ 2) ^ 3`, `256.5`) - another(`1 == bool 1 != bool 24 < bool 4 > bool -1`, `1`) - another(`1 == bOOl 1 != BOOL 24 < Bool 4 > booL -1`, `1`) - another(`m1+on(foo)group_left m2`, `m1 + on (foo) group_left () m2`) - another(`M1+ON(FOO)GROUP_left M2`, `M1 + on (FOO) group_left () M2`) - same(`m1 + on (foo) group_right () m2`) - same(`m1 + on (foo, bar) group_right (x, y) m2`) - another(`m1 + on (foo, bar,) group_right (x, y,) m2`, `m1 + on (foo, bar) group_right (x, y) m2`) - same(`m1 == bool on (foo, bar) group_right (x, y) m2`) - another(`5 - 1 + 3 * 2 ^ 2 ^ 3 - 2 OR Metric {Bar= "Baz", aaa!="bb",cc=~"dd" ,zz !~"ff" } `, - `770 or Metric{Bar="Baz", aaa!="bb", cc=~"dd", zz!~"ff"}`) - same(`"foo" + bar()`) - same(`"foo" + bar{x="y"}`) - same(`("foo"[3s] + bar{x="y"})[5m:3s] offset 10s`) - same(`("foo"[3s] + bar{x="y"})[5i:3i] offset 10i`) - same(`bar + "foo" offset 3s`) - same(`bar + "foo" offset 3i`) - another(`1+2 if 2>3`, `NaN`) - another(`1+4 if 2<3`, `5`) - another(`2+6 default 3 if 2>3`, `8`) - another(`2+6 if 2>3 default NaN`, `NaN`) - another(`42 if 3>2 if 2+2<5`, `42`) - another(`42 if 3>2 if 2+2>=5`, `NaN`) - another(`1+2 ifnot 2>3`, `3`) - another(`1+4 ifnot 2<3`, `NaN`) - another(`2+6 default 3 ifnot 2>3`, `8`) - another(`2+6 ifnot 2>3 default NaN`, `8`) - another(`42 if 3>2 ifnot 2+2<5`, `NaN`) - another(`42 if 3>2 ifnot 2+2>=5`, `42`) - - // parensExpr - another(`(-foo + ((bar) / (baz))) + ((23))`, `((0 - foo) + (bar / baz)) + 23`) - another(`(FOO + ((Bar) / (baZ))) + ((23))`, `(FOO + (Bar / baZ)) + 23`) - same(`(foo, bar)`) - another(`((foo, bar),(baz))`, `((foo, bar), baz)`) - same(`(foo, (bar, baz), ((x, y), (z, y), xx))`) - another(`1+(foo, bar,)`, `1 + (foo, bar)`) - another(`((foo(bar,baz)), (1+(2)+(3,4)+()))`, `(foo(bar, baz), (3 + (3, 4)) + ())`) - same(`()`) - - // funcExpr - same(`f()`) - another(`f(x,)`, `f(x)`) - another(`-f()-Ff()`, `(0 - f()) - Ff()`) - same(`F()`) - another(`+F()`, `F()`) - another(`++F()`, `F()`) - another(`--F()`, `0 - (0 - F())`) - same(`f(http_server_request)`) - same(`f(http_server_request)[4s:5m] offset 10m`) - same(`f(http_server_request)[4i:5i] offset 10i`) - same(`F(HttpServerRequest)`) - same(`f(job, foo)`) - same(`F(Job, Foo)`) - another(` FOO (bar) + f ( m ( ),ff(1 + ( 2.5)) ,M[5m ] , "ff" )`, `FOO(bar) + f(m(), ff(3.5), M[5m], "ff")`) - // funcName matching keywords - same(`by(2)`) - same(`BY(2)`) - same(`or(2)`) - same(`OR(2)`) - same(`bool(2)`) - same(`BOOL(2)`) - same(`rate(rate(m))`) - same(`rate(rate(m[5m]))`) - same(`rate(rate(m[5m])[1h:])`) - same(`rate(rate(m[5m])[1h:3s])`) - // funcName with escape chars - same(`foo\(ba\-r()`) - - // aggrFuncExpr - same(`sum(http_server_request) by ()`) - same(`sum(http_server_request) by (job)`) - same(`sum(http_server_request) without (job, foo)`) - another(`sum(x,y,) without (a,b,)`, `sum(x, y) without (a, b)`) - another(`sum by () (xx)`, `sum(xx) by ()`) - another(`sum by (s) (xx)[5s]`, `(sum(xx) by (s))[5s]`) - another(`SUM BY (ZZ, aa) (XX)`, `sum(XX) by (ZZ, aa)`) - another(`sum without (a, b) (xx,2+2)`, `sum(xx, 4) without (a, b)`) - another(`Sum WIthout (a, B) (XX,2+2)`, `sum(XX, 4) without (a, B)`) - same(`sum(a) or sum(b)`) - same(`sum(a) by () or sum(b) without (x, y)`) - same(`sum(a) + sum(b)`) - same(`sum(x) * (1 + sum(a))`) - - // All the above - another(`Sum(Ff(M) * M{X=""}[5m] Offset 7m - 123, 35) BY (X, y) * F2("Test")`, - `sum((Ff(M) * M{X=""}[5m] offset 7m) - 123, 35) by (X, y) * F2("Test")`) - another(`# comment - Sum(Ff(M) * M{X=""}[5m] Offset 7m - 123, 35) BY (X, y) # yet another comment - * F2("Test")`, - `sum((Ff(M) * M{X=""}[5m] offset 7m) - 123, 35) by (X, y) * F2("Test")`) - - // withExpr - another(`with () x`, `x`) - another(`with (x=1,) x`, `1`) - another(`with (x = m offset 5h) x + x`, `m offset 5h + m offset 5h`) - another(`with (x = m offset 5i) x + x`, `m offset 5i + m offset 5i`) - another(`with (foo = bar{x="x"}) 1`, `1`) - another(`with (foo = bar{x="x"}) "x"`, `"x"`) - another(`with (f="x") f`, `"x"`) - another(`with (foo = bar{x="x"}) x{x="y"}`, `x{x="y"}`) - another(`with (foo = bar{x="x"}) 1+1`, `2`) - another(`with (foo = bar{x="x"}) f()`, `f()`) - another(`with (foo = bar{x="x"}) sum(x)`, `sum(x)`) - another(`with (foo = bar{x="x"}) baz{foo="bar"}`, `baz{foo="bar"}`) - another(`with (foo = bar) baz`, `baz`) - another(`with (foo = bar) foo + foo{a="b"}`, `bar + bar{a="b"}`) - another(`with (foo = bar, bar=baz + f()) test`, `test`) - another(`with (ct={job="test"}) a{ct} + ct() + f({ct="x"})`, `(a{job="test"} + {job="test"}) + f({ct="x"})`) - another(`with (ct={job="test", i="bar"}) ct + {ct, x="d"} + foo{ct, ct} + ctx(1)`, - `(({job="test", i="bar"} + {job="test", i="bar", x="d"}) + foo{job="test", i="bar"}) + ctx(1)`) - another(`with (foo = bar) {__name__=~"foo"}`, `{__name__=~"foo"}`) - another(`with (foo = bar) foo{__name__="foo"}`, `bar`) - another(`with (foo = bar) {__name__="foo", x="y"}`, `bar{x="y"}`) - another(`with (foo(bar) = {__name__!="bar"}) foo(x)`, `{__name__!="bar"}`) - another(`with (foo(bar) = bar{__name__="bar"}) foo(x)`, `x`) - another(`with (foo\-bar(baz) = baz + baz) foo\-bar((x,y))`, `(x, y) + (x, y)`) - another(`with (foo\-bar(baz) = baz + baz) foo\-bar(x*y)`, `(x * y) + (x * y)`) - another(`with (foo\-bar(baz) = baz + baz) foo\-bar(x\*y)`, `x\*y + x\*y`) - another(`with (foo\-bar(b\ az) = b\ az + b\ az) foo\-bar(x\*y)`, `x\*y + x\*y`) - // override ttf to something new. - another(`with (ttf = a) ttf + b`, `a + b`) - // override ttf to ru - another(`with (ttf = ru(m, n)) ttf`, `(clamp_min(n - clamp_min(m, 0), 0) / clamp_min(n, 0)) * 100`) - - // Verify withExpr recursion and forward reference - another(`with (x = x+y, y = x+x) y ^ 2`, `((x + y) + (x + y)) ^ 2`) - another(`with (f1(x)=f2(x), f2(x)=f1(x)^2) f1(foobar)`, `f2(foobar)`) - another(`with (f1(x)=f2(x), f2(x)=f1(x)^2) f2(foobar)`, `f2(foobar) ^ 2`) - - // Verify withExpr funcs - another(`with (x() = y+1) x`, `y + 1`) - another(`with (x(foo) = foo+1) x(a)`, `a + 1`) - another(`with (x(a, b) = a + b) x(foo, bar)`, `foo + bar`) - another(`with (x(a, b) = a + b) x(foo, x(1, 2))`, `foo + 3`) - another(`with (x(a) = sum(a) by (b)) x(xx) / x(y)`, `sum(xx) by (b) / sum(y) by (b)`) - another(`with (f(a,f,x)=ff(x,f,a)) f(f(x,y,z),1,2)`, `ff(2, 1, ff(z, y, x))`) - another(`with (f(x)=1+f(x)) f(foo{bar="baz"})`, `1 + f(foo{bar="baz"})`) - another(`with (a=foo, y=bar, f(a)= a+a+y) f(x)`, `(x + x) + bar`) - another(`with (f(a, b) = m{a, b}) f({a="x", b="y"}, {c="d"})`, `m{a="x", b="y", c="d"}`) - another(`with (xx={a="x"}, f(a, b) = m{a, b}) f({xx, b="y"}, {c="d"})`, `m{a="x", b="y", c="d"}`) - another(`with (x() = {b="c"}) foo{x}`, `foo{b="c"}`) - another(`with (f(x)=x{foo="bar"} offset 5m) f(m offset 10m)`, `(m{foo="bar"} offset 10m) offset 5m`) - another(`with (f(x)=x{foo="bar",bas="a"}[5m]) f(m[10m] offset 3s)`, `(m{foo="bar", bas="a"}[10m] offset 3s)[5m]`) - another(`with (f(x)=x{foo="bar"}[5m] offset 10m) f(m{x="y"})`, `m{x="y", foo="bar"}[5m] offset 10m`) - another(`with (f(x)=x{foo="bar"}[5m] offset 10m) f({x="y", foo="bar", foo="bar"})`, `{x="y", foo="bar"}[5m] offset 10m`) - another(`with (f(m, x)=m{x}[5m] offset 10m) f(foo, {})`, `foo[5m] offset 10m`) - another(`with (f(m, x)=m{x, bar="baz"}[5m] offset 10m) f(foo, {})`, `foo{bar="baz"}[5m] offset 10m`) - another(`with (f(x)=x[5m] offset 3s) f(foo[3m]+bar)`, `(foo[3m] + bar)[5m] offset 3s`) - another(`with (f(x)=x[5m:3s] oFFsEt 1.5m) f(sum(s) by (a,b))`, `(sum(s) by (a, b))[5m:3s] offset 1.5m`) - another(`with (x="a", y=x) y+"bc"`, `"abc"`) - another(`with (x="a", y="b"+x) "we"+y+"z"+f()`, `"webaz" + f()`) - another(`with (f(x) = m{foo=x+"y", bar="y"+x, baz=x} + x) f("qwe")`, `m{foo="qwey", bar="yqwe", baz="qwe"} + "qwe"`) - another(`with (f(a)=a) f`, `f`) - another(`with (f\q(a)=a) f\q`, `fq`) - - // Verify withExpr for aggr func modifiers - another(`with (f(x) = x, y = sum(m) by (f)) y`, `sum(m) by (f)`) - another(`with (f(x) = sum(m) by (x)) f(foo)`, `sum(m) by (foo)`) - another(`with (f(x) = sum(m) by (x)) f((foo, bar, foo))`, `sum(m) by (foo, bar)`) - another(`with (f(x) = sum(m) without (x,y)) f((a, b))`, `sum(m) without (a, b, y)`) - another(`with (f(x) = sum(m) without (y,x)) f((a, y))`, `sum(m) without (y, a)`) - another(`with (f(x,y) = a + on (x,y) group_left (y,bar) b) f(foo,())`, `a + on (foo) group_left (bar) b`) - another(`with (f(x,y) = a + on (x,y) group_left (y,bar) b) f((foo),())`, `a + on (foo) group_left (bar) b`) - another(`with (f(x,y) = a + on (x,y) group_left (y,bar) b) f((foo,xx),())`, `a + on (foo, xx) group_left (bar) b`) - - // Verify nested with exprs - another(`with (f(x) = (with(x=y) x) + x) f(z)`, `y + z`) - another(`with (x=foo) f(a, with (y=x) y)`, `f(a, foo)`) - another(`with (x=foo) a * x + (with (y=x) y) / y`, `(a * foo) + (foo / y)`) - another(`with (x = with (y = foo) y + x) x/x`, `(foo + x) / (foo + x)`) - another(`with ( - x = {foo="bar"}, - q = m{x, y="1"}, - f(x) = - with ( - z(y) = x + y * q - ) - z(foo) / f(x) - ) - f(a)`, `(a + (foo * m{foo="bar", y="1"})) / f(a)`) - - // complex withExpr - another(`WITH ( - treshold = (0.9), - commonFilters = {job="cacher", instance=~"1.2.3.4"}, - hits = rate(cache{type="hit", commonFilters}[5m]), - miss = rate(cache{type="miss", commonFilters}[5m]), - sumByInstance(arg) = sum(arg) by (instance), - hitRatio = sumByInstance(hits) / sumByInstance(hits + miss) - ) - hitRatio < treshold`, - `(sum(rate(cache{type="hit", job="cacher", instance=~"1.2.3.4"}[5m])) by (instance) / sum(rate(cache{type="hit", job="cacher", instance=~"1.2.3.4"}[5m]) + rate(cache{type="miss", job="cacher", instance=~"1.2.3.4"}[5m])) by (instance)) < 0.9`) - another(`WITH ( - x2(x) = x^2, - f(x, y) = x2(x) + x*y + x2(y) - ) - f(a, 3) - `, `((a ^ 2) + (a * 3)) + 9`) - another(`WITH ( - x2(x) = x^2, - f(x, y) = x2(x) + x*y + x2(y) - ) - f(2, 3) - `, `19`) - another(`WITH ( - commonFilters = {instance="foo"}, - timeToFuckup(currv, maxv) = (maxv - currv) / rate(currv) - ) - timeToFuckup(diskUsage{commonFilters}, maxDiskSize{commonFilters})`, - `(maxDiskSize{instance="foo"} - diskUsage{instance="foo"}) / rate(diskUsage{instance="foo"})`) - another(`WITH ( - commonFilters = {job="foo", instance="bar"}, - sumRate(m, cf) = sum(rate(m{cf})) by (job, instance), - hitRate(hits, misses) = sumRate(hits, commonFilters) / (sumRate(hits, commonFilters) + sumRate(misses, commonFilters)) - ) - hitRate(cacheHits, cacheMisses)`, - `sum(rate(cacheHits{job="foo", instance="bar"})) by (job, instance) / (sum(rate(cacheHits{job="foo", instance="bar"})) by (job, instance) + sum(rate(cacheMisses{job="foo", instance="bar"})) by (job, instance))`) - another(`with(y=123,z=5) union(with(y=3,f(x)=x*y) f(2) + f(3), with(x=5,y=2) x*y*z)`, `union(15, 50)`) -} - -func TestParseError(t *testing.T) { - f := func(s string) { - t.Helper() - - e, err := Parse(s) - if err == nil { - t.Fatalf("expecting non-nil error when parsing %q", s) - } - if e != nil { - t.Fatalf("expecting nil expr when parsing %q", s) - } - } - - // an empty string - f("") - f(" \t\b\r\n ") - - // invalid metricExpr - f(`{__name__="ff"} offset 55`) - f(`foo[55]`) - f(`m[-5m]`) - f(`{`) - f(`foo{`) - f(`foo{bar`) - f(`foo{bar=`) - f(`foo{bar="baz"`) - f(`foo{bar="baz", `) - f(`foo{123="23"}`) - f(`foo{foo}`) - f(`foo{,}`) - f(`foo{,foo="bar"}`) - f(`foo{foo=}`) - f(`foo{foo="ba}`) - f(`foo{"foo"="bar"}`) - f(`foo{$`) - f(`foo{a $`) - f(`foo{a="b",$`) - f(`foo{a="b"}$`) - f(`[`) - f(`[]`) - f(`f[5m]$`) - f(`[5m]`) - f(`[5m] offset 4h`) - f(`m[5m] offset $`) - f(`m[5m] offset 5h $`) - f(`m[]`) - f(`m[-5m]`) - f(`m[5m:`) - f(`m[5m:-`) - f(`m[5m:-1`) - f(`m[5m:-1]`) - f(`m[5m:-1s]`) - f(`m[-5m:1s]`) - f(`m[-5m:-1s]`) - f(`m[:`) - f(`m[:-`) - f(`m[:1]`) - f(`m[:-1m]`) - f(`m[5]`) - f(`m[[5m]]`) - f(`m[foo]`) - f(`m["ff"]`) - f(`m[10m`) - f(`m[123`) - f(`m["ff`) - f(`m[(f`) - f(`fd}`) - f(`]`) - f(`m $`) - f(`m{,}`) - f(`m{x=y}`) - f(`m{x=y/5}`) - f(`m{x=y+5}`) - - // Invalid regexp - f(`foo{bar=~"x["}`) - f(`foo{bar=~"x("}`) - f(`foo{bar=~"x)"}`) - f(`foo{bar!~"x["}`) - f(`foo{bar!~"x("}`) - f(`foo{bar!~"x)"}`) - - // invalid stringExpr - f(`'`) - f(`"`) - f("`") - f(`"foo`) - f(`'foo`) - f("`foo") - f(`"foo\"bar`) - f(`'foo\'bar`) - f("`foo\\`bar") - f(`"" $`) - f(`"foo" +`) - f(`n{"foo" + m`) - - // invalid numberExpr - f(`12.`) - f(`1.2e`) - f(`23e-`) - f(`23E+`) - f(`.`) - f(`-12.`) - f(`-1.2e`) - f(`-23e-`) - f(`-23E+`) - f(`-.`) - f(`-1$$`) - f(`-$$`) - f(`+$$`) - f(`23 $$`) - - // invalid binaryOpExpr - f(`+`) - f(`1 +`) - f(`1 + 2.`) - f(`3 unless`) - f(`23 + on (foo)`) - f(`m + on (,) m`) - f(`3 * ignoring`) - f(`m * on (`) - f(`m * on (foo`) - f(`m * on (foo,`) - f(`m * on (foo,)`) - f(`m * on (,foo)`) - f(`m * on (,)`) - f(`m == bool (bar) baz`) - f(`m == bool () baz`) - f(`m * by (baz) n`) - f(`m + bool group_left m2`) - f(`m + on () group_left (`) - f(`m + on () group_left (,`) - f(`m + on () group_left (,foo`) - f(`m + on () group_left (foo,)`) - f(`m + on () group_left (,foo)`) - f(`m + on () group_left (foo)`) - f(`m + on () group_right (foo) (m`) - f(`m or ignoring () group_left () n`) - f(`1 + bool 2`) - f(`m % bool n`) - f(`m * bool baz`) - f(`M * BOoL BaZ`) - f(`foo unless ignoring (bar) group_left xxx`) - f(`foo or bool bar`) - f(`foo == bool $$`) - f(`"foo" + bar`) - - // invalid parensExpr - f(`(`) - f(`($`) - f(`(+`) - f(`(1`) - f(`(m+`) - f(`1)`) - f(`(,)`) - f(`(1)$`) - - // invalid funcExpr - f(`f $`) - f(`f($)`) - f(`f[`) - f(`f()$`) - f(`f(`) - f(`f(foo`) - f(`f(f,`) - f(`f(,`) - f(`f(,)`) - f(`f(,foo)`) - f(`f(,foo`) - f(`f(foo,$`) - f(`f() by (a)`) - f(`f without (x) (y)`) - f(`f() foo (a)`) - f(`f bar (x) (b)`) - f(`f bar (x)`) - - // invalid aggrFuncExpr - f(`sum(`) - f(`sum $`) - f(`sum [`) - f(`sum($)`) - f(`sum()$`) - f(`sum(foo) ba`) - f(`sum(foo) ba()`) - f(`sum(foo) by`) - f(`sum(foo) without x`) - f(`sum(foo) aaa`) - f(`sum(foo) aaa x`) - f(`sum() by $`) - f(`sum() by (`) - f(`sum() by ($`) - f(`sum() by (a`) - f(`sum() by (a $`) - f(`sum() by (a ]`) - f(`sum() by (a)$`) - f(`sum() by (,`) - f(`sum() by (a,$`) - f(`sum() by (,)`) - f(`sum() by (,a`) - f(`sum() by (,a)`) - f(`sum() on (b)`) - f(`sum() bool`) - f(`sum() group_left`) - f(`sum() group_right(x)`) - f(`sum ba`) - f(`sum ba ()`) - f(`sum by (`) - f(`sum by (a`) - f(`sum by (,`) - f(`sum by (,)`) - f(`sum by (,a`) - f(`sum by (,a)`) - f(`sum by (a)`) - f(`sum by (a) (`) - f(`sum by (a) [`) - f(`sum by (a) {`) - f(`sum by (a) (b`) - f(`sum by (a) (b,`) - f(`sum by (a) (,)`) - f(`avg by (a) (,b)`) - f(`sum by (x) (y) by (z)`) - f(`sum(m) by (1)`) - - // invalid withExpr - f(`with $`) - f(`with a`) - f(`with a=b c`) - f(`with (`) - f(`with (x=b)$`) - f(`with ($`) - f(`with (foo`) - f(`with (foo $`) - f(`with (x y`) - f(`with (x =`) - f(`with (x = $`) - f(`with (x= y`) - f(`with (x= y $`) - f(`with (x= y)`) - f(`with (x=(`) - f(`with (x=[)`) - f(`with (x=() x)`) - f(`with ($$)`) - f(`with (x $$`) - f(`with (x = $$)`) - f(`with (x = foo) bar{x}`) - f(`with (x = {foo="bar"}[5m]) bar{x}`) - f(`with (x = {foo="bar"} offset 5m) bar{x}`) - f(`with (x = a, x = b) c`) - f(`with (x(a, a) = b) c`) - f(`with (x=m{f="x"}) foo{x}`) - f(`with (sum = x) y`) - f(`with (rate(a) = b) c`) - f(`with (clamp_min=x) y`) - f(`with (f()`) - f(`with (a=b c=d) e`) - f(`with (f(x)=x^2) m{x}`) - f(`with (f(x)=ff()) m{x}`) - f(`with (f(x`) - f(`with (x=m) a{x} + b`) - f(`with (x=m) b + a{x}`) - f(`with (x=m) f(b, a{x})`) - f(`with (x=m) sum(a{x})`) - f(`with (x=m) (a{x})`) - f(`with (f(a)=a) f(1, 2)`) - f(`with (f(x)=x{foo="bar"}) f(1)`) - f(`with (f(x)=x{foo="bar"}) f(m + n)`) - f(`with (f = with`) - f(`with (,)`) - f(`with (1) 2`) - f(`with (f(1)=2) 3`) - f(`with (f(,)=x) x`) - f(`with (x(a) = {b="c"}) foo{x}`) - f(`with (f(x) = m{foo=xx}) f("qwe")`) - f(`a + with(f(x)=x) f(1,2)`) - f(`with (f(x) = sum(m) by (x)) f({foo="bar"})`) - f(`with (f(x) = sum(m) by (x)) f((xx(), {foo="bar"}))`) - f(`with (f(x) = m + on (x) n) f(xx())`) - f(`with (f(x) = m + on (a) group_right (x) n) f(xx())`) -} diff --git a/lib/metricsql/utils_example_test.go b/lib/metricsql/utils_example_test.go deleted file mode 100644 index 33629cf30..000000000 --- a/lib/metricsql/utils_example_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package metricsql_test - -import ( - "fmt" - "log" - - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql" -) - -func ExampleExpandWithExprs() { - // mql can contain arbitrary MetricsQL extensions - see https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL - mql := `WITH ( - commonFilters = {job="$job", instance="$instance"}, - f(a, b) = 100*(a/b), - ) - f(disk_free_bytes{commonFilters}, disk_total_bytes{commonFilters})` - - // Convert mql to PromQL - pql, err := metricsql.ExpandWithExprs(mql) - if err != nil { - log.Fatalf("cannot expand with expressions: %s", err) - } - - fmt.Printf("%s\n", pql) - - // Output: - // 100 * (disk_free_bytes{job="$job", instance="$instance"} / disk_total_bytes{job="$job", instance="$instance"}) -} diff --git a/lib/metricsql/utils_test.go b/lib/metricsql/utils_test.go deleted file mode 100644 index ce08034a2..000000000 --- a/lib/metricsql/utils_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package metricsql - -import ( - "testing" -) - -func TestExpandWithExprsSuccess(t *testing.T) { - f := func(q, qExpected string) { - t.Helper() - for i := 0; i < 3; i++ { - qExpanded, err := ExpandWithExprs(q) - if err != nil { - t.Fatalf("unexpected error when expanding %q: %s", q, err) - } - if qExpanded != qExpected { - t.Fatalf("unexpected expanded expression for %q;\ngot\n%q\nwant\n%q", q, qExpanded, qExpected) - } - } - } - - f(`1`, `1`) - f(`foobar`, `foobar`) - f(`with (x = 1) x+x`, `2`) - f(`with (f(x) = x*x) 3+f(2)+2`, `9`) -} - -func TestExpandWithExprsError(t *testing.T) { - f := func(q string) { - t.Helper() - for i := 0; i < 3; i++ { - qExpanded, err := ExpandWithExprs(q) - if err == nil { - t.Fatalf("expecting non-nil error when expanding %q", q) - } - if qExpanded != "" { - t.Fatalf("unexpected non-empty qExpanded=%q", qExpanded) - } - } - } - - f(``) - f(` with (`) -} diff --git a/vendor/github.com/VictoriaMetrics/metricsql/LICENSE b/vendor/github.com/VictoriaMetrics/metricsql/LICENSE new file mode 100644 index 000000000..b0d2a9fb5 --- /dev/null +++ b/vendor/github.com/VictoriaMetrics/metricsql/LICENSE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2019-2020 VictoriaMetrics, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/VictoriaMetrics/metricsql/README.md b/vendor/github.com/VictoriaMetrics/metricsql/README.md new file mode 100644 index 000000000..28af4ac44 --- /dev/null +++ b/vendor/github.com/VictoriaMetrics/metricsql/README.md @@ -0,0 +1,23 @@ +[![Build Status](https://github.com/VictoriaMetrics/metricsql/workflows/main/badge.svg)](https://github.com/VictoriaMetrics/metricsql/actions) +[![GoDoc](https://godoc.org/github.com/VictoriaMetrics/metricsql?status.svg)](http://godoc.org/github.com/VictoriaMetrics/metricsql) +[![Go Report](https://goreportcard.com/badge/github.com/VictoriaMetrics/metricsql)](https://goreportcard.com/report/github.com/VictoriaMetrics/metricsql) +[![codecov](https://codecov.io/gh/VictoriaMetrics/metricsql/branch/master/graph/badge.svg)](https://codecov.io/gh/VictoriaMetrics/metricsql) + + +# metricsql + +Package metricsql implements [MetricsQL](https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL) +and [PromQL](https://medium.com/@valyala/promql-tutorial-for-beginners-9ab455142085) parser in Go. + +### Usage + +```go + expr, err := metricsql.Parse(`sum(rate(foo{bar="baz"}[5m])) by (job)`) + if err != nil { + // parse error + } + // Now expr contains parsed MetricsQL as `*Expr` structs. + // See Parse examples for more details. +``` + +See [docs](https://godoc.org/github.com/VictoriaMetrics/metricsql) for more details. diff --git a/lib/metricsql/aggr.go b/vendor/github.com/VictoriaMetrics/metricsql/aggr.go similarity index 100% rename from lib/metricsql/aggr.go rename to vendor/github.com/VictoriaMetrics/metricsql/aggr.go diff --git a/lib/metricsql/binary_op.go b/vendor/github.com/VictoriaMetrics/metricsql/binary_op.go similarity index 98% rename from lib/metricsql/binary_op.go rename to vendor/github.com/VictoriaMetrics/metricsql/binary_op.go index 453929566..1e7d8be53 100644 --- a/lib/metricsql/binary_op.go +++ b/vendor/github.com/VictoriaMetrics/metricsql/binary_op.go @@ -5,7 +5,7 @@ import ( "math" "strings" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql/binaryop" + "github.com/VictoriaMetrics/metricsql/binaryop" ) var binaryOps = map[string]bool{ diff --git a/lib/metricsql/binaryop/funcs.go b/vendor/github.com/VictoriaMetrics/metricsql/binaryop/funcs.go similarity index 100% rename from lib/metricsql/binaryop/funcs.go rename to vendor/github.com/VictoriaMetrics/metricsql/binaryop/funcs.go diff --git a/vendor/github.com/VictoriaMetrics/metricsql/doc.go b/vendor/github.com/VictoriaMetrics/metricsql/doc.go new file mode 100644 index 000000000..55f156849 --- /dev/null +++ b/vendor/github.com/VictoriaMetrics/metricsql/doc.go @@ -0,0 +1,15 @@ +// Package metricsql implements MetricsQL parser. +// +// This parser can parse PromQL. Additionally it can parse all the MetricsQL extensions. +// See https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL for details about MetricsQL extensions. +// +// Usage: +// +// expr, err := metricsql.Parse(`sum(rate(foo{bar="baz"}[5m])) by (job)`) +// if err != nil { +// // parse error +// } +// // Now expr contains parsed MetricsQL as `*Expr` structs. +// // See Parse examples for more details. +// +package metricsql diff --git a/vendor/github.com/VictoriaMetrics/metricsql/go.mod b/vendor/github.com/VictoriaMetrics/metricsql/go.mod new file mode 100644 index 000000000..9f8ac04e8 --- /dev/null +++ b/vendor/github.com/VictoriaMetrics/metricsql/go.mod @@ -0,0 +1,5 @@ +module github.com/VictoriaMetrics/metricsql + +go 1.13 + +require github.com/VictoriaMetrics/metrics v1.11.2 diff --git a/vendor/github.com/VictoriaMetrics/metricsql/go.sum b/vendor/github.com/VictoriaMetrics/metricsql/go.sum new file mode 100644 index 000000000..482d891c0 --- /dev/null +++ b/vendor/github.com/VictoriaMetrics/metricsql/go.sum @@ -0,0 +1,6 @@ +github.com/VictoriaMetrics/metrics v1.11.2 h1:t/ceLP6SvagUqypCKU7cI7+tQn54+TIV/tGoxihHvx8= +github.com/VictoriaMetrics/metrics v1.11.2/go.mod h1:LU2j9qq7xqZYXz8tF3/RQnB2z2MbZms5TDiIg9/NHiQ= +github.com/valyala/fastrand v1.0.0 h1:LUKT9aKer2dVQNUi3waewTbKV+7H17kvWFNKs2ObdkI= +github.com/valyala/fastrand v1.0.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ= +github.com/valyala/histogram v1.0.1 h1:FzA7n2Tz/wKRMejgu3PV1vw3htAklTjjuoI6z3d4KDg= +github.com/valyala/histogram v1.0.1/go.mod h1:lQy0xA4wUz2+IUnf97SivorsJIp8FxsnRd6x25q7Mto= diff --git a/lib/metricsql/lexer.go b/vendor/github.com/VictoriaMetrics/metricsql/lexer.go similarity index 100% rename from lib/metricsql/lexer.go rename to vendor/github.com/VictoriaMetrics/metricsql/lexer.go diff --git a/lib/metricsql/parser.go b/vendor/github.com/VictoriaMetrics/metricsql/parser.go similarity index 100% rename from lib/metricsql/parser.go rename to vendor/github.com/VictoriaMetrics/metricsql/parser.go diff --git a/lib/metricsql/regexp_cache.go b/vendor/github.com/VictoriaMetrics/metricsql/regexp_cache.go similarity index 100% rename from lib/metricsql/regexp_cache.go rename to vendor/github.com/VictoriaMetrics/metricsql/regexp_cache.go diff --git a/lib/metricsql/rollup.go b/vendor/github.com/VictoriaMetrics/metricsql/rollup.go similarity index 100% rename from lib/metricsql/rollup.go rename to vendor/github.com/VictoriaMetrics/metricsql/rollup.go diff --git a/lib/metricsql/transform.go b/vendor/github.com/VictoriaMetrics/metricsql/transform.go similarity index 100% rename from lib/metricsql/transform.go rename to vendor/github.com/VictoriaMetrics/metricsql/transform.go diff --git a/lib/metricsql/utils.go b/vendor/github.com/VictoriaMetrics/metricsql/utils.go similarity index 100% rename from lib/metricsql/utils.go rename to vendor/github.com/VictoriaMetrics/metricsql/utils.go diff --git a/vendor/modules.txt b/vendor/modules.txt index 0d8884ca3..4d9b9709c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -14,6 +14,9 @@ github.com/BurntSushi/toml github.com/VictoriaMetrics/fastcache # github.com/VictoriaMetrics/metrics v1.11.2 github.com/VictoriaMetrics/metrics +# github.com/VictoriaMetrics/metricsql v0.1.0 +github.com/VictoriaMetrics/metricsql +github.com/VictoriaMetrics/metricsql/binaryop # github.com/aws/aws-sdk-go v1.30.13 github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/arn