datadog 2.23.0 → 2.25.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 (145) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +67 -1
  3. data/ext/datadog_profiling_native_extension/collectors_stack.c +17 -5
  4. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
  5. data/ext/datadog_profiling_native_extension/extconf.rb +4 -1
  6. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +12 -0
  7. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +4 -0
  8. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  9. data/lib/datadog/ai_guard/api_client.rb +82 -0
  10. data/lib/datadog/ai_guard/component.rb +42 -0
  11. data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
  12. data/lib/datadog/ai_guard/configuration/settings.rb +98 -0
  13. data/lib/datadog/ai_guard/configuration.rb +11 -0
  14. data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
  15. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +34 -0
  16. data/lib/datadog/ai_guard/evaluation/request.rb +81 -0
  17. data/lib/datadog/ai_guard/evaluation/result.rb +43 -0
  18. data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
  19. data/lib/datadog/ai_guard/evaluation.rb +72 -0
  20. data/lib/datadog/ai_guard/ext.rb +16 -0
  21. data/lib/datadog/ai_guard.rb +153 -0
  22. data/lib/datadog/appsec/context.rb +2 -1
  23. data/lib/datadog/appsec/remote.rb +5 -12
  24. data/lib/datadog/appsec/security_engine/engine.rb +3 -3
  25. data/lib/datadog/appsec/security_engine/result.rb +2 -1
  26. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  27. data/lib/datadog/core/configuration/components.rb +6 -0
  28. data/lib/datadog/core/configuration/config_helper.rb +1 -1
  29. data/lib/datadog/core/configuration/deprecations.rb +2 -2
  30. data/lib/datadog/core/configuration/option_definition.rb +4 -2
  31. data/lib/datadog/core/configuration/options.rb +8 -5
  32. data/lib/datadog/core/configuration/settings.rb +14 -3
  33. data/lib/datadog/core/configuration/supported_configurations.rb +8 -1
  34. data/lib/datadog/core/environment/cgroup.rb +52 -25
  35. data/lib/datadog/core/environment/container.rb +140 -46
  36. data/lib/datadog/core/environment/ext.rb +1 -0
  37. data/lib/datadog/core/environment/process.rb +9 -1
  38. data/lib/datadog/core/error.rb +6 -6
  39. data/lib/datadog/core/pin.rb +4 -0
  40. data/lib/datadog/core/rate_limiter.rb +9 -1
  41. data/lib/datadog/core/remote/client.rb +14 -6
  42. data/lib/datadog/core/remote/component.rb +6 -4
  43. data/lib/datadog/core/remote/configuration/content.rb +15 -2
  44. data/lib/datadog/core/remote/configuration/digest.rb +14 -7
  45. data/lib/datadog/core/remote/configuration/repository.rb +1 -1
  46. data/lib/datadog/core/remote/configuration/target.rb +13 -6
  47. data/lib/datadog/core/remote/transport/config.rb +3 -16
  48. data/lib/datadog/core/remote/transport/http/config.rb +4 -44
  49. data/lib/datadog/core/remote/transport/http/negotiation.rb +0 -39
  50. data/lib/datadog/core/remote/transport/http.rb +13 -24
  51. data/lib/datadog/core/remote/transport/negotiation.rb +7 -16
  52. data/lib/datadog/core/semaphore.rb +1 -4
  53. data/lib/datadog/core/telemetry/component.rb +52 -13
  54. data/lib/datadog/core/telemetry/event/app_started.rb +36 -1
  55. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
  56. data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
  57. data/lib/datadog/core/telemetry/request.rb +17 -3
  58. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +2 -32
  59. data/lib/datadog/core/telemetry/transport/http.rb +21 -16
  60. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -10
  61. data/lib/datadog/core/telemetry/worker.rb +88 -32
  62. data/lib/datadog/core/transport/ext.rb +2 -0
  63. data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
  64. data/lib/datadog/core/transport/http/api/instance.rb +4 -21
  65. data/lib/datadog/core/transport/http/builder.rb +9 -5
  66. data/lib/datadog/core/transport/http/client.rb +19 -8
  67. data/lib/datadog/core/transport/http.rb +22 -19
  68. data/lib/datadog/core/transport/response.rb +12 -1
  69. data/lib/datadog/core/transport/transport.rb +90 -0
  70. data/lib/datadog/core/utils/only_once_successful.rb +2 -0
  71. data/lib/datadog/core/utils/safe_dup.rb +2 -2
  72. data/lib/datadog/core/utils/sequence.rb +2 -0
  73. data/lib/datadog/core/utils/time.rb +1 -1
  74. data/lib/datadog/core/workers/async.rb +10 -1
  75. data/lib/datadog/core/workers/interval_loop.rb +44 -3
  76. data/lib/datadog/core/workers/polling.rb +2 -0
  77. data/lib/datadog/core/workers/queue.rb +100 -1
  78. data/lib/datadog/data_streams/processor.rb +1 -1
  79. data/lib/datadog/data_streams/transport/http/stats.rb +1 -36
  80. data/lib/datadog/data_streams/transport/http.rb +5 -6
  81. data/lib/datadog/data_streams/transport/stats.rb +3 -17
  82. data/lib/datadog/di/boot.rb +4 -2
  83. data/lib/datadog/di/contrib/active_record.rb +30 -5
  84. data/lib/datadog/di/el/compiler.rb +8 -4
  85. data/lib/datadog/di/error.rb +5 -0
  86. data/lib/datadog/di/instrumenter.rb +26 -7
  87. data/lib/datadog/di/logger.rb +2 -2
  88. data/lib/datadog/di/probe_builder.rb +2 -1
  89. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  90. data/lib/datadog/di/probe_manager.rb +37 -31
  91. data/lib/datadog/di/probe_notification_builder.rb +15 -2
  92. data/lib/datadog/di/probe_notifier_worker.rb +5 -5
  93. data/lib/datadog/di/remote.rb +89 -84
  94. data/lib/datadog/di/transport/diagnostics.rb +7 -35
  95. data/lib/datadog/di/transport/http/diagnostics.rb +1 -31
  96. data/lib/datadog/di/transport/http/input.rb +1 -31
  97. data/lib/datadog/di/transport/http.rb +28 -17
  98. data/lib/datadog/di/transport/input.rb +7 -34
  99. data/lib/datadog/di.rb +61 -5
  100. data/lib/datadog/error_tracking/filters.rb +2 -2
  101. data/lib/datadog/kit/appsec/events/v2.rb +2 -3
  102. data/lib/datadog/open_feature/evaluation_engine.rb +2 -1
  103. data/lib/datadog/open_feature/remote.rb +3 -10
  104. data/lib/datadog/open_feature/transport.rb +9 -11
  105. data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
  106. data/lib/datadog/opentelemetry/configuration/settings.rb +2 -2
  107. data/lib/datadog/opentelemetry/metrics.rb +21 -14
  108. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +5 -8
  109. data/lib/datadog/profiling/collectors/code_provenance.rb +27 -2
  110. data/lib/datadog/profiling/collectors/info.rb +5 -4
  111. data/lib/datadog/profiling/component.rb +12 -11
  112. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +18 -0
  113. data/lib/datadog/profiling/http_transport.rb +4 -1
  114. data/lib/datadog/tracing/contrib/extensions.rb +10 -2
  115. data/lib/datadog/tracing/contrib/karafka/patcher.rb +31 -32
  116. data/lib/datadog/tracing/contrib/status_range_matcher.rb +2 -1
  117. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +3 -1
  118. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +6 -3
  119. data/lib/datadog/tracing/contrib/waterdrop.rb +4 -0
  120. data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
  121. data/lib/datadog/tracing/distributed/baggage.rb +3 -2
  122. data/lib/datadog/tracing/remote.rb +1 -9
  123. data/lib/datadog/tracing/sampling/priority_sampler.rb +3 -1
  124. data/lib/datadog/tracing/span.rb +1 -1
  125. data/lib/datadog/tracing/span_event.rb +2 -2
  126. data/lib/datadog/tracing/span_operation.rb +20 -9
  127. data/lib/datadog/tracing/trace_operation.rb +44 -6
  128. data/lib/datadog/tracing/tracer.rb +42 -16
  129. data/lib/datadog/tracing/transport/http/traces.rb +2 -50
  130. data/lib/datadog/tracing/transport/http.rb +15 -9
  131. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  132. data/lib/datadog/tracing/transport/traces.rb +6 -66
  133. data/lib/datadog/tracing/workers/trace_writer.rb +5 -0
  134. data/lib/datadog/tracing/writer.rb +1 -0
  135. data/lib/datadog/version.rb +2 -2
  136. data/lib/datadog.rb +1 -0
  137. metadata +24 -17
  138. data/lib/datadog/core/remote/transport/http/api.rb +0 -53
  139. data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
  140. data/lib/datadog/core/transport/http/api/spec.rb +0 -36
  141. data/lib/datadog/data_streams/transport/http/api.rb +0 -33
  142. data/lib/datadog/data_streams/transport/http/client.rb +0 -21
  143. data/lib/datadog/di/transport/http/api.rb +0 -42
  144. data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
  145. data/lib/datadog/tracing/transport/http/api.rb +0 -44
@@ -129,7 +129,6 @@ module Datadog
129
129
  # @yield Optional block where new newly created {Datadog::Tracing::SpanOperation} captures the execution.
130
130
  # @yieldparam [Datadog::Tracing::SpanOperation] span_op the newly created and active [Datadog::Tracing::SpanOperation]
131
131
  # @yieldparam [Datadog::Tracing::TraceOperation] trace_op the active [Datadog::Tracing::TraceOperation]
132
- # rubocop:disable Metrics/MethodLength
133
132
  def trace(
134
133
  name,
135
134
  continue_from: nil,
@@ -241,10 +240,21 @@ module Datadog
241
240
  trace.to_correlation
242
241
  end
243
242
 
244
- # Setup a new trace to continue from where another
243
+ # Setup a new trace execution context to continue from where another
245
244
  # trace left off.
245
+ # This is useful to continue distributed or async traces.
246
246
  #
247
- # Used to continue distributed or async traces.
247
+ # The first span created in the restored context is a direct child of the
248
+ # active span from when the {Datadog::Tracing::TraceDigest} was created.
249
+ #
250
+ # When no block is given, the trace context is restored in the current thread.
251
+ # It remains active until the first span created in this restored context is finished.
252
+ # After that, if a new span is created, it start a new, unrelated trace.
253
+ #
254
+ # When a block is given, the trace context is restored inside the block execution.
255
+ # It remains active until the block ends, even when the first span created inside
256
+ # the block finishes. This means that multiple spans can be direct children of the
257
+ # active span from when the {Datadog::Tracing::TraceDigest} was created.
248
258
  #
249
259
  # @param [Datadog::Tracing::TraceDigest] digest continue from the {Datadog::Tracing::TraceDigest}.
250
260
  # @param [Thread] key Thread to retrieve trace from. Defaults to current thread. For internal use only.
@@ -260,13 +270,32 @@ module Datadog
260
270
  # Start a new trace from the digest
261
271
  context = call_context(key)
262
272
  original_trace = active_trace(key)
263
- trace = start_trace(continue_from: digest)
273
+ # When we want the trace to be bound to a block, we cannot let
274
+ # it auto finish when the local root span finishes. This would
275
+ # create mutiple traces inside the block. Instead, we'll
276
+ # expliclity finish the trace after the block finishes.
277
+ auto_finish = !block
278
+
279
+ trace = start_trace(continue_from: digest, auto_finish: auto_finish)
264
280
 
265
281
  # If block hasn't been given; we need to manually deactivate
266
282
  # this trace. Subscribe to the trace finished event to do this.
267
283
  subscribe_trace_deactivation!(context, trace, original_trace) unless block
268
284
 
269
- context.activate!(trace, &block)
285
+ if block
286
+ # When a block is given, the trace will be active until the block finishes.
287
+ context.activate!(trace) do
288
+ yield
289
+ ensure # We have to flush even when an error occurs
290
+ # On block completion, force the trace to finish and flush its finished spans.
291
+ # Unfinished spans are lost as the {TraceOperation} has ended.
292
+ trace.finish!
293
+ flush_trace(trace)
294
+ end
295
+ else
296
+ # Otherwise, the trace will be bound to the current thread after this point
297
+ context.activate!(trace)
298
+ end
270
299
  end
271
300
 
272
301
  # Sample a span, tagging the trace as appropriate.
@@ -329,7 +358,7 @@ module Datadog
329
358
  @provider.context(key)
330
359
  end
331
360
 
332
- def build_trace(digest = nil)
361
+ def build_trace(digest, auto_finish)
333
362
  # Resolve hostname if configured
334
363
  hostname = Core::Environment::Socket.hostname if Datadog.configuration.tracing.report_hostname
335
364
  hostname = (hostname && !hostname.empty?) ? hostname : nil
@@ -353,7 +382,8 @@ module Datadog
353
382
  trace_state_unknown_fields: digest.trace_state_unknown_fields,
354
383
  remote_parent: digest.span_remote,
355
384
  tracer: self,
356
- baggage: digest.baggage
385
+ baggage: digest.baggage,
386
+ auto_finish: auto_finish
357
387
  )
358
388
  else
359
389
  TraceOperation.new(
@@ -362,13 +392,12 @@ module Datadog
362
392
  profiling_enabled: profiling_enabled,
363
393
  apm_tracing_enabled: apm_tracing_enabled,
364
394
  remote_parent: false,
365
- tracer: self
395
+ tracer: self,
396
+ auto_finish: auto_finish
366
397
  )
367
398
  end
368
399
  end
369
- # rubocop:enable Metrics/MethodLength
370
400
 
371
- # rubocop:disable Metrics/MethodLength
372
401
  def bind_trace_events!(trace_op)
373
402
  events = trace_op.send(:events)
374
403
 
@@ -387,13 +416,12 @@ module Datadog
387
416
  flush_trace(event_trace_op)
388
417
  end
389
418
  end
390
- # rubocop:enable Metrics/MethodLength
391
419
 
392
420
  # Creates a new TraceOperation, with events bounds to this Tracer instance.
393
421
  # @return [TraceOperation]
394
- def start_trace(continue_from: nil)
422
+ def start_trace(continue_from: nil, auto_finish: true)
395
423
  # Build a new trace using digest if provided.
396
- trace = build_trace(continue_from)
424
+ trace = build_trace(continue_from, auto_finish)
397
425
 
398
426
  # Bind trace events: sample trace, set default service, flush spans.
399
427
  bind_trace_events!(trace)
@@ -402,7 +430,6 @@ module Datadog
402
430
  end
403
431
 
404
432
  # rubocop:disable Lint/UnderscorePrefixedVariableName
405
- # rubocop:disable Metrics/MethodLength
406
433
  def start_span(
407
434
  name,
408
435
  continue_from: nil,
@@ -454,9 +481,8 @@ module Datadog
454
481
  span
455
482
  end
456
483
  end
457
- # rubocop:enable Lint/UnderscorePrefixedVariableName
458
- # rubocop:enable Metrics/MethodLength
459
484
 
485
+ # rubocop:enable Lint/UnderscorePrefixedVariableName
460
486
  def resolve_tags(tags, service)
461
487
  merged_tags = if @tags.any? && tags
462
488
  # Combine default tags with provided tags,
@@ -2,12 +2,10 @@
2
2
 
3
3
  require 'json'
4
4
 
5
- require_relative '../traces'
6
- require_relative 'client'
7
5
  require_relative '../../../core/transport/http/response'
8
6
  require_relative '../../../core/transport/http/api/endpoint'
9
- require_relative '../../../core/transport/http/api/spec'
10
7
  require_relative '../../../core/transport/http/api/instance'
8
+ require_relative '../traces'
11
9
 
12
10
  module Datadog
13
11
  module Tracing
@@ -27,58 +25,15 @@ module Datadog
27
25
  end
28
26
  end
29
27
 
30
- # Extensions for HTTP client
31
- module Client
32
- def send_traces_payload(request)
33
- send_request(request) do |api, env|
34
- api.send_traces(env)
35
- end
36
- end
37
- end
38
-
39
28
  module API
40
- # HTTP API Spec
41
- class Spec < Core::Transport::HTTP::API::Spec
42
- attr_accessor :traces
43
-
44
- def send_traces(env, &block)
45
- raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('traces', self) if traces.nil?
46
-
47
- traces.call(env, &block)
48
- end
49
-
50
- def encoder
51
- traces.encoder
52
- end
53
- end
54
-
55
- # HTTP API Instance
56
- class Instance < Core::Transport::HTTP::API::Instance
57
- def send_traces(env)
58
- unless spec.is_a?(Traces::API::Spec)
59
- raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
60
- 'traces', self
61
- )
62
- end
63
-
64
- spec.send_traces(env) do |request_env|
65
- call(request_env)
66
- end
67
- end
68
- end
69
-
70
29
  # Endpoint for submitting trace data
71
30
  class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
72
31
  HEADER_CONTENT_TYPE = 'Content-Type'
73
32
  HEADER_TRACE_COUNT = 'X-Datadog-Trace-Count'
74
33
  SERVICE_RATE_KEY = 'rate_by_service'
75
34
 
76
- attr_reader \
77
- :encoder
78
-
79
35
  def initialize(path, encoder, options = {})
80
- super(:post, path)
81
- @encoder = encoder
36
+ super(:post, path, encoder: encoder)
82
37
  @service_rates = options.fetch(:service_rates, false)
83
38
  end
84
39
 
@@ -111,9 +66,6 @@ module Datadog
111
66
  end
112
67
  end
113
68
  end
114
-
115
- # Add traces behavior to transport components
116
- HTTP::Client.include(Traces::Client)
117
69
  end
118
70
  end
119
71
  end
@@ -1,17 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../core/encoding'
3
4
  require_relative '../../core/environment/container'
4
5
  require_relative '../../core/environment/ext'
5
6
  require_relative '../../core/transport/ext'
6
7
  require_relative '../../core/transport/http'
7
- require_relative 'http/api'
8
- require_relative '../../../datadog/version'
8
+ require_relative 'http/traces'
9
9
 
10
10
  module Datadog
11
11
  module Tracing
12
12
  module Transport
13
13
  # Namespace for HTTP transport components
14
14
  module HTTP
15
+ V4 = Traces::API::Endpoint.new(
16
+ '/v0.4/traces',
17
+ Core::Encoding::MsgpackEncoder,
18
+ service_rates: true
19
+ )
20
+
21
+ V3 = Traces::API::Endpoint.new(
22
+ '/v0.3/traces',
23
+ Core::Encoding::MsgpackEncoder,
24
+ )
25
+
15
26
  module_function
16
27
 
17
28
  # Builds a new Transport::HTTP::Client with default settings
@@ -19,20 +30,15 @@ module Datadog
19
30
  def default(
20
31
  agent_settings:,
21
32
  logger: Datadog.logger,
22
- api_version: nil,
23
33
  headers: nil
24
34
  )
25
35
  Core::Transport::HTTP.build(
26
- api_instance_class: Traces::API::Instance,
27
36
  agent_settings: agent_settings,
28
37
  logger: logger,
29
- api_version: api_version,
30
38
  headers: headers
31
39
  ) do |transport|
32
- apis = API.defaults
33
-
34
- transport.api API::V4, apis[API::V4], fallback: API::V3, default: true
35
- transport.api API::V3, apis[API::V3]
40
+ transport.api 'v0.4', V4, fallback: 'v0.3', default: true
41
+ transport.api 'v0.3', V3
36
42
 
37
43
  # Call block to apply any customization, if provided
38
44
  yield(transport) if block_given?
@@ -42,7 +42,7 @@ module Datadog
42
42
  response
43
43
  rescue => e
44
44
  message =
45
- "Internal error during IO transport request. Cause: #{e.class.name} #{e.message} " \
45
+ "Internal error during IO transport request. Cause: #{e.class.name}: #{e.message} " \
46
46
  "Location: #{Array(e.backtrace).first}"
47
47
 
48
48
  # Log error
@@ -3,7 +3,9 @@
3
3
  require_relative '../../core/chunker'
4
4
  require_relative '../../core/transport/parcel'
5
5
  require_relative '../../core/transport/request'
6
+ require_relative '../../core/transport/transport'
6
7
  require_relative '../../core/utils/array'
8
+ require_relative 'http/client'
7
9
  require_relative 'serializable_trace'
8
10
  require_relative 'trace_formatter'
9
11
 
@@ -121,16 +123,8 @@ module Datadog
121
123
  # This class initializes the HTTP client, breaks down large
122
124
  # batches of traces into smaller chunks and handles
123
125
  # API version downgrade handshake.
124
- class Transport
125
- attr_reader :client, :apis, :default_api, :current_api_id, :logger
126
-
127
- def initialize(apis, default_api, logger: Datadog.logger)
128
- @apis = apis
129
- @default_api = default_api
130
- @logger = logger
131
-
132
- change_api!(default_api)
133
- end
126
+ class Transport < Core::Transport::Transport
127
+ self.http_client_class = Tracing::Transport::HTTP::Client
134
128
 
135
129
  def send_traces(traces)
136
130
  encoder = current_api.encoder
@@ -143,7 +137,7 @@ module Datadog
143
137
  responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count|
144
138
  request = Request.new(EncodedParcel.new(encoded_traces, trace_count))
145
139
 
146
- client.send_traces_payload(request).tap do |response|
140
+ client.send_request(:traces, request).tap do |response|
147
141
  if downgrade?(response)
148
142
  downgrade!
149
143
  return send_traces(traces)
@@ -171,35 +165,11 @@ module Datadog
171
165
  end
172
166
 
173
167
  def stats
174
- @client.stats
175
- end
176
-
177
- def current_api
178
- apis[@current_api_id]
168
+ client.stats
179
169
  end
180
170
 
181
171
  private
182
172
 
183
- def downgrade?(response)
184
- return false unless apis.fallbacks.key?(@current_api_id)
185
-
186
- response.not_found? || response.unsupported?
187
- end
188
-
189
- def downgrade!
190
- downgrade_api_id = apis.fallbacks[@current_api_id]
191
- raise NoDowngradeAvailableError, @current_api_id if downgrade_api_id.nil?
192
-
193
- change_api!(downgrade_api_id)
194
- end
195
-
196
- def change_api!(api_id)
197
- raise UnknownApiVersionError, api_id unless apis.key?(api_id)
198
-
199
- @current_api_id = api_id
200
- @client = HTTP::Client.new(current_api, logger: logger)
201
- end
202
-
203
173
  # Queries the agent for native span events serialization support.
204
174
  # This changes how the serialization of span events performed.
205
175
  def native_events_supported?
@@ -219,36 +189,6 @@ module Datadog
219
189
  false
220
190
  end
221
191
  end
222
-
223
- # Raised when configured with an unknown API version
224
- class UnknownApiVersionError < StandardError
225
- attr_reader :version
226
-
227
- def initialize(version)
228
- super
229
-
230
- @version = version
231
- end
232
-
233
- def message
234
- "No matching transport API for version #{version}!"
235
- end
236
- end
237
-
238
- # Raised when configured with an unknown API version
239
- class NoDowngradeAvailableError < StandardError
240
- attr_reader :version
241
-
242
- def initialize(version)
243
- super
244
-
245
- @version = version
246
- end
247
-
248
- def message
249
- "No downgrade from transport API version #{version} is available!"
250
- end
251
- end
252
192
  end
253
193
  end
254
194
  end
@@ -21,6 +21,8 @@ module Datadog
21
21
  :transport,
22
22
  :agent_settings
23
23
 
24
+ # DEV-3.0: change to keyword arguments
25
+ #
24
26
  # rubocop:disable Lint/MissingSuper
25
27
  def initialize(options = {})
26
28
  @logger = options[:logger] || Datadog.logger
@@ -143,6 +145,9 @@ module Datadog
143
145
 
144
146
  # Are there more traces to be processed next?
145
147
  def work_pending?
148
+ # This is the same implementation as in Queue, but it was
149
+ # overwritten by IntervalLoop on its way to this worker class.
150
+ # See the comments in those two methods for more info.
146
151
  !buffer.empty?
147
152
  end
148
153
 
@@ -19,6 +19,7 @@ module Datadog
19
19
  :events,
20
20
  :agent_settings
21
21
 
22
+ # DEV-3.0: change to keyword arguments
22
23
  def initialize(options = {})
23
24
  @logger = options[:logger] || Datadog.logger
24
25
 
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 23
6
+ MINOR = 25
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
@@ -21,6 +21,6 @@ module Datadog
21
21
  # To allow testing with the next unreleased version of Ruby, the version check is performed
22
22
  # as `< #{MAXIMUM_RUBY_VERSION}`, meaning prereleases of MAXIMUM_RUBY_VERSION are allowed
23
23
  # but not stable MAXIMUM_RUBY_VERSION releases.
24
- MAXIMUM_RUBY_VERSION = '4.0'
24
+ MAXIMUM_RUBY_VERSION = '4.1'
25
25
  end
26
26
  end
data/lib/datadog.rb CHANGED
@@ -6,6 +6,7 @@ require_relative 'datadog/tracing/contrib'
6
6
 
7
7
  # Load other products (must follow tracing)
8
8
  require_relative 'datadog/profiling'
9
+ require_relative 'datadog/ai_guard'
9
10
  require_relative 'datadog/appsec'
10
11
  require_relative 'datadog/di'
11
12
  require_relative 'datadog/data_streams'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.23.0
4
+ version: 2.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-12-11 00:00:00.000000000 Z
11
+ date: 2026-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -30,20 +30,20 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.4'
33
+ version: '3.5'
34
34
  - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: 3.4.2
36
+ version: 3.5.0
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '3.4'
43
+ version: '3.5'
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 3.4.2
46
+ version: 3.5.0
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: libddwaf
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -139,6 +139,7 @@ files:
139
139
  - ext/datadog_profiling_native_extension/collectors_stack.h
140
140
  - ext/datadog_profiling_native_extension/collectors_thread_context.c
141
141
  - ext/datadog_profiling_native_extension/collectors_thread_context.h
142
+ - ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c
142
143
  - ext/datadog_profiling_native_extension/datadog_ruby_common.c
143
144
  - ext/datadog_profiling_native_extension/datadog_ruby_common.h
144
145
  - ext/datadog_profiling_native_extension/encoded_profile.c
@@ -181,6 +182,19 @@ files:
181
182
  - ext/libdatadog_api/process_discovery.h
182
183
  - ext/libdatadog_extconf_helpers.rb
183
184
  - lib/datadog.rb
185
+ - lib/datadog/ai_guard.rb
186
+ - lib/datadog/ai_guard/api_client.rb
187
+ - lib/datadog/ai_guard/component.rb
188
+ - lib/datadog/ai_guard/configuration.rb
189
+ - lib/datadog/ai_guard/configuration/ext.rb
190
+ - lib/datadog/ai_guard/configuration/settings.rb
191
+ - lib/datadog/ai_guard/evaluation.rb
192
+ - lib/datadog/ai_guard/evaluation/message.rb
193
+ - lib/datadog/ai_guard/evaluation/no_op_result.rb
194
+ - lib/datadog/ai_guard/evaluation/request.rb
195
+ - lib/datadog/ai_guard/evaluation/result.rb
196
+ - lib/datadog/ai_guard/evaluation/tool_call.rb
197
+ - lib/datadog/ai_guard/ext.rb
184
198
  - lib/datadog/appsec.rb
185
199
  - lib/datadog/appsec/actions_handler.rb
186
200
  - lib/datadog/appsec/actions_handler/serializable_backtrace.rb
@@ -374,7 +388,6 @@ files:
374
388
  - lib/datadog/core/remote/tie/tracing.rb
375
389
  - lib/datadog/core/remote/transport/config.rb
376
390
  - lib/datadog/core/remote/transport/http.rb
377
- - lib/datadog/core/remote/transport/http/api.rb
378
391
  - lib/datadog/core/remote/transport/http/config.rb
379
392
  - lib/datadog/core/remote/transport/http/negotiation.rb
380
393
  - lib/datadog/core/remote/transport/negotiation.rb
@@ -409,7 +422,6 @@ files:
409
422
  - lib/datadog/core/telemetry/metrics_manager.rb
410
423
  - lib/datadog/core/telemetry/request.rb
411
424
  - lib/datadog/core/telemetry/transport/http.rb
412
- - lib/datadog/core/telemetry/transport/http/api.rb
413
425
  - lib/datadog/core/telemetry/transport/http/telemetry.rb
414
426
  - lib/datadog/core/telemetry/transport/telemetry.rb
415
427
  - lib/datadog/core/telemetry/worker.rb
@@ -423,7 +435,6 @@ files:
423
435
  - lib/datadog/core/transport/http/api/fallbacks.rb
424
436
  - lib/datadog/core/transport/http/api/instance.rb
425
437
  - lib/datadog/core/transport/http/api/map.rb
426
- - lib/datadog/core/transport/http/api/spec.rb
427
438
  - lib/datadog/core/transport/http/builder.rb
428
439
  - lib/datadog/core/transport/http/client.rb
429
440
  - lib/datadog/core/transport/http/env.rb
@@ -431,6 +442,7 @@ files:
431
442
  - lib/datadog/core/transport/parcel.rb
432
443
  - lib/datadog/core/transport/request.rb
433
444
  - lib/datadog/core/transport/response.rb
445
+ - lib/datadog/core/transport/transport.rb
434
446
  - lib/datadog/core/utils.rb
435
447
  - lib/datadog/core/utils/array.rb
436
448
  - lib/datadog/core/utils/at_fork_monkey_patch.rb
@@ -469,8 +481,6 @@ files:
469
481
  - lib/datadog/data_streams/pathway_context.rb
470
482
  - lib/datadog/data_streams/processor.rb
471
483
  - lib/datadog/data_streams/transport/http.rb
472
- - lib/datadog/data_streams/transport/http/api.rb
473
- - lib/datadog/data_streams/transport/http/client.rb
474
484
  - lib/datadog/data_streams/transport/http/stats.rb
475
485
  - lib/datadog/data_streams/transport/stats.rb
476
486
  - lib/datadog/di.rb
@@ -506,7 +516,6 @@ files:
506
516
  - lib/datadog/di/serializer.rb
507
517
  - lib/datadog/di/transport/diagnostics.rb
508
518
  - lib/datadog/di/transport/http.rb
509
- - lib/datadog/di/transport/http/api.rb
510
519
  - lib/datadog/di/transport/http/diagnostics.rb
511
520
  - lib/datadog/di/transport/http/input.rb
512
521
  - lib/datadog/di/transport/input.rb
@@ -543,7 +552,6 @@ files:
543
552
  - lib/datadog/open_feature/transport.rb
544
553
  - lib/datadog/opentelemetry.rb
545
554
  - lib/datadog/opentelemetry/api/baggage.rb
546
- - lib/datadog/opentelemetry/api/baggage.rbs
547
555
  - lib/datadog/opentelemetry/api/context.rb
548
556
  - lib/datadog/opentelemetry/api/trace/span.rb
549
557
  - lib/datadog/opentelemetry/configuration/settings.rb
@@ -1060,7 +1068,6 @@ files:
1060
1068
  - lib/datadog/tracing/trace_segment.rb
1061
1069
  - lib/datadog/tracing/tracer.rb
1062
1070
  - lib/datadog/tracing/transport/http.rb
1063
- - lib/datadog/tracing/transport/http/api.rb
1064
1071
  - lib/datadog/tracing/transport/http/client.rb
1065
1072
  - lib/datadog/tracing/transport/http/statistics.rb
1066
1073
  - lib/datadog/tracing/transport/http/traces.rb
@@ -1083,8 +1090,8 @@ licenses:
1083
1090
  - Apache-2.0
1084
1091
  metadata:
1085
1092
  allowed_push_host: https://rubygems.org
1086
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.23.0/CHANGELOG.md
1087
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.23.0
1093
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.25.0/CHANGELOG.md
1094
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.25.0
1088
1095
  post_install_message:
1089
1096
  rdoc_options: []
1090
1097
  require_paths:
@@ -1096,7 +1103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
1096
1103
  version: 2.5.0
1097
1104
  - - "<"
1098
1105
  - !ruby/object:Gem::Version
1099
- version: '4.0'
1106
+ version: '4.1'
1100
1107
  required_rubygems_version: !ruby/object:Gem::Requirement
1101
1108
  requirements:
1102
1109
  - - ">="
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../../encoding'
4
- require_relative '../../../transport/http/api/map'
5
- require_relative '../../../transport/http/api/instance'
6
- require_relative '../../../transport/http/api/spec'
7
- require_relative 'negotiation'
8
- require_relative 'config'
9
-
10
- module Datadog
11
- module Core
12
- module Remote
13
- module Transport
14
- module HTTP
15
- # Namespace for API components
16
- module API
17
- # Default API versions
18
- ROOT = 'root'
19
- V7 = 'v0.7'
20
-
21
- module_function
22
-
23
- def defaults
24
- Core::Transport::HTTP::API::Map[
25
- ROOT => Spec.new do |s|
26
- s.info = Negotiation::API::Endpoint.new(
27
- '/info',
28
- )
29
- end,
30
- V7 => Spec.new do |s|
31
- s.config = Config::API::Endpoint.new(
32
- '/v0.7/config',
33
- Core::Encoding::JSONEncoder,
34
- )
35
- end,
36
- ]
37
- end
38
-
39
- class Instance < Core::Transport::HTTP::API::Instance
40
- include Config::API::Instance
41
- include Negotiation::API::Instance
42
- end
43
-
44
- class Spec < Core::Transport::HTTP::API::Spec
45
- include Config::API::Spec
46
- include Negotiation::API::Spec
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end