Skip to content

Commit c47c746

Browse files
authored
Add feature gate for refactor of OTLP->Datadog span translation (#37171)
#### Description Add a feature gate exporter.datadogexporter.EnableReceiveResourceSpansV2. Enabling this gate uses a refactored implementation of OTLP->Datadog Span translation which improves performance by 10%, and deprecates the following functionality: - No longer checks for resource-related values (container, env, hostname) in span attributes. This previous behavior did not follow the OTel spec. After a migration period of 6 versions, we plan to change this to opt-out, then deprecate the old functionality after another 6 versions. #### Link to tracking issue #37077 #### Testing Add unit tests for new functionality (verify that relevant span attributes aren't used). Ran collector with new feature flag enabled.
1 parent 7fd7054 commit c47c746

File tree

13 files changed

+249
-20
lines changed

13 files changed

+249
-20
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
7+
component: datadogexporter
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: "Add a feature gate datadog.EnableReceiveResourceSpansV2. Enabling this gate uses a refactored implementation of OTLP->Datadog Span translation in datadogexporter and datadogconnector which improves performance by 10%, and deprecates the following functionality:
11+
- No longer checks for resource-related values (container, env, hostname) in span attributes. This previous behavior did not follow the OTel spec."
12+
13+
# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
14+
issues: [37171]

.github/CODEOWNERS

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ confmap/provider/s3provider/ @open-telemetry/collector-cont
2626
confmap/provider/secretsmanagerprovider/ @open-telemetry/collector-contrib-approvers @driverpt @atoulme
2727

2828
connector/countconnector/ @open-telemetry/collector-contrib-approvers @djaglowski @jpkrohling
29-
connector/datadogconnector/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @ankitpatel96 @jade-guiton-dd
29+
connector/datadogconnector/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @ankitpatel96 @jade-guiton-dd @IbraheemA
3030
connector/exceptionsconnector/ @open-telemetry/collector-contrib-approvers @marctc
3131
connector/failoverconnector/ @open-telemetry/collector-contrib-approvers @akats7 @fatsheep9146
3232
connector/grafanacloudconnector/ @open-telemetry/collector-contrib-approvers @rlankfo @jcreixell
@@ -54,7 +54,7 @@ exporter/carbonexporter/ @open-telemetry/collector-cont
5454
exporter/cassandraexporter/ @open-telemetry/collector-contrib-approvers @atoulme @emreyalvac
5555
exporter/clickhouseexporter/ @open-telemetry/collector-contrib-approvers @hanjm @dmitryax @Frapschen @SpencerTorres
5656
exporter/coralogixexporter/ @open-telemetry/collector-contrib-approvers @povilasv
57-
exporter/datadogexporter/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @liustanley @songy23 @mackjmr @ankitpatel96 @jade-guiton-dd
57+
exporter/datadogexporter/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @liustanley @songy23 @mackjmr @ankitpatel96 @jade-guiton-dd @IbraheemA
5858
exporter/datasetexporter/ @open-telemetry/collector-contrib-approvers @atoulme @martin-majlis-s1 @zdaratom-s1 @tomaz-s1
5959
exporter/dorisexporter/ @open-telemetry/collector-contrib-approvers @atoulme @joker-star-l
6060
exporter/elasticsearchexporter/ @open-telemetry/collector-contrib-approvers @JaredTan95 @carsonip @lahsivjar
@@ -146,7 +146,7 @@ internal/tools/ @open-telemetry/collector-cont
146146

147147
pkg/batchperresourceattr/ @open-telemetry/collector-contrib-approvers @atoulme @dmitryax
148148
pkg/batchpersignal/ @open-telemetry/collector-contrib-approvers @jpkrohling
149-
pkg/datadog/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @liustanley @songy23 @mackjmr @ankitpatel96 @jade-guiton-dd
149+
pkg/datadog/ @open-telemetry/collector-contrib-approvers @mx-psi @dineshg13 @liustanley @songy23 @mackjmr @ankitpatel96 @jade-guiton-dd @IbraheemA
150150
pkg/experimentalmetricmetadata/ @open-telemetry/collector-contrib-approvers @dmitryax
151151
pkg/golden/ @open-telemetry/collector-contrib-approvers @djaglowski @atoulme
152152
pkg/kafka/topic/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy

connector/datadogconnector/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
| ------------- |-----------|
66
| Distributions | [contrib] |
77
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconnector%2Fdatadog%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconnector%2Fdatadog) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconnector%2Fdatadog%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconnector%2Fdatadog) |
8-
| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@ankitpatel96](https://www.github.com/ankitpatel96), [@jade-guiton-dd](https://www.github.com/jade-guiton-dd) |
8+
| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@ankitpatel96](https://www.github.com/ankitpatel96), [@jade-guiton-dd](https://www.github.com/jade-guiton-dd), [@IbraheemA](https://www.github.com/IbraheemA) |
99
| Emeritus | [@gbbr](https://www.github.com/gbbr) |
1010

1111
[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta

connector/datadogconnector/connector.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424
semconv "go.opentelemetry.io/collector/semconv/v1.27.0"
2525
"go.opentelemetry.io/otel/metric/noop"
2626
"go.uber.org/zap"
27+
28+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog"
2729
)
2830

2931
// traceToMetricConnector is the schema for connector
@@ -117,6 +119,9 @@ func getTraceAgentCfg(logger *zap.Logger, cfg TracesConfig, attributesTranslator
117119
logger.Info("traces::compute_top_level_by_span_kind needs to be enabled in both the Datadog connector and Datadog exporter configs if both components are being used")
118120
acfg.Features["enable_otlp_compute_top_level_by_span_kind"] = struct{}{}
119121
}
122+
if datadog.ReceiveResourceSpansV2FeatureGate.IsEnabled() {
123+
acfg.Features["enable_receive_resource_spans_v2"] = struct{}{}
124+
}
120125
if v := cfg.BucketInterval; v > 0 {
121126
acfg.BucketInterval = v
122127
}

connector/datadogconnector/connector_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,67 @@ func TestContainerTags(t *testing.T) {
192192
assert.ElementsMatch(t, []string{"region:my-region", "zone:my-zone", "az:my-az"}, tags)
193193
}
194194

195+
func TestReceiveResourceSpansV2(t *testing.T) {
196+
t.Run("ReceiveResourceSpansV1", func(t *testing.T) {
197+
testReceiveResourceSpansV2(t, false)
198+
})
199+
t.Run("ReceiveResourceSpansV2", func(t *testing.T) {
200+
testReceiveResourceSpansV2(t, true)
201+
})
202+
}
203+
204+
func testReceiveResourceSpansV2(t *testing.T, enableReceiveResourceSpansV2 bool) {
205+
if enableReceiveResourceSpansV2 {
206+
if err := featuregate.GlobalRegistry().Set("datadog.EnableReceiveResourceSpansV2", true); err != nil {
207+
t.Fatal(err)
208+
}
209+
}
210+
connector, metricsSink := creteConnector(t)
211+
err := connector.Start(context.Background(), componenttest.NewNopHost())
212+
if err != nil {
213+
t.Errorf("Error starting connector: %v", err)
214+
return
215+
}
216+
defer func() {
217+
_ = connector.Shutdown(context.Background())
218+
}()
219+
220+
trace := generateTrace()
221+
sattr := trace.ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Attributes()
222+
223+
sattr.PutStr("deployment.environment.name", "do-not-use")
224+
225+
err = connector.ConsumeTraces(context.Background(), trace)
226+
assert.NoError(t, err)
227+
228+
for {
229+
if len(metricsSink.AllMetrics()) > 0 {
230+
break
231+
}
232+
time.Sleep(100 * time.Millisecond)
233+
}
234+
235+
// check if the container tags are added to the metrics
236+
metrics := metricsSink.AllMetrics()
237+
assert.Len(t, metrics, 1)
238+
239+
ch := make(chan []byte, 100)
240+
tr := newTranslatorWithStatsChannel(t, zap.NewNop(), ch)
241+
_, err = tr.MapMetrics(context.Background(), metrics[0], nil)
242+
require.NoError(t, err)
243+
msg := <-ch
244+
sp := &pb.StatsPayload{}
245+
246+
err = proto.Unmarshal(msg, sp)
247+
require.NoError(t, err)
248+
249+
if enableReceiveResourceSpansV2 {
250+
assert.Equal(t, "none", sp.Stats[0].Env)
251+
} else {
252+
assert.Equal(t, "do-not-use", sp.Stats[0].Env)
253+
}
254+
}
255+
195256
func newTranslatorWithStatsChannel(t *testing.T, logger *zap.Logger, ch chan []byte) *otlpmetrics.Translator {
196257
options := []otlpmetrics.TranslatorOption{
197258
otlpmetrics.WithHistogramMode(otlpmetrics.HistogramModeDistributions),

connector/datadogconnector/metadata.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ status:
66
beta: [traces_to_metrics, traces_to_traces]
77
distributions: [contrib]
88
codeowners:
9-
active: [mx-psi, dineshg13, ankitpatel96, jade-guiton-dd]
9+
active: [mx-psi, dineshg13, ankitpatel96, jade-guiton-dd, IbraheemA]
1010
emeritus: [gbbr]
1111

1212
tests:
1313
goleak:
14-
skip: true
14+
skip: true

exporter/datadogexporter/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
| Stability | [beta]: traces, metrics, logs |
77
| Distributions | [contrib] |
88
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aexporter%2Fdatadog%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aexporter%2Fdatadog) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aexporter%2Fdatadog%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aexporter%2Fdatadog) |
9-
| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@liustanley](https://www.github.com/liustanley), [@songy23](https://www.github.com/songy23), [@mackjmr](https://www.github.com/mackjmr), [@ankitpatel96](https://www.github.com/ankitpatel96), [@jade-guiton-dd](https://www.github.com/jade-guiton-dd) |
9+
| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@mx-psi](https://www.github.com/mx-psi), [@dineshg13](https://www.github.com/dineshg13), [@liustanley](https://www.github.com/liustanley), [@songy23](https://www.github.com/songy23), [@mackjmr](https://www.github.com/mackjmr), [@ankitpatel96](https://www.github.com/ankitpatel96), [@jade-guiton-dd](https://www.github.com/jade-guiton-dd), [@IbraheemA](https://www.github.com/IbraheemA) |
1010
| Emeritus | [@gbbr](https://www.github.com/gbbr) |
1111

1212
[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta

exporter/datadogexporter/metadata.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ status:
66
beta: [traces, metrics, logs]
77
distributions: [contrib]
88
codeowners:
9-
active: [mx-psi, dineshg13, liustanley, songy23, mackjmr, ankitpatel96, jade-guiton-dd]
9+
active: [mx-psi, dineshg13, liustanley, songy23, mackjmr, ankitpatel96, jade-guiton-dd, IbraheemA]
1010
emeritus: [gbbr]
1111

1212
tests:
@@ -22,4 +22,4 @@ tests:
2222
expect_consumer_error: true
2323
goleak:
2424
setup: "setupTestMain(m)"
25-
skip: true
25+
skip: true

exporter/datadogexporter/traces_exporter.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/hostmetadata"
3333
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metrics"
3434
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/scrub"
35+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/datadog"
3536
)
3637

3738
var traceCustomHTTPFeatureGate = featuregate.GlobalRegistry().MustRegister(
@@ -238,6 +239,9 @@ func newTraceAgentConfig(ctx context.Context, params exporter.Settings, cfg *Con
238239
if cfg.Traces.ComputeTopLevelBySpanKind {
239240
acfg.Features["enable_otlp_compute_top_level_by_span_kind"] = struct{}{}
240241
}
242+
if datadog.ReceiveResourceSpansV2FeatureGate.IsEnabled() {
243+
acfg.Features["enable_receive_resource_spans_v2"] = struct{}{}
244+
}
241245
tracelog.SetLogger(&zaplogger{params.Logger}) // TODO: This shouldn't be a singleton
242246
return acfg, nil
243247
}

0 commit comments

Comments
 (0)