datadog 2.22.0 → 2.24.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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +100 -1
  3. data/ext/LIBDATADOG_DEVELOPMENT.md +1 -58
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +21 -5
  5. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
  6. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +1 -1
  7. data/ext/datadog_profiling_native_extension/extconf.rb +9 -4
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
  9. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +12 -0
  10. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +4 -0
  11. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  12. data/ext/libdatadog_api/datadog_ruby_common.h +1 -1
  13. data/ext/libdatadog_api/feature_flags.c +554 -0
  14. data/ext/libdatadog_api/feature_flags.h +5 -0
  15. data/ext/libdatadog_api/init.c +2 -0
  16. data/ext/libdatadog_api/library_config.c +12 -11
  17. data/ext/libdatadog_extconf_helpers.rb +1 -1
  18. data/lib/datadog/appsec/api_security/route_extractor.rb +23 -6
  19. data/lib/datadog/appsec/api_security/sampler.rb +7 -4
  20. data/lib/datadog/appsec/assets/blocked.html +8 -0
  21. data/lib/datadog/appsec/assets/blocked.json +1 -1
  22. data/lib/datadog/appsec/assets/blocked.text +3 -1
  23. data/lib/datadog/appsec/assets.rb +1 -1
  24. data/lib/datadog/appsec/context.rb +2 -1
  25. data/lib/datadog/appsec/remote.rb +5 -9
  26. data/lib/datadog/appsec/response.rb +18 -4
  27. data/lib/datadog/appsec/security_engine/result.rb +2 -1
  28. data/lib/datadog/core/configuration/components.rb +30 -3
  29. data/lib/datadog/core/configuration/config_helper.rb +2 -2
  30. data/lib/datadog/core/configuration/deprecations.rb +2 -2
  31. data/lib/datadog/core/configuration/option_definition.rb +4 -2
  32. data/lib/datadog/core/configuration/options.rb +8 -5
  33. data/lib/datadog/core/configuration/settings.rb +28 -3
  34. data/lib/datadog/core/configuration/supported_configurations.rb +332 -302
  35. data/lib/datadog/core/ddsketch.rb +0 -2
  36. data/lib/datadog/core/environment/cgroup.rb +52 -25
  37. data/lib/datadog/core/environment/container.rb +140 -46
  38. data/lib/datadog/core/environment/ext.rb +7 -0
  39. data/lib/datadog/core/environment/process.rb +87 -0
  40. data/lib/datadog/core/feature_flags.rb +61 -0
  41. data/lib/datadog/core/rate_limiter.rb +9 -1
  42. data/lib/datadog/core/remote/client/capabilities.rb +7 -0
  43. data/lib/datadog/core/remote/client.rb +14 -6
  44. data/lib/datadog/core/remote/component.rb +6 -4
  45. data/lib/datadog/core/remote/configuration/content.rb +15 -2
  46. data/lib/datadog/core/remote/configuration/digest.rb +14 -7
  47. data/lib/datadog/core/remote/configuration/repository.rb +1 -1
  48. data/lib/datadog/core/remote/configuration/target.rb +13 -6
  49. data/lib/datadog/core/remote/transport/config.rb +4 -25
  50. data/lib/datadog/core/remote/transport/http/config.rb +10 -50
  51. data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
  52. data/lib/datadog/core/remote/transport/http.rb +15 -24
  53. data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
  54. data/lib/datadog/core/remote/worker.rb +25 -37
  55. data/lib/datadog/core/tag_builder.rb +0 -4
  56. data/lib/datadog/core/tag_normalizer.rb +84 -0
  57. data/lib/datadog/core/telemetry/component.rb +59 -16
  58. data/lib/datadog/core/telemetry/event/app_started.rb +86 -49
  59. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
  60. data/lib/datadog/core/telemetry/logger.rb +2 -2
  61. data/lib/datadog/core/telemetry/logging.rb +2 -8
  62. data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
  63. data/lib/datadog/core/telemetry/request.rb +17 -3
  64. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +3 -34
  65. data/lib/datadog/core/telemetry/transport/http.rb +21 -16
  66. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -11
  67. data/lib/datadog/core/telemetry/worker.rb +88 -32
  68. data/lib/datadog/core/transport/ext.rb +2 -0
  69. data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
  70. data/lib/datadog/core/transport/http/api/instance.rb +4 -21
  71. data/lib/datadog/core/transport/http/builder.rb +9 -5
  72. data/lib/datadog/core/transport/http/client.rb +80 -0
  73. data/lib/datadog/core/transport/http.rb +22 -19
  74. data/lib/datadog/core/transport/response.rb +9 -0
  75. data/lib/datadog/core/transport/transport.rb +90 -0
  76. data/lib/datadog/core/utils/array.rb +29 -0
  77. data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
  78. data/lib/datadog/core/utils/network.rb +3 -1
  79. data/lib/datadog/core/utils/only_once_successful.rb +8 -2
  80. data/lib/datadog/core/utils/time.rb +1 -1
  81. data/lib/datadog/core/utils.rb +2 -0
  82. data/lib/datadog/core/workers/async.rb +10 -1
  83. data/lib/datadog/core/workers/interval_loop.rb +44 -3
  84. data/lib/datadog/core/workers/polling.rb +2 -0
  85. data/lib/datadog/core/workers/queue.rb +100 -1
  86. data/lib/datadog/data_streams/configuration/settings.rb +49 -0
  87. data/lib/datadog/data_streams/configuration.rb +11 -0
  88. data/lib/datadog/data_streams/ext.rb +11 -0
  89. data/lib/datadog/data_streams/extensions.rb +16 -0
  90. data/lib/datadog/data_streams/pathway_context.rb +169 -0
  91. data/lib/datadog/data_streams/processor.rb +509 -0
  92. data/lib/datadog/data_streams/transport/http/stats.rb +52 -0
  93. data/lib/datadog/data_streams/transport/http.rb +40 -0
  94. data/lib/datadog/data_streams/transport/stats.rb +46 -0
  95. data/lib/datadog/data_streams.rb +100 -0
  96. data/lib/datadog/di/component.rb +0 -16
  97. data/lib/datadog/di/contrib/active_record.rb +31 -5
  98. data/lib/datadog/di/el/compiler.rb +8 -4
  99. data/lib/datadog/di/el/evaluator.rb +1 -1
  100. data/lib/datadog/di/error.rb +9 -0
  101. data/lib/datadog/di/instrumenter.rb +93 -34
  102. data/lib/datadog/di/probe.rb +20 -0
  103. data/lib/datadog/di/probe_builder.rb +2 -1
  104. data/lib/datadog/di/probe_manager.rb +47 -33
  105. data/lib/datadog/di/probe_notification_builder.rb +77 -25
  106. data/lib/datadog/di/proc_responder.rb +32 -0
  107. data/lib/datadog/di/remote.rb +89 -84
  108. data/lib/datadog/di/transport/diagnostics.rb +8 -36
  109. data/lib/datadog/di/transport/http/diagnostics.rb +1 -33
  110. data/lib/datadog/di/transport/http/input.rb +1 -33
  111. data/lib/datadog/di/transport/http.rb +32 -17
  112. data/lib/datadog/di/transport/input.rb +67 -34
  113. data/lib/datadog/di.rb +61 -5
  114. data/lib/datadog/open_feature/component.rb +60 -0
  115. data/lib/datadog/open_feature/configuration.rb +27 -0
  116. data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
  117. data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
  118. data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
  119. data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
  120. data/lib/datadog/open_feature/exposures/event.rb +60 -0
  121. data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
  122. data/lib/datadog/open_feature/exposures/worker.rb +116 -0
  123. data/lib/datadog/open_feature/ext.rb +14 -0
  124. data/lib/datadog/open_feature/native_evaluator.rb +38 -0
  125. data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
  126. data/lib/datadog/open_feature/provider.rb +141 -0
  127. data/lib/datadog/open_feature/remote.rb +67 -0
  128. data/lib/datadog/open_feature/resolution_details.rb +35 -0
  129. data/lib/datadog/open_feature/transport.rb +70 -0
  130. data/lib/datadog/open_feature.rb +19 -0
  131. data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
  132. data/lib/datadog/opentelemetry/configuration/settings.rb +159 -0
  133. data/lib/datadog/opentelemetry/metrics.rb +117 -0
  134. data/lib/datadog/opentelemetry/sdk/configurator.rb +25 -1
  135. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +35 -0
  136. data/lib/datadog/opentelemetry.rb +3 -0
  137. data/lib/datadog/profiling/collectors/code_provenance.rb +41 -7
  138. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +1 -1
  139. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  140. data/lib/datadog/profiling/collectors/info.rb +2 -1
  141. data/lib/datadog/profiling/component.rb +12 -11
  142. data/lib/datadog/profiling/http_transport.rb +4 -1
  143. data/lib/datadog/profiling/profiler.rb +4 -0
  144. data/lib/datadog/profiling/tag_builder.rb +36 -3
  145. data/lib/datadog/profiling.rb +1 -2
  146. data/lib/datadog/single_step_instrument.rb +1 -1
  147. data/lib/datadog/tracing/configuration/ext.rb +9 -0
  148. data/lib/datadog/tracing/configuration/settings.rb +74 -0
  149. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
  150. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
  151. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
  152. data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
  153. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +4 -2
  154. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -1
  155. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +11 -3
  156. data/lib/datadog/tracing/contrib/extensions.rb +10 -2
  157. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +11 -7
  158. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
  159. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +22 -17
  160. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -3
  161. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -3
  162. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -3
  163. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
  164. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
  165. data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
  166. data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
  167. data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
  168. data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
  169. data/lib/datadog/tracing/contrib/rack/middlewares.rb +59 -27
  170. data/lib/datadog/tracing/contrib/rack/route_inference.rb +53 -0
  171. data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
  172. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -1
  173. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +3 -1
  174. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -1
  175. data/lib/datadog/tracing/contrib/status_range_matcher.rb +9 -1
  176. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +3 -1
  177. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +27 -0
  178. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +48 -0
  179. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +17 -0
  180. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
  181. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
  182. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
  183. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
  184. data/lib/datadog/tracing/contrib/waterdrop.rb +37 -0
  185. data/lib/datadog/tracing/contrib.rb +1 -0
  186. data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
  187. data/lib/datadog/tracing/metadata/ext.rb +1 -1
  188. data/lib/datadog/tracing/remote.rb +1 -9
  189. data/lib/datadog/tracing/span_event.rb +2 -2
  190. data/lib/datadog/tracing/span_operation.rb +9 -4
  191. data/lib/datadog/tracing/trace_operation.rb +44 -6
  192. data/lib/datadog/tracing/tracer.rb +42 -16
  193. data/lib/datadog/tracing/transport/http/client.rb +12 -26
  194. data/lib/datadog/tracing/transport/http/traces.rb +2 -50
  195. data/lib/datadog/tracing/transport/http.rb +15 -9
  196. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  197. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  198. data/lib/datadog/tracing/transport/traces.rb +9 -71
  199. data/lib/datadog/tracing/workers/trace_writer.rb +5 -0
  200. data/lib/datadog/tracing/writer.rb +1 -0
  201. data/lib/datadog/version.rb +2 -2
  202. data/lib/datadog.rb +2 -0
  203. metadata +78 -21
  204. data/lib/datadog/core/remote/transport/http/api.rb +0 -53
  205. data/lib/datadog/core/remote/transport/http/client.rb +0 -49
  206. data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
  207. data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
  208. data/lib/datadog/core/transport/http/api/spec.rb +0 -36
  209. data/lib/datadog/di/transport/http/api.rb +0 -42
  210. data/lib/datadog/di/transport/http/client.rb +0 -47
  211. data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
  212. data/lib/datadog/tracing/transport/http/api.rb +0 -44
@@ -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
@@ -7,7 +7,8 @@ module Datadog
7
7
  # This class accumulates the context over the request life-cycle and exposes
8
8
  # interface sufficient for instrumentation to perform threat detection.
9
9
  class Context
10
- ActiveContextError = Class.new(StandardError)
10
+ # Steep: https://github.com/soutaro/steep/issues/1880
11
+ ActiveContextError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
11
12
 
12
13
  # TODO: add delegators for active trace span
13
14
  attr_reader :trace, :span, :events
@@ -7,8 +7,6 @@ module Datadog
7
7
  module AppSec
8
8
  # Remote
9
9
  module Remote
10
- class ReadError < StandardError; end
11
-
12
10
  class NoRulesError < StandardError; end
13
11
 
14
12
  class << self
@@ -23,6 +21,8 @@ module Datadog
23
21
  CAP_ASM_CUSTOM_RULES = 1 << 8
24
22
  CAP_ASM_CUSTOM_BLOCKING_RESPONSE = 1 << 9
25
23
  CAP_ASM_TRUSTED_IPS = 1 << 10
24
+ CAP_ASM_PROCESSOR_OVERRIDES = 1 << 16
25
+ CAP_ASM_CUSTOM_DATA_SCANNERS = 1 << 17
26
26
  CAP_ASM_RASP_SSRF = 1 << 23
27
27
  CAP_ASM_RASP_SQLI = 1 << 21
28
28
  CAP_ASM_AUTO_USER_INSTRUM_MODE = 1 << 31
@@ -43,6 +43,8 @@ module Datadog
43
43
  CAP_ASM_CUSTOM_RULES,
44
44
  CAP_ASM_CUSTOM_BLOCKING_RESPONSE,
45
45
  CAP_ASM_TRUSTED_IPS,
46
+ CAP_ASM_PROCESSOR_OVERRIDES,
47
+ CAP_ASM_CUSTOM_DATA_SCANNERS,
46
48
  CAP_ASM_RASP_SSRF,
47
49
  CAP_ASM_RASP_SQLI,
48
50
  CAP_ASM_AUTO_USER_INSTRUM_MODE,
@@ -105,13 +107,7 @@ module Datadog
105
107
  end
106
108
 
107
109
  def parse_content(content)
108
- data = content.data.read
109
-
110
- content.data.rewind
111
-
112
- raise ReadError, 'EOF reached' if data.nil?
113
-
114
- JSON.parse(data)
110
+ JSON.parse(content.data)
115
111
  end
116
112
  end
117
113
  end
@@ -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
@@ -70,7 +70,8 @@ module Datadog
70
70
 
71
71
  def initialize(duration_ext_ns:, input_truncated:)
72
72
  @events = []
73
- @actions = @attributes = {}
73
+ @actions = {}.freeze
74
+ @attributes = {}.freeze
74
75
  @duration_ns = 0
75
76
  @duration_ext_ns = duration_ext_ns
76
77
  @input_truncated = !!input_truncated
@@ -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
  #
@@ -9,7 +9,7 @@ module Datadog
9
9
  class ConfigHelper
10
10
  def initialize(
11
11
  source_env: ENV,
12
- supported_configurations: SUPPORTED_CONFIGURATIONS,
12
+ supported_configurations: SUPPORTED_CONFIGURATION_NAMES,
13
13
  aliases: ALIASES,
14
14
  alias_to_canonical: ALIAS_TO_CANONICAL,
15
15
  raise_on_unknown_env_var: false
@@ -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."
@@ -21,12 +21,12 @@ module Datadog
21
21
  end
22
22
 
23
23
  private_class_method def self.log_deprecated_environment_variables(logger, source_env, source_name, deprecations, alias_to_canonical)
24
- deprecations.each do |deprecated_env_var, message|
24
+ deprecations.each do |deprecated_env_var|
25
25
  next unless source_env.key?(deprecated_env_var)
26
26
 
27
27
  Datadog::Core.log_deprecation(disallowed_next_major: false, logger: logger) do
28
28
  "#{deprecated_env_var} #{source_name} variable is deprecated" +
29
- (alias_to_canonical[deprecated_env_var] ? ", use #{alias_to_canonical[deprecated_env_var]} instead." : ". #{message}.")
29
+ (alias_to_canonical[deprecated_env_var] ? ", use #{alias_to_canonical[deprecated_env_var]} instead." : ".")
30
30
  end
31
31
  end
32
32
  end
@@ -42,7 +42,8 @@ module Datadog
42
42
  # Acts as DSL for building OptionDefinitions
43
43
  # @public_api
44
44
  class Builder
45
- InvalidOptionError = Class.new(StandardError)
45
+ # Steep: https://github.com/soutaro/steep/issues/1880
46
+ InvalidOptionError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
46
47
 
47
48
  attr_reader \
48
49
  :helpers
@@ -119,7 +120,8 @@ module Datadog
119
120
  env_parser(&options[:env_parser]) if options.key?(:env_parser)
120
121
  after_set(&options[:after_set]) if options.key?(:after_set)
121
122
  resetter(&options[:resetter]) if options.key?(:resetter)
122
- setter(&options[:setter]) if options.key?(:setter)
123
+ # Steep: https://github.com/soutaro/steep/issues/1979
124
+ setter(&options[:setter]) if options.key?(:setter) # steep:ignore BlockTypeMismatch
123
125
  type(options[:type], **(options[:type_options] || {})) if options.key?(:type)
124
126
  end
125
127
 
@@ -40,14 +40,16 @@ module Datadog
40
40
 
41
41
  def default_helpers(name)
42
42
  option_name = name.to_sym
43
- # @type var opt_getter: Configuration::OptionDefinition::helper_proc
44
- opt_getter = proc do
43
+ # Steep: https://github.com/soutaro/steep/issues/335
44
+ # @type var opt_getter: Configuration::OptionDefinition::generic_proc
45
+ opt_getter = proc do # steep:ignore IncompatibleAssignment
45
46
  # These Procs uses `get/set_option`, but we only add them to the OptionDefinition helpers here.
46
47
  # Steep is right that these methods are not defined, but we only run these Procs in instance context.
47
48
  get_option(option_name) # steep:ignore NoMethod
48
49
  end
49
- # @type var opt_setter: Configuration::OptionDefinition::helper_proc
50
- opt_setter = proc do |value|
50
+ # Steep: https://github.com/soutaro/steep/issues/335
51
+ # @type var opt_setter: Configuration::OptionDefinition::generic_proc
52
+ opt_setter = proc do |value| # steep:ignore IncompatibleAssignment
51
53
  set_option(option_name, value) # steep:ignore NoMethod
52
54
  end
53
55
  {
@@ -127,7 +129,8 @@ module Datadog
127
129
  end
128
130
  end
129
131
 
130
- InvalidOptionError = Class.new(StandardError)
132
+ # Steep: https://github.com/soutaro/steep/issues/1880
133
+ InvalidOptionError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
131
134
  end
132
135
  end
133
136
  end
@@ -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
@@ -169,6 +170,20 @@ module Datadog
169
170
  o.env Core::Environment::Ext::ENV_ENVIRONMENT
170
171
  end
171
172
 
173
+ # Configuration for container environments. For internal use only.
174
+ # @!visibility private
175
+ settings :container do
176
+ # Data supplied by the container runner to assist in uniquely identifying this process.
177
+ # Used in [Origin Detection](https://docs.datadoghq.com/developers/dogstatsd/unix_socket/?tab=host#origin-detection)
178
+ #
179
+ # @default `DD_EXTERNAL_ENV` environment variable, otherwise `nil`
180
+ # @return [String,nil]
181
+ option :external_env do |o|
182
+ o.type :string, nilable: true
183
+ o.env Core::Environment::Ext::ENV_EXTERNAL_ENV
184
+ end
185
+ end
186
+
172
187
  # Internal {Datadog::Statsd} metrics collection.
173
188
  #
174
189
  # @public_api
@@ -292,9 +307,6 @@ module Datadog
292
307
  # for Ruby versions 2.x, 3.1.4+, 3.2.3+ and 3.3.0+
293
308
  # (more details in {Datadog::Profiling::Component.enable_gc_profiling?})
294
309
  #
295
- # @warn Due to a VM bug in the Ractor implementation (https://bugs.ruby-lang.org/issues/19112) this feature
296
- # stops working when Ractors get garbage collected.
297
- #
298
310
  # @default `DD_PROFILING_GC_ENABLED` environment variable, otherwise `true`
299
311
  option :gc_enabled do |o|
300
312
  o.type :bool
@@ -828,6 +840,7 @@ module Datadog
828
840
 
829
841
  # Overrides agentless telemetry URL. To be used internally for testing purposes only.
830
842
  #
843
+ # @default `DD_TELEMETRY_AGENTLESS_URL` environment variable, otherwise `nil`.
831
844
  # @return [String]
832
845
  # @!visibility private
833
846
  option :agentless_url_override do |o|
@@ -1003,6 +1016,16 @@ module Datadog
1003
1016
  end
1004
1017
  end
1005
1018
 
1019
+ # Enable experimental process tags propagation such that payloads like spans contain the process tag.
1020
+ #
1021
+ # @default `DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED` environment variable, otherwise `false`
1022
+ # @return [Boolean]
1023
+ option :experimental_propagate_process_tags_enabled do |o|
1024
+ o.env 'DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED'
1025
+ o.default false
1026
+ o.type :bool
1027
+ end
1028
+
1006
1029
  # Tracer specific configuration starting with APM (e.g. DD_APM_TRACING_ENABLED).
1007
1030
  # @public_api
1008
1031
  settings :apm do
@@ -1030,6 +1053,8 @@ module Datadog
1030
1053
  # TODO: Tracing should manage its own settings.
1031
1054
  # Keep this extension here for now to keep things working.
1032
1055
  extend Datadog::Tracing::Configuration::Settings
1056
+
1057
+ extend Datadog::OpenTelemetry::Configuration::Settings
1033
1058
  end
1034
1059
  # standard:enable Metrics/BlockLength
1035
1060
  end