datadog 2.28.0 → 2.30.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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -1
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +82 -12
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +32 -11
  5. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +3 -1
  6. data/ext/datadog_profiling_native_extension/extconf.rb +9 -24
  7. data/ext/datadog_profiling_native_extension/heap_recorder.c +186 -55
  8. data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
  9. data/ext/datadog_profiling_native_extension/http_transport.c +51 -64
  10. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
  11. data/ext/datadog_profiling_native_extension/profiling.c +3 -1
  12. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +24 -8
  13. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -3
  14. data/ext/datadog_profiling_native_extension/stack_recorder.c +63 -48
  15. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -1
  16. data/ext/libdatadog_api/crashtracker.c +5 -0
  17. data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
  18. data/ext/libdatadog_api/extconf.rb +4 -21
  19. data/ext/libdatadog_extconf_helpers.rb +49 -11
  20. data/lib/datadog/ai_guard/configuration/settings.rb +3 -0
  21. data/lib/datadog/appsec/assets/blocked.html +2 -1
  22. data/lib/datadog/appsec/configuration/settings.rb +14 -0
  23. data/lib/datadog/appsec/context.rb +44 -9
  24. data/lib/datadog/appsec/contrib/active_record/patcher.rb +3 -0
  25. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
  26. data/lib/datadog/appsec/contrib/excon/patcher.rb +2 -0
  27. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +55 -6
  28. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  29. data/lib/datadog/appsec/contrib/faraday/patcher.rb +1 -1
  30. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +60 -7
  31. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +11 -6
  32. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  33. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  34. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -10
  35. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +4 -4
  36. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +26 -5
  38. data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
  39. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  40. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  41. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -0
  42. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +2 -0
  43. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +72 -7
  44. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +5 -3
  45. data/lib/datadog/appsec/counter_sampler.rb +25 -0
  46. data/lib/datadog/appsec/event.rb +1 -17
  47. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
  48. data/lib/datadog/appsec/instrumentation/gateway.rb +2 -2
  49. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +18 -0
  50. data/lib/datadog/appsec/monitor/gateway/watcher.rb +2 -2
  51. data/lib/datadog/appsec/security_engine/engine.rb +23 -2
  52. data/lib/datadog/appsec/utils/http/body.rb +38 -0
  53. data/lib/datadog/appsec/utils/http/media_range.rb +2 -1
  54. data/lib/datadog/appsec/utils/http/media_type.rb +28 -35
  55. data/lib/datadog/appsec/utils/http/url_encoded.rb +52 -0
  56. data/lib/datadog/core/configuration/components.rb +29 -4
  57. data/lib/datadog/core/configuration/option.rb +2 -1
  58. data/lib/datadog/core/configuration/options.rb +1 -1
  59. data/lib/datadog/core/configuration/settings.rb +27 -3
  60. data/lib/datadog/core/configuration/supported_configurations.rb +19 -0
  61. data/lib/datadog/core/configuration.rb +2 -2
  62. data/lib/datadog/core/crashtracking/component.rb +71 -19
  63. data/lib/datadog/core/environment/agent_info.rb +65 -1
  64. data/lib/datadog/core/logger.rb +1 -1
  65. data/lib/datadog/core/metrics/logging.rb +1 -1
  66. data/lib/datadog/core/process_discovery.rb +20 -19
  67. data/lib/datadog/core/rate_limiter.rb +2 -0
  68. data/lib/datadog/core/remote/component.rb +16 -5
  69. data/lib/datadog/core/remote/transport/config.rb +5 -11
  70. data/lib/datadog/core/runtime/metrics.rb +1 -2
  71. data/lib/datadog/core/telemetry/component.rb +0 -13
  72. data/lib/datadog/core/telemetry/transport/telemetry.rb +5 -6
  73. data/lib/datadog/core/transport/ext.rb +1 -0
  74. data/lib/datadog/core/transport/http/response.rb +4 -0
  75. data/lib/datadog/core/transport/parcel.rb +61 -9
  76. data/lib/datadog/core/utils/base64.rb +1 -1
  77. data/lib/datadog/core/utils/fnv.rb +26 -0
  78. data/lib/datadog/core/workers/interval_loop.rb +13 -6
  79. data/lib/datadog/core/workers/queue.rb +0 -4
  80. data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
  81. data/lib/datadog/core.rb +6 -1
  82. data/lib/datadog/data_streams/processor.rb +35 -33
  83. data/lib/datadog/data_streams/transport/http/stats.rb +6 -0
  84. data/lib/datadog/data_streams/transport/http.rb +0 -4
  85. data/lib/datadog/data_streams/transport/stats.rb +5 -12
  86. data/lib/datadog/di/boot.rb +1 -0
  87. data/lib/datadog/di/component.rb +17 -5
  88. data/lib/datadog/di/configuration/settings.rb +9 -0
  89. data/lib/datadog/di/context.rb +6 -0
  90. data/lib/datadog/di/instrumenter.rb +183 -134
  91. data/lib/datadog/di/probe.rb +10 -1
  92. data/lib/datadog/di/probe_file_loader.rb +2 -2
  93. data/lib/datadog/di/probe_manager.rb +86 -64
  94. data/lib/datadog/di/probe_notification_builder.rb +46 -18
  95. data/lib/datadog/di/probe_notifier_worker.rb +65 -9
  96. data/lib/datadog/di/probe_repository.rb +198 -0
  97. data/lib/datadog/di/proc_responder.rb +4 -0
  98. data/lib/datadog/di/remote.rb +6 -7
  99. data/lib/datadog/di/serializer.rb +127 -9
  100. data/lib/datadog/di/transport/diagnostics.rb +5 -7
  101. data/lib/datadog/di/transport/http/diagnostics.rb +3 -1
  102. data/lib/datadog/di/transport/http/input.rb +1 -1
  103. data/lib/datadog/di/transport/http.rb +12 -3
  104. data/lib/datadog/di/transport/input.rb +51 -14
  105. data/lib/datadog/kit/tracing/method_tracer.rb +132 -0
  106. data/lib/datadog/open_feature/configuration.rb +2 -0
  107. data/lib/datadog/open_feature/transport.rb +8 -11
  108. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +13 -0
  109. data/lib/datadog/profiling/component.rb +20 -6
  110. data/lib/datadog/profiling/http_transport.rb +5 -6
  111. data/lib/datadog/profiling/profiler.rb +15 -8
  112. data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
  113. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
  114. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  115. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -2
  116. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  117. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -2
  118. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  119. data/lib/datadog/tracing/contrib/grape/endpoint.rb +2 -2
  120. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
  121. data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
  122. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
  123. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  124. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +5 -2
  125. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  126. data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
  127. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +5 -2
  128. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  129. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +5 -2
  130. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  131. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
  132. data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
  133. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
  134. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -1
  135. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
  136. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +2 -1
  137. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +10 -0
  138. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +5 -1
  139. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +24 -0
  140. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
  141. data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
  142. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +5 -1
  143. data/lib/datadog/tracing/contrib/rack/ext.rb +1 -0
  144. data/lib/datadog/tracing/contrib/rack/route_inference.rb +18 -6
  145. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
  146. data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
  147. data/lib/datadog/tracing/contrib/registerable.rb +11 -0
  148. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
  149. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  150. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
  151. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  152. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
  153. data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
  154. data/lib/datadog/tracing/contrib/sneakers/integration.rb +15 -4
  155. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
  156. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +3 -1
  157. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +5 -1
  158. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +1 -0
  159. data/lib/datadog/tracing/metadata/ext.rb +4 -0
  160. data/lib/datadog/tracing/sync_writer.rb +0 -1
  161. data/lib/datadog/tracing/transport/io/client.rb +5 -8
  162. data/lib/datadog/tracing/transport/io/traces.rb +28 -34
  163. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  164. data/lib/datadog/tracing/transport/traces.rb +4 -10
  165. data/lib/datadog/tracing/writer.rb +0 -1
  166. data/lib/datadog/version.rb +1 -1
  167. metadata +14 -8
  168. data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
  169. data/lib/datadog/tracing/workers/trace_writer.rb +0 -204
@@ -25,12 +25,15 @@ module Datadog
25
25
  end
26
26
 
27
27
  def infer(path)
28
- segments = path.delete_prefix('/').split('/', MAX_NUMBER_OF_SEGMENTS + 1).first(MAX_NUMBER_OF_SEGMENTS)
28
+ count = 0
29
+ result = []
29
30
 
30
- segments.map! do |segment| #: Array[String?]
31
+ split(path, '/') do |segment|
31
32
  next if segment.empty?
33
+ break if count >= MAX_NUMBER_OF_SEGMENTS
34
+ count += 1
32
35
 
33
- case segment
36
+ result << case segment
34
37
  when INT_PARAM_REGEX then '{param:int}'
35
38
  when INT_ID_PARAM_REGEX then '{param:int_id}'
36
39
  when HEX_PARAM_REGEX then '{param:hex}'
@@ -40,12 +43,21 @@ module Datadog
40
43
  end
41
44
  end
42
45
 
43
- segments.compact! #: Array[String]
44
-
45
- "/#{segments.join("/")}"
46
+ result.empty? ? '/' : "/#{result.join('/')}"
46
47
  rescue
47
48
  nil
48
49
  end
50
+
51
+ if RUBY_VERSION >= '2.6.'
52
+ def split(path, pattern = nil, &block)
53
+ path.split(pattern, &block)
54
+ end
55
+ else
56
+ def split(path, pattern = nil, &block)
57
+ path.split(pattern).each(&block)
58
+ path
59
+ end
60
+ end
49
61
  end
50
62
  end
51
63
  end
@@ -51,8 +51,11 @@ module Datadog
51
51
  end
52
52
  end
53
53
 
54
- option :distributed_tracing, default: true, type: :bool
55
-
54
+ option :distributed_tracing do |o|
55
+ o.type :bool
56
+ o.env Ext::ENV_DISTRIBUTED_TRACING
57
+ o.default true
58
+ end
56
59
  option :request_queuing do |o|
57
60
  o.type :bool
58
61
  o.default false
@@ -9,6 +9,7 @@ module Datadog
9
9
  module Ext
10
10
  APP = 'rails'
11
11
  ENV_ENABLED = 'DD_TRACE_RAILS_ENABLED'
12
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_RAILS_DISTRIBUTED_TRACING'
12
13
  # @!visibility private
13
14
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_RAILS_ANALYTICS_ENABLED'
14
15
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE'
@@ -33,6 +33,17 @@ module Datadog
33
33
  def register_as(name, registry: Contrib::REGISTRY, auto_patch: false, **options)
34
34
  registry.add(name, new(name, **options), auto_patch)
35
35
  end
36
+
37
+ # Registers this `as` in the global tracer registry as an alias of `original_name`.
38
+ # Using `as` or `original_name` become interchangeable.
39
+ # The configuration object is shared between the two names.
40
+ # The patcher will only run once if both are activated.
41
+ def register_alias_for(original_name, as:, registry: Contrib::REGISTRY)
42
+ original = registry[original_name]
43
+ raise ArgumentError, "integration '#{original_name}' not registered" unless original
44
+
45
+ registry.add(as, original, false)
46
+ end
36
47
  end
37
48
 
38
49
  # Instance methods for registerable behavior
@@ -30,8 +30,11 @@ module Datadog
30
30
  o.default 1.0
31
31
  end
32
32
 
33
- option :distributed_tracing, default: true, type: :bool
34
-
33
+ option :distributed_tracing do |o|
34
+ o.type :bool
35
+ o.env Ext::ENV_DISTRIBUTED_TRACING
36
+ o.default true
37
+ end
35
38
  option :service_name do |o|
36
39
  o.default do
37
40
  Contrib::SpanAttributeSchema.fetch_service_name(
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_REST_CLIENT_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_REST_CLIENT_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_REST_CLIENT_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_REST_CLIENT_PEER_SERVICE'
13
14
  # @!visibility private
@@ -38,7 +38,11 @@ module Datadog
38
38
  end
39
39
 
40
40
  option :quantize, default: {}, type: :hash
41
- option :distributed_tracing, default: false, type: :bool
41
+ option :distributed_tracing do |o|
42
+ o.type :bool
43
+ o.env Ext::ENV_DISTRIBUTED_TRACING
44
+ o.default false
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -12,6 +12,7 @@ module Datadog
12
12
  # @!visibility private
13
13
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_SIDEKIQ_ANALYTICS_ENABLED'
14
14
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SIDEKIQ_ANALYTICS_SAMPLE_RATE'
15
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_SIDEKIQ_DISTRIBUTED_TRACING'
15
16
  SERVICE_NAME = 'sidekiq'
16
17
  SIDEKIQ_8_SECONDS_PER_INTEGER = 0.001 # Sidekiq 8 uses integer epoch milliseconds, rather than epoch floats
17
18
  SPAN_PUSH = 'sidekiq.push'
@@ -33,7 +33,11 @@ module Datadog
33
33
  o.default 1.0
34
34
  end
35
35
 
36
- option :distributed_tracing, default: true, type: :bool
36
+ option :distributed_tracing do |o|
37
+ o.type :bool
38
+ o.env Ext::ENV_DISTRIBUTED_TRACING
39
+ o.default true
40
+ end
37
41
  option :headers, default: DEFAULT_HEADERS, type: :hash
38
42
  option :resource_script_names, default: false, type: :bool
39
43
 
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_SINATRA_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_SINATRA_DISTRIBUTED_TRACING'
11
12
  # @!visibility private
12
13
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_SINATRA_ANALYTICS_ENABLED'
13
14
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SINATRA_ANALYTICS_SAMPLE_RATE'
@@ -13,13 +13,24 @@ module Datadog
13
13
  class Integration
14
14
  include Contrib::Integration
15
15
 
16
- MINIMUM_VERSION = Gem::Version.new('2.12.0')
16
+ MINIMUM_SNEAKERS_VERSION = Gem::Version.new('2.12.0')
17
+ # All versions are supported. Kicks first version is 3.0.0.
18
+ MINIMUM_KICKS_VERSION = Gem::Version.new('3.0.0')
17
19
 
18
20
  # @public_api Changing the integration name or integration options can cause breaking changes
19
21
  register_as :sneakers, auto_patch: true
20
-
22
+ register_alias_for :sneakers, as: :kicks
23
+
24
+ # Sneakers development continues in the Kicks gem.
25
+ # The **only** thing that has changed is the gem name,
26
+ # even the file naming and module namespacing are the same (require 'sneakers', `::Sneakers`).
27
+ #
28
+ # The last version of Sneakers is 2.12.0.
29
+ # The first version of Kicks is 3.0.0. We currently support all versions of Kicks.
30
+ #
31
+ # @see https://github.com/jondot/sneakers/commit/9780692624c666b6db8266d2d5710f709cb0f2e2
21
32
  def self.version
22
- Gem.loaded_specs['sneakers']&.version
33
+ Gem.loaded_specs['sneakers']&.version || Gem.loaded_specs['kicks']&.version
23
34
  end
24
35
 
25
36
  def self.loaded?
@@ -27,7 +38,7 @@ module Datadog
27
38
  end
28
39
 
29
40
  def self.compatible?
30
- super && version >= MINIMUM_VERSION
41
+ super && !!(version&.>= MINIMUM_SNEAKERS_VERSION)
31
42
  end
32
43
 
33
44
  def new_configuration
@@ -51,6 +51,12 @@ module Datadog
51
51
  o.default false
52
52
  end
53
53
 
54
+ option :inject_sql_basehash do |o|
55
+ o.type :bool
56
+ o.env Contrib::Propagation::SqlComment::Ext::ENV_DBM_INJECT_SQL_BASEHASH
57
+ o.default false
58
+ end
59
+
54
60
  option :peer_service do |o|
55
61
  o.type :string, nilable: true
56
62
  o.env Ext::ENV_PEER_SERVICE
@@ -57,7 +57,9 @@ module Datadog
57
57
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
58
58
 
59
59
  propagation_mode = Contrib::Propagation::SqlComment::Mode.new(
60
- comment_propagation, datadog_configuration[:append_comment]
60
+ comment_propagation,
61
+ datadog_configuration[:append_comment],
62
+ datadog_configuration[:inject_sql_basehash]
61
63
  )
62
64
 
63
65
  Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
@@ -18,7 +18,11 @@ module Datadog
18
18
 
19
19
  option :service_name
20
20
 
21
- option :distributed_tracing, default: false, type: :bool
21
+ option :distributed_tracing do |o|
22
+ o.type :bool
23
+ o.env Ext::ENV_DISTRIBUTED_TRACING
24
+ o.default false
25
+ end
22
26
  end
23
27
  end
24
28
  end
@@ -6,6 +6,7 @@ module Datadog
6
6
  module WaterDrop
7
7
  module Ext
8
8
  ENV_ENABLED = 'DD_TRACE_WATERDROP_ENABLED'
9
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_WATERDROP_DISTRIBUTED_TRACING'
9
10
 
10
11
  SPAN_PRODUCER = 'karafka.produce'
11
12
 
@@ -66,6 +66,10 @@ module Datadog
66
66
  TAG_DD_PARENT_ID = '_dd.parent_id'
67
67
  DD_PARENT_ID_DEFAULT = '0000000000000000'
68
68
 
69
+ # Knuth Sampling Rate: the sampling rate applied by agent-based or rule-based sampling.
70
+ # This is a propagated tag (prefixed with `_dd.p.`) that is included in `x-datadog-tags`.
71
+ TAG_KNUTH_SAMPLING_RATE = '_dd.p.ksr'
72
+
69
73
  # Trace tags with this prefix will propagate from a trace through distributed tracing.
70
74
  # Distributed headers tags with this prefix will be injected into the active trace.
71
75
  TAGS_PREFIX = '_dd.p.'
@@ -9,7 +9,6 @@ require_relative 'transport/http'
9
9
  module Datadog
10
10
  module Tracing
11
11
  # SyncWriter flushes both services and traces synchronously
12
- # DEV: To be replaced by Datadog::Tracing::Workers::TraceWriter.
13
12
  #
14
13
  # Note: If you're wondering if this class is used at all, since there are no other references to it on the codebase,
15
14
  # the separate `datadog-lambda` uses it as of February 2021:
@@ -19,8 +19,11 @@ module Datadog
19
19
  @out = out
20
20
  @encoder = encoder
21
21
 
22
+ # Note: The :encode option was previously supported but is no longer used.
23
+ # Data is now expected to be pre-encoded in the Parcel before reaching this client,
24
+ # matching the behavior of other transports (e.g., HTTP transport).
25
+ # If provided, the :encode option will be silently ignored for backwards compatibility.
22
26
  @request_block = options.fetch(:request, method(:send_default_request))
23
- @encode_block = options.fetch(:encode, method(:encode_data))
24
27
  @write_block = options.fetch(:write, method(:write_data))
25
28
  @response_block = options.fetch(:response, method(:build_response))
26
29
  end
@@ -38,7 +41,6 @@ module Datadog
38
41
  # Update statistics
39
42
  update_stats_from_response!(response)
40
43
 
41
- # Return response
42
44
  response
43
45
  rescue => e
44
46
  message =
@@ -59,10 +61,6 @@ module Datadog
59
61
  InternalErrorResponse.new(e)
60
62
  end
61
63
 
62
- def encode_data(encoder, request)
63
- request.parcel.encode_with(encoder)
64
- end
65
-
66
64
  def write_data(out, data)
67
65
  out.puts(data)
68
66
  end
@@ -74,8 +72,7 @@ module Datadog
74
72
  private
75
73
 
76
74
  def send_default_request(out, request)
77
- # Encode data
78
- data = @encode_block.call(encoder, request)
75
+ data = request.parcel.data
79
76
 
80
77
  # Write to IO
81
78
  result = @write_block.call(out, data)
@@ -21,29 +21,6 @@ module Datadog
21
21
  end
22
22
  end
23
23
 
24
- # Extensions for HTTP client
25
- module Client
26
- def send_traces(traces)
27
- # Build a request
28
- req = Transport::Traces::Request.new(Parcel.new(traces))
29
-
30
- [send_request(req) do |out, request|
31
- # Encode trace data
32
- data = encode_data(encoder, request)
33
-
34
- # Write to IO
35
- result = if block_given?
36
- yield(out, data)
37
- else
38
- write_data(out, data)
39
- end
40
-
41
- # Generate response
42
- Traces::Response.new(result)
43
- end]
44
- end
45
- end
46
-
47
24
  # Encoder for IO-specific trace encoding
48
25
  # API compliant when used with {JSONEncoder}.
49
26
  module Encoder
@@ -54,13 +31,13 @@ module Datadog
54
31
  ].freeze
55
32
 
56
33
  # Encodes a list of traces
57
- def encode_traces(encoder, traces)
34
+ def encode_traces(traces)
58
35
  trace_hashes = traces.map do |trace|
59
36
  encode_trace(trace)
60
37
  end
61
38
 
62
- # Wrap traces & encode them
63
- encoder.encode(traces: trace_hashes)
39
+ # Wrap traces
40
+ {traces: trace_hashes}
64
41
  end
65
42
 
66
43
  private
@@ -78,17 +55,34 @@ module Datadog
78
55
  end
79
56
  end
80
57
 
81
- # Transfer object for list of traces
82
- class Parcel
83
- include Datadog::Core::Transport::Parcel
58
+ # Extensions for HTTP client
59
+ module Client
84
60
  include Encoder
85
61
 
86
- def count
87
- data.length
88
- end
62
+ def send_traces(traces)
63
+ # Build a request
64
+ encoded_traces = encode_traces(traces)
65
+ encoder = Core::Encoding::JSONEncoder
66
+ parcel = Core::Transport::Parcel.new(
67
+ encoder.encode(encoded_traces),
68
+ content_type: encoder.content_type,
69
+ )
70
+ req = Transport::Traces::Request.new(parcel)
71
+
72
+ [send_request(req) do |out, request|
73
+ # Get already-encoded data from parcel
74
+ data = request.parcel.data
75
+
76
+ # Write to IO
77
+ result = if block_given?
78
+ yield(out, data)
79
+ else
80
+ write_data(out, data)
81
+ end
89
82
 
90
- def encode_with(encoder)
91
- encode_traces(encoder, data)
83
+ # Generate response
84
+ Traces::Response.new(result)
85
+ end]
92
86
  end
93
87
  end
94
88
 
@@ -49,6 +49,7 @@ module Datadog
49
49
 
50
50
  tag_agent_sample_rate!
51
51
  tag_hostname!
52
+ tag_knuth_sampling_rate!
52
53
  tag_lang!
53
54
  tag_origin!
54
55
  tag_process_id!
@@ -110,6 +111,16 @@ module Datadog
110
111
  )
111
112
  end
112
113
 
114
+ def tag_knuth_sampling_rate!
115
+ rate = trace.rule_sample_rate || trace.agent_sample_rate
116
+ return unless rate
117
+
118
+ root_span.set_tag(
119
+ Tracing::Metadata::Ext::Distributed::TAG_KNUTH_SAMPLING_RATE,
120
+ format('%.6g', rate)
121
+ )
122
+ end
123
+
113
124
  def tag_lang!
114
125
  return if trace.lang.nil?
115
126
 
@@ -14,19 +14,13 @@ module Datadog
14
14
  module Transport
15
15
  module Traces
16
16
  # Data transfer object for encoded traces
17
- class EncodedParcel
18
- include Datadog::Core::Transport::Parcel
19
-
17
+ class Parcel < Core::Transport::Parcel
20
18
  attr_reader :trace_count
21
19
 
22
- def initialize(data, trace_count)
23
- super(data)
20
+ def initialize(data, trace_count:, **opts)
21
+ super(data, **opts)
24
22
  @trace_count = trace_count
25
23
  end
26
-
27
- def count
28
- data.length
29
- end
30
24
  end
31
25
 
32
26
  # Traces request
@@ -135,7 +129,7 @@ module Datadog
135
129
  )
136
130
 
137
131
  responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count|
138
- request = Request.new(EncodedParcel.new(encoded_traces, trace_count))
132
+ request = Request.new(Parcel.new(encoded_traces, trace_count: trace_count))
139
133
 
140
134
  client.send_request(:traces, request).tap do |response|
141
135
  if downgrade?(response)
@@ -9,7 +9,6 @@ require_relative 'transport/http'
9
9
  module Datadog
10
10
  module Tracing
11
11
  # Processor that sends traces and metadata to the agent
12
- # DEV: Our goal is for {Datadog::Tracing::Workers::TraceWriter} to replace this class in the future
13
12
  # @public_api
14
13
  class Writer
15
14
  attr_reader \
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 28
6
+ MINOR = 30
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
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.28.0
4
+ version: 2.30.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: 2026-02-04 00:00:00.000000000 Z
11
+ date: 2026-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 25.0.0.1.0
67
+ version: 29.0.0.1.0
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 25.0.0.1.0
74
+ version: 29.0.0.1.0
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: logger
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -169,6 +169,7 @@ files:
169
169
  - ext/datadog_profiling_native_extension/unsafe_api_calls_check.h
170
170
  - ext/libdatadog_api/crashtracker.c
171
171
  - ext/libdatadog_api/crashtracker.h
172
+ - ext/libdatadog_api/crashtracker_report_exception.c
172
173
  - ext/libdatadog_api/datadog_ruby_common.c
173
174
  - ext/libdatadog_api/datadog_ruby_common.h
174
175
  - ext/libdatadog_api/ddsketch.c
@@ -260,7 +261,7 @@ files:
260
261
  - lib/datadog/appsec/contrib/rack/patcher.rb
261
262
  - lib/datadog/appsec/contrib/rack/request_body_middleware.rb
262
263
  - lib/datadog/appsec/contrib/rack/request_middleware.rb
263
- - lib/datadog/appsec/contrib/rails/ext.rb
264
+ - lib/datadog/appsec/contrib/rack/response_body.rb
264
265
  - lib/datadog/appsec/contrib/rails/framework.rb
265
266
  - lib/datadog/appsec/contrib/rails/gateway/request.rb
266
267
  - lib/datadog/appsec/contrib/rails/gateway/watcher.rb
@@ -281,6 +282,7 @@ files:
281
282
  - lib/datadog/appsec/contrib/sinatra/patcher.rb
282
283
  - lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb
283
284
  - lib/datadog/appsec/contrib/sinatra/request_middleware.rb
285
+ - lib/datadog/appsec/counter_sampler.rb
284
286
  - lib/datadog/appsec/event.rb
285
287
  - lib/datadog/appsec/ext.rb
286
288
  - lib/datadog/appsec/extensions.rb
@@ -310,8 +312,10 @@ files:
310
312
  - lib/datadog/appsec/utils.rb
311
313
  - lib/datadog/appsec/utils/hash_coercion.rb
312
314
  - lib/datadog/appsec/utils/http.rb
315
+ - lib/datadog/appsec/utils/http/body.rb
313
316
  - lib/datadog/appsec/utils/http/media_range.rb
314
317
  - lib/datadog/appsec/utils/http/media_type.rb
318
+ - lib/datadog/appsec/utils/http/url_encoded.rb
315
319
  - lib/datadog/auto_instrument.rb
316
320
  - lib/datadog/auto_instrument_base.rb
317
321
  - lib/datadog/core.rb
@@ -454,6 +458,7 @@ files:
454
458
  - lib/datadog/core/utils/at_fork_monkey_patch.rb
455
459
  - lib/datadog/core/utils/base64.rb
456
460
  - lib/datadog/core/utils/duration.rb
461
+ - lib/datadog/core/utils/fnv.rb
457
462
  - lib/datadog/core/utils/forking.rb
458
463
  - lib/datadog/core/utils/hash.rb
459
464
  - lib/datadog/core/utils/lru_cache.rb
@@ -516,6 +521,7 @@ files:
516
521
  - lib/datadog/di/probe_manager.rb
517
522
  - lib/datadog/di/probe_notification_builder.rb
518
523
  - lib/datadog/di/probe_notifier_worker.rb
524
+ - lib/datadog/di/probe_repository.rb
519
525
  - lib/datadog/di/proc_responder.rb
520
526
  - lib/datadog/di/redactor.rb
521
527
  - lib/datadog/di/remote.rb
@@ -539,6 +545,7 @@ files:
539
545
  - lib/datadog/kit/appsec/events/v2.rb
540
546
  - lib/datadog/kit/enable_core_dumps.rb
541
547
  - lib/datadog/kit/identity.rb
548
+ - lib/datadog/kit/tracing/method_tracer.rb
542
549
  - lib/datadog/open_feature.rb
543
550
  - lib/datadog/open_feature/component.rb
544
551
  - lib/datadog/open_feature/configuration.rb
@@ -1088,7 +1095,6 @@ files:
1088
1095
  - lib/datadog/tracing/transport/traces.rb
1089
1096
  - lib/datadog/tracing/utils.rb
1090
1097
  - lib/datadog/tracing/workers.rb
1091
- - lib/datadog/tracing/workers/trace_writer.rb
1092
1098
  - lib/datadog/tracing/writer.rb
1093
1099
  - lib/datadog/version.rb
1094
1100
  homepage: https://github.com/DataDog/dd-trace-rb
@@ -1097,8 +1103,8 @@ licenses:
1097
1103
  - Apache-2.0
1098
1104
  metadata:
1099
1105
  allowed_push_host: https://rubygems.org
1100
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.28.0/CHANGELOG.md
1101
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.28.0
1106
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.30.0/CHANGELOG.md
1107
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.30.0
1102
1108
  post_install_message:
1103
1109
  rdoc_options: []
1104
1110
  require_paths:
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Rails
7
- # Rails integration constants
8
- module Ext
9
- end
10
- end
11
- end
12
- end
13
- end