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 Feb 13, 2024
1 parent 5aac3fd commit 0b7c8cb
Show file tree
Hide file tree
Showing 9 changed files with 187 additions and 6 deletions.
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
}

Check warning on line 173 in cmd/builder/internal/builder/config.go

View check run for this annotation

Codecov / codecov/patch

cmd/builder/internal/builder/config.go#L172-L173

Added lines #L172 - L173 were not covered by tests
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
}

Check warning on line 195 in cmd/builder/internal/builder/config.go

View check run for this annotation

Codecov / codecov/patch

cmd/builder/internal/builder/config.go#L194-L195

Added lines #L194 - L195 were not covered by tests
c.Providers = &providers
}

if c.Converters != nil {
converters, err := parseModules(*c.Converters)
if err != nil {
return err
}

Check warning on line 203 in cmd/builder/internal/builder/config.go

View check run for this annotation

Codecov / codecov/patch

cmd/builder/internal/builder/config.go#L202-L203

Added lines #L202 - L203 were not covered by tests
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
}

Check warning on line 213 in cmd/builder/internal/builder/config.go

View check run for this annotation

Codecov / codecov/patch

cmd/builder/internal/builder/config.go#L212-L213

Added lines #L212 - L213 were not covered by tests
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
8 changes: 8 additions & 0 deletions cmd/builder/internal/config/default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,11 @@ processors:
connectors:
- gomod: go.opentelemetry.io/collector/connector/forwardconnector v0.94.0

providers:
- gomod: go.opentelemetry.io/collector/confmap/provider/envprovider v0.94.0
- gomod: go.opentelemetry.io/collector/confmap/provider/fileprovider v0.94.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpprovider v0.94.0
- gomod: go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.94.0
- gomod: go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.94.0
converters:
- gomod: go.opentelemetry.io/collector/confmap/converter/expandconverter v0.94.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.94.1

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

replaces:
- go.opentelemetry.io/collector => ../../
- go.opentelemetry.io/collector/otelcol => ../../otelcol
Expand Down
22 changes: 21 additions & 1 deletion cmd/otelcorecol/main.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 0b7c8cb

Please sign in to comment.