add support for parsing buckets from variables of prom.Linear and prom.Expo helpers

Change-Id: I61bb46dcbdc02d506da563bc7973430ecef8c364
This commit is contained in:
Han Kang 2022-10-13 10:44:13 -07:00
parent 79b4f1e77a
commit be3e5cb313

View File

@ -404,13 +404,19 @@ func (c *metricDecoder) decodeBuckets(expr ast.Expr) ([]float64, error) {
case *ast.Ident: case *ast.Ident:
variableExpr, found := c.variables[v.Name] variableExpr, found := c.variables[v.Name]
if !found { 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) 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")
}
case *ast.CompositeLit: case *ast.CompositeLit:
return decodeListOfFloats(v, v.Elts) return decodeListOfFloats(v, v.Elts)
@ -421,30 +427,38 @@ func (c *metricDecoder) decodeBuckets(expr ast.Expr) ([]float64, error) {
return metrics.DefBuckets, nil return metrics.DefBuckets, nil
} }
case *ast.CallExpr: case *ast.CallExpr:
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) se, ok := v.Fun.(*ast.SelectorExpr)
if !ok { if !ok {
return nil, newDecodeErrorf(v, errBuckets) return nil, newDecodeErrorf(v, errBuckets), true
} }
functionName := se.Sel.String() functionName := se.Sel.String()
functionImport, ok := se.X.(*ast.Ident) functionImport, ok := se.X.(*ast.Ident)
if !ok { if !ok {
return nil, newDecodeErrorf(v, errBuckets) return nil, newDecodeErrorf(v, errBuckets), true
} }
if functionImport.String() != c.kubeMetricsImportName { if functionImport.String() != c.kubeMetricsImportName {
return nil, newDecodeErrorf(v, errBuckets) return nil, newDecodeErrorf(v, errBuckets), true
} }
firstArg, secondArg, thirdArg, err := decodeBucketArguments(v) firstArg, secondArg, thirdArg, err := decodeBucketArguments(v)
if err != nil { if err != nil {
return nil, err return nil, err, true
} }
switch functionName { switch functionName {
case "LinearBuckets": case "LinearBuckets":
return metrics.LinearBuckets(firstArg, secondArg, thirdArg), nil return metrics.LinearBuckets(firstArg, secondArg, thirdArg), nil, true
case "ExponentialBuckets": case "ExponentialBuckets":
return metrics.ExponentialBuckets(firstArg, secondArg, thirdArg), nil return metrics.ExponentialBuckets(firstArg, secondArg, thirdArg), nil, true
} }
} return nil, nil, false
return nil, newDecodeErrorf(expr, errBuckets)
} }
func (c *metricDecoder) decodeObjectives(expr ast.Expr) (map[float64]float64, error) { func (c *metricDecoder) decodeObjectives(expr ast.Expr) (map[float64]float64, error) {