Skip to content

Commit

Permalink
Change deprecated NewConfigProvider to use options and do input valid…
Browse files Browse the repository at this point in the history
…ation

Signed-off-by: Bogdan Drutu <[email protected]>
  • Loading branch information
bogdandrutu committed Mar 1, 2022
1 parent 73a30a6 commit e1fca07
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 60 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@

- Deprecate `pdata.NumberDataPoint.Type()` and `pdata.Exemplar.Type()` in favor of `NumberDataPoint.ValueType()` and
`Exemplar.ValueType()` (#4850)
- Deprecate `service.MustNewConfigProvider` and `service.MustNewDefaultConfigProvider`in favor of `service.NewConfigProvider` (#4762)

## v0.44.0 Beta

Expand Down
36 changes: 28 additions & 8 deletions service/collector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ import (
"go.uber.org/zap/zapcore"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/config/configmapprovider"
"go.opentelemetry.io/collector/internal/testcomponents"
"go.opentelemetry.io/collector/internal/testutil"
)
Expand All @@ -51,10 +53,13 @@ func TestCollector_StartAsGoRoutine(t *testing.T) {
factories, err := testcomponents.NewDefaultFactories()
require.NoError(t, err)

cfgProvider, err := NewConfigProvider([]string{filepath.Join("testdata", "otelcol-config.yaml")})
require.NoError(t, err)

set := CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: factories,
ConfigProvider: MustNewDefaultConfigProvider([]string{filepath.Join("testdata", "otelcol-config.yaml")}, nil),
ConfigProvider: cfgProvider,
}
col, err := New(set)
require.NoError(t, err)
Expand Down Expand Up @@ -93,12 +98,21 @@ func TestCollector_Start(t *testing.T) {
}

metricsPort := testutil.GetAvailablePort(t)

cfgProvider, err := NewConfigProvider(
[]string{filepath.Join("testdata", "otelcol-config.yaml")},
WithConfigMapConverters([]config.MapConverterFunc{
configmapprovider.NewOverwritePropertiesConverter(
[]string{"service.telemetry.metrics.address=localhost:" + strconv.FormatUint(uint64(metricsPort), 10)},
),
}))

require.NoError(t, err)

col, err := New(CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: factories,
ConfigProvider: MustNewDefaultConfigProvider(
[]string{filepath.Join("testdata", "otelcol-config.yaml")},
[]string{"service.telemetry.metrics.address=localhost:" + strconv.FormatUint(uint64(metricsPort), 10)}),
BuildInfo: component.NewDefaultBuildInfo(),
Factories: factories,
ConfigProvider: cfgProvider,
LoggingOptions: []zap.Option{zap.Hooks(hook)},
})
require.NoError(t, err)
Expand Down Expand Up @@ -141,10 +155,13 @@ func TestCollector_ShutdownNoop(t *testing.T) {
factories, err := testcomponents.NewDefaultFactories()
require.NoError(t, err)

cfgProvider, err := NewConfigProvider([]string{filepath.Join("testdata", "otelcol-config.yaml")})
require.NoError(t, err)

set := CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: factories,
ConfigProvider: MustNewDefaultConfigProvider([]string{filepath.Join("testdata", "otelcol-config.yaml")}, nil),
ConfigProvider: cfgProvider,
}
col, err := New(set)
require.NoError(t, err)
Expand Down Expand Up @@ -172,10 +189,13 @@ func TestCollector_ReportError(t *testing.T) {
factories, err := testcomponents.NewDefaultFactories()
require.NoError(t, err)

cfgProvider, err := NewConfigProvider([]string{filepath.Join("testdata", "otelcol-config.yaml")})
require.NoError(t, err)

col, err := New(CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: factories,
ConfigProvider: MustNewDefaultConfigProvider([]string{filepath.Join("testdata", "otelcol-config.yaml")}, nil),
ConfigProvider: cfgProvider,
})
require.NoError(t, err)

Expand Down
11 changes: 10 additions & 1 deletion service/collector_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ import (
"go.uber.org/zap/zapcore"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/eventlog"

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

type WindowsService struct {
Expand Down Expand Up @@ -134,7 +137,13 @@ func openEventLog(serviceName string) (*eventlog.Log, error) {

func newWithWindowsEventLogCore(set CollectorSettings, elog *eventlog.Log) (*Collector, error) {
if set.ConfigProvider == nil {
set.ConfigProvider = MustNewDefaultConfigProvider(getConfigFlag(), getSetFlag())
var err error
set.ConfigProvider, err = NewConfigProvider(
getConfigFlag(),
WithConfigMapConverters([]config.MapConverterFunc{configmapprovider.NewOverwritePropertiesConverter(getSetFlag())}))
if err != nil {
return nil, err
}
}
set.LoggingOptions = append(
set.LoggingOptions,
Expand Down
10 changes: 9 additions & 1 deletion service/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ package service // import "go.opentelemetry.io/collector/service"
import (
"github.com/spf13/cobra"

"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/config/configmapprovider"
"go.opentelemetry.io/collector/service/featuregate"
)

Expand All @@ -30,7 +32,13 @@ func NewCommand(set CollectorSettings) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
featuregate.Apply(featuregate.GetFlags())
if set.ConfigProvider == nil {
set.ConfigProvider = MustNewDefaultConfigProvider(getConfigFlag(), getSetFlag())
var err error
set.ConfigProvider, err = NewConfigProvider(
getConfigFlag(),
WithConfigMapConverters([]config.MapConverterFunc{configmapprovider.NewOverwritePropertiesConverter(getSetFlag())}))
if err != nil {
return err
}
}
col, err := New(set)
if err != nil {
Expand Down
101 changes: 66 additions & 35 deletions service/config_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,39 @@ type ConfigProvider interface {
}

type configProvider struct {
locations []string
configMapProviders map[string]configmapprovider.Provider
cfgMapConverters []config.MapConverterFunc
configUnmarshaler configunmarshaler.ConfigUnmarshaler
locations []string
configMapProviders map[string]configmapprovider.Provider
configMapConverters []config.MapConverterFunc
configUnmarshaler configunmarshaler.ConfigUnmarshaler

sync.Mutex
closer configmapprovider.CloseFunc
watcher chan error
}

// ConfigProviderOption is an option to change the behavior of ConfigProvider
// returned by NewConfigProvider()
type ConfigProviderOption func(opts *configProvider)

func WithConfigMapProviders(c map[string]configmapprovider.Provider) ConfigProviderOption {
return func(opts *configProvider) {
opts.configMapProviders = c
}
}

func WithConfigMapConverters(c []config.MapConverterFunc) ConfigProviderOption {
return func(opts *configProvider) {
opts.configMapConverters = c
}
}

func WithConfigUnmarshaler(c configunmarshaler.ConfigUnmarshaler) ConfigProviderOption {
return func(opts *configProvider) {
opts.configUnmarshaler = c
}
}

// Deprecated: use NewConfigProvider instead
// MustNewConfigProvider returns a new ConfigProvider that provides the configuration:
// * Retrieve the config.Map by merging all retrieved maps from all the configmapprovider.Provider in order.
// * Then applies all the ConfigMapConverterFunc in the given order.
Expand All @@ -88,10 +111,13 @@ func MustNewConfigProvider(
configMapProviders map[string]configmapprovider.Provider,
cfgMapConverters []config.MapConverterFunc,
configUnmarshaler configunmarshaler.ConfigUnmarshaler) ConfigProvider {
return NewConfigProvider(locations, configMapProviders, cfgMapConverters, configUnmarshaler)
cfgProvider, err := NewConfigProvider(locations, WithConfigMapProviders(configMapProviders), WithConfigMapConverters(cfgMapConverters), WithConfigUnmarshaler(configUnmarshaler))
if err != nil {
panic(err)
}
return cfgProvider
}

// Deprecated: [v0.44.0] use MustNewConfigProvider instead
// NewConfigProvider returns a new ConfigProvider that provides the configuration:
// * Retrieve the config.Map by merging all retrieved maps from all the configmapprovider.Provider in order.
// * Then applies all the config.MapConverterFunc in the given order.
Expand All @@ -100,44 +126,49 @@ func MustNewConfigProvider(
// The `configMapProviders` is a map of pairs <scheme,Provider>.
//
// Notice: This API is experimental.
func NewConfigProvider(
locations []string,
configMapProviders map[string]configmapprovider.Provider,
cfgMapConverters []config.MapConverterFunc,
configUnmarshaler configunmarshaler.ConfigUnmarshaler) ConfigProvider {
func NewConfigProvider(locations []string, opts ...ConfigProviderOption) (ConfigProvider, error) {
if len(locations) == 0 {
return nil, fmt.Errorf("cannot create ConfigProvider: no locations provided")
}
// Safe copy, ensures the slice cannot be changed from the caller.
locationsCopy := make([]string, len(locations))
copy(locationsCopy, locations)
return &configProvider{
locations: locationsCopy,
configMapProviders: configMapProviders,
cfgMapConverters: cfgMapConverters,
configUnmarshaler: configUnmarshaler,
watcher: make(chan error, 1),

provider := configProvider{
locations: locationsCopy,
configMapProviders: map[string]configmapprovider.Provider{
"file": configmapprovider.NewFile(),
"env": configmapprovider.NewEnv(),
},
configMapConverters: []config.MapConverterFunc{
configmapprovider.NewExpandConverter(),
},
configUnmarshaler: configunmarshaler.NewDefault(),
watcher: make(chan error, 1),
}

// Override default values with user options
for _, o := range opts {
o(&provider)
}

return &provider, nil
}

// Deprecated: use NewConfigProvider instead
// MustNewDefaultConfigProvider returns the default ConfigProvider, and it creates configuration from a file
// defined by the given configFile and overwrites fields using properties.
func MustNewDefaultConfigProvider(configLocations []string, properties []string) ConfigProvider {
return NewDefaultConfigProvider(configLocations, properties)
}
cfgMapConverter := []config.MapConverterFunc{
configmapprovider.NewOverwritePropertiesConverter(properties),
configmapprovider.NewExpandConverter(),
}

// Deprecated: [v.0.44.0] use MustNewDefaultConfigProvider instead
// NewDefaultConfigProvider returns the default ConfigProvider, and it creates configuration from a file
// defined by the given configFile and overwrites fields using properties.
func NewDefaultConfigProvider(configLocations []string, properties []string) ConfigProvider {
return NewConfigProvider(
configLocations,
map[string]configmapprovider.Provider{
"file": configmapprovider.NewFile(),
"env": configmapprovider.NewEnv(),
},
[]config.MapConverterFunc{
configmapprovider.NewOverwritePropertiesConverter(properties),
configmapprovider.NewExpandConverter(),
},
configunmarshaler.NewDefault())
cfgProvider, err := NewConfigProvider(configLocations, WithConfigMapConverters(cfgMapConverter))
if err != nil {
panic(err)
}
return cfgProvider
}

func (cm *configProvider) Get(ctx context.Context, factories component.Factories) (*config.Config, error) {
Expand All @@ -153,7 +184,7 @@ func (cm *configProvider) Get(ctx context.Context, factories component.Factories
cm.closer = ret.CloseFunc

// Apply all converters.
for _, cfgMapConv := range cm.cfgMapConverters {
for _, cfgMapConv := range cm.configMapConverters {
if err = cfgMapConv(ctx, ret.Map); err != nil {
return nil, fmt.Errorf("cannot convert the config.Map: %w", err)
}
Expand Down
34 changes: 19 additions & 15 deletions service/config_provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,9 @@ func TestConfigProvider_Errors(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cfgW := MustNewConfigProvider(tt.locations, tt.parserProvider, tt.cfgMapConverters, tt.configUnmarshaler)
cfgW, err := NewConfigProvider(tt.locations, WithConfigMapProviders(tt.parserProvider), WithConfigMapConverters(tt.cfgMapConverters), WithConfigUnmarshaler(tt.configUnmarshaler))
assert.NoError(t, err)

_, errN := cfgW.Get(context.Background(), factories)
if tt.expectNewErr {
assert.Error(t, errN)
Expand Down Expand Up @@ -200,11 +202,11 @@ func TestConfigProvider(t *testing.T) {
return &mockProvider{retM: cfgMap}
}()

cfgW := MustNewConfigProvider(
cfgW, err := NewConfigProvider(
[]string{"watcher:"},
map[string]configmapprovider.Provider{"watcher": configMapProvider},
nil,
configunmarshaler.NewDefault())
WithConfigMapProviders(map[string]configmapprovider.Provider{"watcher": configMapProvider}),
WithConfigUnmarshaler(configunmarshaler.NewDefault()))
require.NoError(t, err)
_, errN := cfgW.Get(context.Background(), factories)
assert.NoError(t, errN)

Expand All @@ -228,11 +230,11 @@ func TestConfigProviderNoWatcher(t *testing.T) {
require.NoError(t, errF)

watcherWG := sync.WaitGroup{}
cfgW := MustNewConfigProvider(
cfgW, err := NewConfigProvider(
[]string{filepath.Join("testdata", "otelcol-nop.yaml")},
map[string]configmapprovider.Provider{"file": configmapprovider.NewFile()},
nil,
configunmarshaler.NewDefault())
WithConfigMapProviders(map[string]configmapprovider.Provider{"file": configmapprovider.NewFile()}),
WithConfigUnmarshaler(configunmarshaler.NewDefault()))
require.NoError(t, err)
_, errN := cfgW.Get(context.Background(), factories)
assert.NoError(t, errN)

Expand Down Expand Up @@ -260,12 +262,13 @@ func TestConfigProvider_ShutdownClosesWatch(t *testing.T) {
}()

watcherWG := sync.WaitGroup{}
cfgW := MustNewConfigProvider(
cfgW, err := NewConfigProvider(
[]string{"watcher:"},
map[string]configmapprovider.Provider{"watcher": configMapProvider},
nil,
configunmarshaler.NewDefault())
WithConfigMapProviders(map[string]configmapprovider.Provider{"watcher": configMapProvider}),
WithConfigUnmarshaler(configunmarshaler.NewDefault()))
_, errN := cfgW.Get(context.Background(), factories)
require.NoError(t, err)

assert.NoError(t, errN)

watcherWG.Add(1)
Expand Down Expand Up @@ -322,8 +325,9 @@ func TestBackwardsCompatibilityForFilePath(t *testing.T) {
},
}
for _, tt := range tests {
provider := MustNewDefaultConfigProvider([]string{tt.location}, []string{})
_, err := provider.Get(context.Background(), factories)
provider, err := NewConfigProvider([]string{tt.location})
assert.NoError(t, err)
_, err = provider.Get(context.Background(), factories)
assert.Contains(t, err.Error(), tt.errMessage, tt.name)
}

Expand Down

0 comments on commit e1fca07

Please sign in to comment.