From be3e5cb313b9bd3ef9ac840bcabda95be8d10d64 Mon Sep 17 00:00:00 2001 From: Han Kang Date: Thu, 13 Oct 2022 10:44:13 -0700 Subject: [PATCH] add support for parsing buckets from variables of prom.Linear and prom.Expo helpers Change-Id: I61bb46dcbdc02d506da563bc7973430ecef8c364 --- test/instrumentation/decode_metric.go | 66 ++++++++++++++++----------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/test/instrumentation/decode_metric.go b/test/instrumentation/decode_metric.go index ef0ee99e3ae..1c1cf582480 100644 --- a/test/instrumentation/decode_metric.go +++ b/test/instrumentation/decode_metric.go @@ -404,13 +404,19 @@ func (c *metricDecoder) decodeBuckets(expr ast.Expr) ([]float64, error) { case *ast.Ident: variableExpr, found := c.variables[v.Name] if !found { - return nil, fmt.Errorf("couldn't find variable for bucket") + return nil, newDecodeErrorf(v, "couldn't find variable for bucket") } - v2, ok := variableExpr.(*ast.CompositeLit) - if !ok { - return nil, fmt.Errorf("couldn't find variable for bucket") + switch v2 := variableExpr.(type) { + case *ast.CompositeLit: + return decodeListOfFloats(v2, v2.Elts) + case *ast.CallExpr: + float64s, err2, done := c.decodeBucketFunctionCall(v2) + if done { + return float64s, err2 + } + default: + return nil, newDecodeErrorf(v, "couldn't find variable for bucket") } - return decodeListOfFloats(v2, v2.Elts) case *ast.CompositeLit: return decodeListOfFloats(v, v.Elts) @@ -421,32 +427,40 @@ func (c *metricDecoder) decodeBuckets(expr ast.Expr) ([]float64, error) { return metrics.DefBuckets, nil } case *ast.CallExpr: - se, ok := v.Fun.(*ast.SelectorExpr) - if !ok { - return nil, newDecodeErrorf(v, errBuckets) - } - functionName := se.Sel.String() - functionImport, ok := se.X.(*ast.Ident) - if !ok { - return nil, newDecodeErrorf(v, errBuckets) - } - if functionImport.String() != c.kubeMetricsImportName { - return nil, newDecodeErrorf(v, errBuckets) - } - firstArg, secondArg, thirdArg, err := decodeBucketArguments(v) - if err != nil { - return nil, err - } - switch functionName { - case "LinearBuckets": - return metrics.LinearBuckets(firstArg, secondArg, thirdArg), nil - case "ExponentialBuckets": - return metrics.ExponentialBuckets(firstArg, secondArg, thirdArg), nil + float64s, err2, done := c.decodeBucketFunctionCall(v) + if done { + return float64s, err2 } } return nil, newDecodeErrorf(expr, errBuckets) } +func (c *metricDecoder) decodeBucketFunctionCall(v *ast.CallExpr) ([]float64, error, bool) { + se, ok := v.Fun.(*ast.SelectorExpr) + if !ok { + return nil, newDecodeErrorf(v, errBuckets), true + } + functionName := se.Sel.String() + functionImport, ok := se.X.(*ast.Ident) + if !ok { + return nil, newDecodeErrorf(v, errBuckets), true + } + if functionImport.String() != c.kubeMetricsImportName { + return nil, newDecodeErrorf(v, errBuckets), true + } + firstArg, secondArg, thirdArg, err := decodeBucketArguments(v) + if err != nil { + return nil, err, true + } + switch functionName { + case "LinearBuckets": + return metrics.LinearBuckets(firstArg, secondArg, thirdArg), nil, true + case "ExponentialBuckets": + return metrics.ExponentialBuckets(firstArg, secondArg, thirdArg), nil, true + } + return nil, nil, false +} + func (c *metricDecoder) decodeObjectives(expr ast.Expr) (map[float64]float64, error) { switch v := expr.(type) { case *ast.CompositeLit: