From 0e048eb932f4bc2be3bee7ed2c545b779b6fd4ff Mon Sep 17 00:00:00 2001 From: Bogdan Drutu Date: Wed, 12 Feb 2025 15:29:27 -0800 Subject: [PATCH] Add a featuregatetest package and module to share featuregate testing support Signed-off-by: Bogdan Drutu --- cmd/builder/internal/builder/main_test.go | 1 + cmd/otelcorecol/builder-config.yaml | 1 + cmd/otelcorecol/go.mod | 4 +- exporter/debugexporter/go.mod | 2 + .../internal/base_exporter_test.go | 11 +++--- .../internal/batch_sender_test.go | 25 +++++++------ .../internal/queue_sender_test.go | 19 +++++----- .../exporterhelper/xexporterhelper/go.mod | 2 + exporter/exportertest/go.mod | 2 + exporter/go.mod | 3 ++ exporter/nopexporter/go.mod | 2 + exporter/otlpexporter/go.mod | 2 + exporter/otlphttpexporter/go.mod | 2 + exporter/xexporter/go.mod | 2 + featuregate/featuregatetest/Makefile | 1 + featuregate/featuregatetest/go.mod | 19 ++++++++++ featuregate/featuregatetest/go.sum | 19 ++++++++++ .../featuregatetest}/test_util.go | 6 ++- internal/e2e/go.mod | 2 + otelcol/go.mod | 2 + otelcol/otelcoltest/go.mod | 2 + service/go.mod | 2 + service/pipelines/config_test.go | 7 +--- service/telemetry/config_test.go | 37 +++---------------- service/telemetry/factory_test.go | 9 +---- service/telemetry/tracer_test.go | 9 +---- versions.yaml | 1 + 27 files changed, 115 insertions(+), 79 deletions(-) create mode 100644 featuregate/featuregatetest/Makefile create mode 100644 featuregate/featuregatetest/go.mod create mode 100644 featuregate/featuregatetest/go.sum rename {exporter/exporterhelper/internal => featuregate/featuregatetest}/test_util.go (56%) diff --git a/cmd/builder/internal/builder/main_test.go b/cmd/builder/internal/builder/main_test.go index 178f0afb6b2..8e80e80b787 100644 --- a/cmd/builder/internal/builder/main_test.go +++ b/cmd/builder/internal/builder/main_test.go @@ -83,6 +83,7 @@ var replaceModules = []string{ "/extension/zpagesextension", "/extension/xextension", "/featuregate", + "/featuregate/featuregatetest", "/internal/memorylimiter", "/internal/fanoutconsumer", "/internal/sharedcomponent", diff --git a/cmd/otelcorecol/builder-config.yaml b/cmd/otelcorecol/builder-config.yaml index b60102a0eb1..6c460bcd589 100644 --- a/cmd/otelcorecol/builder-config.yaml +++ b/cmd/otelcorecol/builder-config.yaml @@ -84,6 +84,7 @@ replaces: - go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension - go.opentelemetry.io/collector/extension/zpagesextension => ../../extension/zpagesextension - go.opentelemetry.io/collector/featuregate => ../../featuregate + - go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest - go.opentelemetry.io/collector/internal/memorylimiter => ../../internal/memorylimiter - go.opentelemetry.io/collector/internal/fanoutconsumer => ../../internal/fanoutconsumer - go.opentelemetry.io/collector/internal/telemetry => ../../internal/telemetry diff --git a/cmd/otelcorecol/go.mod b/cmd/otelcorecol/go.mod index 8955181d51d..23d4eb44d6d 100644 --- a/cmd/otelcorecol/go.mod +++ b/cmd/otelcorecol/go.mod @@ -4,7 +4,7 @@ module go.opentelemetry.io/collector/cmd/otelcorecol go 1.23.0 -toolchain go1.23.6 +toolchain go1.23.5 require ( go.opentelemetry.io/collector/component v0.119.0 @@ -256,6 +256,8 @@ replace go.opentelemetry.io/collector/extension/zpagesextension => ../../extensi replace go.opentelemetry.io/collector/featuregate => ../../featuregate +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest + replace go.opentelemetry.io/collector/internal/memorylimiter => ../../internal/memorylimiter replace go.opentelemetry.io/collector/internal/fanoutconsumer => ../../internal/fanoutconsumer diff --git a/exporter/debugexporter/go.mod b/exporter/debugexporter/go.mod index aad0e7a98ba..27a1c53123d 100644 --- a/exporter/debugexporter/go.mod +++ b/exporter/debugexporter/go.mod @@ -118,3 +118,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../../extension replace go.opentelemetry.io/collector/featuregate => ../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/exporter/exporterhelper/internal/base_exporter_test.go b/exporter/exporterhelper/internal/base_exporter_test.go index e8264e2afbc..5725fbf308c 100644 --- a/exporter/exporterhelper/internal/base_exporter_test.go +++ b/exporter/exporterhelper/internal/base_exporter_test.go @@ -22,6 +22,7 @@ import ( "go.opentelemetry.io/collector/exporter/exporterhelper/internal/requesttest" "go.opentelemetry.io/collector/exporter/exporterqueue" "go.opentelemetry.io/collector/exporter/exportertest" + "go.opentelemetry.io/collector/featuregate/featuregatetest" "go.opentelemetry.io/collector/pipeline" ) @@ -50,7 +51,7 @@ func newNoopExportSender() Sender[request.Request] { func TestBaseExporter(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) be, err := NewBaseExporter(defaultSettings, defaultSignal) require.NoError(t, err) require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost())) @@ -64,7 +65,7 @@ func TestBaseExporter(t *testing.T) { func TestBaseExporterWithOptions(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) want := errors.New("my error") be, err := NewBaseExporter( defaultSettings, defaultSignal, @@ -84,7 +85,7 @@ func TestBaseExporterWithOptions(t *testing.T) { func TestQueueOptionsWithRequestExporter(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) bs, err := NewBaseExporter(exportertest.NewNopSettings(), defaultSignal, WithRetry(configretry.NewDefaultBackOffConfig())) require.NoError(t, err) @@ -108,7 +109,7 @@ func TestQueueOptionsWithRequestExporter(t *testing.T) { func TestBaseExporterLogging(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) set := exportertest.NewNopSettings() logger, observed := observer.New(zap.DebugLevel) set.Logger = zap.New(logger) @@ -183,7 +184,7 @@ func TestQueueRetryWithDisabledQueue(t *testing.T) { }, ) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) set := exportertest.NewNopSettings() logger, observed := observer.New(zap.ErrorLevel) set.Logger = zap.New(logger) diff --git a/exporter/exporterhelper/internal/batch_sender_test.go b/exporter/exporterhelper/internal/batch_sender_test.go index d38c1f91f6d..ec3c20e81c1 100644 --- a/exporter/exporterhelper/internal/batch_sender_test.go +++ b/exporter/exporterhelper/internal/batch_sender_test.go @@ -18,6 +18,7 @@ import ( "go.opentelemetry.io/collector/exporter/exporterbatcher" "go.opentelemetry.io/collector/exporter/exporterhelper/internal/requesttest" "go.opentelemetry.io/collector/exporter/exporterqueue" + "go.opentelemetry.io/collector/featuregate/featuregatetest" ) func TestBatchSender_Merge(t *testing.T) { @@ -56,7 +57,7 @@ func TestBatchSender_Merge(t *testing.T) { }, ) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) be, err := newQueueBatchExporter(exporterqueue.NewDefaultConfig(), tt.batchCfg) require.NoError(t, err) require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost())) @@ -143,7 +144,7 @@ func TestBatchSender_BatchExportError(t *testing.T) { }, ) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) be, err := newQueueBatchExporter(exporterqueue.NewDefaultConfig(), tt.batchCfg) require.NoError(t, err) require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost())) @@ -179,7 +180,7 @@ func TestBatchSender_BatchExportError(t *testing.T) { func TestBatchSender_MergeOrSplit(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) batchCfg := exporterbatcher.NewDefaultConfig() batchCfg.MinSizeItems = 5 @@ -224,7 +225,7 @@ func TestBatchSender_MergeOrSplit(t *testing.T) { func TestBatchSender_Shutdown(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) batchCfg := exporterbatcher.NewDefaultConfig() batchCfg.MinSizeItems = 10 be, err := newQueueBatchExporter(exporterqueue.NewDefaultConfig(), batchCfg) @@ -282,7 +283,7 @@ func TestBatchSender_Shutdown(t *testing.T) { func TestBatchSender_PostShutdown(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) be, err := newQueueBatchExporter(exporterqueue.Config{}, exporterbatcher.NewDefaultConfig()) require.NoError(t, err) assert.NoError(t, be.Start(context.Background(), componenttest.NewNopHost())) @@ -350,7 +351,7 @@ func TestBatchSender_ConcurrencyLimitReached(t *testing.T) { // To avoid blocking, the concurrency limit is set to the number of concurrent goroutines that are in charge of // reading from the queue and adding to batch. With the new model, we are pulling instead of pushing so we don't // block the reading goroutine anymore. - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, false) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, false) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -408,7 +409,7 @@ func TestBatchSender_ConcurrencyLimitReached(t *testing.T) { func TestBatchSender_BatchBlocking(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) bCfg := exporterbatcher.NewDefaultConfig() bCfg.MinSizeItems = 3 be, err := newQueueBatchExporter(exporterqueue.Config{}, bCfg) @@ -442,7 +443,7 @@ func TestBatchSender_BatchBlocking(t *testing.T) { func TestBatchSender_BatchCancelled(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) bCfg := exporterbatcher.NewDefaultConfig() bCfg.MinSizeItems = 2 be, err := newQueueBatchExporter(exporterqueue.Config{}, bCfg) @@ -481,7 +482,7 @@ func TestBatchSender_BatchCancelled(t *testing.T) { func TestBatchSender_DrainActiveRequests(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) bCfg := exporterbatcher.NewDefaultConfig() bCfg.MinSizeItems = 2 @@ -520,7 +521,7 @@ func TestBatchSender_DrainActiveRequests(t *testing.T) { func TestBatchSender_UnstartedShutdown(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) be, err := newQueueBatchExporter(exporterqueue.NewDefaultConfig(), exporterbatcher.NewDefaultConfig()) require.NoError(t, err) err = be.Shutdown(context.Background()) @@ -581,7 +582,7 @@ func TestBatchSender_UnstartedShutdown(t *testing.T) { func TestBatchSenderWithTimeout(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) bCfg := exporterbatcher.NewDefaultConfig() bCfg.MinSizeItems = 10 @@ -656,7 +657,7 @@ func TestBatchSenderTimerResetNoConflict(t *testing.T) { func TestBatchSenderTimerFlush(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) if runtime.GOOS == "windows" { t.Skip("skipping flaky test on Windows, see https://github.com/open-telemetry/opentelemetry-collector/issues/10802") } diff --git a/exporter/exporterhelper/internal/queue_sender_test.go b/exporter/exporterhelper/internal/queue_sender_test.go index b85aaef238f..48e95d75ef7 100644 --- a/exporter/exporterhelper/internal/queue_sender_test.go +++ b/exporter/exporterhelper/internal/queue_sender_test.go @@ -23,13 +23,14 @@ import ( "go.opentelemetry.io/collector/exporter/exporterqueue" "go.opentelemetry.io/collector/exporter/exportertest" "go.opentelemetry.io/collector/exporter/internal/storagetest" + "go.opentelemetry.io/collector/featuregate/featuregatetest" "go.opentelemetry.io/collector/pipeline" ) func TestQueuedBatchStopWhileWaiting(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) qCfg := exporterqueue.NewDefaultConfig() qCfg.NumConsumers = 1 be, err := newQueueBatchExporter(qCfg, exporterbatcher.Config{}) @@ -55,7 +56,7 @@ func TestQueuedBatchStopWhileWaiting(t *testing.T) { func TestQueueBatchDoNotPreserveCancellation(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) qCfg := exporterqueue.NewDefaultConfig() qCfg.NumConsumers = 1 be, err := newQueueBatchExporter(qCfg, exporterbatcher.Config{}) @@ -112,7 +113,7 @@ func TestQueueBatchHappyPath(t *testing.T) { }, ) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) be, err := newQueueBatchExporter(tt.qCfg, exporterbatcher.Config{}) require.NoError(t, err) @@ -140,7 +141,7 @@ func TestQueueBatchHappyPath(t *testing.T) { func TestQueueConfig_Validate(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) qCfg := NewDefaultQueueConfig() require.NoError(t, qCfg.Validate()) @@ -165,7 +166,7 @@ func TestQueueConfig_Validate(t *testing.T) { func TestQueueFailedRequestDropped(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) qSet := exporterqueue.Settings{ Signal: defaultSignal, ExporterSettings: defaultSettings, @@ -192,7 +193,7 @@ func TestQueueFailedRequestDropped(t *testing.T) { func TestQueueBatchPersistenceEnabled(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) qSet := exporterqueue.Settings{ Signal: defaultSignal, ExporterSettings: defaultSettings, @@ -224,7 +225,7 @@ func TestQueueBatchPersistenceEnabled(t *testing.T) { func TestQueueBatchPersistenceEnabledStorageError(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) storageError := errors.New("could not get storage client") qSet := exporterqueue.Settings{ @@ -257,7 +258,7 @@ func TestQueueBatchPersistenceEnabledStorageError(t *testing.T) { func TestQueueBatchPersistentEnabled_NoDataLossOnShutdown(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) qCfg := exporterqueue.NewDefaultConfig() qCfg.NumConsumers = 1 @@ -325,7 +326,7 @@ func TestQueueBatchPersistentEnabled_NoDataLossOnShutdown(t *testing.T) { func TestQueueBatchNoStartShutdown(t *testing.T) { runTest := func(testName string, enableQueueBatcher bool) { t.Run(testName, func(t *testing.T) { - setFeatureGateForTest(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) + featuregatetest.SetGate(t, usePullingBasedExporterQueueBatcher, enableQueueBatcher) set := exportertest.NewNopSettings() set.ID = exporterID qSet := exporterqueue.Settings{ diff --git a/exporter/exporterhelper/xexporterhelper/go.mod b/exporter/exporterhelper/xexporterhelper/go.mod index b8141e4db4e..cc172756bd8 100644 --- a/exporter/exporterhelper/xexporterhelper/go.mod +++ b/exporter/exporterhelper/xexporterhelper/go.mod @@ -102,3 +102,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../../../extens replace go.opentelemetry.io/collector/featuregate => ../../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../../featuregate/featuregatetest diff --git a/exporter/exportertest/go.mod b/exporter/exportertest/go.mod index 983d2dc84b7..2015e648ddf 100644 --- a/exporter/exportertest/go.mod +++ b/exporter/exportertest/go.mod @@ -92,3 +92,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../../extension replace go.opentelemetry.io/collector/featuregate => ../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/exporter/go.mod b/exporter/go.mod index 49e64f8cdbf..078a43e6d47 100644 --- a/exporter/go.mod +++ b/exporter/go.mod @@ -15,6 +15,7 @@ require ( go.opentelemetry.io/collector/extension/extensiontest v0.119.0 go.opentelemetry.io/collector/extension/xextension v0.119.0 go.opentelemetry.io/collector/featuregate v1.25.0 + go.opentelemetry.io/collector/featuregate/featuregatetest v0.119.0 go.opentelemetry.io/collector/pdata v1.25.0 go.opentelemetry.io/collector/pdata/testdata v0.119.0 go.opentelemetry.io/collector/pipeline v0.119.0 @@ -97,3 +98,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../extension/ex replace go.opentelemetry.io/collector/featuregate => ../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../featuregate/featuregatetest diff --git a/exporter/nopexporter/go.mod b/exporter/nopexporter/go.mod index 072f94b6258..c31c12281ac 100644 --- a/exporter/nopexporter/go.mod +++ b/exporter/nopexporter/go.mod @@ -99,3 +99,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../../extension replace go.opentelemetry.io/collector/featuregate => ../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/exporter/otlpexporter/go.mod b/exporter/otlpexporter/go.mod index 25ccd8171e2..3c384167f28 100644 --- a/exporter/otlpexporter/go.mod +++ b/exporter/otlpexporter/go.mod @@ -157,3 +157,5 @@ replace go.opentelemetry.io/collector/extension/auth/authtest => ../../extension replace go.opentelemetry.io/collector/featuregate => ../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/exporter/otlphttpexporter/go.mod b/exporter/otlphttpexporter/go.mod index 8869e76d0e8..0902595b25b 100644 --- a/exporter/otlphttpexporter/go.mod +++ b/exporter/otlphttpexporter/go.mod @@ -155,3 +155,5 @@ replace go.opentelemetry.io/collector/extension/auth/authtest => ../../extension replace go.opentelemetry.io/collector/featuregate => ../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/exporter/xexporter/go.mod b/exporter/xexporter/go.mod index 08b2e9bf493..db3725fcb22 100644 --- a/exporter/xexporter/go.mod +++ b/exporter/xexporter/go.mod @@ -74,3 +74,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../../extension replace go.opentelemetry.io/collector/featuregate => ../../featuregate replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/featuregate/featuregatetest/Makefile b/featuregate/featuregatetest/Makefile new file mode 100644 index 00000000000..ded7a36092d --- /dev/null +++ b/featuregate/featuregatetest/Makefile @@ -0,0 +1 @@ +include ../../Makefile.Common diff --git a/featuregate/featuregatetest/go.mod b/featuregate/featuregatetest/go.mod new file mode 100644 index 00000000000..b9d495750a3 --- /dev/null +++ b/featuregate/featuregatetest/go.mod @@ -0,0 +1,19 @@ +module go.opentelemetry.io/collector/featuregate/featuregatetest + +go 1.23.0 + +require ( + go.opentelemetry.io/collector/featuregate v1.25.0 + github.com/stretchr/testify v1.10.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace go.opentelemetry.io/collector/featuregate => ../ diff --git a/featuregate/featuregatetest/go.sum b/featuregate/featuregatetest/go.sum new file mode 100644 index 00000000000..916afc9b167 --- /dev/null +++ b/featuregate/featuregatetest/go.sum @@ -0,0 +1,19 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +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/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/collector/featuregate v1.25.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/exporter/exporterhelper/internal/test_util.go b/featuregate/featuregatetest/test_util.go similarity index 56% rename from exporter/exporterhelper/internal/test_util.go rename to featuregate/featuregatetest/test_util.go index e09b66763e3..68c8f46b23e 100644 --- a/exporter/exporterhelper/internal/test_util.go +++ b/featuregate/featuregatetest/test_util.go @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -package internal // import "go.opentelemetry.io/collector/exporter/exporterhelper/internal" +package featuregatetest // import "go.opentelemetry.io/collector/exporter/exporterhelper/internal" import ( "testing" @@ -11,7 +11,9 @@ import ( "go.opentelemetry.io/collector/featuregate" ) -func setFeatureGateForTest(tb testing.TB, gate *featuregate.Gate, enabled bool) { +// SetGate sets the value to the given gate. Also, it installs a cleanup function to restore +// the gate to the initial value when the test is done. +func SetGate(tb testing.TB, gate *featuregate.Gate, enabled bool) { originalValue := gate.IsEnabled() require.NoError(tb, featuregate.GlobalRegistry().Set(gate.ID(), enabled)) tb.Cleanup(func() { diff --git a/internal/e2e/go.mod b/internal/e2e/go.mod index bc336795ea0..760e3e60859 100644 --- a/internal/e2e/go.mod +++ b/internal/e2e/go.mod @@ -247,3 +247,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../../extension replace go.opentelemetry.io/collector/extension/auth/authtest => ../../extension/auth/authtest replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/otelcol/go.mod b/otelcol/go.mod index 59751c0d2c7..3ceb155504e 100644 --- a/otelcol/go.mod +++ b/otelcol/go.mod @@ -210,3 +210,5 @@ replace go.opentelemetry.io/collector/extension/auth/authtest => ../extension/au replace go.opentelemetry.io/collector/extension/xextension => ../extension/xextension replace go.opentelemetry.io/collector/internal/telemetry => ../internal/telemetry + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../featuregate/featuregatetest diff --git a/otelcol/otelcoltest/go.mod b/otelcol/otelcoltest/go.mod index 958f4bc7d9b..dbc6e68acde 100644 --- a/otelcol/otelcoltest/go.mod +++ b/otelcol/otelcoltest/go.mod @@ -225,3 +225,5 @@ replace go.opentelemetry.io/collector/processor/processortest => ../../processor replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata replace go.opentelemetry.io/collector/internal/telemetry => ../../internal/telemetry + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../../featuregate/featuregatetest diff --git a/service/go.mod b/service/go.mod index 1bd2d13e76f..49bd2469f7a 100644 --- a/service/go.mod +++ b/service/go.mod @@ -219,3 +219,5 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../extension/ex replace go.opentelemetry.io/collector/extension/auth/authtest => ../extension/auth/authtest replace go.opentelemetry.io/collector/extension/xextension => ../extension/xextension + +replace go.opentelemetry.io/collector/featuregate/featuregatetest => ../featuregate/featuregatetest diff --git a/service/pipelines/config_test.go b/service/pipelines/config_test.go index c24f8c744c9..39daa7e82ca 100644 --- a/service/pipelines/config_test.go +++ b/service/pipelines/config_test.go @@ -11,7 +11,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/xconfmap" - "go.opentelemetry.io/collector/featuregate" + "go.opentelemetry.io/collector/featuregate/featuregatetest" "go.opentelemetry.io/collector/pipeline" "go.opentelemetry.io/collector/pipeline/xpipeline" ) @@ -91,7 +91,7 @@ func TestConfigValidate(t *testing.T) { { name: "enabled-featuregate-profiles", cfgFn: func(t *testing.T) Config { - require.NoError(t, featuregate.GlobalRegistry().Set(serviceProfileSupportGateID, true)) + featuregatetest.SetGate(t, serviceProfileSupportGate, true) cfg := generateConfig(t) cfg[pipeline.NewID(xpipeline.SignalProfiles)] = &PipelineConfig{ @@ -113,9 +113,6 @@ func TestConfigValidate(t *testing.T) { } else { require.NoError(t, xconfmap.Validate(cfg)) } - - // Clean up the profiles support gate, which may have been enabled in `cfgFn`. - require.NoError(t, featuregate.GlobalRegistry().Set(serviceProfileSupportGateID, false)) }) } } diff --git a/service/telemetry/config_test.go b/service/telemetry/config_test.go index fb2cfbfc04b..fcbf2eb0efe 100644 --- a/service/telemetry/config_test.go +++ b/service/telemetry/config_test.go @@ -15,7 +15,7 @@ import ( "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/confmap/confmaptest" - "go.opentelemetry.io/collector/featuregate" + "go.opentelemetry.io/collector/featuregate/featuregatetest" ) func TestComponentConfigStruct(t *testing.T) { @@ -30,12 +30,7 @@ func TestUnmarshalDefaultConfig(t *testing.T) { } func TestUnmarshalEmptyMetricReaders(t *testing.T) { - prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false)) - defer func() { - // Restore previous value. - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev)) - }() + featuregatetest.SetGate(t, disableAddressFieldForInternalTelemetryFeatureGate, false) cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_empty_readers.yaml")) require.NoError(t, err) cfg := NewFactory().CreateDefaultConfig() @@ -44,12 +39,7 @@ func TestUnmarshalEmptyMetricReaders(t *testing.T) { } func TestUnmarshalConfigDeprecatedAddress(t *testing.T) { - prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false)) - defer func() { - // Restore previous value. - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev)) - }() + featuregatetest.SetGate(t, disableAddressFieldForInternalTelemetryFeatureGate, false) cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_deprecated_address.yaml")) require.NoError(t, err) cfg := NewFactory().CreateDefaultConfig() @@ -60,12 +50,7 @@ func TestUnmarshalConfigDeprecatedAddress(t *testing.T) { } func TestUnmarshalConfigDeprecatedAddressGateEnabled(t *testing.T) { - prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), true)) - defer func() { - // Restore previous value. - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev)) - }() + featuregatetest.SetGate(t, disableAddressFieldForInternalTelemetryFeatureGate, true) cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_deprecated_address.yaml")) require.NoError(t, err) cfg := NewFactory().CreateDefaultConfig() @@ -76,12 +61,7 @@ func TestUnmarshalConfigDeprecatedAddressGateEnabled(t *testing.T) { } func TestUnmarshalConfigInvalidDeprecatedAddress(t *testing.T) { - prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false)) - defer func() { - // Restore previous value. - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev)) - }() + featuregatetest.SetGate(t, disableAddressFieldForInternalTelemetryFeatureGate, false) cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_invalid_deprecated_address.yaml")) require.NoError(t, err) cfg := NewFactory().CreateDefaultConfig() @@ -89,12 +69,7 @@ func TestUnmarshalConfigInvalidDeprecatedAddress(t *testing.T) { } func TestUnmarshalConfigDeprecatedAddressAndReaders(t *testing.T) { - prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false)) - defer func() { - // Restore previous value. - require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev)) - }() + featuregatetest.SetGate(t, disableAddressFieldForInternalTelemetryFeatureGate, false) cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_deprecated_address_and_readers.yaml")) require.NoError(t, err) cfg := NewFactory().CreateDefaultConfig() diff --git a/service/telemetry/factory_test.go b/service/telemetry/factory_test.go index 8b8d20bc1d1..33dc46a3247 100644 --- a/service/telemetry/factory_test.go +++ b/service/telemetry/factory_test.go @@ -16,7 +16,7 @@ import ( "go.uber.org/zap/zapcore" "go.opentelemetry.io/collector/config/configtelemetry" - "go.opentelemetry.io/collector/featuregate" + "go.opentelemetry.io/collector/featuregate/featuregatetest" ) func TestDefaultConfig(t *testing.T) { @@ -36,12 +36,7 @@ func TestDefaultConfig(t *testing.T) { for _, tt := range tests { t.Run("UseLocalHostAsDefaultMetricsAddress/"+strconv.FormatBool(tt.gate), func(t *testing.T) { - prev := useLocalHostAsDefaultMetricsAddressFeatureGate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(useLocalHostAsDefaultMetricsAddressFeatureGate.ID(), tt.gate)) - defer func() { - // Restore previous value. - require.NoError(t, featuregate.GlobalRegistry().Set(useLocalHostAsDefaultMetricsAddressFeatureGate.ID(), prev)) - }() + featuregatetest.SetGate(t, useLocalHostAsDefaultMetricsAddressFeatureGate, tt.gate) cfg := NewFactory().CreateDefaultConfig() require.Len(t, cfg.(*Config).Metrics.Readers, 1) assert.Equal(t, tt.expected, *cfg.(*Config).Metrics.Readers[0].Pull.Exporter.Prometheus.Host) diff --git a/service/telemetry/tracer_test.go b/service/telemetry/tracer_test.go index 929c2385dd1..3f7ac825725 100644 --- a/service/telemetry/tracer_test.go +++ b/service/telemetry/tracer_test.go @@ -11,7 +11,7 @@ import ( sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/collector/config/configtelemetry" - "go.opentelemetry.io/collector/featuregate" + "go.opentelemetry.io/collector/featuregate/featuregatetest" ) func TestNewTracerProvider(t *testing.T) { @@ -43,12 +43,7 @@ func TestNewTracerProvider(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - previousValue := noopTracerProvider.IsEnabled() - // expect error due to deprecated flag - require.NoError(t, featuregate.GlobalRegistry().Set(noopTracerProvider.ID(), tt.noopTracerGate)) - defer func() { - require.NoError(t, featuregate.GlobalRegistry().Set(noopTracerProvider.ID(), previousValue)) - }() + featuregatetest.SetGate(t, noopTracerProvider, tt.noopTracerGate) sdk, err := config.NewSDK(config.WithOpenTelemetryConfiguration(config.OpenTelemetryConfiguration{TracerProvider: &config.TracerProvider{ Processors: tt.cfg.Traces.Processors, }})) diff --git a/versions.yaml b/versions.yaml index 65695a96a7c..c2188352cb4 100644 --- a/versions.yaml +++ b/versions.yaml @@ -63,6 +63,7 @@ module-sets: - go.opentelemetry.io/collector/extension/zpagesextension - go.opentelemetry.io/collector/extension/memorylimiterextension - go.opentelemetry.io/collector/extension/xextension + - go.opentelemetry.io/collector/featuregate/featuregatetest - go.opentelemetry.io/collector/otelcol - go.opentelemetry.io/collector/otelcol/otelcoltest - go.opentelemetry.io/collector/pdata/pprofile