Skip to content

Commit

Permalink
Support passing in confmap.Providers and confmap.Converters in the bu…
Browse files Browse the repository at this point in the history
…ilder
  • Loading branch information
evan-bradley committed Mar 4, 2024
1 parent 2fa6df8 commit a30c06d
Show file tree
Hide file tree
Showing 13 changed files with 256 additions and 11 deletions.
32 changes: 32 additions & 0 deletions .chloggen/builder-confmap-providers.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

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

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Allow configuring `confmap.Provider`s and `confmap.Converter`s.

# One or more tracking issues or pull requests related to the change
issues: [4759]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext: |
If no providers or converters are specified, the defaults are used.
The default providers are: env, file, http, https, and yaml. The default
converters are: env.
To configure converters or providers, use the `providers` or `converters`
keys in your OCB build manifest with a list of Go modules for your providers.
The modules will work the same as other Collector components.
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [user]
25 changes: 25 additions & 0 deletions .chloggen/pass-confmap-settings.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

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

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Add `ProviderSettings`, `ConverterSettings`, `ProviderFactories`, and `ConverterFactories` fields to `confmap.ResolverSettings`

# One or more tracking issues or pull requests related to the change
issues: [9516]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext: This allows configuring providers and converters, which are instantiated by `NewResolver` using the given factories.

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: []
14 changes: 10 additions & 4 deletions cmd/builder/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,20 @@ dist:
description: Local OpenTelemetry Collector binary
output_path: /tmp/dist
exporters:
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter v0.86.0
- gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.86.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/alibabacloudlogserviceexporter v0.96.0
- gomod: go.opentelemetry.io/collector/exporter/debugexporter v0.96.0

receivers:
- gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.86.0
- gomod: go.opentelemetry.io/collector/receiver/otlpreceiver v0.96.0

processors:
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.86.0
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.96.0

providers:
- gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v0.96.0

converters:
- gomod: go.opentelemetry.io/collector/confmap/converter/expandconverter v0.96.0
EOF
$ builder --config=otelcol-builder.yaml
$ cat > /tmp/otelcol.yaml <<EOF
Expand Down
59 changes: 59 additions & 0 deletions cmd/builder/internal/builder/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ type Config struct {
Receivers []Module `mapstructure:"receivers"`
Processors []Module `mapstructure:"processors"`
Connectors []Module `mapstructure:"connectors"`
Providers *[]Module `mapstructure:"providers"`
Converters *[]Module `mapstructure:"converters"`
Replaces []string `mapstructure:"replaces"`
Excludes []string `mapstructure:"excludes"`
}
Expand Down Expand Up @@ -86,12 +88,21 @@ func NewDefaultConfig() Config {

// Validate checks whether the current configuration is valid
func (c *Config) Validate() error {
var providersError, convertersError error
if c.Providers != nil {
providersError = validateModules(*c.Providers)
}
if c.Converters != nil {
convertersError = validateModules(*c.Converters)
}
return multierr.Combine(
validateModules(c.Extensions),
validateModules(c.Receivers),
validateModules(c.Exporters),
validateModules(c.Processors),
validateModules(c.Connectors),
providersError,
convertersError,
)
}

Expand Down Expand Up @@ -155,6 +166,54 @@ func (c *Config) ParseModules() error {
return err
}

if c.Providers != nil {
providers, err := parseModules(*c.Providers)
if err != nil {
return err
}
c.Providers = &providers
} else {
providers, err := parseModules([]Module{
{
GoMod: "go.opentelemetry.io/collector/confmap/provider/envprovider v" + c.Distribution.OtelColVersion,
},
{
GoMod: "go.opentelemetry.io/collector/confmap/provider/fileprovider v" + c.Distribution.OtelColVersion,
},
{
GoMod: "go.opentelemetry.io/collector/confmap/provider/httpprovider v" + c.Distribution.OtelColVersion,
},
{
GoMod: "go.opentelemetry.io/collector/confmap/provider/httpsprovider v" + c.Distribution.OtelColVersion,
},
{
GoMod: "go.opentelemetry.io/collector/confmap/provider/yamlprovider v" + c.Distribution.OtelColVersion,
},
})
if err != nil {
return err
}
c.Providers = &providers
}

if c.Converters != nil {
converters, err := parseModules(*c.Converters)
if err != nil {
return err
}
c.Converters = &converters
} else {
converters, err := parseModules([]Module{
{
GoMod: "go.opentelemetry.io/collector/confmap/converter/expandconverter v" + c.Distribution.OtelColVersion,
},
})
if err != nil {
return err
}
c.Converters = &converters
}

return nil
}

Expand Down
21 changes: 21 additions & 0 deletions cmd/builder/internal/builder/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,3 +225,24 @@ func TestRequireOtelColModule(t *testing.T) {
})
}
}

func TestAddsDefaultConverters(t *testing.T) {
cfg := NewDefaultConfig()
cfg.Converters = nil
assert.NoError(t, cfg.ParseModules())
assert.Len(t, *cfg.Converters, 1)
}

func TestAddsDefaultProviders(t *testing.T) {
cfg := NewDefaultConfig()
cfg.Providers = nil
assert.NoError(t, cfg.ParseModules())
assert.Len(t, *cfg.Providers, 5)
}

func TestSkipsNilFieldValidation(t *testing.T) {
cfg := NewDefaultConfig()
cfg.Converters = nil
cfg.Providers = nil
assert.NoError(t, cfg.Validate())
}
30 changes: 26 additions & 4 deletions cmd/builder/internal/builder/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,37 @@ import (
"github.com/stretchr/testify/require"
)

func newInitializedConfig(t *testing.T) Config {
cfg := NewDefaultConfig()
// Validate and ParseModules will be called before the config is
// given to Generate.
assert.NoError(t, cfg.Validate())
assert.NoError(t, cfg.ParseModules())

return cfg
}

func TestGenerateDefault(t *testing.T) {
require.NoError(t, Generate(NewDefaultConfig()))
require.NoError(t, Generate(newInitializedConfig(t)))
}

func TestGenerateInvalidCollectorVersion(t *testing.T) {
cfg := NewDefaultConfig()
cfg := newInitializedConfig(t)
cfg.Distribution.OtelColVersion = "invalid"
err := Generate(cfg)
require.NoError(t, err)
}

func TestGenerateInvalidOutputPath(t *testing.T) {
cfg := NewDefaultConfig()
cfg := newInitializedConfig(t)
cfg.Distribution.OutputPath = "/:invalid"
err := Generate(cfg)
require.Error(t, err)
require.Contains(t, err.Error(), "failed to create output path")
}

func TestSkipGenerate(t *testing.T) {
cfg := NewDefaultConfig()
cfg := newInitializedConfig(t)
cfg.Distribution.OutputPath = t.TempDir()
cfg.SkipGenerate = true
err := Generate(cfg)
Expand Down Expand Up @@ -120,13 +130,25 @@ func TestGenerateAndCompile(t *testing.T) {
return cfg
},
},
{
testCase: "No converters or providers",
cfgBuilder: func(t *testing.T) Config {
cfg := NewDefaultConfig()
cfg.Distribution.OutputPath = t.TempDir()
cfg.Replaces = append(cfg.Replaces, replaces...)
cfg.Converters = &[]Module{}
cfg.Providers = &[]Module{}
return cfg
},
},
}

for _, tt := range testCases {
t.Run(tt.testCase, func(t *testing.T) {
cfg := tt.cfgBuilder(t)
assert.NoError(t, cfg.Validate())
assert.NoError(t, cfg.SetGoPath())
assert.NoError(t, cfg.ParseModules())
require.NoError(t, GenerateAndCompile(cfg))
})
}
Expand Down
6 changes: 6 additions & 0 deletions cmd/builder/internal/builder/templates/go.mod.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ module {{.Distribution.Module}}
go 1.21

require (
{{- range .Converters}}
{{if .GoMod}}{{.GoMod}}{{end}}
{{- end}}
{{- range .Providers}}
{{if .GoMod}}{{.GoMod}}{{end}}
{{- end}}
{{- range .Connectors}}
{{if .GoMod}}{{.GoMod}}{{end}}
{{- end}}
Expand Down
36 changes: 35 additions & 1 deletion cmd/builder/internal/builder/templates/main.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ import (
"log"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/confmap"
{{- range .Converters}}
{{.Name}} "{{.Import}}"
{{- end}}
{{- range .Providers}}
{{.Name}} "{{.Import}}"
{{- end}}
"go.opentelemetry.io/collector/otelcol"
)

Expand All @@ -16,8 +23,27 @@ func main() {
Description: "{{ .Distribution.Description }}",
Version: "{{ .Distribution.Version }}",
}
providers := []confmap.Provider{
{{- range .Providers}}
{{.Name}}.New(),
{{- end}}
}
set := otelcol.CollectorSettings{
BuildInfo: info,
Factories: components,
ConfigProviderSettings: otelcol.ConfigProviderSettings{
ResolverSettings: confmap.ResolverSettings{
Providers: makeMapProvidersMap(providers...),
Converters: []confmap.Converter{
{{- range .Converters}}
{{.Name}}.New(confmap.ConverterSettings{}),
{{- end}}
},
},
},
}

if err := run(otelcol.CollectorSettings{BuildInfo: info, Factories: components}); err != nil {
if err := run(set); err != nil {
log.Fatal(err)
}
}
Expand All @@ -30,3 +56,11 @@ func runInteractive(params otelcol.CollectorSettings) error {

return nil
}

func makeMapProvidersMap(providers ...confmap.Provider) map[string]confmap.Provider {
ret := make(map[string]confmap.Provider, len(providers))
for _, provider := range providers {
ret[provider.Scheme()] = provider
}
return ret
}
2 changes: 2 additions & 0 deletions cmd/builder/internal/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@ func applyCfgFromFile(flags *flag.FlagSet, cfgFromFile builder.Config) {
cfg.Receivers = cfgFromFile.Receivers
cfg.Processors = cfgFromFile.Processors
cfg.Connectors = cfgFromFile.Connectors
cfg.Providers = cfgFromFile.Providers
cfg.Converters = cfgFromFile.Converters
cfg.Replaces = cfgFromFile.Replaces
cfg.Excludes = cfgFromFile.Excludes

Expand Down
9 changes: 9 additions & 0 deletions cmd/builder/internal/config/default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,12 @@ processors:
connectors:
- gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.95.0

providers:
- gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.95.0
converters:
- gomod: go.opentelemetry.io/collector/confmap/converter/expandconverter v0.95.0

9 changes: 9 additions & 0 deletions cmd/otelcorecol/builder-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ processors:
connectors:
- gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.95.0

providers:
- gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.95.0
- gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.95.0
converters:
- gomod: go.opentelemetry.io/collector/confmap/converter/expandconverter v0.95.0

replaces:
- go.opentelemetry.io/collector => ../../
- go.opentelemetry.io/collector/otelcol => ../../otelcol
Expand Down
2 changes: 1 addition & 1 deletion cmd/otelcorecol/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ go 1.21
require (
github.com/stretchr/testify v1.8.4
go.opentelemetry.io/collector/component v0.95.0
go.opentelemetry.io/collector/confmap v0.95.0
go.opentelemetry.io/collector/connector v0.95.0
go.opentelemetry.io/collector/connector/forwardconnector v0.95.0
go.opentelemetry.io/collector/exporter v0.95.0
Expand Down Expand Up @@ -85,7 +86,6 @@ require (
go.opentelemetry.io/collector/config/configtelemetry v0.95.0 // indirect
go.opentelemetry.io/collector/config/configtls v0.95.0 // indirect
go.opentelemetry.io/collector/config/internal v0.95.0 // indirect
go.opentelemetry.io/collector/confmap v0.95.0 // indirect
go.opentelemetry.io/collector/confmap/converter/expandconverter v0.95.0 // indirect
go.opentelemetry.io/collector/confmap/provider/envprovider v0.95.0 // indirect
go.opentelemetry.io/collector/confmap/provider/fileprovider v0.95.0 // indirect
Expand Down
Loading

0 comments on commit a30c06d

Please sign in to comment.