diff --git a/pkg/naming/metric_namer.go b/pkg/naming/metric_namer.go index 32e96e36..b92c7610 100644 --- a/pkg/naming/metric_namer.go +++ b/pkg/naming/metric_namer.go @@ -159,7 +159,7 @@ func NamersFromConfig(cfg []config.DiscoveryRule, mapper apimeta.RESTMapper) ([] namespaced = *rule.Resources.Namespaced } - metricsQuery, err := NewMetricsQuery(rule.MetricsQuery, resConv, namespaced) + metricsQuery, err := NewExternalMetricsQuery(rule.MetricsQuery, resConv, namespaced) if err != nil { return nil, fmt.Errorf("unable to construct metrics query associated with series query %q: %v", rule.SeriesQuery, err) } diff --git a/pkg/naming/metrics_query.go b/pkg/naming/metrics_query.go index c7f5c156..0dbc13a5 100644 --- a/pkg/naming/metrics_query.go +++ b/pkg/naming/metrics_query.go @@ -50,7 +50,27 @@ type MetricsQuery interface { // - LabelMatchersByName: the raw map-form of the above matchers // - GroupBy: the group-by clause to use for the resources in the query (stringified) // - GroupBySlice: the raw slice form of the above group-by clause -func NewMetricsQuery(queryTemplate string, resourceConverter ResourceConverter, namespaced bool) (MetricsQuery, error) { +func NewMetricsQuery(queryTemplate string, resourceConverter ResourceConverter) (MetricsQuery, error) { + templ, err := template.New("metrics-query").Delims("<<", ">>").Parse(queryTemplate) + if err != nil { + return nil, fmt.Errorf("unable to parse metrics query template %q: %v", queryTemplate, err) + } + + return &metricsQuery{ + resConverter: resourceConverter, + template: templ, + namespaced: true, + }, nil +} + +// NewExternalMetricsQuery constructs a new MetricsQuery by compiling the given Go template. +// The delimiters on the template are `<<` and `>>`, and it may use the following fields: +// - Series: the series in question +// - LabelMatchers: a pre-stringified form of the label matchers for the resources in the query +// - LabelMatchersByName: the raw map-form of the above matchers +// - GroupBy: the group-by clause to use for the resources in the query (stringified) +// - GroupBySlice: the raw slice form of the above group-by clause +func NewExternalMetricsQuery(queryTemplate string, resourceConverter ResourceConverter, namespaced bool) (MetricsQuery, error) { templ, err := template.New("metrics-query").Delims("<<", ">>").Parse(queryTemplate) if err != nil { return nil, fmt.Errorf("unable to parse metrics query template %q: %v", queryTemplate, err) diff --git a/pkg/naming/metrics_query_test.go b/pkg/naming/metrics_query_test.go index 36f0d110..ebd23ce7 100644 --- a/pkg/naming/metrics_query_test.go +++ b/pkg/naming/metrics_query_test.go @@ -76,7 +76,7 @@ func checks(cs ...checkFunc) checkFunc { func TestBuildSelector(t *testing.T) { mustNewQuery := func(queryTemplate string, namespaced bool) MetricsQuery { - mq, err := NewMetricsQuery(queryTemplate, &resourceConverterMock{namespaced}, true) + mq, err := NewMetricsQuery(queryTemplate, &resourceConverterMock{namespaced}) if err != nil { t.Fatal(err) } @@ -272,7 +272,7 @@ func TestBuildSelector(t *testing.T) { func TestBuildExternalSelector(t *testing.T) { mustNewQuery := func(queryTemplate string) MetricsQuery { - mq, err := NewMetricsQuery(queryTemplate, &resourceConverterMock{true}, true) + mq, err := NewExternalMetricsQuery(queryTemplate, &resourceConverterMock{true}, true) if err != nil { t.Fatal(err) } @@ -280,7 +280,7 @@ func TestBuildExternalSelector(t *testing.T) { } mustNewNonNamespacedQuery := func(queryTemplate string) MetricsQuery { - mq, err := NewMetricsQuery(queryTemplate, &resourceConverterMock{true}, false) + mq, err := NewExternalMetricsQuery(queryTemplate, &resourceConverterMock{true}, false) if err != nil { t.Fatal(err) } diff --git a/pkg/resourceprovider/provider.go b/pkg/resourceprovider/provider.go index 18376e69..371eee0b 100644 --- a/pkg/resourceprovider/provider.go +++ b/pkg/resourceprovider/provider.go @@ -54,11 +54,11 @@ func newResourceQuery(cfg config.ResourceRule, mapper apimeta.RESTMapper) (resou return resourceQuery{}, fmt.Errorf("unable to construct label-resource converter: %v", err) } - contQuery, err := naming.NewMetricsQuery(cfg.ContainerQuery, converter, true) + contQuery, err := naming.NewMetricsQuery(cfg.ContainerQuery, converter) if err != nil { return resourceQuery{}, fmt.Errorf("unable to construct container metrics query: %v", err) } - nodeQuery, err := naming.NewMetricsQuery(cfg.NodeQuery, converter, true) + nodeQuery, err := naming.NewMetricsQuery(cfg.NodeQuery, converter) if err != nil { return resourceQuery{}, fmt.Errorf("unable to construct node metrics query: %v", err) }