datadog 2.15.0 → 2.16.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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -2
  3. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  4. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
  5. data/ext/datadog_profiling_native_extension/extconf.rb +3 -0
  6. data/ext/datadog_profiling_native_extension/heap_recorder.c +8 -1
  7. data/ext/libdatadog_api/crashtracker.c +1 -9
  8. data/ext/libdatadog_api/crashtracker.h +5 -0
  9. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  10. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  11. data/ext/libdatadog_api/init.c +15 -0
  12. data/ext/libdatadog_api/library_config.c +122 -0
  13. data/ext/libdatadog_api/library_config.h +19 -0
  14. data/ext/libdatadog_api/process_discovery.c +117 -0
  15. data/ext/libdatadog_api/process_discovery.h +5 -0
  16. data/lib/datadog/appsec/actions_handler.rb +3 -2
  17. data/lib/datadog/appsec/assets/waf_rules/recommended.json +1344 -0
  18. data/lib/datadog/appsec/assets/waf_rules/strict.json +1344 -0
  19. data/lib/datadog/appsec/autoload.rb +1 -1
  20. data/lib/datadog/appsec/component.rb +11 -4
  21. data/lib/datadog/appsec/configuration/settings.rb +31 -18
  22. data/lib/datadog/appsec/context.rb +1 -1
  23. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  24. data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
  25. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  26. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +2 -3
  27. data/lib/datadog/appsec/contrib/devise/ext.rb +1 -0
  28. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
  29. data/lib/datadog/appsec/contrib/devise/patcher.rb +3 -5
  30. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +17 -4
  31. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  32. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  33. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  34. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  35. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  36. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +22 -32
  38. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  39. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +16 -16
  40. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  41. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  42. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  43. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  44. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  45. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  46. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  47. data/lib/datadog/appsec/event.rb +85 -95
  48. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +5 -2
  49. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  50. data/lib/datadog/appsec/monitor/gateway/watcher.rb +42 -12
  51. data/lib/datadog/appsec/processor/rule_loader.rb +26 -28
  52. data/lib/datadog/appsec/processor/rule_merger.rb +5 -5
  53. data/lib/datadog/appsec/processor.rb +1 -1
  54. data/lib/datadog/appsec/remote.rb +14 -13
  55. data/lib/datadog/appsec/response.rb +6 -6
  56. data/lib/datadog/appsec/security_engine/runner.rb +1 -1
  57. data/lib/datadog/appsec/security_event.rb +39 -0
  58. data/lib/datadog/appsec.rb +1 -1
  59. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  60. data/lib/datadog/core/configuration/components.rb +19 -10
  61. data/lib/datadog/core/configuration/option.rb +61 -25
  62. data/lib/datadog/core/configuration/settings.rb +10 -0
  63. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  64. data/lib/datadog/core/configuration.rb +24 -0
  65. data/lib/datadog/core/crashtracking/component.rb +1 -9
  66. data/lib/datadog/core/environment/git.rb +1 -0
  67. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  68. data/lib/datadog/core/metrics/client.rb +8 -7
  69. data/lib/datadog/core/process_discovery.rb +32 -0
  70. data/lib/datadog/core/remote/client.rb +7 -0
  71. data/lib/datadog/core/runtime/metrics.rb +1 -1
  72. data/lib/datadog/core/telemetry/component.rb +60 -50
  73. data/lib/datadog/core/telemetry/emitter.rb +17 -11
  74. data/lib/datadog/core/telemetry/event.rb +7 -4
  75. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  76. data/lib/datadog/core/telemetry/request.rb +3 -3
  77. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  78. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  79. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  80. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  81. data/lib/datadog/core/telemetry/transport/telemetry.rb +52 -0
  82. data/lib/datadog/core/telemetry/worker.rb +45 -0
  83. data/lib/datadog/core/utils/time.rb +12 -0
  84. data/lib/datadog/core/workers/async.rb +20 -2
  85. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  86. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  87. data/lib/datadog/core.rb +8 -0
  88. data/lib/datadog/di/boot.rb +34 -0
  89. data/lib/datadog/di/remote.rb +2 -0
  90. data/lib/datadog/di.rb +5 -32
  91. data/lib/datadog/error_tracking/collector.rb +87 -0
  92. data/lib/datadog/error_tracking/component.rb +167 -0
  93. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  94. data/lib/datadog/error_tracking/configuration.rb +11 -0
  95. data/lib/datadog/error_tracking/ext.rb +18 -0
  96. data/lib/datadog/error_tracking/extensions.rb +16 -0
  97. data/lib/datadog/error_tracking/filters.rb +77 -0
  98. data/lib/datadog/error_tracking.rb +18 -0
  99. data/lib/datadog/kit/identity.rb +1 -1
  100. data/lib/datadog/profiling/exporter.rb +1 -1
  101. data/lib/datadog/tracing/analytics.rb +1 -1
  102. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
  103. data/lib/datadog/tracing/contrib/karafka/monitor.rb +1 -1
  104. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  105. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  106. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  107. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  108. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  109. data/lib/datadog/tracing/distributed/datadog.rb +2 -2
  110. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  111. data/lib/datadog/tracing/span_operation.rb +38 -14
  112. data/lib/datadog/tracing/trace_operation.rb +15 -7
  113. data/lib/datadog/tracing/tracer.rb +7 -3
  114. data/lib/datadog/tracing/utils.rb +1 -1
  115. data/lib/datadog/version.rb +1 -1
  116. data/lib/datadog.rb +2 -3
  117. metadata +34 -8
  118. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  119. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  120. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  121. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -55,7 +55,7 @@ module Datadog
55
55
  span_id = Helpers.parse_hex_id(fetcher[@span_id_key])
56
56
 
57
57
  # Return early if this propagation is not valid
58
- return if span_id.nil? || span_id <= 0 || span_id >= Tracing::Utils::EXTERNAL_MAX_ID
58
+ return if span_id.nil? || span_id <= 0 || span_id > Tracing::Utils::EXTERNAL_MAX_ID
59
59
 
60
60
  # We don't need to try and convert sampled since B3 supports 0/1 (AUTO_REJECT/AUTO_KEEP)
61
61
  sampling_priority = Helpers.parse_decimal_id(fetcher[@sampled_key])
@@ -54,7 +54,7 @@ module Datadog
54
54
 
55
55
  span_id = Helpers.parse_hex_id(parts[1]) if parts.length > 1
56
56
  # Return early if this propagation is not valid
57
- return if span_id.nil? || span_id <= 0 || span_id >= Tracing::Utils::EXTERNAL_MAX_ID
57
+ return if span_id.nil? || span_id <= 0 || span_id > Tracing::Utils::EXTERNAL_MAX_ID
58
58
 
59
59
  sampling_priority = Helpers.parse_decimal_id(parts[2]) if parts.length > 2
60
60
 
@@ -89,7 +89,7 @@ module Datadog
89
89
  trace_id = Helpers.parse_decimal_id(fetcher_object[@trace_id_key])
90
90
 
91
91
  return unless trace_id
92
- return if trace_id <= 0 || trace_id >= Tracing::Utils::EXTERNAL_MAX_ID
92
+ return if trace_id <= 0 || trace_id > Tracing::Utils::EXTERNAL_MAX_ID
93
93
 
94
94
  trace_id
95
95
  end
@@ -98,7 +98,7 @@ module Datadog
98
98
  parent_id = Helpers.parse_decimal_id(fetcher_object[@parent_id_key])
99
99
 
100
100
  return unless parent_id
101
- return if parent_id <= 0 || parent_id >= Tracing::Utils::EXTERNAL_MAX_ID
101
+ return if parent_id <= 0 || parent_id > Tracing::Utils::EXTERNAL_MAX_ID
102
102
 
103
103
  parent_id
104
104
  end
@@ -9,6 +9,7 @@ module Datadog
9
9
  # {Datadog::Tracing::Sampling::RateSampler} is based on a sample rate.
10
10
  class RateSampler < Sampler
11
11
  KNUTH_FACTOR = 1111111111111111111
12
+ UINT64_MODULO = (1 << 64)
12
13
 
13
14
  # Initialize a {Datadog::Tracing::Sampling::RateSampler}.
14
15
  # This sampler keeps a random subset of the traces. Its main purpose is to
@@ -39,7 +40,7 @@ module Datadog
39
40
  end
40
41
 
41
42
  def sample?(trace)
42
- ((trace.id * KNUTH_FACTOR) % Tracing::Utils::EXTERNAL_MAX_ID) <= @sampling_id_threshold
43
+ ((trace.id * KNUTH_FACTOR) % UINT64_MODULO) <= @sampling_id_threshold
43
44
  end
44
45
 
45
46
  def sample!(trace)
@@ -28,6 +28,7 @@ module Datadog
28
28
  # Span attributes
29
29
  # NOTE: In the future, we should drop the me
30
30
  attr_reader \
31
+ :logger,
31
32
  :end_time,
32
33
  :id,
33
34
  :name,
@@ -37,10 +38,12 @@ module Datadog
37
38
  :start_time,
38
39
  :trace_id,
39
40
  :type
41
+
40
42
  attr_accessor :links, :status, :span_events
41
43
 
42
44
  def initialize(
43
45
  name,
46
+ logger: Datadog.logger,
44
47
  events: nil,
45
48
  on_error: nil,
46
49
  parent_id: 0,
@@ -54,6 +57,8 @@ module Datadog
54
57
  span_events: nil,
55
58
  id: nil
56
59
  )
60
+ @logger = logger
61
+
57
62
  # Ensure dynamically created strings are UTF-8 encoded.
58
63
  #
59
64
  # All strings created in Ruby land are UTF-8. The only sources of non-UTF-8 string are:
@@ -90,11 +95,17 @@ module Datadog
90
95
  set_tags(tags) if tags
91
96
 
92
97
  # Some other SpanOperation-specific behavior
93
- @events = events || Events.new
98
+ @events = events || Events.new(logger: logger)
94
99
  @span = nil
95
100
 
96
- # Subscribe :on_error event
97
- @events.on_error.wrap_default(&on_error) if on_error.is_a?(Proc)
101
+ if on_error.nil?
102
+ # Nothing, default error handler is already set up.
103
+ elsif on_error.is_a?(Proc)
104
+ # Subscribe :on_error event
105
+ @events.on_error.wrap_default(&on_error)
106
+ else
107
+ logger.warn("on_error argument to SpanOperation ignored because is not a Proc: #{on_error}")
108
+ end
98
109
 
99
110
  # Start the span with start time, if given.
100
111
  start(start_time) if start_time
@@ -130,6 +141,10 @@ module Datadog
130
141
  @resource = resource.nil? ? nil : Core::Utils.utf8_encode(resource) # Allow this to be explicitly set to nil
131
142
  end
132
143
 
144
+ def get_collector_or_initialize
145
+ @collector ||= yield
146
+ end
147
+
133
148
  def measure
134
149
  raise ArgumentError, 'Must provide block to measure!' unless block_given?
135
150
  # TODO: Should we just invoke the block and skip tracing instead?
@@ -143,7 +158,7 @@ module Datadog
143
158
  begin
144
159
  start
145
160
  rescue StandardError => e
146
- Datadog.logger.debug { "Failed to start span: #{e}" }
161
+ logger.debug { "Failed to start span: #{e}" }
147
162
  ensure
148
163
  # We should yield to the provided block when possible, as this
149
164
  # block is application code that we don't want to hinder.
@@ -161,7 +176,7 @@ module Datadog
161
176
  # Stop the span first, so timing is a more accurate.
162
177
  # If the span failed to start, timing may be inaccurate,
163
178
  # but this is not really a serious concern.
164
- stop
179
+ stop(exception: e)
165
180
 
166
181
  # Trigger the on_error event
167
182
  events.on_error.publish(self, e)
@@ -202,7 +217,7 @@ module Datadog
202
217
  #
203
218
  # steep:ignore:start
204
219
  # Steep issue fixed in https://github.com/soutaro/steep/pull/1467
205
- def stop(stop_time = nil)
220
+ def stop(stop_time = nil, exception: nil)
206
221
  # A span should not be stopped twice. Note that this is not thread-safe,
207
222
  # stop is called from multiple threads, a given span might be stopped
208
223
  # several times. Again, one should not do this, so this test is more a
@@ -220,7 +235,7 @@ module Datadog
220
235
  @duration_end = stop_time.nil? ? duration_marker : nil
221
236
 
222
237
  # Trigger after_stop event
223
- events.after_stop.publish(self)
238
+ events.after_stop.publish(self, exception)
224
239
 
225
240
  self
226
241
  end
@@ -236,6 +251,10 @@ module Datadog
236
251
  !@end_time.nil?
237
252
  end
238
253
 
254
+ def root?
255
+ parent_id == 0
256
+ end
257
+
239
258
  # for backwards compatibility
240
259
  def start_time=(time)
241
260
  time.tap { start(time) }
@@ -349,11 +368,13 @@ module Datadog
349
368
  DEFAULT_ON_ERROR = proc { |span_op, error| span_op.set_error(error) unless span_op.nil? }
350
369
 
351
370
  attr_reader \
371
+ :logger,
352
372
  :after_finish,
353
373
  :after_stop,
354
374
  :before_start
355
375
 
356
- def initialize(on_error: nil)
376
+ def initialize(logger: Datadog.logger, on_error: nil)
377
+ @logger = logger
357
378
  @after_finish = AfterFinish.new
358
379
  @after_stop = AfterStop.new
359
380
  @before_start = BeforeStart.new
@@ -362,7 +383,7 @@ module Datadog
362
383
  # This event is lazily initialized as error paths
363
384
  # are normally less common that non-error paths.
364
385
  def on_error
365
- @on_error ||= OnError.new(DEFAULT_ON_ERROR)
386
+ @on_error ||= OnError.new(DEFAULT_ON_ERROR, logger: logger)
366
387
  end
367
388
 
368
389
  # Triggered when the span is finished, regardless of error.
@@ -388,10 +409,13 @@ module Datadog
388
409
 
389
410
  # Triggered when the span raises an error during measurement.
390
411
  class OnError
391
- def initialize(default)
412
+ def initialize(default, logger: Datadog.logger)
392
413
  @handler = default
414
+ @logger = logger
393
415
  end
394
416
 
417
+ attr_reader :logger
418
+
395
419
  # Call custom error handler but fallback to default behavior on failure.
396
420
 
397
421
  # DEV: Revisit this before full 1.0 release.
@@ -405,9 +429,9 @@ module Datadog
405
429
  begin
406
430
  yield(op, error)
407
431
  rescue StandardError => e
408
- Datadog.logger.debug do
432
+ logger.debug do
409
433
  "Custom on_error handler #{@handler} failed, using fallback behavior. \
410
- Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
434
+ Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
411
435
  end
412
436
 
413
437
  original.call(op, error) if original
@@ -419,8 +443,8 @@ module Datadog
419
443
  begin
420
444
  @handler.call(*args)
421
445
  rescue StandardError => e
422
- Datadog.logger.debug do
423
- "Error in on_error handler '#{@default}': #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
446
+ logger.debug do
447
+ "Error in on_error handler '#{@default}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
424
448
  end
425
449
  end
426
450
 
@@ -40,6 +40,7 @@ module Datadog
40
40
  :baggage
41
41
 
42
42
  attr_reader \
43
+ :logger,
43
44
  :active_span_count,
44
45
  :active_span,
45
46
  :id,
@@ -55,6 +56,7 @@ module Datadog
55
56
  :service
56
57
 
57
58
  def initialize(
59
+ logger: Datadog.logger,
58
60
  agent_sample_rate: nil,
59
61
  events: nil,
60
62
  hostname: nil,
@@ -79,8 +81,9 @@ module Datadog
79
81
  remote_parent: false,
80
82
  tracer: nil,
81
83
  baggage: nil
82
-
83
84
  )
85
+ @logger = logger
86
+
84
87
  # Attributes
85
88
  @id = id || Tracing::Utils::TraceId.next_id
86
89
  @max_length = max_length || DEFAULT_MAX_LENGTH
@@ -204,6 +207,7 @@ module Datadog
204
207
 
205
208
  def measure(
206
209
  op_name,
210
+ logger: Datadog.logger,
207
211
  events: nil,
208
212
  on_error: nil,
209
213
  resource: nil,
@@ -217,7 +221,9 @@ module Datadog
217
221
  # Don't allow more span measurements if the
218
222
  # trace is already completed. Prevents multiple
219
223
  # root spans with parent_span_id = 0.
220
- return yield(SpanOperation.new(op_name), TraceOperation.new) if finished? || full?
224
+ return yield( # rubocop:disable Style/MultilineIfModifier
225
+ SpanOperation.new(op_name, logger: logger),
226
+ TraceOperation.new(logger: logger)) if finished? || full?
221
227
 
222
228
  # Create new span
223
229
  span_op = build_span(
@@ -238,6 +244,7 @@ module Datadog
238
244
 
239
245
  def build_span(
240
246
  op_name,
247
+ logger: Datadog.logger,
241
248
  events: nil,
242
249
  on_error: nil,
243
250
  resource: nil,
@@ -259,7 +266,7 @@ module Datadog
259
266
  parent_id = parent ? parent.id : @parent_span_id || 0
260
267
 
261
268
  # Build events
262
- events ||= SpanOperation::Events.new
269
+ events ||= SpanOperation::Events.new(logger: logger)
263
270
 
264
271
  # Before start: activate the span, publish events.
265
272
  events.before_start.subscribe do |span_op|
@@ -274,6 +281,7 @@ module Datadog
274
281
  # Build a new span operation
275
282
  SpanOperation.new(
276
283
  op_name,
284
+ logger: logger,
277
285
  events: events,
278
286
  on_error: on_error,
279
287
  parent_id: parent_id,
@@ -286,10 +294,10 @@ module Datadog
286
294
  id: id
287
295
  )
288
296
  rescue StandardError => e
289
- Datadog.logger.debug { "Failed to build new span: #{e}" }
297
+ logger.debug { "Failed to build new span: #{e}" }
290
298
 
291
299
  # Return dummy span
292
- SpanOperation.new(op_name)
300
+ SpanOperation.new(op_name, logger: logger)
293
301
  end
294
302
  end
295
303
 
@@ -465,7 +473,7 @@ module Datadog
465
473
  # Publish :span_before_start event
466
474
  events.span_before_start.publish(span_op, self)
467
475
  rescue StandardError => e
468
- Datadog.logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
476
+ logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
469
477
  end
470
478
  end
471
479
 
@@ -489,7 +497,7 @@ module Datadog
489
497
  # Publish :trace_finished event
490
498
  events.trace_finished.publish(self) if finished?
491
499
  rescue StandardError => e
492
- Datadog.logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
500
+ logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
493
501
  end
494
502
  end
495
503
 
@@ -342,6 +342,7 @@ module Datadog
342
342
  digest.trace_sampling_priority
343
343
  end
344
344
  TraceOperation.new(
345
+ logger: logger,
345
346
  hostname: hostname,
346
347
  profiling_enabled: profiling_enabled,
347
348
  apm_tracing_enabled: apm_tracing_enabled,
@@ -359,6 +360,7 @@ module Datadog
359
360
  )
360
361
  else
361
362
  TraceOperation.new(
363
+ logger: logger,
362
364
  hostname: hostname,
363
365
  profiling_enabled: profiling_enabled,
364
366
  apm_tracing_enabled: apm_tracing_enabled,
@@ -410,12 +412,13 @@ module Datadog
410
412
  )
411
413
  trace = _trace || start_trace(continue_from: continue_from)
412
414
 
413
- events = SpanOperation::Events.new
415
+ events = SpanOperation::Events.new(logger: logger)
414
416
 
415
417
  if block
416
418
  # Ignore start time if a block has been given
417
419
  trace.measure(
418
420
  name,
421
+ logger: logger,
419
422
  events: events,
420
423
  on_error: on_error,
421
424
  resource: resource,
@@ -429,6 +432,7 @@ module Datadog
429
432
  # Return the new span
430
433
  span = trace.build_span(
431
434
  name,
435
+ logger: logger,
432
436
  events: events,
433
437
  on_error: on_error,
434
438
  resource: resource,
@@ -541,10 +545,10 @@ module Datadog
541
545
 
542
546
  # TODO: Make these dummy objects singletons to preserve memory.
543
547
  def skip_trace(name)
544
- span = SpanOperation.new(name)
548
+ span = SpanOperation.new(name, logger: logger)
545
549
 
546
550
  if block_given?
547
- trace = TraceOperation.new
551
+ trace = TraceOperation.new(logger: logger)
548
552
  yield(span, trace)
549
553
  else
550
554
  span
@@ -24,7 +24,7 @@ module Datadog
24
24
 
25
25
  # While we only generate 63-bit integers due to limitations in other languages, we support
26
26
  # parsing 64-bit integers for distributed tracing since an upstream system may generate one
27
- EXTERNAL_MAX_ID = 1 << 64
27
+ EXTERNAL_MAX_ID = (1 << 64) - 1
28
28
 
29
29
  # We use a custom random number generator because we want no interference
30
30
  # with the default one. Using the default prng, we could break code that
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 15
6
+ MINOR = 16
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
data/lib/datadog.rb CHANGED
@@ -7,7 +7,6 @@ require_relative 'datadog/tracing/contrib'
7
7
  # Load other products (must follow tracing)
8
8
  require_relative 'datadog/profiling'
9
9
  require_relative 'datadog/appsec'
10
- # Line probes will not work on Ruby < 2.6 because of lack of :script_compiled
11
- # trace point. Only load DI on supported Ruby versions.
12
- require_relative 'datadog/di' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'
10
+ require_relative 'datadog/di'
11
+ require_relative 'datadog/error_tracking'
13
12
  require_relative 'datadog/kit'
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.15.0
4
+ version: 2.16.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-04-22 00:00:00.000000000 Z
11
+ date: 2025-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -31,6 +31,9 @@ dependencies:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '3.4'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 3.4.1
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +41,9 @@ dependencies:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
43
  version: '3.4'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 3.4.1
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: libddwaf
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -146,10 +152,16 @@ files:
146
152
  - ext/datadog_profiling_native_extension/unsafe_api_calls_check.c
147
153
  - ext/datadog_profiling_native_extension/unsafe_api_calls_check.h
148
154
  - ext/libdatadog_api/crashtracker.c
155
+ - ext/libdatadog_api/crashtracker.h
149
156
  - ext/libdatadog_api/datadog_ruby_common.c
150
157
  - ext/libdatadog_api/datadog_ruby_common.h
151
158
  - ext/libdatadog_api/extconf.rb
159
+ - ext/libdatadog_api/init.c
160
+ - ext/libdatadog_api/library_config.c
161
+ - ext/libdatadog_api/library_config.h
152
162
  - ext/libdatadog_api/macos_development.md
163
+ - ext/libdatadog_api/process_discovery.c
164
+ - ext/libdatadog_api/process_discovery.h
153
165
  - ext/libdatadog_extconf_helpers.rb
154
166
  - lib/datadog.rb
155
167
  - lib/datadog/appsec.rb
@@ -247,6 +259,7 @@ files:
247
259
  - lib/datadog/appsec/security_engine.rb
248
260
  - lib/datadog/appsec/security_engine/result.rb
249
261
  - lib/datadog/appsec/security_engine/runner.rb
262
+ - lib/datadog/appsec/security_event.rb
250
263
  - lib/datadog/appsec/utils.rb
251
264
  - lib/datadog/appsec/utils/http.rb
252
265
  - lib/datadog/appsec/utils/http/media_range.rb
@@ -260,6 +273,7 @@ files:
260
273
  - lib/datadog/core/chunker.rb
261
274
  - lib/datadog/core/configuration.rb
262
275
  - lib/datadog/core/configuration/agent_settings_resolver.rb
276
+ - lib/datadog/core/configuration/agentless_settings_resolver.rb
263
277
  - lib/datadog/core/configuration/base.rb
264
278
  - lib/datadog/core/configuration/components.rb
265
279
  - lib/datadog/core/configuration/ext.rb
@@ -267,6 +281,7 @@ files:
267
281
  - lib/datadog/core/configuration/option_definition.rb
268
282
  - lib/datadog/core/configuration/options.rb
269
283
  - lib/datadog/core/configuration/settings.rb
284
+ - lib/datadog/core/configuration/stable_config.rb
270
285
  - lib/datadog/core/contrib/rails/utils.rb
271
286
  - lib/datadog/core/crashtracking/component.rb
272
287
  - lib/datadog/core/crashtracking/tag_builder.rb
@@ -302,6 +317,7 @@ files:
302
317
  - lib/datadog/core/metrics/metric.rb
303
318
  - lib/datadog/core/metrics/options.rb
304
319
  - lib/datadog/core/pin.rb
320
+ - lib/datadog/core/process_discovery.rb
305
321
  - lib/datadog/core/rate_limiter.rb
306
322
  - lib/datadog/core/remote.rb
307
323
  - lib/datadog/core/remote/client.rb
@@ -334,16 +350,17 @@ files:
334
350
  - lib/datadog/core/telemetry/event.rb
335
351
  - lib/datadog/core/telemetry/ext.rb
336
352
  - lib/datadog/core/telemetry/http/adapters/net.rb
337
- - lib/datadog/core/telemetry/http/env.rb
338
- - lib/datadog/core/telemetry/http/ext.rb
339
- - lib/datadog/core/telemetry/http/response.rb
340
- - lib/datadog/core/telemetry/http/transport.rb
341
353
  - lib/datadog/core/telemetry/logger.rb
342
354
  - lib/datadog/core/telemetry/logging.rb
343
355
  - lib/datadog/core/telemetry/metric.rb
344
356
  - lib/datadog/core/telemetry/metrics_collection.rb
345
357
  - lib/datadog/core/telemetry/metrics_manager.rb
346
358
  - lib/datadog/core/telemetry/request.rb
359
+ - lib/datadog/core/telemetry/transport/http.rb
360
+ - lib/datadog/core/telemetry/transport/http/api.rb
361
+ - lib/datadog/core/telemetry/transport/http/client.rb
362
+ - lib/datadog/core/telemetry/transport/http/telemetry.rb
363
+ - lib/datadog/core/telemetry/transport/telemetry.rb
347
364
  - lib/datadog/core/telemetry/worker.rb
348
365
  - lib/datadog/core/transport/ext.rb
349
366
  - lib/datadog/core/transport/http.rb
@@ -391,6 +408,7 @@ files:
391
408
  - lib/datadog/core/workers/runtime_metrics.rb
392
409
  - lib/datadog/di.rb
393
410
  - lib/datadog/di/base.rb
411
+ - lib/datadog/di/boot.rb
394
412
  - lib/datadog/di/code_tracker.rb
395
413
  - lib/datadog/di/component.rb
396
414
  - lib/datadog/di/configuration.rb
@@ -419,6 +437,14 @@ files:
419
437
  - lib/datadog/di/transport/http/input.rb
420
438
  - lib/datadog/di/transport/input.rb
421
439
  - lib/datadog/di/utils.rb
440
+ - lib/datadog/error_tracking.rb
441
+ - lib/datadog/error_tracking/collector.rb
442
+ - lib/datadog/error_tracking/component.rb
443
+ - lib/datadog/error_tracking/configuration.rb
444
+ - lib/datadog/error_tracking/configuration/settings.rb
445
+ - lib/datadog/error_tracking/ext.rb
446
+ - lib/datadog/error_tracking/extensions.rb
447
+ - lib/datadog/error_tracking/filters.rb
422
448
  - lib/datadog/kit.rb
423
449
  - lib/datadog/kit/appsec/events.rb
424
450
  - lib/datadog/kit/enable_core_dumps.rb
@@ -948,8 +974,8 @@ licenses:
948
974
  - Apache-2.0
949
975
  metadata:
950
976
  allowed_push_host: https://rubygems.org
951
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.15.0/CHANGELOG.md
952
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.15.0
977
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.16.0/CHANGELOG.md
978
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.16.0
953
979
  post_install_message:
954
980
  rdoc_options: []
955
981
  require_paths:
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module Core
5
- module Telemetry
6
- module Http
7
- # Data structure for an HTTP request
8
- class Env
9
- attr_accessor :path, :body
10
-
11
- attr_writer :headers
12
-
13
- def headers
14
- @headers ||= {}
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module Core
5
- module Telemetry
6
- module Http
7
- module Ext
8
- HEADER_DD_API_KEY = 'DD-API-KEY'
9
- HEADER_CONTENT_TYPE = 'Content-Type'
10
- HEADER_CONTENT_LENGTH = 'Content-Length'
11
- HEADER_DD_TELEMETRY_API_VERSION = 'DD-Telemetry-API-Version'
12
- HEADER_DD_TELEMETRY_REQUEST_TYPE = 'DD-Telemetry-Request-Type'
13
- HEADER_TELEMETRY_DEBUG_ENABLED = 'DD-Telemetry-Debug-Enabled'
14
- HEADER_CLIENT_LIBRARY_LANGUAGE = 'DD-Client-Library-Language'
15
- HEADER_CLIENT_LIBRARY_VERSION = 'DD-Client-Library-Version'
16
-
17
- CONTENT_TYPE_APPLICATION_JSON = 'application/json'
18
- API_VERSION = 'v2'
19
-
20
- AGENTLESS_HOST_PREFIX = 'instrumentation-telemetry-intake'
21
-
22
- AGENT_ENDPOINT = '/telemetry/proxy/api/v2/apmtelemetry'
23
- AGENTLESS_ENDPOINT = '/api/v2/apmtelemetry'
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module Core
5
- module Telemetry
6
- module Http
7
- # Module for base HTTP response
8
- module Response
9
- def payload
10
- nil
11
- end
12
-
13
- def ok?
14
- nil
15
- end
16
-
17
- def unsupported?
18
- nil
19
- end
20
-
21
- def not_found?
22
- nil
23
- end
24
-
25
- def client_error?
26
- nil
27
- end
28
-
29
- def server_error?
30
- nil
31
- end
32
-
33
- def internal_error?
34
- nil
35
- end
36
-
37
- def code
38
- nil
39
- end
40
-
41
- def inspect
42
- "#{self.class} ok?:#{ok?} unsupported?:#{unsupported?}, " \
43
- "not_found?:#{not_found?}, client_error?:#{client_error?}, " \
44
- "server_error?:#{server_error?}, internal_error?:#{internal_error?}, " \
45
- "payload:#{payload}"
46
- end
47
- end
48
-
49
- # A generic error response for internal errors
50
- class InternalErrorResponse
51
- include Response
52
-
53
- attr_reader :error
54
-
55
- def initialize(error)
56
- @error = error
57
- end
58
-
59
- def internal_error?
60
- true
61
- end
62
-
63
- def inspect
64
- "#{super}, error_type:#{error.class} error:#{error}"
65
- end
66
- end
67
- end
68
- end
69
- end
70
- end