diff --git a/.chloggen/datadog-connector-traces.yaml b/.chloggen/datadog-connector-traces.yaml new file mode 100644 index 000000000000..808b388eb57a --- /dev/null +++ b/.chloggen/datadog-connector-traces.yaml @@ -0,0 +1,27 @@ +# 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. filelogreceiver) +component: datadogconnector + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Allow datadogconnector to be used as a traces-to-traces connector + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [27846] + +# (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 your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# 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: [] diff --git a/connector/datadogconnector/README.md b/connector/datadogconnector/README.md index ba6c82f892a7..457382cd830c 100644 --- a/connector/datadogconnector/README.md +++ b/connector/datadogconnector/README.md @@ -15,6 +15,7 @@ | [Exporter Pipeline Type] | [Receiver Pipeline Type] | [Stability Level] | | ------------------------ | ------------------------ | ----------------- | | traces | metrics | [beta] | +| traces | traces | [beta] | [Exporter Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#exporter-pipeline-type [Receiver Pipeline Type]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/connector/README.md#receiver-pipeline-type @@ -91,7 +92,7 @@ service: exporters: [datadog/connector] traces/2: # this pipeline uses sampling - receivers: [otlp] + receivers: [datadog/connector] processors: [batch, probabilistic_sampler] exporters: [datadog] diff --git a/connector/datadogconnector/connector.go b/connector/datadogconnector/connector.go index 1c089f254490..582e45712825 100644 --- a/connector/datadogconnector/connector.go +++ b/connector/datadogconnector/connector.go @@ -18,7 +18,8 @@ import ( // connectorImp is the schema for connector type connectorImp struct { - metricsConsumer consumer.Metrics // the next component in the pipeline to ingest data after connector + metricsConsumer consumer.Metrics // the next component in the pipeline to ingest metrics after connector + tracesConsumer consumer.Traces // the next component in the pipeline to ingest traces after connector logger *zap.Logger // agent specifies the agent used to ingest traces and output APM Stats. @@ -40,7 +41,7 @@ type connectorImp struct { var _ component.Component = (*connectorImp)(nil) // testing that the connectorImp properly implements the type Component interface // function to create a new connector -func newConnector(logger *zap.Logger, _ component.Config, nextConsumer consumer.Metrics) (*connectorImp, error) { +func newConnector(logger *zap.Logger, _ component.Config, metricsConsumer consumer.Metrics, tracesConsumer consumer.Traces) (*connectorImp, error) { logger.Info("Building datadog connector") in := make(chan *pb.StatsPayload, 100) @@ -55,7 +56,8 @@ func newConnector(logger *zap.Logger, _ component.Config, nextConsumer consumer. agent: datadog.NewAgent(ctx, in), translator: trans, in: in, - metricsConsumer: nextConsumer, + metricsConsumer: metricsConsumer, + tracesConsumer: tracesConsumer, exit: make(chan struct{}), }, nil } @@ -64,7 +66,9 @@ func newConnector(logger *zap.Logger, _ component.Config, nextConsumer consumer. func (c *connectorImp) Start(_ context.Context, _ component.Host) error { c.logger.Info("Starting datadogconnector") c.agent.Start() - go c.run() + if c.metricsConsumer != nil { + go c.run() + } return nil } @@ -85,6 +89,9 @@ func (c *connectorImp) Capabilities() consumer.Capabilities { func (c *connectorImp) ConsumeTraces(ctx context.Context, traces ptrace.Traces) error { c.agent.Ingest(ctx, traces) + if c.tracesConsumer != nil { + return c.tracesConsumer.ConsumeTraces(ctx, traces) + } return nil } diff --git a/connector/datadogconnector/connector_test.go b/connector/datadogconnector/connector_test.go index 7f016b6776a4..d5410720be71 100644 --- a/connector/datadogconnector/connector_test.go +++ b/connector/datadogconnector/connector_test.go @@ -23,9 +23,15 @@ func TestNewConnector(t *testing.T) { creationParams := connectortest.NewNopCreateSettings() cfg := factory.CreateDefaultConfig().(*Config) - traceConnector, err := factory.CreateTracesToMetrics(context.Background(), creationParams, cfg, consumertest.NewNop()) + traceToMetricsConnector, err := factory.CreateTracesToMetrics(context.Background(), creationParams, cfg, consumertest.NewNop()) assert.NoError(t, err) - _, ok := traceConnector.(*connectorImp) + _, ok := traceToMetricsConnector.(*connectorImp) + assert.True(t, ok) // checks if the created connector implements the connectorImp struct + + traceToTracesConnector, err := factory.CreateTracesToTraces(context.Background(), creationParams, cfg, consumertest.NewNop()) + assert.NoError(t, err) + + _, ok = traceToTracesConnector.(*connectorImp) assert.True(t, ok) // checks if the created connector implements the connectorImp struct } diff --git a/connector/datadogconnector/factory.go b/connector/datadogconnector/factory.go index fc61ebfeff1f..5d1d6673426c 100644 --- a/connector/datadogconnector/factory.go +++ b/connector/datadogconnector/factory.go @@ -21,7 +21,8 @@ func NewFactory() connector.Factory { return connector.NewFactory( metadata.Type, createDefaultConfig, - connector.WithTracesToMetrics(createTracesToMetricsConnector, metadata.TracesToMetricsStability)) + connector.WithTracesToMetrics(createTracesToMetricsConnector, metadata.TracesToMetricsStability), + connector.WithTracesToTraces(createTracesToTracesConnector, metadata.TracesToTracesStability)) } var _ component.Config = (*Config)(nil) @@ -35,7 +36,15 @@ func createDefaultConfig() component.Config { // defines the consumer type of the connector // we want to consume traces and export metrics therefore define nextConsumer as metrics, consumer is the next component in the pipeline func createTracesToMetricsConnector(_ context.Context, params connector.CreateSettings, cfg component.Config, nextConsumer consumer.Metrics) (connector.Traces, error) { - c, err := newConnector(params.Logger, cfg, nextConsumer) + c, err := newConnector(params.Logger, cfg, nextConsumer, nil) + if err != nil { + return nil, err + } + return c, nil +} + +func createTracesToTracesConnector(_ context.Context, params connector.CreateSettings, cfg component.Config, nextConsumer consumer.Traces) (connector.Traces, error) { + c, err := newConnector(params.Logger, cfg, nil, nextConsumer) if err != nil { return nil, err } diff --git a/connector/datadogconnector/internal/metadata/generated_status.go b/connector/datadogconnector/internal/metadata/generated_status.go index 6ff2f2e5baa3..1e601630c741 100644 --- a/connector/datadogconnector/internal/metadata/generated_status.go +++ b/connector/datadogconnector/internal/metadata/generated_status.go @@ -9,4 +9,5 @@ import ( const ( Type = "datadog" TracesToMetricsStability = component.StabilityLevelBeta + TracesToTracesStability = component.StabilityLevelBeta ) diff --git a/connector/datadogconnector/metadata.yaml b/connector/datadogconnector/metadata.yaml index 9de47b0382df..f6b1f32221ef 100644 --- a/connector/datadogconnector/metadata.yaml +++ b/connector/datadogconnector/metadata.yaml @@ -3,7 +3,7 @@ type: datadog status: class: connector stability: - beta: [traces_to_metrics] + beta: [traces_to_metrics, traces_to_traces] distributions: [contrib] codeowners: active: [mx-psi, gbbr, dineshg13]