datadog 2.22.0 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +59 -2
  3. data/ext/LIBDATADOG_DEVELOPMENT.md +1 -58
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +4 -0
  5. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +1 -1
  6. data/ext/datadog_profiling_native_extension/extconf.rb +6 -4
  7. data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
  8. data/ext/libdatadog_api/datadog_ruby_common.h +1 -1
  9. data/ext/libdatadog_api/feature_flags.c +554 -0
  10. data/ext/libdatadog_api/feature_flags.h +5 -0
  11. data/ext/libdatadog_api/init.c +2 -0
  12. data/ext/libdatadog_api/library_config.c +12 -11
  13. data/ext/libdatadog_extconf_helpers.rb +1 -1
  14. data/lib/datadog/appsec/api_security/route_extractor.rb +23 -6
  15. data/lib/datadog/appsec/api_security/sampler.rb +7 -4
  16. data/lib/datadog/appsec/assets/blocked.html +8 -0
  17. data/lib/datadog/appsec/assets/blocked.json +1 -1
  18. data/lib/datadog/appsec/assets/blocked.text +3 -1
  19. data/lib/datadog/appsec/assets.rb +1 -1
  20. data/lib/datadog/appsec/remote.rb +4 -0
  21. data/lib/datadog/appsec/response.rb +18 -4
  22. data/lib/datadog/core/configuration/components.rb +30 -3
  23. data/lib/datadog/core/configuration/config_helper.rb +1 -1
  24. data/lib/datadog/core/configuration/settings.rb +14 -0
  25. data/lib/datadog/core/configuration/supported_configurations.rb +330 -301
  26. data/lib/datadog/core/ddsketch.rb +0 -2
  27. data/lib/datadog/core/environment/ext.rb +6 -0
  28. data/lib/datadog/core/environment/process.rb +79 -0
  29. data/lib/datadog/core/feature_flags.rb +61 -0
  30. data/lib/datadog/core/remote/client/capabilities.rb +7 -0
  31. data/lib/datadog/core/remote/transport/config.rb +2 -10
  32. data/lib/datadog/core/remote/transport/http/config.rb +9 -9
  33. data/lib/datadog/core/remote/transport/http/negotiation.rb +17 -8
  34. data/lib/datadog/core/remote/transport/http.rb +2 -0
  35. data/lib/datadog/core/remote/transport/negotiation.rb +2 -18
  36. data/lib/datadog/core/remote/worker.rb +25 -37
  37. data/lib/datadog/core/tag_builder.rb +0 -4
  38. data/lib/datadog/core/tag_normalizer.rb +84 -0
  39. data/lib/datadog/core/telemetry/component.rb +7 -3
  40. data/lib/datadog/core/telemetry/event/app_started.rb +52 -49
  41. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +1 -1
  42. data/lib/datadog/core/telemetry/logger.rb +2 -2
  43. data/lib/datadog/core/telemetry/logging.rb +2 -8
  44. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +5 -6
  45. data/lib/datadog/core/telemetry/transport/telemetry.rb +1 -2
  46. data/lib/datadog/core/transport/http/client.rb +69 -0
  47. data/lib/datadog/core/utils/array.rb +29 -0
  48. data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
  49. data/lib/datadog/core/utils/network.rb +3 -1
  50. data/lib/datadog/core/utils/only_once_successful.rb +6 -2
  51. data/lib/datadog/core/utils.rb +2 -0
  52. data/lib/datadog/data_streams/configuration/settings.rb +49 -0
  53. data/lib/datadog/data_streams/configuration.rb +11 -0
  54. data/lib/datadog/data_streams/ext.rb +11 -0
  55. data/lib/datadog/data_streams/extensions.rb +16 -0
  56. data/lib/datadog/data_streams/pathway_context.rb +169 -0
  57. data/lib/datadog/data_streams/processor.rb +509 -0
  58. data/lib/datadog/data_streams/transport/http/api.rb +33 -0
  59. data/lib/datadog/data_streams/transport/http/client.rb +21 -0
  60. data/lib/datadog/data_streams/transport/http/stats.rb +87 -0
  61. data/lib/datadog/data_streams/transport/http.rb +41 -0
  62. data/lib/datadog/data_streams/transport/stats.rb +60 -0
  63. data/lib/datadog/data_streams.rb +100 -0
  64. data/lib/datadog/di/component.rb +0 -16
  65. data/lib/datadog/di/el/evaluator.rb +1 -1
  66. data/lib/datadog/di/error.rb +4 -0
  67. data/lib/datadog/di/instrumenter.rb +76 -30
  68. data/lib/datadog/di/probe.rb +20 -0
  69. data/lib/datadog/di/probe_manager.rb +10 -2
  70. data/lib/datadog/di/probe_notification_builder.rb +62 -23
  71. data/lib/datadog/di/proc_responder.rb +32 -0
  72. data/lib/datadog/di/transport/diagnostics.rb +2 -2
  73. data/lib/datadog/di/transport/http/diagnostics.rb +2 -4
  74. data/lib/datadog/di/transport/http/input.rb +2 -4
  75. data/lib/datadog/di/transport/http.rb +6 -2
  76. data/lib/datadog/di/transport/input.rb +64 -4
  77. data/lib/datadog/open_feature/component.rb +60 -0
  78. data/lib/datadog/open_feature/configuration.rb +27 -0
  79. data/lib/datadog/open_feature/evaluation_engine.rb +69 -0
  80. data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
  81. data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
  82. data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
  83. data/lib/datadog/open_feature/exposures/event.rb +60 -0
  84. data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
  85. data/lib/datadog/open_feature/exposures/worker.rb +116 -0
  86. data/lib/datadog/open_feature/ext.rb +14 -0
  87. data/lib/datadog/open_feature/native_evaluator.rb +38 -0
  88. data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
  89. data/lib/datadog/open_feature/provider.rb +141 -0
  90. data/lib/datadog/open_feature/remote.rb +74 -0
  91. data/lib/datadog/open_feature/resolution_details.rb +35 -0
  92. data/lib/datadog/open_feature/transport.rb +72 -0
  93. data/lib/datadog/open_feature.rb +19 -0
  94. data/lib/datadog/opentelemetry/configuration/settings.rb +159 -0
  95. data/lib/datadog/opentelemetry/metrics.rb +110 -0
  96. data/lib/datadog/opentelemetry/sdk/configurator.rb +25 -1
  97. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +38 -0
  98. data/lib/datadog/opentelemetry.rb +3 -0
  99. data/lib/datadog/profiling/collectors/code_provenance.rb +15 -6
  100. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +1 -1
  101. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  102. data/lib/datadog/profiling/profiler.rb +4 -0
  103. data/lib/datadog/profiling/tag_builder.rb +36 -3
  104. data/lib/datadog/profiling.rb +1 -2
  105. data/lib/datadog/single_step_instrument.rb +1 -1
  106. data/lib/datadog/tracing/configuration/ext.rb +9 -0
  107. data/lib/datadog/tracing/configuration/settings.rb +74 -0
  108. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
  109. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
  110. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
  111. data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
  112. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +4 -2
  113. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -1
  114. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +11 -3
  115. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +11 -7
  116. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
  117. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +22 -17
  118. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -3
  119. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -3
  120. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -3
  121. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
  122. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
  123. data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
  124. data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
  125. data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
  126. data/lib/datadog/tracing/contrib/karafka/patcher.rb +32 -0
  127. data/lib/datadog/tracing/contrib/rack/middlewares.rb +59 -27
  128. data/lib/datadog/tracing/contrib/rack/route_inference.rb +53 -0
  129. data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
  130. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -1
  131. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +3 -1
  132. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -1
  133. data/lib/datadog/tracing/contrib/status_range_matcher.rb +7 -0
  134. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +27 -0
  135. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +48 -0
  136. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +17 -0
  137. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
  138. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
  139. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +46 -0
  140. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
  141. data/lib/datadog/tracing/contrib/waterdrop.rb +37 -0
  142. data/lib/datadog/tracing/contrib.rb +1 -0
  143. data/lib/datadog/tracing/metadata/ext.rb +1 -1
  144. data/lib/datadog/tracing/transport/http/client.rb +12 -26
  145. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  146. data/lib/datadog/tracing/transport/traces.rb +3 -5
  147. data/lib/datadog/version.rb +2 -2
  148. data/lib/datadog.rb +2 -0
  149. metadata +78 -15
  150. data/lib/datadog/core/remote/transport/http/client.rb +0 -49
  151. data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
  152. data/lib/datadog/di/transport/http/client.rb +0 -47
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'zlib'
4
- require_relative 'lru_cache'
5
4
  require_relative 'route_extractor'
6
5
  require_relative '../../core/utils/time'
6
+ require_relative '../../core/utils/lru_cache'
7
7
 
8
8
  module Datadog
9
9
  module AppSec
@@ -37,20 +37,23 @@ module Datadog
37
37
  def initialize(sample_delay)
38
38
  raise ArgumentError, 'sample_delay must be an Integer' unless sample_delay.is_a?(Integer)
39
39
 
40
- @cache = LRUCache.new(MAX_CACHE_SIZE)
40
+ @cache = Core::Utils::LRUCache.new(MAX_CACHE_SIZE)
41
41
  @sample_delay_seconds = sample_delay
42
42
  end
43
43
 
44
44
  def sample?(request, response)
45
45
  return true if @sample_delay_seconds.zero?
46
+ return false if response.status == 404
46
47
 
47
- key = Zlib.crc32("#{request.request_method}#{RouteExtractor.route_pattern(request)}#{response.status}")
48
+ route_pattern = RouteExtractor.route_pattern(request).to_s
49
+
50
+ key = Zlib.crc32("#{request.request_method}#{route_pattern}#{response.status}")
48
51
  current_timestamp = Core::Utils::Time.now.to_i
49
52
  cached_timestamp = @cache[key] || 0
50
53
 
51
54
  return false if current_timestamp - cached_timestamp <= @sample_delay_seconds
52
55
 
53
- @cache.store(key, current_timestamp)
56
+ @cache[key] = current_timestamp
54
57
  true
55
58
  end
56
59
  end
@@ -82,12 +82,20 @@
82
82
  footer p {
83
83
  font-size: 16px
84
84
  }
85
+
86
+ .security-response-id {
87
+ font-size:14px;
88
+ color:#999;
89
+ margin-top:20px;
90
+ font-family:monospace
91
+ }
85
92
  </style>
86
93
  </head>
87
94
 
88
95
  <body>
89
96
  <main>
90
97
  <p>Sorry, you cannot access this page. Please contact the customer service team.</p>
98
+ <p class="security-response-id">Security Response ID: [security_response_id]</p>
91
99
  </main>
92
100
  <footer>
93
101
  <p>Security provided by <a
@@ -1 +1 @@
1
- {"errors": [{"title": "You've been blocked", "detail": "Sorry, you cannot access this page. Please contact the customer service team. Security provided by Datadog."}]}
1
+ {"errors":[{"title":"You've been blocked","detail":"Sorry, you cannot access this page. Please contact the customer service team. Security provided by Datadog."}],"security_response_id":"[security_response_id]"}
@@ -1,5 +1,7 @@
1
- You've been blocked
1
+ You've been blocked.
2
2
 
3
3
  Sorry, you cannot access this page. Please contact the customer service team.
4
4
 
5
+ Security Response ID: [security_response_id]
6
+
5
7
  Security provided by Datadog.
@@ -21,7 +21,7 @@ module Datadog
21
21
  end
22
22
 
23
23
  def blocked(format: :html)
24
- (@blocked ||= {})[format] ||= read("blocked.#{format}")
24
+ (@blocked ||= {})[format] ||= read("blocked.#{format}").freeze
25
25
  end
26
26
 
27
27
  def path
@@ -23,6 +23,8 @@ module Datadog
23
23
  CAP_ASM_CUSTOM_RULES = 1 << 8
24
24
  CAP_ASM_CUSTOM_BLOCKING_RESPONSE = 1 << 9
25
25
  CAP_ASM_TRUSTED_IPS = 1 << 10
26
+ CAP_ASM_PROCESSOR_OVERRIDES = 1 << 16
27
+ CAP_ASM_CUSTOM_DATA_SCANNERS = 1 << 17
26
28
  CAP_ASM_RASP_SSRF = 1 << 23
27
29
  CAP_ASM_RASP_SQLI = 1 << 21
28
30
  CAP_ASM_AUTO_USER_INSTRUM_MODE = 1 << 31
@@ -43,6 +45,8 @@ module Datadog
43
45
  CAP_ASM_CUSTOM_RULES,
44
46
  CAP_ASM_CUSTOM_BLOCKING_RESPONSE,
45
47
  CAP_ASM_TRUSTED_IPS,
48
+ CAP_ASM_PROCESSOR_OVERRIDES,
49
+ CAP_ASM_CUSTOM_DATA_SCANNERS,
46
50
  CAP_ASM_RASP_SSRF,
47
51
  CAP_ASM_RASP_SQLI,
48
52
  CAP_ASM_AUTO_USER_INSTRUM_MODE,
@@ -7,6 +7,8 @@ module Datadog
7
7
  module AppSec
8
8
  # AppSec response
9
9
  class Response
10
+ SECURITY_RESPONSE_ID_PLACEHOLDER = '[security_response_id]'
11
+
10
12
  attr_reader :status, :headers, :body
11
13
 
12
14
  def initialize(status:, headers: {}, body: [])
@@ -37,16 +39,26 @@ module Datadog
37
39
  Response.new(
38
40
  status: interrupt_params['status_code']&.to_i || 403,
39
41
  headers: {'Content-Type' => content_type},
40
- body: [content(content_type)],
42
+ body: [
43
+ content(
44
+ security_response_id: interrupt_params['security_response_id'],
45
+ content_type: content_type
46
+ )
47
+ ],
41
48
  )
42
49
  end
43
50
 
44
51
  def redirect_response(interrupt_params)
45
52
  status_code = interrupt_params['status_code'].to_i
53
+ location = interrupt_params.fetch('location')
54
+
55
+ if (security_response_id = interrupt_params.fetch('security_response_id'))
56
+ location.gsub!(SECURITY_RESPONSE_ID_PLACEHOLDER, security_response_id)
57
+ end
46
58
 
47
59
  Response.new(
48
60
  status: ((status_code >= 300 && status_code < 400) ? status_code : 303),
49
- headers: {'Location' => interrupt_params.fetch('location')},
61
+ headers: {'Location' => location},
50
62
  body: [],
51
63
  )
52
64
  end
@@ -82,16 +94,18 @@ module Datadog
82
94
  DEFAULT_CONTENT_TYPE
83
95
  end
84
96
 
85
- def content(content_type)
97
+ def content(security_response_id:, content_type:)
86
98
  content_format = CONTENT_TYPE_TO_FORMAT[content_type]
87
99
 
88
100
  using_default = Datadog.configuration.appsec.block.templates.using_default?(content_format)
89
101
 
90
- if using_default
102
+ template = if using_default
91
103
  Datadog::AppSec::Assets.blocked(format: content_format)
92
104
  else
93
105
  Datadog.configuration.appsec.block.templates.send(content_format)
94
106
  end
107
+
108
+ template.gsub(SECURITY_RESPONSE_ID_PLACEHOLDER, security_response_id.to_s)
95
109
  end
96
110
  end
97
111
  end
@@ -15,10 +15,12 @@ require_relative '../../tracing/component'
15
15
  require_relative '../../profiling/component'
16
16
  require_relative '../../appsec/component'
17
17
  require_relative '../../di/component'
18
+ require_relative '../../open_feature/component'
18
19
  require_relative '../../error_tracking/component'
19
20
  require_relative '../crashtracking/component'
20
21
  require_relative '../environment/agent_info'
21
22
  require_relative '../process_discovery'
23
+ require_relative '../../data_streams/processor'
22
24
 
23
25
  module Datadog
24
26
  module Core
@@ -75,11 +77,26 @@ module Datadog
75
77
 
76
78
  Datadog::Core::Crashtracking::Component.build(settings, agent_settings, logger: logger)
77
79
  end
80
+
81
+ def build_data_streams(settings, agent_settings, logger)
82
+ return unless settings.data_streams.enabled
83
+
84
+ Datadog::DataStreams::Processor.new(
85
+ interval: settings.data_streams.interval,
86
+ logger: logger,
87
+ settings: settings,
88
+ agent_settings: agent_settings
89
+ )
90
+ rescue => e
91
+ logger.warn("Failed to initialize Data Streams Monitoring: #{e.class}: #{e}")
92
+ nil
93
+ end
78
94
  end
79
95
 
80
96
  attr_reader \
81
97
  :health_metrics,
82
98
  :settings,
99
+ :agent_settings,
83
100
  :logger,
84
101
  :remote,
85
102
  :profiler,
@@ -90,7 +107,9 @@ module Datadog
90
107
  :error_tracking,
91
108
  :dynamic_instrumentation,
92
109
  :appsec,
93
- :agent_info
110
+ :agent_info,
111
+ :data_streams,
112
+ :open_feature
94
113
 
95
114
  def initialize(settings)
96
115
  @settings = settings
@@ -102,7 +121,7 @@ module Datadog
102
121
  # This agent_settings is intended for use within Core. If you require
103
122
  # agent_settings within a product outside of core you should extend
104
123
  # the Core resolver from within your product/component's namespace.
105
- agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
124
+ @agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
106
125
 
107
126
  # Exposes agent capability information for detection by any components
108
127
  @agent_info = Core::Environment::AgentInfo.new(agent_settings, logger: @logger)
@@ -124,8 +143,10 @@ module Datadog
124
143
  @runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger, telemetry)
125
144
  @health_metrics = self.class.build_health_metrics(settings, @logger, telemetry)
126
145
  @appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry)
146
+ @open_feature = OpenFeature::Component.build(settings, agent_settings, logger: @logger, telemetry: telemetry)
127
147
  @dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry)
128
148
  @error_tracking = Datadog::ErrorTracking::Component.build(settings, @tracer, @logger)
149
+ @data_streams = self.class.build_data_streams(settings, agent_settings, @logger)
129
150
  @environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation
130
151
 
131
152
  # Configure non-privileged components.
@@ -142,7 +163,7 @@ module Datadog
142
163
 
143
164
  # Starts up components
144
165
  def startup!(settings, old_state: nil)
145
- telemetry.start(old_state&.telemetry_enabled?)
166
+ telemetry.start(old_state&.telemetry_enabled?, components: self)
146
167
 
147
168
  if settings.profiling.enabled
148
169
  if profiler
@@ -182,6 +203,9 @@ module Datadog
182
203
  # Shutdown DI after remote, since remote config triggers DI operations.
183
204
  dynamic_instrumentation&.shutdown!
184
205
 
206
+ # Shutdown OpenFeature component
207
+ open_feature&.shutdown!
208
+
185
209
  # Decommission AppSec
186
210
  appsec&.shutdown!
187
211
 
@@ -195,6 +219,9 @@ module Datadog
195
219
  # Shutdown workers
196
220
  runtime_metrics.stop(true, close_metrics: false)
197
221
 
222
+ # Shutdown Data Streams Monitoring processor
223
+ data_streams&.stop(true)
224
+
198
225
  # Shutdown the old metrics, unless they are still being used.
199
226
  # (e.g. custom Statsd instances.)
200
227
  #
@@ -57,7 +57,7 @@ module Datadog
57
57
  # Until we've correctly implemented support for datadog-ci-rb, we disable config inversion if ci is enabled.
58
58
  if !defined?(::Datadog::CI) &&
59
59
  (name.start_with?('DD_', 'OTEL_') || @alias_to_canonical[name]) &&
60
- !@supported_configurations[name]
60
+ !@supported_configurations.include?(name)
61
61
  if defined?(@raise_on_unknown_env_var) && @raise_on_unknown_env_var # Only enabled for tests!
62
62
  if @alias_to_canonical[name]
63
63
  raise "Please use #{@alias_to_canonical[name]} instead of #{name}. See docs/AccessEnvironmentVariables.md for details."
@@ -12,6 +12,7 @@ require_relative '../remote/ext'
12
12
  require_relative '../../profiling/ext'
13
13
 
14
14
  require_relative '../../tracing/configuration/settings'
15
+ require_relative '../../opentelemetry/configuration/settings'
15
16
 
16
17
  module Datadog
17
18
  module Core
@@ -828,6 +829,7 @@ module Datadog
828
829
 
829
830
  # Overrides agentless telemetry URL. To be used internally for testing purposes only.
830
831
  #
832
+ # @default `DD_TELEMETRY_AGENTLESS_URL` environment variable, otherwise `nil`.
831
833
  # @return [String]
832
834
  # @!visibility private
833
835
  option :agentless_url_override do |o|
@@ -1003,6 +1005,16 @@ module Datadog
1003
1005
  end
1004
1006
  end
1005
1007
 
1008
+ # Enable experimental process tags propagation such that payloads like spans contain the process tag.
1009
+ #
1010
+ # @default `DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED` environment variable, otherwise `false`
1011
+ # @return [Boolean]
1012
+ option :experimental_propagate_process_tags_enabled do |o|
1013
+ o.env 'DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED'
1014
+ o.default false
1015
+ o.type :bool
1016
+ end
1017
+
1006
1018
  # Tracer specific configuration starting with APM (e.g. DD_APM_TRACING_ENABLED).
1007
1019
  # @public_api
1008
1020
  settings :apm do
@@ -1030,6 +1042,8 @@ module Datadog
1030
1042
  # TODO: Tracing should manage its own settings.
1031
1043
  # Keep this extension here for now to keep things working.
1032
1044
  extend Datadog::Tracing::Configuration::Settings
1045
+
1046
+ extend Datadog::OpenTelemetry::Configuration::Settings
1033
1047
  end
1034
1048
  # standard:enable Metrics/BlockLength
1035
1049
  end