datadog 2.15.0 → 2.17.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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -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/encoded_profile.c +22 -12
  6. data/ext/datadog_profiling_native_extension/encoded_profile.h +1 -0
  7. data/ext/datadog_profiling_native_extension/extconf.rb +3 -0
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +8 -1
  9. data/ext/datadog_profiling_native_extension/http_transport.c +45 -72
  10. data/ext/datadog_profiling_native_extension/stack_recorder.c +4 -5
  11. data/ext/libdatadog_api/crashtracker.c +11 -12
  12. data/ext/libdatadog_api/crashtracker.h +5 -0
  13. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  14. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  15. data/ext/libdatadog_api/init.c +15 -0
  16. data/ext/libdatadog_api/library_config.c +122 -0
  17. data/ext/libdatadog_api/library_config.h +19 -0
  18. data/ext/libdatadog_api/macos_development.md +3 -3
  19. data/ext/libdatadog_api/process_discovery.c +117 -0
  20. data/ext/libdatadog_api/process_discovery.h +5 -0
  21. data/ext/libdatadog_extconf_helpers.rb +1 -1
  22. data/lib/datadog/appsec/actions_handler.rb +3 -2
  23. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  24. data/lib/datadog/appsec/api_security.rb +9 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +1344 -0
  26. data/lib/datadog/appsec/assets/waf_rules/strict.json +1344 -0
  27. data/lib/datadog/appsec/autoload.rb +1 -1
  28. data/lib/datadog/appsec/component.rb +11 -4
  29. data/lib/datadog/appsec/configuration/settings.rb +31 -18
  30. data/lib/datadog/appsec/context.rb +1 -1
  31. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  32. data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
  33. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  34. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +2 -3
  35. data/lib/datadog/appsec/contrib/devise/ext.rb +1 -0
  36. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
  37. data/lib/datadog/appsec/contrib/devise/patcher.rb +3 -5
  38. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +17 -4
  39. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  40. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  41. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  42. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  43. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  44. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  45. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +22 -32
  46. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  47. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +16 -16
  48. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  49. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  50. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  51. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  52. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  53. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  54. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  55. data/lib/datadog/appsec/event.rb +85 -95
  56. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +5 -2
  57. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  58. data/lib/datadog/appsec/monitor/gateway/watcher.rb +42 -12
  59. data/lib/datadog/appsec/processor/rule_loader.rb +26 -28
  60. data/lib/datadog/appsec/processor/rule_merger.rb +5 -5
  61. data/lib/datadog/appsec/processor.rb +1 -1
  62. data/lib/datadog/appsec/remote.rb +14 -13
  63. data/lib/datadog/appsec/response.rb +6 -6
  64. data/lib/datadog/appsec/security_engine/runner.rb +1 -1
  65. data/lib/datadog/appsec/security_event.rb +39 -0
  66. data/lib/datadog/appsec.rb +1 -1
  67. data/lib/datadog/core/buffer/random.rb +18 -2
  68. data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -5
  69. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  70. data/lib/datadog/core/configuration/components.rb +48 -30
  71. data/lib/datadog/core/configuration/components_state.rb +23 -0
  72. data/lib/datadog/core/configuration/option.rb +79 -43
  73. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  74. data/lib/datadog/core/configuration/options.rb +1 -1
  75. data/lib/datadog/core/configuration/settings.rb +20 -10
  76. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  77. data/lib/datadog/core/configuration.rb +40 -16
  78. data/lib/datadog/core/crashtracking/component.rb +3 -10
  79. data/lib/datadog/core/encoding.rb +1 -1
  80. data/lib/datadog/core/environment/cgroup.rb +10 -12
  81. data/lib/datadog/core/environment/container.rb +38 -40
  82. data/lib/datadog/core/environment/ext.rb +6 -6
  83. data/lib/datadog/core/environment/git.rb +1 -0
  84. data/lib/datadog/core/environment/identity.rb +3 -3
  85. data/lib/datadog/core/environment/platform.rb +3 -3
  86. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  87. data/lib/datadog/core/error.rb +11 -9
  88. data/lib/datadog/core/logger.rb +2 -2
  89. data/lib/datadog/core/metrics/client.rb +20 -21
  90. data/lib/datadog/core/metrics/logging.rb +5 -5
  91. data/lib/datadog/core/process_discovery.rb +32 -0
  92. data/lib/datadog/core/rate_limiter.rb +4 -2
  93. data/lib/datadog/core/remote/client.rb +39 -31
  94. data/lib/datadog/core/remote/component.rb +3 -3
  95. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  96. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  97. data/lib/datadog/core/remote/transport/http/client.rb +1 -1
  98. data/lib/datadog/core/remote/transport/http/config.rb +21 -5
  99. data/lib/datadog/core/remote/transport/http/negotiation.rb +1 -1
  100. data/lib/datadog/core/runtime/metrics.rb +4 -4
  101. data/lib/datadog/core/telemetry/component.rb +78 -53
  102. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  103. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  104. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  105. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  106. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  107. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  108. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  109. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  110. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  111. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  112. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  113. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  114. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  115. data/lib/datadog/core/telemetry/event.rb +17 -472
  116. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  117. data/lib/datadog/core/telemetry/logger.rb +1 -1
  118. data/lib/datadog/core/telemetry/metric.rb +3 -3
  119. data/lib/datadog/core/telemetry/request.rb +3 -3
  120. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  121. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  122. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  123. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  124. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  125. data/lib/datadog/core/telemetry/worker.rb +90 -24
  126. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  127. data/lib/datadog/core/transport/http/builder.rb +13 -13
  128. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  129. data/lib/datadog/core/utils/duration.rb +32 -32
  130. data/lib/datadog/core/utils/forking.rb +2 -2
  131. data/lib/datadog/core/utils/network.rb +6 -6
  132. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  133. data/lib/datadog/core/utils/time.rb +20 -0
  134. data/lib/datadog/core/utils/truncation.rb +21 -0
  135. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  136. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  137. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  138. data/lib/datadog/core/worker.rb +1 -1
  139. data/lib/datadog/core/workers/async.rb +29 -12
  140. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  141. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  142. data/lib/datadog/core.rb +8 -0
  143. data/lib/datadog/di/boot.rb +34 -0
  144. data/lib/datadog/di/remote.rb +2 -0
  145. data/lib/datadog/di.rb +5 -32
  146. data/lib/datadog/error_tracking/collector.rb +87 -0
  147. data/lib/datadog/error_tracking/component.rb +167 -0
  148. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  149. data/lib/datadog/error_tracking/configuration.rb +11 -0
  150. data/lib/datadog/error_tracking/ext.rb +18 -0
  151. data/lib/datadog/error_tracking/extensions.rb +16 -0
  152. data/lib/datadog/error_tracking/filters.rb +77 -0
  153. data/lib/datadog/error_tracking.rb +18 -0
  154. data/lib/datadog/kit/identity.rb +1 -1
  155. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  156. data/lib/datadog/profiling/exporter.rb +1 -1
  157. data/lib/datadog/profiling/ext.rb +0 -1
  158. data/lib/datadog/profiling/flush.rb +1 -1
  159. data/lib/datadog/profiling/http_transport.rb +1 -6
  160. data/lib/datadog/profiling/scheduler.rb +8 -1
  161. data/lib/datadog/profiling/tag_builder.rb +1 -5
  162. data/lib/datadog/tracing/analytics.rb +1 -1
  163. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
  164. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  165. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  166. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  167. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  168. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  169. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -5
  170. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -5
  171. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -5
  172. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
  173. data/lib/datadog/tracing/contrib/karafka/monitor.rb +1 -1
  174. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  175. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  176. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  177. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  178. data/lib/datadog/tracing/contrib/support.rb +28 -0
  179. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  180. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  181. data/lib/datadog/tracing/distributed/datadog.rb +2 -2
  182. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  183. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  184. data/lib/datadog/tracing/span_operation.rb +38 -14
  185. data/lib/datadog/tracing/trace_operation.rb +15 -7
  186. data/lib/datadog/tracing/tracer.rb +7 -3
  187. data/lib/datadog/tracing/utils.rb +1 -1
  188. data/lib/datadog/version.rb +1 -1
  189. data/lib/datadog.rb +2 -3
  190. metadata +53 -10
  191. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  192. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  193. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  194. 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
@@ -10,17 +10,17 @@ module Datadog
10
10
  # Adds error tagging behavior
11
11
  # @public_api
12
12
  module Errors
13
- def set_error(e)
13
+ def set_error(error)
14
14
  Datadog::Core.log_deprecation do
15
15
  'Errors.set_error(..) is deprecated. ' \
16
16
  'Use Errors.set_error_tags(..) instead.'
17
17
  end
18
- set_error_tags(e)
18
+ set_error_tags(error)
19
19
  end
20
20
 
21
21
  # Mark the span with the given error.
22
- def set_error_tags(e)
23
- e = Core::Error.build_from(e)
22
+ def set_error_tags(error)
23
+ e = Core::Error.build_from(error)
24
24
 
25
25
  set_tag(Ext::Errors::TAG_TYPE, e.type) unless e.type.empty?
26
26
  set_tag(Ext::Errors::TAG_MSG, e.message) unless e.message.empty?
@@ -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 = 17
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.17.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-06-02 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
@@ -58,14 +64,14 @@ dependencies:
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: 16.0.1.1.0
67
+ version: 18.1.0.1.0
62
68
  type: :runtime
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: 16.0.1.1.0
74
+ version: 18.1.0.1.0
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: logger
71
77
  requirement: !ruby/object:Gem::Requirement
@@ -146,16 +152,24 @@ 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
156
168
  - lib/datadog/appsec/actions_handler.rb
157
169
  - lib/datadog/appsec/actions_handler/serializable_backtrace.rb
158
170
  - lib/datadog/appsec/anonymizer.rb
171
+ - lib/datadog/appsec/api_security.rb
172
+ - lib/datadog/appsec/api_security/lru_cache.rb
159
173
  - lib/datadog/appsec/assets.rb
160
174
  - lib/datadog/appsec/assets/blocked.html
161
175
  - lib/datadog/appsec/assets/blocked.json
@@ -247,6 +261,7 @@ files:
247
261
  - lib/datadog/appsec/security_engine.rb
248
262
  - lib/datadog/appsec/security_engine/result.rb
249
263
  - lib/datadog/appsec/security_engine/runner.rb
264
+ - lib/datadog/appsec/security_event.rb
250
265
  - lib/datadog/appsec/utils.rb
251
266
  - lib/datadog/appsec/utils/http.rb
252
267
  - lib/datadog/appsec/utils/http/media_range.rb
@@ -260,13 +275,16 @@ files:
260
275
  - lib/datadog/core/chunker.rb
261
276
  - lib/datadog/core/configuration.rb
262
277
  - lib/datadog/core/configuration/agent_settings_resolver.rb
278
+ - lib/datadog/core/configuration/agentless_settings_resolver.rb
263
279
  - lib/datadog/core/configuration/base.rb
264
280
  - lib/datadog/core/configuration/components.rb
281
+ - lib/datadog/core/configuration/components_state.rb
265
282
  - lib/datadog/core/configuration/ext.rb
266
283
  - lib/datadog/core/configuration/option.rb
267
284
  - lib/datadog/core/configuration/option_definition.rb
268
285
  - lib/datadog/core/configuration/options.rb
269
286
  - lib/datadog/core/configuration/settings.rb
287
+ - lib/datadog/core/configuration/stable_config.rb
270
288
  - lib/datadog/core/contrib/rails/utils.rb
271
289
  - lib/datadog/core/crashtracking/component.rb
272
290
  - lib/datadog/core/crashtracking/tag_builder.rb
@@ -302,6 +320,7 @@ files:
302
320
  - lib/datadog/core/metrics/metric.rb
303
321
  - lib/datadog/core/metrics/options.rb
304
322
  - lib/datadog/core/pin.rb
323
+ - lib/datadog/core/process_discovery.rb
305
324
  - lib/datadog/core/rate_limiter.rb
306
325
  - lib/datadog/core/remote.rb
307
326
  - lib/datadog/core/remote/client.rb
@@ -332,18 +351,31 @@ files:
332
351
  - lib/datadog/core/telemetry/component.rb
333
352
  - lib/datadog/core/telemetry/emitter.rb
334
353
  - lib/datadog/core/telemetry/event.rb
354
+ - lib/datadog/core/telemetry/event/app_client_configuration_change.rb
355
+ - lib/datadog/core/telemetry/event/app_closing.rb
356
+ - lib/datadog/core/telemetry/event/app_dependencies_loaded.rb
357
+ - lib/datadog/core/telemetry/event/app_heartbeat.rb
358
+ - lib/datadog/core/telemetry/event/app_integrations_change.rb
359
+ - lib/datadog/core/telemetry/event/app_started.rb
360
+ - lib/datadog/core/telemetry/event/base.rb
361
+ - lib/datadog/core/telemetry/event/distributions.rb
362
+ - lib/datadog/core/telemetry/event/generate_metrics.rb
363
+ - lib/datadog/core/telemetry/event/log.rb
364
+ - lib/datadog/core/telemetry/event/message_batch.rb
365
+ - lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb
335
366
  - lib/datadog/core/telemetry/ext.rb
336
367
  - 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
368
  - lib/datadog/core/telemetry/logger.rb
342
369
  - lib/datadog/core/telemetry/logging.rb
343
370
  - lib/datadog/core/telemetry/metric.rb
344
371
  - lib/datadog/core/telemetry/metrics_collection.rb
345
372
  - lib/datadog/core/telemetry/metrics_manager.rb
346
373
  - lib/datadog/core/telemetry/request.rb
374
+ - lib/datadog/core/telemetry/transport/http.rb
375
+ - lib/datadog/core/telemetry/transport/http/api.rb
376
+ - lib/datadog/core/telemetry/transport/http/client.rb
377
+ - lib/datadog/core/telemetry/transport/http/telemetry.rb
378
+ - lib/datadog/core/telemetry/transport/telemetry.rb
347
379
  - lib/datadog/core/telemetry/worker.rb
348
380
  - lib/datadog/core/transport/ext.rb
349
381
  - lib/datadog/core/transport/http.rb
@@ -374,6 +406,7 @@ files:
374
406
  - lib/datadog/core/utils/safe_dup.rb
375
407
  - lib/datadog/core/utils/sequence.rb
376
408
  - lib/datadog/core/utils/time.rb
409
+ - lib/datadog/core/utils/truncation.rb
377
410
  - lib/datadog/core/utils/url.rb
378
411
  - lib/datadog/core/vendor/multipart-post/LICENSE
379
412
  - lib/datadog/core/vendor/multipart-post/multipart.rb
@@ -391,6 +424,7 @@ files:
391
424
  - lib/datadog/core/workers/runtime_metrics.rb
392
425
  - lib/datadog/di.rb
393
426
  - lib/datadog/di/base.rb
427
+ - lib/datadog/di/boot.rb
394
428
  - lib/datadog/di/code_tracker.rb
395
429
  - lib/datadog/di/component.rb
396
430
  - lib/datadog/di/configuration.rb
@@ -419,6 +453,14 @@ files:
419
453
  - lib/datadog/di/transport/http/input.rb
420
454
  - lib/datadog/di/transport/input.rb
421
455
  - lib/datadog/di/utils.rb
456
+ - lib/datadog/error_tracking.rb
457
+ - lib/datadog/error_tracking/collector.rb
458
+ - lib/datadog/error_tracking/component.rb
459
+ - lib/datadog/error_tracking/configuration.rb
460
+ - lib/datadog/error_tracking/configuration/settings.rb
461
+ - lib/datadog/error_tracking/ext.rb
462
+ - lib/datadog/error_tracking/extensions.rb
463
+ - lib/datadog/error_tracking/filters.rb
422
464
  - lib/datadog/kit.rb
423
465
  - lib/datadog/kit/appsec/events.rb
424
466
  - lib/datadog/kit/enable_core_dumps.rb
@@ -863,6 +905,7 @@ files:
863
905
  - lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb
864
906
  - lib/datadog/tracing/contrib/sucker_punch/integration.rb
865
907
  - lib/datadog/tracing/contrib/sucker_punch/patcher.rb
908
+ - lib/datadog/tracing/contrib/support.rb
866
909
  - lib/datadog/tracing/contrib/trilogy/configuration/settings.rb
867
910
  - lib/datadog/tracing/contrib/trilogy/ext.rb
868
911
  - lib/datadog/tracing/contrib/trilogy/instrumentation.rb
@@ -948,8 +991,8 @@ licenses:
948
991
  - Apache-2.0
949
992
  metadata:
950
993
  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
994
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.17.0/CHANGELOG.md
995
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.17.0
953
996
  post_install_message:
954
997
  rdoc_options: []
955
998
  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