From b15179e4da112b8ce2b56c6cd336072f7307c87a Mon Sep 17 00:00:00 2001 From: Bogdan Drutu Date: Tue, 11 Oct 2022 13:50:45 -0700 Subject: [PATCH] Enable confmap expand feature (#6276) Signed-off-by: Bogdan Signed-off-by: Bogdan --- CHANGELOG.md | 1 + confmap/resolver.go | 18 ++++++++++++++---- confmap/resolver_test.go | 10 ++-------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dbb2befce4..2fd02047289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ - `receiver/otlp`: Make logs related to gRCPC and HTTP server startup clearer (#6174) - Add prometheus metric prefix and constant service attributes to Collector's own telemetry when using OpenTelemetry for internal telemetry (#6223) - `exporter/logging`: Apply consistent rendering of map values (#6244) +- Add support in the confmap.Resolver to expand embedded config URIs inside configuration. (#6276) ### 🧰 Bug fixes 🧰 diff --git a/confmap/resolver.go b/confmap/resolver.go index b30cbc637d4..ebecae68c0c 100644 --- a/confmap/resolver.go +++ b/confmap/resolver.go @@ -23,6 +23,8 @@ import ( "sync" "go.uber.org/multierr" + + "go.opentelemetry.io/collector/featuregate" ) var ( @@ -37,6 +39,17 @@ var ( errTooManyRecursiveExpansions = errors.New("too many recursive expansions") ) +const expandEnabled = "confmap.expandEnabled" + +func init() { + // TODO: Remove this if by v0.64.0 no complains from distros. + featuregate.GetRegistry().MustRegister(featuregate.Gate{ + ID: expandEnabled, + Description: "controls whether expending embedded external config providers URIs", + Enabled: true, + }) +} + // Resolver resolves a configuration as a Conf. type Resolver struct { uris []location @@ -46,8 +59,6 @@ type Resolver struct { sync.Mutex closers []CloseFunc watcher chan error - - enableExpand bool } // ResolverSettings are the settings to configure the behavior of the Resolver. @@ -149,7 +160,7 @@ func (mr *Resolver) Resolve(ctx context.Context) (*Conf, error) { } } - if mr.enableExpand { + if featuregate.GetRegistry().IsEnabled(expandEnabled) { cfgMap := make(map[string]interface{}) for _, k := range retMap.AllKeys() { val, err := mr.expandValueRecursively(ctx, retMap.Get(k)) @@ -160,7 +171,6 @@ func (mr *Resolver) Resolve(ctx context.Context) (*Conf, error) { } retMap = NewFromStringMap(cfgMap) } - // Apply the converters in the given order. for _, confConv := range mr.converters { if err := confConv.Convert(ctx, retMap); err != nil { diff --git a/confmap/resolver_test.go b/confmap/resolver_test.go index 5621b2e0a40..31656be5836 100644 --- a/confmap/resolver_test.go +++ b/confmap/resolver_test.go @@ -350,7 +350,7 @@ func TestResolverExpandEnvVars(t *testing.T) { t.Run(test.name, func(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{filepath.Join("testdata", test.name)}, Providers: makeMapProvidersMap(fileProvider, envProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true + // Test that expanded configs are the same with the simple config with no env vars. cfgMap, err := resolver.Resolve(context.Background()) require.NoError(t, err) @@ -373,7 +373,7 @@ func TestResolverDoneNotExpandOldEnvVars(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{"test:"}, Providers: makeMapProvidersMap(fileProvider, envProvider, emptySchemeProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true + // Test that expanded configs are the same with the simple config with no env vars. cfgMap, err := resolver.Resolve(context.Background()) require.NoError(t, err) @@ -394,7 +394,6 @@ func TestResolverExpandMapAndSliceValues(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{"input:"}, Providers: makeMapProvidersMap(provider, testProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true cfgMap, err := resolver.Resolve(context.Background()) require.NoError(t, err) @@ -416,7 +415,6 @@ func TestResolverInfiniteExpand(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{"input:"}, Providers: makeMapProvidersMap(provider, testProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true _, err = resolver.Resolve(context.Background()) assert.ErrorIs(t, err, errTooManyRecursiveExpansions) @@ -433,7 +431,6 @@ func TestResolverExpandSliceValueError(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{"input:"}, Providers: makeMapProvidersMap(provider, testProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true _, err = resolver.Resolve(context.Background()) assert.EqualError(t, err, "unsupported type=*errors.errorString for retrieved config") @@ -450,7 +447,6 @@ func TestResolverExpandMapValueError(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{"input:"}, Providers: makeMapProvidersMap(provider, testProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true _, err = resolver.Resolve(context.Background()) assert.EqualError(t, err, "unsupported type=*errors.errorString for retrieved config") @@ -468,7 +464,6 @@ func TestResolverExpandInvalidScheme(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{"input:"}, Providers: makeMapProvidersMap(provider, testProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true _, err = resolver.Resolve(context.Background()) assert.EqualError(t, err, `invalid uri: "g_c_s:VALUE"`) @@ -485,7 +480,6 @@ func TestResolverExpandInvalidOpaqueValue(t *testing.T) { resolver, err := NewResolver(ResolverSettings{URIs: []string{"input:"}, Providers: makeMapProvidersMap(provider, testProvider), Converters: nil}) require.NoError(t, err) - resolver.enableExpand = true _, err = resolver.Resolve(context.Background()) assert.EqualError(t, err, `the uri "test:$VALUE" contains unsupported characters ('$')`)