Skip to content

Commit

Permalink
Remove already deprecates config.Config (#6394)
Browse files Browse the repository at this point in the history
* Remove already deprecates config.Config

Signed-off-by: Bogdan <[email protected]>

* Update service/internal/configunmarshaler/defaultunmarshaler.go

Co-authored-by: Alex Boten <[email protected]>

Signed-off-by: Bogdan <[email protected]>
Co-authored-by: Alex Boten <[email protected]>
  • Loading branch information
bogdandrutu and codeboten authored Oct 26, 2022
1 parent 99fdd1f commit 3262fd8
Show file tree
Hide file tree
Showing 9 changed files with 193 additions and 208 deletions.
11 changes: 11 additions & 0 deletions .chloggen/rmconfigconfig.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: breaking

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: config

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Remove already deprecates `config.Config`.

# One or more tracking issues or pull requests related to the change
issues: [6394]
136 changes: 0 additions & 136 deletions config/moved_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,145 +15,9 @@
package config // import "go.opentelemetry.io/collector/config"

import (
"errors"
"fmt"

"go.opentelemetry.io/collector/service/telemetry"
)

var (
errMissingExporters = errors.New("no enabled exporters specified in config")
errMissingReceivers = errors.New("no enabled receivers specified in config")
errMissingServicePipelines = errors.New("service must have at least one pipeline")
)

// Config defines the configuration for the various elements of collector or agent.
// Deprecated: [v0.52.0] Use service.Config
type Config struct {
// Receivers is a map of ComponentID to Receivers.
Receivers map[ComponentID]Receiver

// Exporters is a map of ComponentID to Exporters.
Exporters map[ComponentID]Exporter

// Processors is a map of ComponentID to Processors.
Processors map[ComponentID]Processor

// Extensions is a map of ComponentID to extensions.
Extensions map[ComponentID]Extension

Service
}

var _ validatable = (*Config)(nil)

// Validate returns an error if the config is invalid.
//
// This function performs basic validation of configuration. There may be more subtle
// invalid cases that we currently don't check for but which we may want to add in
// the future (e.g. disallowing receiving and exporting on the same endpoint).
func (cfg *Config) Validate() error {
// Currently, there is no default receiver enabled.
// The configuration must specify at least one receiver to be valid.
if len(cfg.Receivers) == 0 {
return errMissingReceivers
}

// Validate the receiver configuration.
for recvID, recvCfg := range cfg.Receivers {
if err := recvCfg.Validate(); err != nil {
return fmt.Errorf("receiver %q has invalid configuration: %w", recvID, err)
}
}

// Currently, there is no default exporter enabled.
// The configuration must specify at least one exporter to be valid.
if len(cfg.Exporters) == 0 {
return errMissingExporters
}

// Validate the exporter configuration.
for expID, expCfg := range cfg.Exporters {
if err := expCfg.Validate(); err != nil {
return fmt.Errorf("exporter %q has invalid configuration: %w", expID, err)
}
}

// Validate the processor configuration.
for procID, procCfg := range cfg.Processors {
if err := procCfg.Validate(); err != nil {
return fmt.Errorf("processor %q has invalid configuration: %w", procID, err)
}
}

// Validate the extension configuration.
for extID, extCfg := range cfg.Extensions {
if err := extCfg.Validate(); err != nil {
return fmt.Errorf("extension %q has invalid configuration: %w", extID, err)
}
}

return cfg.validateService()
}

func (cfg *Config) validateService() error {
// Check that all enabled extensions in the service are configured.
for _, ref := range cfg.Service.Extensions {
// Check that the name referenced in the Service extensions exists in the top-level extensions.
if cfg.Extensions[ref] == nil {
return fmt.Errorf("service references extension %q which does not exist", ref)
}
}

// Must have at least one pipeline.
if len(cfg.Service.Pipelines) == 0 {
return errMissingServicePipelines
}

// Check that all pipelines have at least one receiver and one exporter, and they reference
// only configured components.
for pipelineID, pipeline := range cfg.Service.Pipelines {
if pipelineID.Type() != TracesDataType && pipelineID.Type() != MetricsDataType && pipelineID.Type() != LogsDataType {
return fmt.Errorf("unknown pipeline datatype %q for %v", pipelineID.Type(), pipelineID)
}

// Validate pipeline has at least one receiver.
if len(pipeline.Receivers) == 0 {
return fmt.Errorf("pipeline %q must have at least one receiver", pipelineID)
}

// Validate pipeline receiver name references.
for _, ref := range pipeline.Receivers {
// Check that the name referenced in the pipeline's receivers exists in the top-level receivers.
if cfg.Receivers[ref] == nil {
return fmt.Errorf("pipeline %q references receiver %q which does not exist", pipelineID, ref)
}
}

// Validate pipeline processor name references.
for _, ref := range pipeline.Processors {
// Check that the name referenced in the pipeline's processors exists in the top-level processors.
if cfg.Processors[ref] == nil {
return fmt.Errorf("pipeline %q references processor %q which does not exist", pipelineID, ref)
}
}

// Validate pipeline has at least one exporter.
if len(pipeline.Exporters) == 0 {
return fmt.Errorf("pipeline %q must have at least one exporter", pipelineID)
}

// Validate pipeline exporter name references.
for _, ref := range pipeline.Exporters {
// Check that the name referenced in the pipeline's Exporters exists in the top-level Exporters.
if cfg.Exporters[ref] == nil {
return fmt.Errorf("pipeline %q references exporter %q which does not exist", pipelineID, ref)
}
}
}
return nil
}

// Service defines the configurable components of the service.
// Deprecated: [v0.52.0] Use service.ConfigService
type Service struct {
Expand Down
133 changes: 132 additions & 1 deletion service/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,141 @@
package service // import "go.opentelemetry.io/collector/service"

import (
"errors"
"fmt"

"go.opentelemetry.io/collector/config"
)

type Config = config.Config
var (
errMissingExporters = errors.New("no enabled exporters specified in config")
errMissingReceivers = errors.New("no enabled receivers specified in config")
errMissingServicePipelines = errors.New("service must have at least one pipeline")
)

// Config defines the configuration for the various elements of collector or agent.
type Config struct {
// Receivers is a map of ComponentID to Receivers.
Receivers map[config.ComponentID]config.Receiver

// Exporters is a map of ComponentID to Exporters.
Exporters map[config.ComponentID]config.Exporter

// Processors is a map of ComponentID to Processors.
Processors map[config.ComponentID]config.Processor

// Extensions is a map of ComponentID to extensions.
Extensions map[config.ComponentID]config.Extension

Service ConfigService
}

// Validate returns an error if the config is invalid.
//
// This function performs basic validation of configuration. There may be more subtle
// invalid cases that we currently don't check for but which we may want to add in
// the future (e.g. disallowing receiving and exporting on the same endpoint).
func (cfg *Config) Validate() error {
// Currently, there is no default receiver enabled.
// The configuration must specify at least one receiver to be valid.
if len(cfg.Receivers) == 0 {
return errMissingReceivers
}

// Validate the receiver configuration.
for recvID, recvCfg := range cfg.Receivers {
if err := recvCfg.Validate(); err != nil {
return fmt.Errorf("receiver %q has invalid configuration: %w", recvID, err)
}
}

// Currently, there is no default exporter enabled.
// The configuration must specify at least one exporter to be valid.
if len(cfg.Exporters) == 0 {
return errMissingExporters
}

// Validate the exporter configuration.
for expID, expCfg := range cfg.Exporters {
if err := expCfg.Validate(); err != nil {
return fmt.Errorf("exporter %q has invalid configuration: %w", expID, err)
}
}

// Validate the processor configuration.
for procID, procCfg := range cfg.Processors {
if err := procCfg.Validate(); err != nil {
return fmt.Errorf("processor %q has invalid configuration: %w", procID, err)
}
}

// Validate the extension configuration.
for extID, extCfg := range cfg.Extensions {
if err := extCfg.Validate(); err != nil {
return fmt.Errorf("extension %q has invalid configuration: %w", extID, err)
}
}

return cfg.validateService()
}

func (cfg *Config) validateService() error {
// Check that all enabled extensions in the service are configured.
for _, ref := range cfg.Service.Extensions {
// Check that the name referenced in the Service extensions exists in the top-level extensions.
if cfg.Extensions[ref] == nil {
return fmt.Errorf("service references extension %q which does not exist", ref)
}
}

// Must have at least one pipeline.
if len(cfg.Service.Pipelines) == 0 {
return errMissingServicePipelines
}

// Check that all pipelines have at least one receiver and one exporter, and they reference
// only configured components.
for pipelineID, pipeline := range cfg.Service.Pipelines {
if pipelineID.Type() != config.TracesDataType && pipelineID.Type() != config.MetricsDataType && pipelineID.Type() != config.LogsDataType {
return fmt.Errorf("unknown pipeline datatype %q for %v", pipelineID.Type(), pipelineID)
}

// Validate pipeline has at least one receiver.
if len(pipeline.Receivers) == 0 {
return fmt.Errorf("pipeline %q must have at least one receiver", pipelineID)
}

// Validate pipeline receiver name references.
for _, ref := range pipeline.Receivers {
// Check that the name referenced in the pipeline's receivers exists in the top-level receivers.
if cfg.Receivers[ref] == nil {
return fmt.Errorf("pipeline %q references receiver %q which does not exist", pipelineID, ref)
}
}

// Validate pipeline processor name references.
for _, ref := range pipeline.Processors {
// Check that the name referenced in the pipeline's processors exists in the top-level processors.
if cfg.Processors[ref] == nil {
return fmt.Errorf("pipeline %q references processor %q which does not exist", pipelineID, ref)
}
}

// Validate pipeline has at least one exporter.
if len(pipeline.Exporters) == 0 {
return fmt.Errorf("pipeline %q must have at least one exporter", pipelineID)
}

// Validate pipeline exporter name references.
for _, ref := range pipeline.Exporters {
// Check that the name referenced in the pipeline's Exporters exists in the top-level Exporters.
if cfg.Exporters[ref] == nil {
return fmt.Errorf("pipeline %q references exporter %q which does not exist", pipelineID, ref)
}
}
}
return nil
}

type ConfigService = config.Service

Expand Down
14 changes: 10 additions & 4 deletions service/config_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,17 +100,23 @@ func NewConfigProvider(set ConfigProviderSettings) (ConfigProvider, error) {
}

func (cm *configProvider) Get(ctx context.Context, factories component.Factories) (*Config, error) {
retMap, err := cm.mapResolver.Resolve(ctx)
conf, err := cm.mapResolver.Resolve(ctx)
if err != nil {
return nil, fmt.Errorf("cannot resolve the configuration: %w", err)
}

var cfg *Config
if cfg, err = configunmarshaler.Unmarshal(retMap, factories); err != nil {
cfg, err := configunmarshaler.Unmarshal(conf, factories)
if err != nil {
return nil, fmt.Errorf("cannot unmarshal the configuration: %w", err)
}

return cfg, nil
return &Config{
Receivers: cfg.Receivers.GetReceivers(),
Processors: cfg.Processors.GetProcessors(),
Exporters: cfg.Exporters.GetExporters(),
Extensions: cfg.Extensions.GetExtensions(),
Service: cfg.Service,
}, nil
}

func (cm *configProvider) Watch() <-chan error {
Expand Down
4 changes: 0 additions & 4 deletions service/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,6 @@ import (
)

var (
errMissingExporters = errors.New("no enabled exporters specified in config")
errMissingReceivers = errors.New("no enabled receivers specified in config")
errMissingServicePipelines = errors.New("service must have at least one pipeline")

errInvalidRecvConfig = errors.New("invalid receiver config")
errInvalidExpConfig = errors.New("invalid exporter config")
errInvalidProcConfig = errors.New("invalid processor config")
Expand Down
18 changes: 5 additions & 13 deletions service/internal/configunmarshaler/defaultunmarshaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,19 @@ type configError struct {
code configErrorCode
}

type configSettings struct {
type Config struct {
Receivers *Receivers `mapstructure:"receivers"`
Processors *Processors `mapstructure:"processors"`
Exporters *Exporters `mapstructure:"exporters"`
Extensions *Extensions `mapstructure:"extensions"`
Service config.Service `mapstructure:"service"`
}

// Unmarshal the config.Config from a confmap.Conf.
// Unmarshal the Config from a confmap.Conf.
// After the config is unmarshalled, `Validate()` must be called to validate.
func Unmarshal(v *confmap.Conf, factories component.Factories) (*config.Config, error) {
func Unmarshal(v *confmap.Conf, factories component.Factories) (*Config, error) {
// Unmarshal top level sections and validate.
rawCfg := configSettings{
cfg := &Config{
Receivers: NewReceivers(factories.Receivers),
Processors: NewProcessors(factories.Processors),
Exporters: NewExporters(factories.Exporters),
Expand All @@ -83,21 +83,13 @@ func Unmarshal(v *confmap.Conf, factories component.Factories) (*config.Config,
},
},
}
if err := v.Unmarshal(&rawCfg, confmap.WithErrorUnused()); err != nil {
if err := v.Unmarshal(&cfg, confmap.WithErrorUnused()); err != nil {
return nil, configError{
error: fmt.Errorf("error reading top level configuration sections: %w", err),
code: errUnmarshalTopLevelStructure,
}
}

cfg := &config.Config{
Receivers: rawCfg.Receivers.GetReceivers(),
Processors: rawCfg.Processors.GetProcessors(),
Exporters: rawCfg.Exporters.GetExporters(),
Extensions: rawCfg.Extensions.GetExtensions(),
Service: rawCfg.Service,
}

return cfg, nil
}

Expand Down
Loading

0 comments on commit 3262fd8

Please sign in to comment.