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 <bogdandrutu@gmail.com>
  • Loading branch information
bogdandrutu committed Mar 1, 2022
1 parent 73a30a6 commit bda2750
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 68 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
14 changes: 14 additions & 0 deletions service/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,20 @@ const (
Closed
)

func (s State) String() string {
switch s {
case Starting:
return "Starting"
case Running:
return "Running"
case Closing:
return "Closing"
case Closed:
return "Closed"
}
return "UNKNOWN"
}

// (Internal note) Collector Lifecycle:
// - New constructs a new Collector.
// - Run starts the collector.
Expand Down
54 changes: 38 additions & 16 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,33 +53,40 @@ func TestCollector_StartAsGoRoutine(t *testing.T) {
factories, err := testcomponents.NewDefaultFactories()
require.NoError(t, err)

cfgProvider, err := NewConfigProvider(
[]string{filepath.Join("testdata", "otelcol-config.yaml")},
WithConfigMapConverters([]config.MapConverterFunc{
configmapprovider.NewOverwritePropertiesConverter(
[]string{"service.telemetry.metrics.address=localhost:" + strconv.FormatUint(uint64(testutil.GetAvailablePort(t)), 10)},
),
}))
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)

colDone := make(chan struct{})
go func() {
defer close(colDone)
colErr := col.Run(context.Background())
if colErr != nil {
err = colErr
}
require.NoError(t, col.Run(context.Background()))
}()

time.Sleep(100 * time.Millisecond)

assert.Eventually(t, func() bool {
fmt.Println(col.GetState())
return Running == col.GetState()
}, time.Second*2, time.Millisecond*200)
}, 2*time.Second, 100*time.Millisecond)

col.Shutdown()
col.Shutdown()
<-colDone
assert.Eventually(t, func() bool {
return Closed == col.GetState()
}, time.Second*2, time.Millisecond*200)
assert.Equal(t, Closed, col.GetState())
}

func TestCollector_Start(t *testing.T) {
Expand All @@ -93,12 +102,19 @@ 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 +157,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 +191,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
Loading

0 comments on commit bda2750

Please sign in to comment.