Skip to content

Commit 3053801

Browse files
committed
Remove all default providers/converters
1 parent f88ce7a commit 3053801

File tree

7 files changed

+136
-92
lines changed

7 files changed

+136
-92
lines changed

otelcol/collector_test.go

Lines changed: 107 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package otelcol
77
import (
88
"context"
99
"errors"
10+
"os"
1011
"path/filepath"
1112
"sync"
1213
"syscall"
@@ -15,6 +16,8 @@ import (
1516

1617
"github.com/stretchr/testify/assert"
1718
"github.com/stretchr/testify/require"
19+
"go.uber.org/zap"
20+
"gopkg.in/yaml.v3"
1821

1922
"go.opentelemetry.io/collector/component"
2023
"go.opentelemetry.io/collector/confmap"
@@ -34,7 +37,7 @@ func TestCollectorStartAsGoRoutine(t *testing.T) {
3437
set := CollectorSettings{
3538
BuildInfo: component.NewDefaultBuildInfo(),
3639
Factories: nopFactories,
37-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
40+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
3841
}
3942
col, err := NewCollector(set)
4043
require.NoError(t, err)
@@ -55,7 +58,7 @@ func TestCollectorCancelContext(t *testing.T) {
5558
set := CollectorSettings{
5659
BuildInfo: component.NewDefaultBuildInfo(),
5760
Factories: nopFactories,
58-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
61+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
5962
}
6063
col, err := NewCollector(set)
6164
require.NoError(t, err)
@@ -87,10 +90,10 @@ func TestCollectorStateAfterConfigChange(t *testing.T) {
8790
BuildInfo: component.NewDefaultBuildInfo(),
8891
Factories: nopFactories,
8992
// this will be overwritten, but we need something to get past validation
90-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
93+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
9194
})
9295
require.NoError(t, err)
93-
provider, err := NewConfigProvider(newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}))
96+
provider, err := NewConfigProvider(newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}))
9497
require.NoError(t, err)
9598
col.configProvider = &mockCfgProvider{ConfigProvider: provider, watcher: watcher}
9699

@@ -116,7 +119,7 @@ func TestCollectorReportError(t *testing.T) {
116119
col, err := NewCollector(CollectorSettings{
117120
BuildInfo: component.NewDefaultBuildInfo(),
118121
Factories: nopFactories,
119-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
122+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
120123
})
121124
require.NoError(t, err)
122125

@@ -162,7 +165,7 @@ func TestComponentStatusWatcher(t *testing.T) {
162165
col, err := NewCollector(CollectorSettings{
163166
BuildInfo: component.NewDefaultBuildInfo(),
164167
Factories: func() (Factories, error) { return factories, nil },
165-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-statuswatcher.yaml")}),
168+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-statuswatcher.yaml")}),
166169
})
167170
require.NoError(t, err)
168171

@@ -225,7 +228,7 @@ func TestCollectorSendSignal(t *testing.T) {
225228
col, err := NewCollector(CollectorSettings{
226229
BuildInfo: component.NewDefaultBuildInfo(),
227230
Factories: nopFactories,
228-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
231+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
229232
})
230233
require.NoError(t, err)
231234

@@ -253,7 +256,7 @@ func TestCollectorFailedShutdown(t *testing.T) {
253256
col, err := NewCollector(CollectorSettings{
254257
BuildInfo: component.NewDefaultBuildInfo(),
255258
Factories: nopFactories,
256-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
259+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
257260
})
258261
require.NoError(t, err)
259262

@@ -278,7 +281,7 @@ func TestCollectorStartInvalidConfig(t *testing.T) {
278281
col, err := NewCollector(CollectorSettings{
279282
BuildInfo: component.NewDefaultBuildInfo(),
280283
Factories: nopFactories,
281-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-invalid.yaml")}),
284+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-invalid.yaml")}),
282285
})
283286
require.NoError(t, err)
284287
assert.Error(t, col.Run(context.Background()))
@@ -294,7 +297,7 @@ func TestNewCollectorInvalidConfigProviderSettings(t *testing.T) {
294297
}
295298

296299
func TestNewCollectorUseConfig(t *testing.T) {
297-
set := newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")})
300+
set := newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")})
298301

299302
col, err := NewCollector(CollectorSettings{
300303
BuildInfo: component.NewDefaultBuildInfo(),
@@ -335,7 +338,7 @@ func TestCollectorStartWithTraceContextPropagation(t *testing.T) {
335338
set := CollectorSettings{
336339
BuildInfo: component.NewDefaultBuildInfo(),
337340
Factories: nopFactories,
338-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", tt.file)}),
341+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", tt.file)}),
339342
}
340343

341344
col, err := NewCollector(set)
@@ -367,7 +370,7 @@ func TestCollectorRun(t *testing.T) {
367370
set := CollectorSettings{
368371
BuildInfo: component.NewDefaultBuildInfo(),
369372
Factories: nopFactories,
370-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", tt.file)}),
373+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", tt.file)}),
371374
}
372375
col, err := NewCollector(set)
373376
require.NoError(t, err)
@@ -385,7 +388,7 @@ func TestCollectorShutdownBeforeRun(t *testing.T) {
385388
set := CollectorSettings{
386389
BuildInfo: component.NewDefaultBuildInfo(),
387390
Factories: nopFactories,
388-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
391+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
389392
}
390393
col, err := NewCollector(set)
391394
require.NoError(t, err)
@@ -405,7 +408,7 @@ func TestCollectorClosedStateOnStartUpError(t *testing.T) {
405408
set := CollectorSettings{
406409
BuildInfo: component.NewDefaultBuildInfo(),
407410
Factories: nopFactories,
408-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-invalid.yaml")}),
411+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-invalid.yaml")}),
409412
}
410413
col, err := NewCollector(set)
411414
require.NoError(t, err)
@@ -426,7 +429,7 @@ func TestCollectorDryRun(t *testing.T) {
426429
settings: CollectorSettings{
427430
BuildInfo: component.NewDefaultBuildInfo(),
428431
Factories: nopFactories,
429-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-invalid.yaml")}),
432+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-invalid.yaml")}),
430433
},
431434
expectedErr: `service::pipelines::traces: references processor "invalid" which is not configured`,
432435
},
@@ -492,3 +495,92 @@ func (*failureProvider) Scheme() string {
492495
func (*failureProvider) Shutdown(context.Context) error {
493496
return nil
494497
}
498+
499+
type fakeProvider struct {
500+
scheme string
501+
ret func(ctx context.Context, uri string, watcher confmap.WatcherFunc) (*confmap.Retrieved, error)
502+
logger *zap.Logger
503+
}
504+
505+
func (f *fakeProvider) Retrieve(ctx context.Context, uri string, watcher confmap.WatcherFunc) (*confmap.Retrieved, error) {
506+
return f.ret(ctx, uri, watcher)
507+
}
508+
509+
func (f *fakeProvider) Scheme() string {
510+
return f.scheme
511+
}
512+
513+
func (f *fakeProvider) Shutdown(context.Context) error {
514+
return nil
515+
}
516+
517+
func newFakeProvider(scheme string, ret func(ctx context.Context, uri string, watcher confmap.WatcherFunc) (*confmap.Retrieved, error)) confmap.ProviderFactory {
518+
return confmap.NewProviderFactory(func(ps confmap.ProviderSettings) confmap.Provider {
519+
return &fakeProvider{
520+
scheme: scheme,
521+
ret: ret,
522+
logger: ps.Logger,
523+
}
524+
})
525+
}
526+
527+
func newEnvProvider() confmap.ProviderFactory {
528+
return newFakeProvider("env", func(_ context.Context, uri string, _ confmap.WatcherFunc) (*confmap.Retrieved, error) {
529+
// When using `env` as the default scheme for tests, the uri will not include `env:`.
530+
// Instead of duplicating the switch cases, the scheme is added instead.
531+
if uri[0:4] != "env:" {
532+
uri = "env:" + uri
533+
}
534+
switch uri {
535+
case "env:COMPLEX_VALUE":
536+
return confmap.NewRetrieved([]any{"localhost:3042"})
537+
case "env:HOST":
538+
return confmap.NewRetrieved("localhost")
539+
case "env:OS":
540+
return confmap.NewRetrieved("ubuntu")
541+
case "env:PR":
542+
return confmap.NewRetrieved("amd")
543+
case "env:PORT":
544+
return confmap.NewRetrieved(3044)
545+
case "env:INT":
546+
return confmap.NewRetrieved(1)
547+
case "env:INT32":
548+
return confmap.NewRetrieved(32)
549+
case "env:INT64":
550+
return confmap.NewRetrieved(64)
551+
case "env:FLOAT32":
552+
return confmap.NewRetrieved(float32(3.25))
553+
case "env:FLOAT64":
554+
return confmap.NewRetrieved(float64(6.4))
555+
case "env:BOOL":
556+
return confmap.NewRetrieved(true)
557+
}
558+
return nil, errors.New("impossible")
559+
})
560+
}
561+
562+
func newDefaultConfigProviderSettings(t testing.TB, uris []string) ConfigProviderSettings {
563+
fileProvider := newFakeProvider("file", func(_ context.Context, uri string, _ confmap.WatcherFunc) (*confmap.Retrieved, error) {
564+
return confmap.NewRetrieved(newConfFromFile(t, uri[5:]))
565+
})
566+
return ConfigProviderSettings{
567+
ResolverSettings: confmap.ResolverSettings{
568+
URIs: uris,
569+
ProviderFactories: []confmap.ProviderFactory{
570+
fileProvider,
571+
newEnvProvider(),
572+
},
573+
},
574+
}
575+
}
576+
577+
// newConfFromFile creates a new Conf by reading the given file.
578+
func newConfFromFile(t testing.TB, fileName string) map[string]any {
579+
content, err := os.ReadFile(filepath.Clean(fileName))
580+
require.NoErrorf(t, err, "unable to read the file %v", fileName)
581+
582+
var data map[string]any
583+
require.NoError(t, yaml.Unmarshal(content, &data), "unable to parse yaml")
584+
585+
return confmap.NewFromStringMap(data).ToStringMap()
586+
}

otelcol/command.go

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,15 @@ import (
1717
// Any URIs specified in CollectorSettings.ConfigProviderSettings.ResolverSettings.URIs
1818
// are considered defaults and will be overwritten by config flags passed as
1919
// command-line arguments to the executable.
20-
//
21-
// Deprecated: [v0.103.0] use NewCommandMustSetProvider instead
20+
// At least one Provider must be
2221
func NewCommand(set CollectorSettings) *cobra.Command {
23-
return commandHelper(set, false)
24-
}
25-
26-
// NewCommandMustSetProvider constructs a new cobra.Command using the given CollectorSettings.
27-
// Any URIs specified in CollectorSettings.ConfigProviderSettings.ResolverSettings.URIs
28-
// are considered defaults and will be overwritten by config flags passed as
29-
// command-line arguments to the executable.
30-
// At least one Provider must be supplied via CollectorSettings.ConfigProviderSettings.ResolverSettings.ProviderFactories.
31-
func NewCommandMustSetProvider(set CollectorSettings) *cobra.Command {
32-
return commandHelper(set, true)
33-
}
34-
35-
func commandHelper(set CollectorSettings, enforceProviders bool) *cobra.Command {
3622
flagSet := flags(featuregate.GlobalRegistry())
3723
rootCmd := &cobra.Command{
3824
Use: set.BuildInfo.Command,
3925
Version: set.BuildInfo.Version,
4026
SilenceUsage: true,
4127
RunE: func(cmd *cobra.Command, _ []string) error {
42-
err := updateSettingsUsingFlags(&set, flagSet, enforceProviders)
28+
err := updateSettingsUsingFlags(&set, flagSet)
4329
if err != nil {
4430
return err
4531
}
@@ -52,13 +38,24 @@ func commandHelper(set CollectorSettings, enforceProviders bool) *cobra.Command
5238
},
5339
}
5440
rootCmd.AddCommand(newComponentsCommand(set))
55-
rootCmd.AddCommand(newValidateSubCommand(set, flagSet, enforceProviders))
41+
rootCmd.AddCommand(newValidateSubCommand(set, flagSet))
5642
rootCmd.Flags().AddGoFlagSet(flagSet)
5743
return rootCmd
5844
}
5945

46+
// NewCommandMustSetProvider constructs a new cobra.Command using the given CollectorSettings.
47+
// Any URIs specified in CollectorSettings.ConfigProviderSettings.ResolverSettings.URIs
48+
// are considered defaults and will be overwritten by config flags passed as
49+
// command-line arguments to the executable.
50+
// At least one Provider must be supplied via CollectorSettings.ConfigProviderSettings.ResolverSettings.ProviderFactories.
51+
//
52+
// Deprecated: [v0.104.0] use NewCommand instead
53+
func NewCommandMustSetProvider(set CollectorSettings) *cobra.Command {
54+
return NewCommand(set)
55+
}
56+
6057
// Puts command line flags from flags into the CollectorSettings, to be used during config resolution.
61-
func updateSettingsUsingFlags(set *CollectorSettings, flags *flag.FlagSet, enforceProviders bool) error {
58+
func updateSettingsUsingFlags(set *CollectorSettings, flags *flag.FlagSet) error {
6259
resolverSet := &set.ConfigProviderSettings.ResolverSettings
6360
configFlags := getConfigFlag(flags)
6461

@@ -73,14 +70,8 @@ func updateSettingsUsingFlags(set *CollectorSettings, flags *flag.FlagSet, enfor
7370
set.ConfigProviderSettings.ResolverSettings.DefaultScheme = "env"
7471
}
7572

76-
// Provide a default set of providers and converters if none have been specified.
77-
// TODO: Remove this after CollectorSettings.ConfigProvider is removed and instead
78-
// do it in the builder.
7973
if len(resolverSet.ProviderFactories) == 0 && len(resolverSet.ConverterFactories) == 0 {
80-
if enforceProviders {
81-
return errors.New("at least one Provider must be supplied")
82-
}
83-
set.ConfigProviderSettings = newDefaultConfigProviderSettings(resolverSet.URIs)
74+
return errors.New("at least one Provider must be supplied")
8475
}
8576
return nil
8677
}

otelcol/command_components_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestNewBuildSubCommand(t *testing.T) {
2020
set := CollectorSettings{
2121
BuildInfo: component.NewDefaultBuildInfo(),
2222
Factories: nopFactories,
23-
ConfigProviderSettings: newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}),
23+
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
2424
}
2525
cmd := NewCommandMustSetProvider(set)
2626
cmd.SetArgs([]string{"components"})

0 commit comments

Comments
 (0)