feat(monitor): update influxql-to-metricsql@v0.0.7 to support percentile aggregator (#20836)

This commit is contained in:
Zexi Li
2024-07-17 22:59:20 +08:00
committed by GitHub
parent f4c87d3213
commit 1f3bc0ad6c
4 changed files with 41 additions and 9 deletions

2
go.mod
View File

@@ -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

2
go.sum
View File

@@ -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=

View File

@@ -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) {

2
vendor/modules.txt vendored
View File

@@ -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