ddtrace 1.16.0 → 1.18.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +86 -1
  3. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -0
  4. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +8 -1
  5. data/ext/ddtrace_profiling_native_extension/extconf.rb +28 -10
  6. data/ext/ddtrace_profiling_native_extension/http_transport.c +5 -2
  7. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +78 -18
  8. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +6 -0
  9. data/ext/ddtrace_profiling_native_extension/profiling.c +1 -0
  10. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +1 -3
  11. data/lib/datadog/appsec/component.rb +4 -1
  12. data/lib/datadog/appsec/configuration/settings.rb +4 -6
  13. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +2 -0
  14. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +0 -46
  15. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -5
  16. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +0 -10
  17. data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
  18. data/lib/datadog/appsec/remote.rb +12 -9
  19. data/lib/datadog/core/configuration/settings.rb +1 -1
  20. data/lib/datadog/core/configuration.rb +4 -0
  21. data/lib/datadog/core/remote/worker.rb +1 -0
  22. data/lib/datadog/core/workers/async.rb +1 -0
  23. data/lib/datadog/kit/enable_core_dumps.rb +5 -6
  24. data/lib/datadog/opentelemetry/sdk/span_processor.rb +39 -8
  25. data/lib/datadog/opentelemetry/sdk/trace/span.rb +102 -3
  26. data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
  27. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +1 -0
  28. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  29. data/lib/datadog/profiling/component.rb +13 -5
  30. data/lib/datadog/tracing/configuration/ext.rb +3 -0
  31. data/lib/datadog/tracing/configuration/settings.rb +18 -3
  32. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  33. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +5 -0
  34. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +24 -0
  35. data/lib/datadog/tracing/distributed/datadog.rb +0 -1
  36. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  37. data/lib/datadog/tracing/trace_digest.rb +31 -0
  38. data/lib/datadog/tracing/workers.rb +1 -0
  39. data/lib/ddtrace/version.rb +1 -1
  40. metadata +7 -7
@@ -83,19 +83,40 @@ module Datadog
83
83
 
84
84
  extracted_trace_digest = nil
85
85
 
86
- ::Datadog.configuration.tracing.distributed_tracing.propagation_extract_style.each do |style|
86
+ config = ::Datadog.configuration.tracing.distributed_tracing
87
+
88
+ config.propagation_extract_style.each do |style|
87
89
  propagator = @propagation_styles[style]
88
90
  next if propagator.nil?
89
91
 
90
92
  begin
91
- extracted_trace_digest = propagator.extract(data)
93
+ if extracted_trace_digest
94
+ # Return if we are only inspecting the first valid style.
95
+ next if config.propagation_extract_first
96
+
97
+ # Continue parsing styles to find the W3C `tracestate` header, if present.
98
+ # `tracestate` must always be propagated, as it might contain pass-through data that we don't control.
99
+ # @see https://www.w3.org/TR/2021/REC-trace-context-1-20211123/#mutating-the-tracestate-field
100
+ next if style != Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT
101
+
102
+ if (tracecontext_digest = propagator.extract(data))
103
+ # Only parse if it represent the same trace as the successfully extracted one
104
+ next unless tracecontext_digest.trace_id == extracted_trace_digest.trace_id
105
+
106
+ # Preserve the `tracestate`
107
+ extracted_trace_digest = extracted_trace_digest.merge(
108
+ trace_state: tracecontext_digest.trace_state,
109
+ trace_state_unknown_fields: tracecontext_digest.trace_state_unknown_fields
110
+ )
111
+ end
112
+ else
113
+ extracted_trace_digest = propagator.extract(data)
114
+ end
92
115
  rescue => e
93
116
  ::Datadog.logger.error(
94
117
  "Error extracting distributed trace data. Cause: #{e} Location: #{Array(e.backtrace).first}"
95
118
  )
96
119
  end
97
-
98
- break if extracted_trace_digest
99
120
  end
100
121
 
101
122
  extracted_trace_digest
@@ -141,6 +141,37 @@ module Datadog
141
141
 
142
142
  freeze
143
143
  end
144
+
145
+ # Creates a copy of this object, modifying the provided fields.
146
+ # @param field_value_pairs [Hash<String>] the fields to be overwritten
147
+ # @return [TraceDigest] returns a copy of this object with the `field_value_pairs` modified
148
+ def merge(field_value_pairs)
149
+ # DEV: Because we want to sometimes freeze the values provided to `TraceDigest`, it's best
150
+ # DEV: to let `#initialize` decide how to handle each field, instead of duplicating that logic here.
151
+ TraceDigest.new(
152
+ **{
153
+ span_id: span_id,
154
+ span_name: span_name,
155
+ span_resource: span_resource,
156
+ span_service: span_service,
157
+ span_type: span_type,
158
+ trace_distributed_tags: trace_distributed_tags,
159
+ trace_hostname: trace_hostname,
160
+ trace_id: trace_id,
161
+ trace_name: trace_name,
162
+ trace_origin: trace_origin,
163
+ trace_process_id: trace_process_id,
164
+ trace_resource: trace_resource,
165
+ trace_runtime_id: trace_runtime_id,
166
+ trace_sampling_priority: trace_sampling_priority,
167
+ trace_service: trace_service,
168
+ trace_distributed_id: trace_distributed_id,
169
+ trace_flags: trace_flags,
170
+ trace_state: trace_state,
171
+ trace_state_unknown_fields: trace_state_unknown_fields,
172
+ }.merge!(field_value_pairs)
173
+ )
174
+ end
144
175
  end
145
176
  end
146
177
  end
@@ -69,6 +69,7 @@ module Datadog
69
69
  Datadog.logger.debug { "Starting thread for: #{self}" }
70
70
  @worker = Thread.new { perform }
71
71
  @worker.name = self.class.name unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3')
72
+ @worker.thread_variable_set(:fork_safe, true)
72
73
 
73
74
  nil
74
75
  end
@@ -3,7 +3,7 @@
3
3
  module DDTrace
4
4
  module VERSION
5
5
  MAJOR = 1
6
- MINOR = 16
6
+ MINOR = 18
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: ddtrace
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.0
4
+ version: 1.18.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: 2023-11-03 00:00:00.000000000 Z
11
+ date: 2023-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 3.2.2
33
+ version: 3.2.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 3.2.2
40
+ version: 3.2.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: libddwaf
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.3.0
75
+ version: 0.5.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.3.0
82
+ version: 0.5.0
83
83
  description: |
84
84
  ddtrace is Datadog's tracing client for Ruby. It is used to trace requests
85
85
  as they flow across web servers, databases and microservices so that developers
@@ -890,7 +890,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
890
890
  - !ruby/object:Gem::Version
891
891
  version: 2.0.0
892
892
  requirements: []
893
- rubygems_version: 3.4.1
893
+ rubygems_version: 3.4.21
894
894
  signing_key:
895
895
  specification_version: 4
896
896
  summary: Datadog tracing code for your Ruby applications