@@ -144,6 +144,11 @@ import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_HEADERS
144144import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_PROTOCOL
145145import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_TIMEOUT
146146import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_TEMPORALITY_PREFERENCE
147+ import static datadog.trace.api.config.OtlpConfig.OTLP_TRACES_ENDPOINT
148+ import static datadog.trace.api.config.OtlpConfig.OTLP_TRACES_HEADERS
149+ import static datadog.trace.api.config.OtlpConfig.OTLP_TRACES_PROTOCOL
150+ import static datadog.trace.api.config.OtlpConfig.OTLP_TRACES_TIMEOUT
151+ import static datadog.trace.api.config.OtlpConfig.TRACE_OTEL_ENABLED
147152import datadog.trace.config.inversion.ConfigHelper
148153
149154import datadog.trace.api.env.FixedCapturedEnvironment
@@ -231,6 +236,18 @@ class ConfigTest extends DDSpecification {
231236 private static final OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE_ENV = " OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE"
232237 private static final OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE_PROP = " otel.exporter.otlp.metrics.temporality.preference"
233238
239+ private static final OTEL_TRACES_EXPORTER_ENV = " OTEL_TRACES_EXPORTER"
240+ private static final OTEL_TRACES_EXPORTER_PROP = " otel.traces.exporter"
241+
242+ private static final OTEL_EXPORTER_OTLP_TRACES_ENDPOINT_ENV = " OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"
243+ private static final OTEL_EXPORTER_OTLP_TRACES_ENDPOINT_PROP = " otel.exporter.otlp.traces.endpoint"
244+ private static final OTEL_EXPORTER_OTLP_TRACES_HEADERS_ENV = " OTEL_EXPORTER_OTLP_TRACES_HEADERS"
245+ private static final OTEL_EXPORTER_OTLP_TRACES_HEADERS_PROP = " otel.exporter.otlp.traces.headers"
246+ private static final OTEL_EXPORTER_OTLP_TRACES_PROTOCOL_ENV = " OTEL_EXPORTER_OTLP_TRACES_PROTOCOL"
247+ private static final OTEL_EXPORTER_OTLP_TRACES_PROTOCOL_PROP = " otel.exporter.otlp.traces.protocol"
248+ private static final OTEL_EXPORTER_OTLP_TRACES_TIMEOUT_ENV = " OTEL_EXPORTER_OTLP_TRACES_TIMEOUT"
249+ private static final OTEL_EXPORTER_OTLP_TRACES_TIMEOUT_PROP = " otel.exporter.otlp.traces.timeout"
250+
234251 def setup () {
235252 FixedCapturedEnvironment . useFixedEnv([:])
236253 }
@@ -340,11 +357,17 @@ class ConfigTest extends DDSpecification {
340357 prop. setProperty(METRICS_OTEL_INTERVAL , " 11000" )
341358 prop. setProperty(METRICS_OTEL_TIMEOUT , " 9000" )
342359 prop. setProperty(OTLP_METRICS_ENDPOINT , " http://localhost:4333/v1/metrics" )
343- prop. setProperty(OTLP_METRICS_HEADERS , " api-key=key,other-config-value=value" )
360+ prop. setProperty(OTLP_METRICS_HEADERS , " api-key=key,other-config-value=value,metrics-config-value=M " )
344361 prop. setProperty(OTLP_METRICS_PROTOCOL , " http/protobuf" )
345- prop. setProperty(OTLP_METRICS_TIMEOUT , " 5000 " )
362+ prop. setProperty(OTLP_METRICS_TIMEOUT , " 5001 " )
346363 prop. setProperty(OTLP_METRICS_TEMPORALITY_PREFERENCE , " cumulative" )
347364
365+ prop. setProperty(TRACE_OTEL_ENABLED , " True" )
366+ prop. setProperty(OTLP_TRACES_ENDPOINT , " http://localhost:4333/v1/traces" )
367+ prop. setProperty(OTLP_TRACES_HEADERS , " api-key=key,other-config-value=value,traces-config-value=T" )
368+ prop. setProperty(OTLP_TRACES_PROTOCOL , " http/protobuf" )
369+ prop. setProperty(OTLP_TRACES_TIMEOUT , " 5002" )
370+
348371 when :
349372 Config config = Config . get(prop)
350373
@@ -450,18 +473,28 @@ class ConfigTest extends DDSpecification {
450473 ! config. isEventbridgeInjectDatadogAttributeEnabled()
451474
452475 config. xDatadogTagsMaxLength == 128
476+
453477 config. metricsOtelEnabled
454478 config. metricsOtelInterval == 11000
455479 config. metricsOtelTimeout == 9000
456480 config. otlpMetricsEndpoint == " http://localhost:4333/v1/metrics"
457481 config. otlpMetricsHeaders[" api-key" ] == " key"
458482 config. otlpMetricsHeaders[" other-config-value" ] == " value"
483+ config. otlpMetricsHeaders[" metrics-config-value" ] == " M"
459484 config. otlpMetricsProtocol == HTTP_PROTOBUF
460- config. otlpMetricsTimeout == 5000
485+ config. otlpMetricsTimeout == 5001
461486 config. otlpMetricsTemporalityPreference == CUMULATIVE
487+
488+ config. traceOtelEnabled
489+ config. otlpTracesEndpoint == " http://localhost:4333/v1/traces"
490+ config. otlpTracesHeaders[" api-key" ] == " key"
491+ config. otlpTracesHeaders[" other-config-value" ] == " value"
492+ config. otlpTracesHeaders[" traces-config-value" ] == " T"
493+ config. otlpTracesProtocol == HTTP_PROTOBUF
494+ config. otlpTracesTimeout == 5002
462495 }
463496
464- def " otel metrics : default values when configured incorrectly" () {
497+ def " otel: default values when configured incorrectly" () {
465498 setup :
466499 def prop = new Properties ()
467500
@@ -474,6 +507,12 @@ class ConfigTest extends DDSpecification {
474507 prop. setProperty(OTLP_METRICS_TIMEOUT , " -34" )
475508 prop. setProperty(OTLP_METRICS_TEMPORALITY_PREFERENCE , " invalid" )
476509
510+ prop. setProperty(TRACE_OTEL_ENABLED , " youhou" )
511+ prop. setProperty(OTLP_TRACES_ENDPOINT , " invalid" )
512+ prop. setProperty(OTLP_TRACES_HEADERS , " 11" )
513+ prop. setProperty(OTLP_TRACES_PROTOCOL , " invalid" )
514+ prop. setProperty(OTLP_TRACES_TIMEOUT , " -34" )
515+
477516 when :
478517 Config config = Config . get(prop)
479518
@@ -486,9 +525,15 @@ class ConfigTest extends DDSpecification {
486525 config. otlpMetricsProtocol == HTTP_PROTOBUF
487526 config. otlpMetricsTimeout == 7500
488527 config. otlpMetricsTemporalityPreference == DELTA
528+
529+ ! config. traceOtelEnabled
530+ config. otlpTracesEndpoint == " invalid"
531+ config. otlpTracesHeaders == [:]
532+ config. otlpTracesProtocol == HTTP_PROTOBUF
533+ config. otlpTracesTimeout == 10000
489534 }
490535
491- def " otel metrics : default values when not set" () {
536+ def " otel: default values when not set" () {
492537 setup :
493538 def prop = new Properties ()
494539
@@ -504,19 +549,26 @@ class ConfigTest extends DDSpecification {
504549 config. otlpMetricsProtocol == HTTP_PROTOBUF
505550 config. otlpMetricsTimeout == 7500
506551 config. otlpMetricsTemporalityPreference == DELTA
507- }
508552
553+ ! config. traceOtelEnabled
554+ config. otlpTracesEndpoint == " http://localhost:4318/v1/traces"
555+ config. otlpTracesHeaders == [:]
556+ config. otlpTracesProtocol == HTTP_PROTOBUF
557+ config. otlpTracesTimeout == 10000
558+ }
509559
510- def " otel metrics : check syntax for attributes and headers" () {
560+ def " otel: check syntax for OTLP headers" () {
511561 setup :
512562 def prop = new Properties ()
513563 prop. setProperty(OTLP_METRICS_HEADERS , " api,key=key" )
564+ prop. setProperty(OTLP_TRACES_HEADERS , " api,key=key" )
514565
515566 when :
516567 Config config = Config . get(prop)
517568
518569 then :
519570 config. otlpMetricsHeaders. size() == 0
571+ config. otlpTracesHeaders. size() == 0
520572 }
521573
522574 def " otel generic config via system properties - metrics enabled" () {
@@ -559,7 +611,6 @@ class ConfigTest extends DDSpecification {
559611 config. logLevel == " warning"
560612 }
561613
562-
563614 def " otel generic config via env var - metrics enabled" () {
564615 setup :
565616 environmentVariables. set(DD_METRICS_OTEL_ENABLED_ENV , " true" )
@@ -598,9 +649,11 @@ class ConfigTest extends DDSpecification {
598649 config. logLevel == " error"
599650 }
600651
601- def " otel metrics: fallback keys" () {
652+ def " otel: OTLP fallback keys" () {
602653 setup :
603654 System . setProperty(DD_METRICS_OTEL_ENABLED_PROP , " true" )
655+ System . setProperty(DD_TRACE_OTEL_ENABLED_PROP , " true" )
656+ System . setProperty(OTEL_TRACES_EXPORTER_PROP , " otlp" )
604657 System . setProperty(OTEL_EXPORTER_OTLP_PROTOCOL_PROP , " http/json" )
605658 System . setProperty(OTEL_EXPORTER_OTLP_ENDPOINT_PROP ," http://localhost:4319" )
606659 System . setProperty(OTEL_EXPORTER_OTLP_HEADERS_PROP ," api-key=key,other-config-value=value" )
@@ -616,11 +669,20 @@ class ConfigTest extends DDSpecification {
616669 config. otlpMetricsHeaders[" api-key" ] == " key"
617670 config. otlpMetricsHeaders[" other-config-value" ] == " value"
618671 config. otlpMetricsTimeout == 1000
672+
673+ config. otlpTracesProtocol == HTTP_JSON
674+ config. otlpTracesEndpoint == " http://localhost:4319/v1/traces"
675+ config. otlpTracesHeaders. size() == 2
676+ config. otlpTracesHeaders[" api-key" ] == " key"
677+ config. otlpTracesHeaders[" other-config-value" ] == " value"
678+ config. otlpTracesTimeout == 1000
619679 }
620680
621- def " otel metrics: fallback key endpoint" () {
681+ def " otel: OTLP fallback key endpoint" () {
622682 setup :
623683 System . setProperty(DD_METRICS_OTEL_ENABLED_PROP , " true" )
684+ System . setProperty(DD_TRACE_OTEL_ENABLED_PROP , " true" )
685+ System . setProperty(OTEL_TRACES_EXPORTER_PROP , " otlp" )
624686 System . setProperty(OTEL_EXPORTER_OTLP_PROTOCOL_PROP , " http/json" )
625687 System . setProperty(PREFIX + TRACE_AGENT_URL ," http://192.168.0.3:8126" )
626688
@@ -631,11 +693,15 @@ class ConfigTest extends DDSpecification {
631693 config. agentHost == " 192.168.0.3"
632694 config. otlpMetricsProtocol == HTTP_JSON
633695 config. otlpMetricsEndpoint == " http://192.168.0.3:4318/v1/metrics"
696+ config. otlpTracesProtocol == HTTP_JSON
697+ config. otlpTracesEndpoint == " http://192.168.0.3:4318/v1/traces"
634698 }
635699
636- def " otel metrics: fallback key endpoint 2" () {
700+ def " otel: OTLP fallback key endpoint 2" () {
637701 setup :
638702 System . setProperty(DD_METRICS_OTEL_ENABLED_PROP , " true" )
703+ System . setProperty(DD_TRACE_OTEL_ENABLED_PROP , " true" )
704+ System . setProperty(OTEL_TRACES_EXPORTER_PROP , " otlp" )
639705 System . setProperty(PREFIX + TRACE_AGENT_URL ," '/tmp/ddagent/trace.sock'" )
640706
641707 when :
@@ -645,6 +711,8 @@ class ConfigTest extends DDSpecification {
645711 config. agentHost == " localhost"
646712 config. otlpMetricsProtocol == HTTP_PROTOBUF
647713 config. otlpMetricsEndpoint == " http://localhost:4318/v1/metrics"
714+ config. otlpTracesProtocol == HTTP_PROTOBUF
715+ config. otlpTracesEndpoint == " http://localhost:4318/v1/traces"
648716 }
649717
650718
@@ -751,10 +819,17 @@ class ConfigTest extends DDSpecification {
751819 System . setProperty(OTEL_METRIC_EXPORT_INTERVAL_PROP , " 11000" )
752820 System . setProperty(OTEL_METRIC_EXPORT_TIMEOUT_PROP , " 9000" )
753821 System . setProperty(OTEL_EXPORTER_OTLP_METRICS_ENDPOINT_PROP , " http://localhost:4333/v1/metrics" )
754- System . setProperty(OTEL_EXPORTER_OTLP_METRICS_HEADERS_PROP , " api-key=key,other-config-value=value" )
822+ System . setProperty(OTEL_EXPORTER_OTLP_METRICS_HEADERS_PROP , " api-key=key,other-config-value=value,metrics-config-value=M " )
755823 System . setProperty(OTEL_EXPORTER_OTLP_METRICS_PROTOCOL_PROP , " http/protobuf" )
756- System . setProperty(OTEL_EXPORTER_OTLP_METRICS_TIMEOUT_PROP , " 5000 " )
824+ System . setProperty(OTEL_EXPORTER_OTLP_METRICS_TIMEOUT_PROP , " 5001 " )
757825 System . setProperty(OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE_PROP , " cumulative" )
826+
827+ System . setProperty(DD_TRACE_OTEL_ENABLED_PROP , " True" )
828+ System . setProperty(OTEL_TRACES_EXPORTER_PROP , " otlp" )
829+ System . setProperty(OTEL_EXPORTER_OTLP_TRACES_ENDPOINT_PROP , " http://localhost:4333/v1/traces" )
830+ System . setProperty(OTEL_EXPORTER_OTLP_TRACES_HEADERS_PROP , " api-key=key,other-config-value=value,traces-config-value=T" )
831+ System . setProperty(OTEL_EXPORTER_OTLP_TRACES_PROTOCOL_PROP , " http/protobuf" )
832+ System . setProperty(OTEL_EXPORTER_OTLP_TRACES_TIMEOUT_PROP , " 5002" )
758833 System . setProperty(OTEL_RESOURCE_ATTRIBUTES_PROP , " service.name=my=app,service.version=1.0.0,deployment.environment=production" )
759834
760835 when :
@@ -866,9 +941,18 @@ class ConfigTest extends DDSpecification {
866941 config. otlpMetricsEndpoint == " http://localhost:4333/v1/metrics"
867942 config. otlpMetricsHeaders[" api-key" ] == " key"
868943 config. otlpMetricsHeaders[" other-config-value" ] == " value"
944+ config. otlpMetricsHeaders[" metrics-config-value" ] == " M"
869945 config. otlpMetricsProtocol == HTTP_PROTOBUF
870- config. otlpMetricsTimeout == 5000
946+ config. otlpMetricsTimeout == 5001
871947 config. otlpMetricsTemporalityPreference == CUMULATIVE
948+
949+ config. traceOtelEnabled
950+ config. otlpTracesEndpoint == " http://localhost:4333/v1/traces"
951+ config. otlpTracesHeaders[" api-key" ] == " key"
952+ config. otlpTracesHeaders[" other-config-value" ] == " value"
953+ config. otlpTracesHeaders[" traces-config-value" ] == " T"
954+ config. otlpTracesProtocol == HTTP_PROTOBUF
955+ config. otlpTracesTimeout == 5002
872956 }
873957
874958 def " specify overrides via env vars" () {
@@ -899,11 +983,18 @@ class ConfigTest extends DDSpecification {
899983 environmentVariables. set(OTEL_METRIC_EXPORT_INTERVAL_ENV , " 11000" )
900984 environmentVariables. set(OTEL_METRIC_EXPORT_TIMEOUT_ENV , " 9000" )
901985 environmentVariables. set(OTEL_EXPORTER_OTLP_METRICS_ENDPOINT_ENV , " http://localhost:4333/v1/metrics" )
902- environmentVariables. set(OTEL_EXPORTER_OTLP_METRICS_HEADERS_ENV , " api-key=key,other-config-value=value" )
986+ environmentVariables. set(OTEL_EXPORTER_OTLP_METRICS_HEADERS_ENV , " api-key=key,other-config-value=value,metrics-config-value=M " )
903987 environmentVariables. set(OTEL_EXPORTER_OTLP_METRICS_PROTOCOL_ENV , " http/protobuf" )
904- environmentVariables. set(OTEL_EXPORTER_OTLP_METRICS_TIMEOUT_ENV , " 5000 " )
988+ environmentVariables. set(OTEL_EXPORTER_OTLP_METRICS_TIMEOUT_ENV , " 5001 " )
905989 environmentVariables. set(OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE_ENV , " cumulative" )
906990
991+ environmentVariables. set(DD_TRACE_OTEL_ENABLED_ENV , " True" )
992+ environmentVariables. set(OTEL_TRACES_EXPORTER_ENV , " otlp" )
993+ environmentVariables. set(OTEL_EXPORTER_OTLP_TRACES_ENDPOINT_ENV , " http://localhost:4333/v1/traces" )
994+ environmentVariables. set(OTEL_EXPORTER_OTLP_TRACES_HEADERS_ENV , " api-key=key,other-config-value=value,traces-config-value=T" )
995+ environmentVariables. set(OTEL_EXPORTER_OTLP_TRACES_PROTOCOL_ENV , " http/protobuf" )
996+ environmentVariables. set(OTEL_EXPORTER_OTLP_TRACES_TIMEOUT_ENV , " 5002" )
997+
907998 when :
908999 def config = new Config ()
9091000
@@ -931,15 +1022,25 @@ class ConfigTest extends DDSpecification {
9311022
9321023 config. requestHeaderTags == [" *" : " http.request.headers." ]
9331024 config. responseHeaderTags == [" *" : " http.response.headers." ]
1025+
9341026 config. metricsOtelEnabled
9351027 config. metricsOtelInterval == 11000
9361028 config. metricsOtelTimeout == 9000
9371029 config. otlpMetricsEndpoint == " http://localhost:4333/v1/metrics"
9381030 config. otlpMetricsHeaders[" api-key" ] == " key"
9391031 config. otlpMetricsHeaders[" other-config-value" ] == " value"
1032+ config. otlpMetricsHeaders[" metrics-config-value" ] == " M"
9401033 config. otlpMetricsProtocol == HTTP_PROTOBUF
941- config. otlpMetricsTimeout == 5000
1034+ config. otlpMetricsTimeout == 5001
9421035 config. otlpMetricsTemporalityPreference == CUMULATIVE
1036+
1037+ config. traceOtelEnabled
1038+ config. otlpTracesEndpoint == " http://localhost:4333/v1/traces"
1039+ config. otlpTracesHeaders[" api-key" ] == " key"
1040+ config. otlpTracesHeaders[" other-config-value" ] == " value"
1041+ config. otlpTracesHeaders[" traces-config-value" ] == " T"
1042+ config. otlpTracesProtocol == HTTP_PROTOBUF
1043+ config. otlpTracesTimeout == 5002
9431044 }
9441045
9451046 def " sys props override env vars" () {
0 commit comments