From 3f1b120eda41e631ba345c0e71c8ee3cbebfcc35 Mon Sep 17 00:00:00 2001 From: Nail Islamov Date: Wed, 28 Nov 2018 12:13:07 +1100 Subject: [PATCH 1/2] Add a flag `metrics-start-duration` --- cmd/adapter/adapter.go | 7 ++++++- pkg/custom-provider/provider.go | 6 ++++-- pkg/custom-provider/provider_test.go | 3 ++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/cmd/adapter/adapter.go b/cmd/adapter/adapter.go index 19731222e..37c738d5d 100644 --- a/cmd/adapter/adapter.go +++ b/cmd/adapter/adapter.go @@ -53,6 +53,8 @@ type PrometheusAdapter struct { AdapterConfigFile string // MetricsRelistInterval is the interval at which to relist the set of available metrics MetricsRelistInterval time.Duration + // MetricsMaxAge is the period to query available metrics for + MetricsMaxAge time.Duration metricsConfig *adaptercfg.MetricsDiscoveryConfig } @@ -83,6 +85,8 @@ func (cmd *PrometheusAdapter) addFlags() { "and custom metrics API resources") cmd.Flags().DurationVar(&cmd.MetricsRelistInterval, "metrics-relist-interval", cmd.MetricsRelistInterval, ""+ "interval at which to re-list the set of all available metrics from Prometheus") + cmd.Flags().DurationVar(&cmd.MetricsMaxAge, "metrics-max-age", cmd.MetricsMaxAge, ""+ + "period for which to query the set of available metrics from Prometheus") } func (cmd *PrometheusAdapter) loadConfig() error { @@ -122,7 +126,7 @@ func (cmd *PrometheusAdapter) makeProvider(promClient prom.Client, stopCh <-chan } // construct the provider and start it - cmProvider, runner := cmprov.NewPrometheusProvider(mapper, dynClient, promClient, namers, cmd.MetricsRelistInterval) + cmProvider, runner := cmprov.NewPrometheusProvider(mapper, dynClient, promClient, namers, cmd.MetricsRelistInterval, cmd.MetricsMaxAge) runner.RunUntil(stopCh) return cmProvider, nil @@ -173,6 +177,7 @@ func main() { cmd := &PrometheusAdapter{ PrometheusURL: "https://localhost", MetricsRelistInterval: 10 * time.Minute, + MetricsMaxAge: 20 * time.Minute, } cmd.Name = "prometheus-metrics-adapter" cmd.addFlags() diff --git a/pkg/custom-provider/provider.go b/pkg/custom-provider/provider.go index 96f8831cc..afd59ac94 100644 --- a/pkg/custom-provider/provider.go +++ b/pkg/custom-provider/provider.go @@ -55,9 +55,10 @@ type prometheusProvider struct { SeriesRegistry } -func NewPrometheusProvider(mapper apimeta.RESTMapper, kubeClient dynamic.Interface, promClient prom.Client, namers []MetricNamer, updateInterval time.Duration) (provider.CustomMetricsProvider, Runnable) { +func NewPrometheusProvider(mapper apimeta.RESTMapper, kubeClient dynamic.Interface, promClient prom.Client, namers []MetricNamer, updateInterval time.Duration, maxAge time.Duration) (provider.CustomMetricsProvider, Runnable) { lister := &cachingMetricsLister{ updateInterval: updateInterval, + maxAge: maxAge, promClient: promClient, namers: namers, @@ -191,6 +192,7 @@ type cachingMetricsLister struct { promClient prom.Client updateInterval time.Duration + maxAge time.Duration namers []MetricNamer } @@ -212,7 +214,7 @@ type selectorSeries struct { } func (l *cachingMetricsLister) updateMetrics() error { - startTime := pmodel.Now().Add(-1 * l.updateInterval) + startTime := pmodel.Now().Add(-1 * l.maxAge) // don't do duplicate queries when it's just the matchers that change seriesCacheByQuery := make(map[prom.Selector][]prom.Series) diff --git a/pkg/custom-provider/provider_test.go b/pkg/custom-provider/provider_test.go index dd08f978f..29abe0380 100644 --- a/pkg/custom-provider/provider_test.go +++ b/pkg/custom-provider/provider_test.go @@ -32,6 +32,7 @@ import ( ) const fakeProviderUpdateInterval = 2 * time.Second +const fakeProviderStartDuration = 2 * time.Second func setupPrometheusProvider() (provider.CustomMetricsProvider, *fakeprom.FakePrometheusClient) { fakeProm := &fakeprom.FakePrometheusClient{} @@ -41,7 +42,7 @@ func setupPrometheusProvider() (provider.CustomMetricsProvider, *fakeprom.FakePr namers, err := NamersFromConfig(cfg, restMapper()) Expect(err).NotTo(HaveOccurred()) - prov, _ := NewPrometheusProvider(restMapper(), fakeKubeClient, fakeProm, namers, fakeProviderUpdateInterval) + prov, _ := NewPrometheusProvider(restMapper(), fakeKubeClient, fakeProm, namers, fakeProviderUpdateInterval, fakeProviderStartDuration) containerSel := prom.MatchSeries("", prom.NameMatches("^container_.*"), prom.LabelNeq("container_name", "POD"), prom.LabelNeq("namespace", ""), prom.LabelNeq("pod_name", "")) namespacedSel := prom.MatchSeries("", prom.LabelNeq("namespace", ""), prom.NameNotMatches("^container_.*")) From 88c0ad0b6aafb85014b2a1fa35667879828610eb Mon Sep 17 00:00:00 2001 From: Nail Islamov Date: Wed, 28 Nov 2018 12:20:09 +1100 Subject: [PATCH 2/2] Add validation --- cmd/adapter/adapter.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/adapter/adapter.go b/cmd/adapter/adapter.go index 37c738d5d..1a31253f9 100644 --- a/cmd/adapter/adapter.go +++ b/cmd/adapter/adapter.go @@ -109,6 +109,10 @@ func (cmd *PrometheusAdapter) makeProvider(promClient prom.Client, stopCh <-chan return nil, nil } + if cmd.MetricsMaxAge < cmd.MetricsRelistInterval { + return nil, fmt.Errorf("max age must not be less than relist interval") + } + // grab the mapper and dynamic client mapper, err := cmd.RESTMapper() if err != nil {