From 893f878acd18f3598e48455bdffae77364e1e825 Mon Sep 17 00:00:00 2001 From: "kristina.pathak" Date: Sun, 26 May 2024 21:56:27 -0700 Subject: [PATCH] add some tests --- cmd/builder/go.mod | 4 +- cmd/builder/go.sum | 8 +- cmd/builder/internal/builder/main.go | 21 +- cmd/builder/internal/builder/main_test.go | 350 ++++++++++++++++-- cmd/builder/internal/builder/modfiles_test.go | 85 +++++ 5 files changed, 410 insertions(+), 58 deletions(-) create mode 100644 cmd/builder/internal/builder/modfiles_test.go diff --git a/cmd/builder/go.mod b/cmd/builder/go.mod index c123a51656c..5df9ff1bd6a 100644 --- a/cmd/builder/go.mod +++ b/cmd/builder/go.mod @@ -31,8 +31,8 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect - golang.org/x/sys v0.14.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + golang.org/x/sys v0.20.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/cmd/builder/go.sum b/cmd/builder/go.sum index 9b4a5ff398e..6e4d8bfd37e 100644 --- a/cmd/builder/go.sum +++ b/cmd/builder/go.sum @@ -37,8 +37,8 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= @@ -54,8 +54,8 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/cmd/builder/internal/builder/main.go b/cmd/builder/internal/builder/main.go index 3af9fdd8775..981e5214c91 100644 --- a/cmd/builder/internal/builder/main.go +++ b/cmd/builder/internal/builder/main.go @@ -12,7 +12,6 @@ import ( "path/filepath" "strings" "text/template" - "time" "go.uber.org/zap" "golang.org/x/mod/modfile" @@ -24,7 +23,6 @@ var ( ErrGoNotFound = errors.New("go binary not found") ErrDepNotFound = errors.New("dependency not found in go mod file") ErrVersionMismatch = errors.New("mismatch in go.mod and builder configuration versions") - errDownloadFailed = errors.New("failed to download go modules") errCompileFailed = errors.New("failed to compile the OpenTelemetry Collector distribution") skipStrictMsg = "Use --skip-strict-versioning to temporarily disable this check. This flag will be removed in a future minor version" ) @@ -156,7 +154,7 @@ func GetModules(cfg Config) error { } if cfg.SkipStrictVersioning { - return downloadModules(cfg) + return nil } // Perform strict version checking. For each component listed and the @@ -196,22 +194,7 @@ func GetModules(cfg Config) error { } } - return downloadModules(cfg) -} - -func downloadModules(cfg Config) error { - cfg.Logger.Info("Getting go modules") - failReason := "unknown" - for i := 1; i <= cfg.downloadModules.numRetries; i++ { - if _, err := runGoCommand(cfg, "mod", "download"); err != nil { - failReason = err.Error() - cfg.Logger.Info("Failed modules download", zap.String("retry", fmt.Sprintf("%d/%d", i, cfg.downloadModules.numRetries))) - time.Sleep(cfg.downloadModules.wait) - continue - } - return nil - } - return fmt.Errorf("%w: %s", errDownloadFailed, failReason) + return nil } func processAndWrite(cfg Config, tmpl *template.Template, outFile string, tmplParams any) error { diff --git a/cmd/builder/internal/builder/main_test.go b/cmd/builder/internal/builder/main_test.go index ea39bcf785c..fedce62e72b 100644 --- a/cmd/builder/internal/builder/main_test.go +++ b/cmd/builder/internal/builder/main_test.go @@ -19,23 +19,7 @@ import ( "golang.org/x/mod/modfile" ) -const ( - goModTestFile = `// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 -module go.opentelemetry.io/collector/cmd/builder/internal/tester -go 1.20 -require ( - go.opentelemetry.io/collector/component v0.96.0 - go.opentelemetry.io/collector/connector v0.94.1 - go.opentelemetry.io/collector/exporter v0.94.1 - go.opentelemetry.io/collector/extension v0.94.1 - go.opentelemetry.io/collector/otelcol v0.94.1 - go.opentelemetry.io/collector/processor v0.94.1 - go.opentelemetry.io/collector/receiver v0.94.1 - go.opentelemetry.io/collector v0.96.0 -)` - modulePrefix = "go.opentelemetry.io/collector" -) +const modulePrefix = "go.opentelemetry.io/collector" var ( replaceModules = []string{ @@ -102,18 +86,6 @@ func newInitializedConfig(t *testing.T) Config { return cfg } -func TestGenerateDefault(t *testing.T) { - require.NoError(t, Generate(newInitializedConfig(t))) -} - -func TestGenerateInvalidOutputPath(t *testing.T) { - 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 TestVersioning(t *testing.T) { replaces := generateReplaces() tests := []struct { @@ -240,7 +212,7 @@ func TestSkipGenerate(t *testing.T) { cfg.SkipGenerate = true err := Generate(cfg) require.NoError(t, err) - outputFile, err := os.Open(cfg.Distribution.OutputPath) + outputFile, err := os.Open(filepath.Clean(cfg.Distribution.OutputPath)) defer func() { require.NoError(t, outputFile.Close()) }() @@ -252,8 +224,10 @@ func TestSkipGenerate(t *testing.T) { func TestGenerateAndCompile(t *testing.T) { replaces := generateReplaces() testCases := []struct { - testCase string - cfgBuilder func(t *testing.T) Config + testCase string + cfgBuilder func(t *testing.T) Config + verifyFiles func(t *testing.T, dir string) + expectedErr string }{ { testCase: "Default Configuration Compilation", @@ -263,6 +237,61 @@ func TestGenerateAndCompile(t *testing.T) { cfg.Replaces = append(cfg.Replaces, replaces...) return cfg }, + }, { + testCase: "Skip New Gomod Configuration Compilation", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Receivers = append(cfg.Receivers, + Module{ + GoMod: "go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1", + }, + ) + tempDir := t.TempDir() + err := makeModule(tempDir, []byte(goModTestFile)) + require.NoError(t, err) + cfg.Distribution.OutputPath = filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + verifyFiles: func(t *testing.T, dir string) { + assert.FileExists(t, filepath.Clean(filepath.Join(dir, mainTemplate.Name()))) + assert.NoFileExists(t, filepath.Clean(filepath.Join(dir, "go.mod"))) + }, + }, + { + testCase: "Generate Only", + cfgBuilder: func(t *testing.T) Config { + cfg := newInitializedConfig(t) + cfg.SkipCompilation = true + cfg.SkipGetModules = true + return cfg + }, + }, + { + testCase: "Skip Everything", + cfgBuilder: func(_ *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipCompilation = true + cfg.SkipGenerate = true + cfg.SkipGetModules = true + cfg.SkipNewGoModule = true + return cfg + }, + verifyFiles: func(t *testing.T, dir string) { + // gosec linting error: G304 Potential file inclusion via variable + // we are setting the dir + outputFile, err := os.Open(dir) //nolint:gosec + defer func() { + require.NoError(t, outputFile.Close()) + }() + require.NoError(t, err) + _, err = outputFile.Readdirnames(1) + require.ErrorIs(t, err, io.EOF, "skip generate should leave output directory empty") + }, }, { testCase: "LDFlags Compilation", @@ -329,6 +358,47 @@ func TestGenerateAndCompile(t *testing.T) { return cfg }, }, + { + testCase: "No Dir Permissions", + cfgBuilder: func(t *testing.T) Config { + cfg := newTestConfig() + cfg.Distribution.OutputPath = t.TempDir() + assert.NoError(t, os.Chmod(cfg.Distribution.OutputPath, 0000)) + cfg.Replaces = append(cfg.Replaces, replaces...) + return cfg + }, + expectedErr: "failed to generate source file", + }, + { + testCase: "Invalid Output Path", + cfgBuilder: func(t *testing.T) Config { + cfg := newInitializedConfig(t) + cfg.Distribution.OutputPath = "/:invalid" + return cfg + }, + expectedErr: "failed to create output path", + }, + { + testCase: "Malformed Receiver", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Receivers = append(cfg.Receivers, + Module{ + Name: "missing version", + GoMod: "go.opentelemetry.io/collector/cmd/builder/unittests", + }, + ) + tempDir := t.TempDir() + err := makeModule(tempDir, []byte(goModTestFile)) + require.NoError(t, err) + cfg.Distribution.OutputPath = filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + expectedErr: "ill-formatted modspec", + }, } for _, tt := range testCases { @@ -337,7 +407,221 @@ func TestGenerateAndCompile(t *testing.T) { assert.NoError(t, cfg.Validate()) assert.NoError(t, cfg.SetGoPath()) assert.NoError(t, cfg.ParseModules()) - require.NoError(t, GenerateAndCompile(cfg)) + err := GenerateAndCompile(cfg) + if len(tt.expectedErr) == 0 { + assert.NoError(t, err) + } else { + assert.ErrorContains(t, err, tt.expectedErr) + } + if tt.verifyFiles != nil { + tt.verifyFiles(t, cfg.Distribution.OutputPath) + } + }) + } +} + +func TestGetModules(t *testing.T) { + testCases := []struct { + description string + cfgBuilder func(t *testing.T) Config + expectedErr string + }{ + { + description: "Skip New Gomod Success", + cfgBuilder: func(t *testing.T) Config { + cfg := newTestConfig() + cfg.Distribution.Go = "go" + tempDir := t.TempDir() + require.NoError(t, makeModule(tempDir, []byte(goModTestFile))) + outputDir := filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Distribution.OutputPath = outputDir + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + }, + { + description: "Core Version Mismatch", + cfgBuilder: func(t *testing.T) Config { + cfg := newTestConfig() + cfg.Distribution.Go = "go" + cfg.Distribution.OtelColVersion = "0.100.0" + tempDir := t.TempDir() + require.NoError(t, makeModule(tempDir, []byte(goModTestFile))) + outputDir := filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Distribution.OutputPath = outputDir + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + expectedErr: ErrVersionMismatch.Error(), + }, + { + description: "No Go Distribution", + cfgBuilder: func(_ *testing.T) Config { + cfg := NewDefaultConfig() + cfg.downloadModules.wait = 0 + return cfg + }, + expectedErr: "failed to update go.mod", + }, + { + description: "Invalid Dependency", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.downloadModules.wait = 0 + cfg.Distribution.Go = "go" + tempDir := t.TempDir() + require.NoError(t, makeModule(tempDir, []byte(invalidDependencyGoMod))) + outputDir := filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Distribution.OutputPath = outputDir + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + expectedErr: "failed to update go.mod", + }, + { + description: "Malformed Go Mod", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.downloadModules.wait = 0 + cfg.Distribution.Go = "go" + tempDir := t.TempDir() + require.NoError(t, makeModule(tempDir, []byte(malformedGoMod))) + outputDir := filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Distribution.OutputPath = outputDir + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + expectedErr: "go subcommand failed with args '[mod edit -print]'", + }, + { + description: "Receiver Version Mismatch - Configured Lower", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Distribution.Go = "go" + cfg.Receivers = append(cfg.Receivers, + Module{ + GoMod: "go.opentelemetry.io/collector/receiver/otlpreceiver v0.100.1", + }, + ) + tempDir := t.TempDir() + err := makeModule(tempDir, []byte(goModTestFile)) + require.NoError(t, err) + cfg.Distribution.OutputPath = filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + expectedErr: ErrVersionMismatch.Error(), + }, + { + description: "Receiver Version Mismatch - Configured Higher", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Distribution.Go = "go" + cfg.Receivers = append(cfg.Receivers, + Module{ + GoMod: "go.opentelemetry.io/collector/receiver/otlpreceiver v0.103.0", + }, + ) + tempDir := t.TempDir() + err := makeModule(tempDir, []byte(goModTestFile)) + require.NoError(t, err) + cfg.Distribution.OutputPath = filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + }, + { + description: "Exporter Not in Gomod", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Distribution.Go = "go" + cfg.Exporters = append(cfg.Exporters, + Module{ + GoMod: "go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1", + }, + ) + tempDir := t.TempDir() + err := makeModule(tempDir, []byte(goModTestFile)) + require.NoError(t, err) + cfg.Distribution.OutputPath = filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + }, + { + description: "Receiver Nonexistent Version", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Distribution.Go = "go" + cfg.Receivers = append(cfg.Receivers, + Module{ + GoMod: "go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.2", + }, + ) + tempDir := t.TempDir() + err := makeModule(tempDir, []byte(goModTestFile)) + require.NoError(t, err) + cfg.Distribution.OutputPath = filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + expectedErr: "failed to update go.mod", + }, + { + description: "Receiver In Current Module", + cfgBuilder: func(t *testing.T) Config { + cfg := NewDefaultConfig() + cfg.Distribution.Go = "go" + cfg.Receivers = append(cfg.Receivers, + Module{ + GoMod: "go.opentelemetry.io/collector/cmd/builder/unittests v0.0.0", + }, + ) + tempDir := t.TempDir() + err := makeModule(tempDir, []byte(goModTestFile)) + require.NoError(t, err) + cfg.Distribution.OutputPath = filepath.Clean(filepath.Join(tempDir, "output")) + cfg.Replaces = nil + cfg.Excludes = nil + cfg.SkipNewGoModule = true + return cfg + }, + expectedErr: "failed to update go.mod", + }, + } + for _, tc := range testCases { + t.Run(tc.description, func(t *testing.T) { + cfg := tc.cfgBuilder(t) + require.NoError(t, cfg.SetBackwardsCompatibility()) + require.NoError(t, cfg.Validate()) + require.NoError(t, cfg.ParseModules()) + // GenerateAndCompile calls GetModules(). We want to call Generate() + // first so our dependencies stay in the gomod after go mod tidy. + err := GenerateAndCompile(cfg) + if len(tc.expectedErr) == 0 { + if !assert.NoError(t, err) { + mf, mvm, readErr := cfg.readGoModFile() + t.Log("go mod file", mf, mvm, readErr) + } + return + } + assert.ErrorContains(t, err, tc.expectedErr) }) } } diff --git a/cmd/builder/internal/builder/modfiles_test.go b/cmd/builder/internal/builder/modfiles_test.go new file mode 100644 index 00000000000..258a30dcb57 --- /dev/null +++ b/cmd/builder/internal/builder/modfiles_test.go @@ -0,0 +1,85 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package builder + +const ( + goModTestFile = `// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +module go.opentelemetry.io/collector/cmd/builder/unittests + +go 1.21.0 + +require ( + go.opentelemetry.io/collector/component v0.102.1 + go.opentelemetry.io/collector/confmap v0.102.1 + go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.1 + go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.1 + go.opentelemetry.io/collector/connector v0.102.1 + go.opentelemetry.io/collector/exporter v0.102.1 + go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1 + go.opentelemetry.io/collector/extension v0.102.1 + go.opentelemetry.io/collector/otelcol v0.102.1 + go.opentelemetry.io/collector/processor v0.102.1 + go.opentelemetry.io/collector/receiver v0.102.1 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1 + golang.org/x/sys v0.20.0 +)` + + invalidDependencyGoMod = `// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +module go.opentelemetry.io/collector/cmd/builder/unittests + +go 1.21.0 + +require ( + go.opentelemetry.io/collector/bad/otelcol v0.94.1 + go.opentelemetry.io/collector/component v0.102.1 + go.opentelemetry.io/collector/confmap v0.102.1 + go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.1 + go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.1 + go.opentelemetry.io/collector/connector v0.102.1 + go.opentelemetry.io/collector/exporter v0.102.1 + go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1 + go.opentelemetry.io/collector/extension v0.102.1 + go.opentelemetry.io/collector/otelcol v0.102.1 + go.opentelemetry.io/collector/processor v0.102.1 + go.opentelemetry.io/collector/receiver v0.102.1 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1 + golang.org/x/sys v0.20.0 +)` + + malformedGoMod = `// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +module go.opentelemetry.io/collector/cmd/builder/unittests + +go 1.21.0 + +require ( + go.opentelemetry.io/collector/componentv0.102.1 + go.opentelemetry.io/collector/confmap v0.102.1 + go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.1 + go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.1 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.1 + go.opentelemetry.io/collector/connector v0.102.1 + go.opentelemetry.io/collector/exporter v0.102.1 + go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1 + go.opentelemetry.io/collector/extension v0.102.1 + go.opentelemetry.io/collector/otelcol v0.102.1 + go.opentelemetry.io/collector/processor v0.102.1 + go.opentelemetry.io/collector/receiver v0.102.1 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1 + golang.org/x/sys v0.20.0 +)` +)