diff --git a/go.mod b/go.mod index 149a4841d7..3584a43643 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( github.com/vishvananda/netns v0.0.5-0.20240412164733-9469873f4601 github.com/vmihailenco/msgpack v4.0.4+incompatible github.com/xuri/excelize/v2 v2.7.1 - github.com/zexi/influxql-to-metricsql v0.0.6 + github.com/zexi/influxql-to-metricsql v0.0.7 go.etcd.io/etcd/api/v3 v3.5.0 go.etcd.io/etcd/client/v3 v3.5.0 golang.org/x/crypto v0.8.0 diff --git a/go.sum b/go.sum index 9debd2bbc3..7c82c052a6 100644 --- a/go.sum +++ b/go.sum @@ -840,6 +840,8 @@ github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPR github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zexi/influxql-to-metricsql v0.0.6 h1:E16T4oqgjIJtSNVvhGGHnw+pmY3yGz2iRsmmmSVuOpY= github.com/zexi/influxql-to-metricsql v0.0.6/go.mod h1:PyRRM+3Zrzzig6J4okYLeSv+/d+5GaL5ccBaUKQABNs= +github.com/zexi/influxql-to-metricsql v0.0.7 h1:t2Kp6neknnOnszNl3mLteK4dSmXWglfI1JYUtRWTmyQ= +github.com/zexi/influxql-to-metricsql v0.0.7/go.mod h1:PyRRM+3Zrzzig6J4okYLeSv+/d+5GaL5ccBaUKQABNs= go.etcd.io/etcd/api/v3 v3.5.0 h1:GsV3S+OfZEOCNXdtNkBSR7kgLobAa/SO6tCxRa0GAYw= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0 h1:2aQv6F436YnN7I4VbI8PPYrBhu+SmrTaADcf8Mi/6PU= diff --git a/vendor/github.com/zexi/influxql-to-metricsql/converter/translator/promql.go b/vendor/github.com/zexi/influxql-to-metricsql/converter/translator/promql.go index 6b2a8cf1da..5232f432b5 100644 --- a/vendor/github.com/zexi/influxql-to-metricsql/converter/translator/promql.go +++ b/vendor/github.com/zexi/influxql-to-metricsql/converter/translator/promql.go @@ -17,9 +17,23 @@ import ( const UNION_RESULT_NAME = "__union_result__" const ( - CALL_TOP = "top" + CALL_TOP = "top" + CALL_PERCENTILE = "percentile" ) +var MUL_ARGS_AGGREGATOR MulArgsAggregator = []string{CALL_TOP, CALL_PERCENTILE} + +type MulArgsAggregator []string + +func (m MulArgsAggregator) Has(aggr string) bool { + for _, a := range m { + if a == aggr { + return true + } + } + return false +} + type promQL struct { groupByWildcard bool timeRange *influxql.TimeRange @@ -331,6 +345,15 @@ func getAggrExpr(ops []*AggrOperator, expr promql.Expr) promql.Expr { promql.Expressions{ aggrOp.Args[0], restExpr}) + case CALL_PERCENTILE: + expr = newAggrExprWithArgs("quantile_over_time", + []promql.ValueType{ + promql.ValueTypeString, + promql.ValueTypeMatrix, + }, promql.ValueTypeVector, + promql.Expressions{ + aggrOp.Args[0], + restExpr}) } return expr } @@ -347,18 +370,25 @@ func newAggrOperatorByName(name string) *AggrOperator { } func getAggrOperator(op *influxql.Call) ([]*AggrOperator, error) { - if len(op.Args) != 1 && op.Name != CALL_TOP { + if len(op.Args) != 1 && !MUL_ARGS_AGGREGATOR.Has(op.Name) { return nil, errors.Errorf("not supported aggregator: %s with args: %#v", op.String(), op.Args) } aggOp := newAggrOperatorByName(op.Name) - if op.Name == CALL_TOP { - topNumStr := op.Args[len(op.Args)-1].String() - topNum, err := strconv.Atoi(topNumStr) + if op.Name == CALL_TOP || op.Name == CALL_PERCENTILE { + numStr := op.Args[len(op.Args)-1].String() + num, err := strconv.Atoi(numStr) if err != nil { return nil, errors.Wrapf(err, "parse top aggregator: %s", op) } + numFloat := float64(num) + if op.Name == CALL_PERCENTILE { + if numFloat > 100 { + return nil, errors.Errorf("percentile %f is large than 100", numFloat) + } + numFloat = numFloat / 100 + } aggOp.Args = promql.Expressions{ - &promql.NumberLiteral{Val: float64(topNum)}, + &promql.NumberLiteral{Val: numFloat}, } } ret := []*AggrOperator{aggOp} @@ -418,7 +448,7 @@ var ( ) func getCallVariable(c *influxql.Call) (string, error) { - if len(c.Args) != 1 && c.Name != CALL_TOP { + if len(c.Args) != 1 && !MUL_ARGS_AGGREGATOR.Has(c.Name) { return "", errors.Errorf("length of call %q args %#v != 1", c.Name, c.Args) } switch args := c.Args[0].(type) { diff --git a/vendor/modules.txt b/vendor/modules.txt index 103756d787..0b0e9fa658 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1174,7 +1174,7 @@ github.com/xuri/nfp # github.com/yusufpapurcu/wmi v1.2.2 ## explicit; go 1.16 github.com/yusufpapurcu/wmi -# github.com/zexi/influxql-to-metricsql v0.0.6 +# github.com/zexi/influxql-to-metricsql v0.0.7 ## explicit; go 1.18 github.com/zexi/influxql-to-metricsql/converter github.com/zexi/influxql-to-metricsql/converter/translator