datadog 2.35.0 → 2.36.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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -1
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +68 -31
  4. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  5. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_stack.c +37 -18
  7. data/ext/datadog_profiling_native_extension/collectors_stack.h +8 -2
  8. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +434 -300
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +9 -7
  10. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +7 -8
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +0 -12
  12. data/ext/datadog_profiling_native_extension/extconf.rb +2 -2
  13. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
  14. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
  15. data/ext/datadog_profiling_native_extension/heap_recorder.c +44 -26
  16. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +14 -35
  17. data/ext/datadog_profiling_native_extension/profiling.c +41 -4
  18. data/ext/datadog_profiling_native_extension/ruby_helpers.c +33 -34
  19. data/ext/datadog_profiling_native_extension/stack_recorder.c +24 -3
  20. data/ext/datadog_profiling_native_extension/stack_recorder.h +1 -0
  21. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +4 -2
  22. data/ext/libdatadog_api/datadog_ruby_common.c +7 -8
  23. data/ext/libdatadog_api/datadog_ruby_common.h +0 -12
  24. data/ext/libdatadog_extconf_helpers.rb +1 -1
  25. data/lib/datadog/appsec/api_security/route_extractor.rb +6 -0
  26. data/lib/datadog/appsec/component.rb +1 -1
  27. data/lib/datadog/appsec/configuration.rb +7 -0
  28. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +37 -4
  29. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +64 -19
  30. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -0
  31. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
  32. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +41 -3
  33. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +20 -7
  34. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +92 -0
  35. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +33 -0
  36. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +17 -1
  37. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +20 -3
  38. data/lib/datadog/appsec/default_header_tags.rb +10 -6
  39. data/lib/datadog/core/configuration/components.rb +1 -0
  40. data/lib/datadog/core/configuration/settings.rb +1 -2
  41. data/lib/datadog/core/configuration/supported_configurations.rb +2 -0
  42. data/lib/datadog/core/remote/component.rb +1 -1
  43. data/lib/datadog/core/telemetry/event/app_started.rb +0 -21
  44. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +1 -1
  45. data/lib/datadog/core/utils/forking.rb +3 -1
  46. data/lib/datadog/core/utils/spawn_monkey_patch.rb +3 -1
  47. data/lib/datadog/core.rb +3 -0
  48. data/lib/datadog/di/base.rb +4 -1
  49. data/lib/datadog/di/component.rb +1 -1
  50. data/lib/datadog/error_tracking/collector.rb +2 -1
  51. data/lib/datadog/error_tracking/component.rb +2 -2
  52. data/lib/datadog/kit/tracing/method_tracer.rb +4 -1
  53. data/lib/datadog/opentelemetry/sdk/propagator.rb +9 -3
  54. data/lib/datadog/opentelemetry/sdk/span_processor.rb +4 -1
  55. data/lib/datadog/profiling/collectors/thread_context.rb +1 -0
  56. data/lib/datadog/profiling/component.rb +13 -15
  57. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +3 -3
  58. data/lib/datadog/ruby_version.rb +25 -0
  59. data/lib/datadog/symbol_database/component.rb +306 -98
  60. data/lib/datadog/symbol_database/extractor.rb +223 -84
  61. data/lib/datadog/tracing/configuration/ext.rb +13 -0
  62. data/lib/datadog/tracing/configuration/settings.rb +17 -0
  63. data/lib/datadog/tracing/contrib/configuration/resolver.rb +7 -0
  64. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
  65. data/lib/datadog/tracing/contrib/grpc.rb +1 -0
  66. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
  67. data/lib/datadog/tracing/contrib/http.rb +1 -0
  68. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
  69. data/lib/datadog/tracing/contrib/karafka.rb +1 -0
  70. data/lib/datadog/tracing/contrib/rack/middlewares.rb +3 -1
  71. data/lib/datadog/tracing/contrib/rack/route_inference.rb +3 -1
  72. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
  73. data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
  74. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +2 -0
  75. data/lib/datadog/tracing/contrib/waterdrop.rb +1 -0
  76. data/lib/datadog/tracing/distributed/propagation.rb +33 -1
  77. data/lib/datadog/tracing/distributed/trace_context.rb +11 -2
  78. data/lib/datadog/tracing/trace_digest.rb +7 -0
  79. data/lib/datadog/tracing/trace_operation.rb +4 -1
  80. data/lib/datadog/tracing/tracer.rb +1 -0
  81. data/lib/datadog/version.rb +1 -1
  82. data/lib/datadog.rb +4 -1
  83. metadata +8 -5
@@ -3,6 +3,7 @@
3
3
  require_relative '../configuration/ext'
4
4
  require_relative '../trace_digest'
5
5
  require_relative '../trace_operation'
6
+ require_relative '../span_link'
6
7
  require_relative '../../core/telemetry/logger'
7
8
  require_relative 'baggage'
8
9
 
@@ -13,6 +14,8 @@ module Datadog
13
14
  class Propagation
14
15
  # @param propagation_styles [Hash<String,Object>]
15
16
  # a map of propagation styles to their corresponding implementations
17
+ # @param propagation_behavior_extract [String]
18
+ # the behavior to apply when extracting distributed trace data
16
19
  # @param propagation_style_inject [Array<String>]
17
20
  # a list of styles to use when injecting distributed trace data
18
21
  # @param propagation_style_extract [Array<String>]
@@ -23,9 +26,11 @@ module Datadog
23
26
  propagation_styles:,
24
27
  propagation_style_inject:,
25
28
  propagation_style_extract:,
29
+ propagation_behavior_extract:,
26
30
  propagation_extract_first:
27
31
  )
28
32
  @propagation_styles = propagation_styles
33
+ @propagation_behavior_extract = propagation_behavior_extract
29
34
  @propagation_extract_first = propagation_extract_first
30
35
  @propagation_style_inject = propagation_style_inject.map { |style| propagation_styles[style] }
31
36
  @propagation_style_extract = propagation_style_extract.map { |style| propagation_styles[style] }
@@ -97,12 +102,20 @@ module Datadog
97
102
  return unless data
98
103
  return if data.empty?
99
104
 
105
+ if @propagation_behavior_extract == Tracing::Configuration::Ext::Distributed::PROPAGATION_BEHAVIOR_EXTRACT_IGNORE
106
+ return nil
107
+ end
108
+
100
109
  extracted_trace_digest = nil
110
+ # Name of the propagation style that first produced a trace context.
111
+ # Used as the `context_headers` span-link attribute when restarting a trace.
112
+ extracted_style_name = nil
101
113
 
102
114
  @propagation_style_extract.each do |propagator|
103
115
  # First extraction?
104
116
  unless extracted_trace_digest
105
117
  extracted_trace_digest = propagator.extract(data)
118
+ extracted_style_name = @propagation_styles.key(propagator) if extracted_trace_digest
106
119
  next
107
120
  end
108
121
 
@@ -145,7 +158,26 @@ module Datadog
145
158
  # Handle baggage after all other styles if present
146
159
  extracted_trace_digest = propagate_baggage(data, extracted_trace_digest) if @baggage_propagator
147
160
 
148
- extracted_trace_digest
161
+ # Default mode: Current digest continues the upstream trace.
162
+ return extracted_trace_digest if @propagation_behavior_extract != Tracing::Configuration::Ext::Distributed::PROPAGATION_BEHAVIOR_EXTRACT_RESTART || extracted_trace_digest&.trace_id.nil?
163
+
164
+ # Restart mode: start a new local digest and create a Span Link on
165
+ # the service-entry span with the original propagation data.
166
+ link = SpanLink.new(
167
+ extracted_trace_digest,
168
+ attributes: {
169
+ 'reason' => 'propagation_behavior_extract',
170
+ 'context_headers' => extracted_style_name,
171
+ }
172
+ )
173
+ baggage_tags = extracted_trace_digest.trace_distributed_tags&.select { |k, _| k.start_with?('baggage.') }
174
+ baggage_tags = nil if baggage_tags&.empty?
175
+ TraceDigest.new(
176
+ span_links: [link],
177
+ baggage: extracted_trace_digest.baggage,
178
+ trace_distributed_tags: baggage_tags,
179
+ span_remote: false,
180
+ )
149
181
  end
150
182
 
151
183
  private
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../core/utils'
4
+ require_relative 'helpers'
5
+
3
6
  module Datadog
4
7
  module Tracing
5
8
  module Distributed
@@ -282,8 +285,11 @@ module Datadog
282
285
  trace_flags & TRACE_FLAGS_SAMPLED
283
286
  end
284
287
 
285
- # @return [Array<String,Integer,String,String,Hash>] returns 4 values:
286
- # tracestate, sampling_priority, ts_parent_id, origin, tags.
288
+ # @return [nil] when the tracestate is absent or has no vendor entries.
289
+ # @return [String] when no `dd=` entry is present, the joined vendor list.
290
+ # @return [Array(String, Integer, String, String, Hash, String)] when a `dd=`
291
+ # entry is present: [tracestate without `dd=`, sampling_priority, origin,
292
+ # ts_parent_id, tags, unknown_fields]. All elements past the first may be nil.
287
293
  def extract_tracestate(tracestate)
288
294
  vendors = split_tracestate(tracestate)
289
295
  return unless vendors && !vendors.empty?
@@ -395,6 +401,9 @@ module Datadog
395
401
  tracestate = tracestate.chop
396
402
  end
397
403
 
404
+ tracestate = ::Datadog::Core::Utils.utf8_encode(tracestate, placeholder: nil)
405
+ return unless tracestate
406
+
398
407
  vendors = tracestate.split(',', TRACESTATE_MAX_LIST_MEMBERS + 1)
399
408
  if vendors.length > TRACESTATE_MAX_LIST_MEMBERS || remove_last_member
400
409
  vendors.pop
@@ -22,6 +22,9 @@ module Datadog
22
22
  # @!attribute [r] span_type
23
23
  # The type of the currently active span.
24
24
  # @return [String]
25
+ # @!attribute [r] span_links
26
+ # Span links associated with this trace context.
27
+ # @return [Array<Datadog::Tracing::SpanLink>, nil]
25
28
  # @!attribute [r] trace_distributed_tags
26
29
  # Datadog-specific tags that support richer distributed tracing association.
27
30
  # @return [Hash<String,String>]
@@ -91,6 +94,7 @@ module Datadog
91
94
  :span_resource,
92
95
  :span_service,
93
96
  :span_type,
97
+ :span_links,
94
98
  :trace_distributed_tags,
95
99
  :trace_hostname,
96
100
  :trace_id,
@@ -114,6 +118,7 @@ module Datadog
114
118
  span_resource: nil,
115
119
  span_service: nil,
116
120
  span_type: nil,
121
+ span_links: nil,
117
122
  trace_distributed_tags: nil,
118
123
  trace_hostname: nil,
119
124
  trace_id: nil,
@@ -136,6 +141,7 @@ module Datadog
136
141
  @span_resource = span_resource && span_resource.dup.freeze
137
142
  @span_service = span_service && span_service.dup.freeze
138
143
  @span_type = span_type && span_type.dup.freeze
144
+ @span_links = span_links && span_links.dup.freeze
139
145
  @trace_distributed_tags = trace_distributed_tags && trace_distributed_tags.dup.freeze
140
146
  @trace_hostname = trace_hostname && trace_hostname.dup.freeze
141
147
  @trace_id = trace_id
@@ -167,6 +173,7 @@ module Datadog
167
173
  span_resource: span_resource,
168
174
  span_service: span_service,
169
175
  span_type: span_type,
176
+ span_links: span_links,
170
177
  trace_distributed_tags: trace_distributed_tags,
171
178
  trace_hostname: trace_hostname,
172
179
  trace_id: trace_id,
@@ -58,6 +58,7 @@ module Datadog
58
58
 
59
59
  # Creates a new TraceOperation.
60
60
  #
61
+ # @param span_links [Array<Datadog::Tracing::SpanLink>, nil] links to attach to the local root span.
61
62
  # @param auto_finish [Boolean] when true, automatically finishes the trace when the local root span finishes.
62
63
  # When false, the trace remains unfinished until {#finish!} is called.
63
64
  # This is useful when this {TraceOperation} represents the continuation of a remote {TraceDigest},
@@ -72,6 +73,7 @@ module Datadog
72
73
  name: nil,
73
74
  origin: nil,
74
75
  parent_span_id: nil,
76
+ span_links: nil,
75
77
  rate_limiter_rate: nil,
76
78
  resource: nil,
77
79
  rule_sample_rate: nil,
@@ -98,7 +100,7 @@ module Datadog
98
100
  @parent_span_id = parent_span_id
99
101
  @sampled = sampled.nil? || sampled
100
102
  @remote_parent = remote_parent
101
-
103
+ @span_links = span_links
102
104
  # Tags
103
105
  @agent_sample_rate = agent_sample_rate
104
106
  @hostname = hostname
@@ -318,6 +320,7 @@ module Datadog
318
320
  events: span_events,
319
321
  on_error: on_error,
320
322
  parent_id: parent_id,
323
+ links: (@root_span.nil? ? @span_links : nil),
321
324
  resource: resource || op_name,
322
325
  service: service,
323
326
  start_time: start_time,
@@ -387,6 +387,7 @@ module Datadog
387
387
  origin: digest.trace_origin,
388
388
  parent_span_id: digest.span_id,
389
389
  sampling_priority: sampling_priority,
390
+ span_links: digest.span_links,
390
391
  # Distributed tags are just regular trace tags with special meaning to Datadog
391
392
  tags: digest.trace_distributed_tags,
392
393
  trace_state: digest.trace_state,
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 35
6
+ MINOR = 36
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
data/lib/datadog.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Load core first so shared helpers (e.g. Datadog::RubyVersion) are available at require-time
4
+ require_relative 'datadog/core'
5
+
3
6
  # Load tracing
4
7
  require_relative 'datadog/tracing'
5
8
  require_relative 'datadog/tracing/contrib'
@@ -16,7 +19,7 @@ require_relative 'datadog/open_feature'
16
19
  # trace point. Activate DI automatically on supported Ruby versions but
17
20
  # always load its settings so that, for example, turning DI off when
18
21
  # we are on Ruby 2.5 does not produce exceptions.
19
- require_relative 'datadog/di/boot' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'
22
+ require_relative 'datadog/di/boot' if Datadog::RubyVersion.is?('>= 2.6') && RUBY_ENGINE != 'jruby'
20
23
 
21
24
  require_relative 'datadog/error_tracking'
22
25
  require_relative 'datadog/kit'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.35.0
4
+ version: 2.36.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
@@ -63,14 +63,14 @@ dependencies:
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: 33.0.0.1.0
66
+ version: 35.0.0.1.0
67
67
  type: :runtime
68
68
  prerelease: false
69
69
  version_requirements: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: 33.0.0.1.0
73
+ version: 35.0.0.1.0
74
74
  - !ruby/object:Gem::Dependency
75
75
  name: logger
76
76
  requirement: !ruby/object:Gem::Requirement
@@ -265,10 +265,12 @@ files:
265
265
  - lib/datadog/appsec/contrib/graphql/integration.rb
266
266
  - lib/datadog/appsec/contrib/graphql/patcher.rb
267
267
  - lib/datadog/appsec/contrib/integration.rb
268
+ - lib/datadog/appsec/contrib/rack/buffered_input.rb
268
269
  - lib/datadog/appsec/contrib/rack/ext.rb
269
270
  - lib/datadog/appsec/contrib/rack/gateway/request.rb
270
271
  - lib/datadog/appsec/contrib/rack/gateway/response.rb
271
272
  - lib/datadog/appsec/contrib/rack/gateway/watcher.rb
273
+ - lib/datadog/appsec/contrib/rack/input_peeker.rb
272
274
  - lib/datadog/appsec/contrib/rack/integration.rb
273
275
  - lib/datadog/appsec/contrib/rack/patcher.rb
274
276
  - lib/datadog/appsec/contrib/rack/request_body_middleware.rb
@@ -622,6 +624,7 @@ files:
622
624
  - lib/datadog/profiling/tasks/exec.rb
623
625
  - lib/datadog/profiling/tasks/help.rb
624
626
  - lib/datadog/profiling/tasks/setup.rb
627
+ - lib/datadog/ruby_version.rb
625
628
  - lib/datadog/single_step_instrument.rb
626
629
  - lib/datadog/symbol_database.rb
627
630
  - lib/datadog/symbol_database/component.rb
@@ -1137,8 +1140,8 @@ licenses:
1137
1140
  - Apache-2.0
1138
1141
  metadata:
1139
1142
  allowed_push_host: https://rubygems.org
1140
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.35.0/CHANGELOG.md
1141
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.35.0
1143
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.36.0/CHANGELOG.md
1144
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.36.0
1142
1145
  post_install_message: 'JRuby support in the datadog gem is deprecated. Details: https://dtdg.co/jruby-deprecation'
1143
1146
  rdoc_options: []
1144
1147
  require_paths: