diff --git a/connector/datadogconnector/connector.go b/connector/datadogconnector/connector.go index 27b26f46405a7..60d7a5b60bc6a 100644 --- a/connector/datadogconnector/connector.go +++ b/connector/datadogconnector/connector.go @@ -42,6 +42,9 @@ type traceToMetricConnector struct { // exit specifies the exit channel, which will be closed upon shutdown. exit chan struct{} + + // isStarted tracks whether Start() has been called. + isStarted bool } var _ component.Component = (*traceToMetricConnector)(nil) // testing that the connectorImp properly implements the type Component interface @@ -91,11 +94,17 @@ func (c *traceToMetricConnector) Start(_ context.Context, _ component.Host) erro c.logger.Info("Starting datadogconnector") c.agent.Start() go c.run() + c.isStarted = true return nil } // Shutdown implements the component.Component interface. func (c *traceToMetricConnector) Shutdown(context.Context) error { + if !c.isStarted { + // Note: it is not necessary to manually close c.exit, c.in and c.agent.(*datadog.TraceAgent).exit channels as these are unused. + c.logger.Info("Requested shutdown, but not started, ignoring.") + return nil + } c.logger.Info("Shutting down datadog connector") c.logger.Info("Stopping datadog agent") // stop the agent and wait for the run loop to exit diff --git a/connector/datadogconnector/generated_component_test.go b/connector/datadogconnector/generated_component_test.go new file mode 100644 index 0000000000000..bf777c39bb368 --- /dev/null +++ b/connector/datadogconnector/generated_component_test.go @@ -0,0 +1,68 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package datadogconnector + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/connector/connectortest" + "go.opentelemetry.io/collector/consumer/consumertest" +) + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + tests := []struct { + name string + createFn func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) + }{ + + { + name: "traces_to_metrics", + createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { + return factory.CreateTracesToMetrics(ctx, set, cfg, consumertest.NewNop()) + }, + }, + + { + name: "traces_to_traces", + createFn: func(ctx context.Context, set connector.CreateSettings, cfg component.Config) (component.Component, error) { + return factory.CreateTracesToTraces(ctx, set, cfg, consumertest.NewNop()) + }, + }, + } + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, component.UnmarshalConfig(sub, cfg)) + + for _, test := range tests { + t.Run(test.name+"-shutdown", func(t *testing.T) { + c, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + require.NoError(t, err) + err = c.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run(test.name+"-lifecycle", func(t *testing.T) { + firstConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + require.NoError(t, err) + host := componenttest.NewNopHost() + require.NoError(t, err) + require.NoError(t, firstConnector.Start(context.Background(), host)) + require.NoError(t, firstConnector.Shutdown(context.Background())) + secondConnector, err := test.createFn(context.Background(), connectortest.NewNopCreateSettings(), cfg) + require.NoError(t, err) + require.NoError(t, secondConnector.Start(context.Background(), host)) + require.NoError(t, secondConnector.Shutdown(context.Background())) + }) + } +} diff --git a/connector/datadogconnector/go.mod b/connector/datadogconnector/go.mod index dea7d35ac0b73..4bc66b9864a52 100644 --- a/connector/datadogconnector/go.mod +++ b/connector/datadogconnector/go.mod @@ -13,6 +13,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.96.0 github.com/stretchr/testify v1.9.0 go.opentelemetry.io/collector/component v0.96.1-0.20240315172937-3b5aee0c7a16 + go.opentelemetry.io/collector/confmap v0.96.1-0.20240315172937-3b5aee0c7a16 go.opentelemetry.io/collector/connector v0.96.1-0.20240315172937-3b5aee0c7a16 go.opentelemetry.io/collector/consumer v0.96.1-0.20240315172937-3b5aee0c7a16 go.opentelemetry.io/collector/exporter v0.96.1-0.20240315172937-3b5aee0c7a16 @@ -148,7 +149,6 @@ require ( go.opentelemetry.io/collector/config/configtelemetry v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect go.opentelemetry.io/collector/config/configtls v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect go.opentelemetry.io/collector/config/internal v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect - go.opentelemetry.io/collector/confmap v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect go.opentelemetry.io/collector/confmap/converter/expandconverter v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect go.opentelemetry.io/collector/confmap/provider/envprovider v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect go.opentelemetry.io/collector/confmap/provider/fileprovider v0.96.1-0.20240315172937-3b5aee0c7a16 // indirect diff --git a/connector/datadogconnector/metadata.yaml b/connector/datadogconnector/metadata.yaml index 0f6651c166128..7feb71b521867 100644 --- a/connector/datadogconnector/metadata.yaml +++ b/connector/datadogconnector/metadata.yaml @@ -11,5 +11,3 @@ status: emeritus: [gbbr] tests: - skip_lifecycle: true - skip_shutdown: true