From d7afefd0ffdbfcc2ee39675851245f5d588b23f8 Mon Sep 17 00:00:00 2001 From: JBD Date: Fri, 9 Jul 2021 14:44:16 -0700 Subject: [PATCH 1/2] Validate the Prometheus config Validate against nil configuration and configuration with no scrape_configs. Fixes #2705. --- receiver/prometheusreceiver/config.go | 19 +++++++++---------- receiver/prometheusreceiver/factory.go | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/receiver/prometheusreceiver/config.go b/receiver/prometheusreceiver/config.go index f5e7d445f1a..1f6c683ac32 100644 --- a/receiver/prometheusreceiver/config.go +++ b/receiver/prometheusreceiver/config.go @@ -51,16 +51,15 @@ var _ config.CustomUnmarshable = (*Config)(nil) // Validate checks the receiver configuration is valid func (cfg *Config) Validate() error { - if cfg.PrometheusConfig != nil { - if len(cfg.PrometheusConfig.ScrapeConfigs) == 0 { - return errNilScrapeConfig - } - for _, sc := range cfg.PrometheusConfig.ScrapeConfigs { - for _, rc := range sc.MetricRelabelConfigs { - if rc.TargetLabel == "__name__" { - // TODO(#2297): Remove validation after renaming is fixed - return fmt.Errorf("error validating scrapeconfig for job %v: %w", sc.JobName, errRenamingDisallowed) - } + if cfg.PrometheusConfig == nil || len(cfg.PrometheusConfig.ScrapeConfigs) == 0 { + return errInvalidPrometheusConfig + } + + for _, sc := range cfg.PrometheusConfig.ScrapeConfigs { + for _, rc := range sc.MetricRelabelConfigs { + if rc.TargetLabel == "__name__" { + // TODO(#2297): Remove validation after renaming is fixed + return fmt.Errorf("error validating scrapeconfig for job %v: %w", sc.JobName, errRenamingDisallowed) } } } diff --git a/receiver/prometheusreceiver/factory.go b/receiver/prometheusreceiver/factory.go index 98f5e9b68aa..daf8225d2f4 100644 --- a/receiver/prometheusreceiver/factory.go +++ b/receiver/prometheusreceiver/factory.go @@ -33,8 +33,8 @@ const ( ) var ( - errNilScrapeConfig = errors.New("expecting a non-nil ScrapeConfig") - errRenamingDisallowed = errors.New("metric renaming using metric_relabel_configs is disallowed") + errInvalidPrometheusConfig = errors.New("expecting a non-nil Prometheus config with a valid scrape_configs section") + errRenamingDisallowed = errors.New("metric renaming using metric_relabel_configs is disallowed") ) // NewFactory creates a new Prometheus receiver factory. From ba1a200fc3d951ef915353f5115813232d60c017 Mon Sep 17 00:00:00 2001 From: JBD Date: Mon, 12 Jul 2021 11:14:22 -0700 Subject: [PATCH 2/2] Allow initialization of recievers without any configuration --- receiver/prometheusreceiver/config.go | 11 ++++++++--- receiver/prometheusreceiver/factory.go | 5 +---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/receiver/prometheusreceiver/config.go b/receiver/prometheusreceiver/config.go index 1f6c683ac32..af310545393 100644 --- a/receiver/prometheusreceiver/config.go +++ b/receiver/prometheusreceiver/config.go @@ -15,6 +15,7 @@ package prometheusreceiver import ( + "errors" "fmt" "time" @@ -49,10 +50,13 @@ type Config struct { var _ config.Receiver = (*Config)(nil) var _ config.CustomUnmarshable = (*Config)(nil) -// Validate checks the receiver configuration is valid +// Validate checks the receiver configuration is valid. func (cfg *Config) Validate() error { - if cfg.PrometheusConfig == nil || len(cfg.PrometheusConfig.ScrapeConfigs) == 0 { - return errInvalidPrometheusConfig + if cfg.PrometheusConfig == nil { + return nil // noop receiver + } + if len(cfg.PrometheusConfig.ScrapeConfigs) == 0 { + return errors.New("no Prometheus scrape_configs") } for _, sc := range cfg.PrometheusConfig.ScrapeConfigs { @@ -93,5 +97,6 @@ func (cfg *Config) Unmarshal(componentParser *configparser.Parser) error { if err != nil { return fmt.Errorf("prometheus receiver failed to unmarshal yaml to prometheus config: %s", err) } + return nil } diff --git a/receiver/prometheusreceiver/factory.go b/receiver/prometheusreceiver/factory.go index daf8225d2f4..74e57098294 100644 --- a/receiver/prometheusreceiver/factory.go +++ b/receiver/prometheusreceiver/factory.go @@ -32,10 +32,7 @@ const ( typeStr = "prometheus" ) -var ( - errInvalidPrometheusConfig = errors.New("expecting a non-nil Prometheus config with a valid scrape_configs section") - errRenamingDisallowed = errors.New("metric renaming using metric_relabel_configs is disallowed") -) +var errRenamingDisallowed = errors.New("metric renaming using metric_relabel_configs is disallowed") // NewFactory creates a new Prometheus receiver factory. func NewFactory() component.ReceiverFactory {