datadog 2.12.2 → 2.14.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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -1
  3. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +14 -13
  4. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  5. data/lib/datadog/appsec/actions_handler.rb +22 -1
  6. data/lib/datadog/appsec/anonymizer.rb +16 -0
  7. data/lib/datadog/appsec/configuration/settings.rb +62 -10
  8. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  9. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  10. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +79 -0
  11. data/lib/datadog/appsec/contrib/devise/ext.rb +21 -0
  12. data/lib/datadog/appsec/contrib/devise/integration.rb +0 -1
  13. data/lib/datadog/appsec/contrib/devise/patcher.rb +36 -23
  14. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  15. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  16. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  17. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +93 -0
  18. data/lib/datadog/appsec/contrib/rack/ext.rb +14 -0
  19. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +10 -3
  20. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +0 -2
  21. data/lib/datadog/appsec/event.rb +1 -1
  22. data/lib/datadog/appsec/ext.rb +4 -2
  23. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +4 -2
  24. data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -3
  25. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  26. data/lib/datadog/appsec/utils.rb +0 -2
  27. data/lib/datadog/core/configuration/components.rb +2 -1
  28. data/lib/datadog/core/configuration/ext.rb +4 -0
  29. data/lib/datadog/core/configuration/options.rb +2 -2
  30. data/lib/datadog/core/configuration/settings.rb +53 -30
  31. data/lib/datadog/core/environment/agent_info.rb +4 -3
  32. data/lib/datadog/core/metrics/client.rb +1 -1
  33. data/lib/datadog/core/remote/client.rb +1 -1
  34. data/lib/datadog/core/remote/component.rb +3 -6
  35. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  36. data/lib/datadog/core/remote/negotiation.rb +9 -9
  37. data/lib/datadog/core/remote/transport/config.rb +4 -3
  38. data/lib/datadog/core/remote/transport/http/client.rb +4 -3
  39. data/lib/datadog/core/remote/transport/http/config.rb +6 -32
  40. data/lib/datadog/core/remote/transport/http/negotiation.rb +6 -32
  41. data/lib/datadog/core/remote/transport/http.rb +22 -57
  42. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  43. data/lib/datadog/core/runtime/metrics.rb +8 -1
  44. data/lib/datadog/core/telemetry/http/adapters/net.rb +1 -1
  45. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  46. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  47. data/lib/datadog/core/transport/http/builder.rb +5 -3
  48. data/lib/datadog/core/transport/http.rb +39 -2
  49. data/lib/datadog/di/component.rb +0 -2
  50. data/lib/datadog/di/probe_notifier_worker.rb +16 -16
  51. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  52. data/lib/datadog/di/transport/http/api.rb +2 -12
  53. data/lib/datadog/di/transport/http/client.rb +4 -3
  54. data/lib/datadog/di/transport/http/diagnostics.rb +7 -33
  55. data/lib/datadog/di/transport/http/input.rb +7 -33
  56. data/lib/datadog/di/transport/http.rb +14 -56
  57. data/lib/datadog/di/transport/input.rb +4 -3
  58. data/lib/datadog/di/utils.rb +5 -0
  59. data/lib/datadog/kit/appsec/events.rb +12 -0
  60. data/lib/datadog/kit/identity.rb +5 -1
  61. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  62. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  63. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  64. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  65. data/lib/datadog/opentelemetry.rb +2 -1
  66. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  67. data/lib/datadog/profiling.rb +5 -2
  68. data/lib/datadog/tracing/component.rb +15 -12
  69. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  70. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  71. data/lib/datadog/tracing/context_provider.rb +1 -1
  72. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  73. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  74. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  75. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  76. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  77. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  78. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  79. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  80. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  81. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -5
  82. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -11
  83. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +6 -10
  84. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  85. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +46 -0
  86. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  87. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  88. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  89. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  90. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  91. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  92. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  93. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  94. data/lib/datadog/tracing/contrib.rb +1 -0
  95. data/lib/datadog/tracing/correlation.rb +9 -2
  96. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  97. data/lib/datadog/tracing/distributed/datadog.rb +2 -0
  98. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  99. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  100. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  101. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  102. data/lib/datadog/tracing/span_operation.rb +2 -1
  103. data/lib/datadog/tracing/sync_writer.rb +1 -2
  104. data/lib/datadog/tracing/trace_digest.rb +9 -2
  105. data/lib/datadog/tracing/trace_operation.rb +29 -17
  106. data/lib/datadog/tracing/trace_segment.rb +6 -4
  107. data/lib/datadog/tracing/tracer.rb +38 -2
  108. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  109. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  110. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  111. data/lib/datadog/tracing/transport/http.rb +11 -44
  112. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  113. data/lib/datadog/tracing/transport/traces.rb +26 -9
  114. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  115. data/lib/datadog/tracing/writer.rb +2 -6
  116. data/lib/datadog/tracing.rb +16 -3
  117. data/lib/datadog/version.rb +2 -2
  118. data/lib/datadog.rb +1 -1
  119. metadata +24 -13
  120. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  121. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  122. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  123. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  124. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  125. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
@@ -12,10 +12,11 @@ module Datadog
12
12
  class Client
13
13
  include Datadog::Tracing::Transport::HTTP::Statistics
14
14
 
15
- attr_reader :api
15
+ attr_reader :api, :logger
16
16
 
17
- def initialize(api)
17
+ def initialize(api, logger: Datadog.logger)
18
18
  @api = api
19
+ @logger = logger
19
20
  end
20
21
 
21
22
  def send_request(request, &block)
@@ -36,10 +37,10 @@ module Datadog
36
37
 
37
38
  # Log error
38
39
  if stats.consecutive_errors > 0
39
- Datadog.logger.debug(message)
40
+ logger.debug(message)
40
41
  else
41
42
  # Not to report telemetry logs
42
- Datadog.logger.error(message)
43
+ logger.error(message)
43
44
  end
44
45
 
45
46
  # Update statistics
@@ -6,6 +6,8 @@ require_relative '../traces'
6
6
  require_relative 'client'
7
7
  require_relative '../../../core/transport/http/response'
8
8
  require_relative '../../../core/transport/http/api/endpoint'
9
+ require_relative '../../../core/transport/http/api/spec'
10
+ require_relative '../../../core/transport/http/api/instance'
9
11
 
10
12
  module Datadog
11
13
  module Tracing
@@ -35,16 +37,12 @@ module Datadog
35
37
  end
36
38
 
37
39
  module API
38
- # Extensions for HTTP API Spec
39
- module Spec
40
- attr_reader :traces
41
-
42
- def traces=(endpoint)
43
- @traces = endpoint
44
- end
40
+ # HTTP API Spec
41
+ class Spec < Core::Transport::HTTP::API::Spec
42
+ attr_accessor :traces
45
43
 
46
44
  def send_traces(env, &block)
47
- raise NoTraceEndpointDefinedError, self if traces.nil?
45
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('traces', self) if traces.nil?
48
46
 
49
47
  traces.call(env, &block)
50
48
  end
@@ -52,47 +50,21 @@ module Datadog
52
50
  def encoder
53
51
  traces.encoder
54
52
  end
55
-
56
- # Raised when traces sent but no traces endpoint is defined
57
- class NoTraceEndpointDefinedError < StandardError
58
- attr_reader :spec
59
-
60
- def initialize(spec)
61
- super
62
-
63
- @spec = spec
64
- end
65
-
66
- def message
67
- 'No trace endpoint is defined for API specification!'
68
- end
69
- end
70
53
  end
71
54
 
72
- # Extensions for HTTP API Instance
73
- module Instance
55
+ # HTTP API Instance
56
+ class Instance < Core::Transport::HTTP::API::Instance
74
57
  def send_traces(env)
75
- raise TracesNotSupportedError, spec unless spec.is_a?(Traces::API::Spec)
58
+ unless spec.is_a?(Traces::API::Spec)
59
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
60
+ 'traces', self
61
+ )
62
+ end
76
63
 
77
64
  spec.send_traces(env) do |request_env|
78
65
  call(request_env)
79
66
  end
80
67
  end
81
-
82
- # Raised when traces sent to API that does not support traces
83
- class TracesNotSupportedError < StandardError
84
- attr_reader :spec
85
-
86
- def initialize(spec)
87
- super
88
-
89
- @spec = spec
90
- end
91
-
92
- def message
93
- 'Traces not supported for this API!'
94
- end
95
- end
96
68
  end
97
69
 
98
70
  # Endpoint for submitting trace data
@@ -14,62 +14,29 @@ module Datadog
14
14
  module HTTP
15
15
  module_function
16
16
 
17
- # Builds a new Transport::HTTP::Client
18
- def new(klass, &block)
19
- Core::Transport::HTTP.build(
20
- api_instance_class: API::Instance, &block
21
- ).to_transport(klass)
22
- end
23
-
24
17
  # Builds a new Transport::HTTP::Client with default settings
25
18
  # Pass a block to override any settings.
26
19
  def default(
27
20
  agent_settings:,
28
- **options
21
+ logger: Datadog.logger,
22
+ api_version: nil,
23
+ headers: nil
29
24
  )
30
- new(Transport::Traces::Transport) do |transport|
31
- transport.adapter(agent_settings)
32
- transport.headers default_headers
33
-
25
+ Core::Transport::HTTP.build(
26
+ api_instance_class: Traces::API::Instance,
27
+ agent_settings: agent_settings,
28
+ logger: logger,
29
+ api_version: api_version,
30
+ headers: headers
31
+ ) do |transport|
34
32
  apis = API.defaults
35
33
 
36
34
  transport.api API::V4, apis[API::V4], fallback: API::V3, default: true
37
35
  transport.api API::V3, apis[API::V3]
38
36
 
39
- # Apply any settings given by options
40
- unless options.empty?
41
- transport.default_api = options[:api_version] if options.key?(:api_version)
42
- transport.headers options[:headers] if options.key?(:headers)
43
- end
44
-
45
37
  # Call block to apply any customization, if provided
46
38
  yield(transport) if block_given?
47
- end
48
- end
49
-
50
- def default_headers
51
- {
52
- Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
53
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
54
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
55
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
56
- Datadog::Core::Environment::Ext::LANG_INTERPRETER,
57
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
58
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
59
- Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
60
- }.tap do |headers|
61
- # Add container ID, if present.
62
- container_id = Datadog::Core::Environment::Container.container_id
63
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
64
- # Pretend that stats computation are already done by the client
65
- if Datadog.configuration.appsec.standalone.enabled
66
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
67
- end
68
- end
69
- end
70
-
71
- def default_adapter
72
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
39
+ end.to_transport(Transport::Traces::Transport)
73
40
  end
74
41
  end
75
42
  end
@@ -59,6 +59,7 @@ module Datadog
59
59
  tag_high_order_trace_id!
60
60
  tag_sampling_priority!
61
61
  tag_profiling_enabled!
62
+ tag_apm_tracing_disabled!
62
63
 
63
64
  if first_span
64
65
  tag_git_repository_url!
@@ -196,6 +197,12 @@ module Datadog
196
197
  )
197
198
  end
198
199
 
200
+ def tag_apm_tracing_disabled!
201
+ return if trace.apm_tracing_enabled
202
+
203
+ root_span.set_tag(Tracing::Metadata::Ext::TAG_APM_ENABLED, 0)
204
+ end
205
+
199
206
  def tag_git_repository_url!
200
207
  return if git_repository_url.nil?
201
208
 
@@ -43,15 +43,17 @@ module Datadog
43
43
  # We set the value to a conservative 5 MiB, in case network speed is slow.
44
44
  DEFAULT_MAX_PAYLOAD_SIZE = 5 * 1024 * 1024
45
45
 
46
- attr_reader :encoder, :max_size
46
+ attr_reader :encoder, :max_size, :logger
47
47
 
48
48
  #
49
49
  # Single traces larger than +max_size+ will be discarded.
50
50
  #
51
51
  # @param encoder [Datadog::Core::Encoding::Encoder]
52
+ # @param logger [Datadog::Core::Logger]
52
53
  # @param max_size [String] maximum acceptable payload size
53
- def initialize(encoder, native_events_supported:, max_size: DEFAULT_MAX_PAYLOAD_SIZE)
54
+ def initialize(encoder, logger:, native_events_supported:, max_size: DEFAULT_MAX_PAYLOAD_SIZE)
54
55
  @encoder = encoder
56
+ @logger = logger
55
57
  @native_events_supported = native_events_supported
56
58
  @max_size = max_size
57
59
  end
@@ -78,11 +80,16 @@ module Datadog
78
80
  private
79
81
 
80
82
  def encode_one(trace)
81
- encoded = Encoder.encode_trace(encoder, trace, native_events_supported: @native_events_supported)
83
+ encoded = Encoder.encode_trace(
84
+ encoder,
85
+ trace,
86
+ logger: logger,
87
+ native_events_supported: @native_events_supported
88
+ )
82
89
 
83
90
  if encoded.size > max_size
84
91
  # This single trace is too large, we can't flush it
85
- Datadog.logger.debug { "Dropping trace. Payload too large: '#{trace.inspect}'" }
92
+ logger.debug { "Dropping trace. Payload too large: '#{trace.inspect}'" }
86
93
  Datadog.health_metrics.transport_trace_too_large(1)
87
94
 
88
95
  return nil
@@ -96,7 +103,7 @@ module Datadog
96
103
  module Encoder
97
104
  module_function
98
105
 
99
- def encode_trace(encoder, trace, native_events_supported:)
106
+ def encode_trace(encoder, trace, logger:, native_events_supported:)
100
107
  # Format the trace for transport
101
108
  TraceFormatter.format!(trace)
102
109
 
@@ -106,7 +113,7 @@ module Datadog
106
113
  # Encode the trace
107
114
  encoder.encode(serializable_trace).tap do |encoded|
108
115
  # Print the actual serialized trace, since the encoder can change make non-trivial changes
109
- Datadog.logger.debug { "Flushing trace: #{encoder.decode(encoded)}" }
116
+ logger.debug { "Flushing trace: #{encoder.decode(encoded)}" }
110
117
  end
111
118
  end
112
119
  end
@@ -117,11 +124,12 @@ module Datadog
117
124
  # batches of traces into smaller chunks and handles
118
125
  # API version downgrade handshake.
119
126
  class Transport
120
- attr_reader :client, :apis, :default_api, :current_api_id
127
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
121
128
 
122
- def initialize(apis, default_api)
129
+ def initialize(apis, default_api, logger: Datadog.logger)
123
130
  @apis = apis
124
131
  @default_api = default_api
132
+ @logger = logger
125
133
 
126
134
  change_api!(default_api)
127
135
  end
@@ -130,6 +138,7 @@ module Datadog
130
138
  encoder = current_api.encoder
131
139
  chunker = Datadog::Tracing::Transport::Traces::Chunker.new(
132
140
  encoder,
141
+ logger: logger,
133
142
  native_events_supported: native_events_supported?
134
143
  )
135
144
 
@@ -190,7 +199,7 @@ module Datadog
190
199
  raise UnknownApiVersionError, api_id unless apis.key?(api_id)
191
200
 
192
201
  @current_api_id = api_id
193
- @client = HTTP::Client.new(current_api)
202
+ @client = HTTP::Client.new(current_api, logger: logger)
194
203
  end
195
204
 
196
205
  # Queries the agent for native span events serialization support.
@@ -198,6 +207,14 @@ module Datadog
198
207
  def native_events_supported?
199
208
  return @native_events_supported if defined?(@native_events_supported)
200
209
 
210
+ # Check for an explicit override
211
+ option = Datadog.configuration.tracing.native_span_events
212
+ unless option.nil?
213
+ @native_events_supported = option
214
+ return option
215
+ end
216
+
217
+ # Otherwise, check for agent support, to ensure a configuration-less setup.
201
218
  if (res = Datadog.send(:components).agent_info.fetch)
202
219
  @native_events_supported = res.span_events == true
203
220
  else
@@ -26,14 +26,10 @@ module Datadog
26
26
  @logger = options[:logger] || Datadog.logger
27
27
 
28
28
  transport_options = options.fetch(:transport_options, {})
29
-
30
- if options.key?(:agent_settings)
31
- @agent_settings = options[:agent_settings]
32
- transport_options = transport_options.merge(agent_settings: @agent_settings)
33
- end
29
+ @agent_settings = options[:agent_settings]
34
30
 
35
31
  @transport = options.fetch(:transport) do
36
- Datadog::Tracing::Transport::HTTP.default(**transport_options)
32
+ Datadog::Tracing::Transport::HTTP.default(agent_settings: agent_settings, logger: logger, **transport_options)
37
33
  end
38
34
  end
39
35
  # rubocop:enable Lint/MissingSuper
@@ -26,15 +26,11 @@ module Datadog
26
26
  @buff_size = options.fetch(:buffer_size, Workers::AsyncTransport::DEFAULT_BUFFER_MAX_SIZE)
27
27
  @flush_interval = options.fetch(:flush_interval, Workers::AsyncTransport::DEFAULT_FLUSH_INTERVAL)
28
28
  transport_options = options.fetch(:transport_options, {})
29
-
30
- if options.key?(:agent_settings)
31
- @agent_settings = options[:agent_settings]
32
- transport_options = transport_options.merge(agent_settings: @agent_settings)
33
- end
29
+ @agent_settings = options[:agent_settings]
34
30
 
35
31
  # transport and buffers
36
32
  @transport = options.fetch(:transport) do
37
- Transport::HTTP.default(**transport_options)
33
+ Transport::HTTP.default(agent_settings: agent_settings, logger: logger, **transport_options)
38
34
  end
39
35
 
40
36
  @shutdown_timeout = options.fetch(:shutdown_timeout, Workers::AsyncTransport::DEFAULT_SHUTDOWN_TIMEOUT)
@@ -26,7 +26,6 @@ module Datadog
26
26
  id: nil,
27
27
  &block
28
28
  )
29
-
30
29
  tracer.trace(
31
30
  name,
32
31
  continue_from: continue_from,
@@ -82,7 +81,7 @@ module Datadog
82
81
  # @public_api
83
82
  def keep!
84
83
  trace = active_trace
85
- active_trace.keep! if trace
84
+ trace.keep! if trace
86
85
  end
87
86
 
88
87
  # (see Datadog::Tracing::TraceSegment#reject!)
@@ -90,7 +89,7 @@ module Datadog
90
89
  # @public_api
91
90
  def reject!
92
91
  trace = active_trace
93
- active_trace.reject! if trace
92
+ trace.reject! if trace
94
93
  end
95
94
 
96
95
  # (see Datadog::Tracing::Tracer#active_correlation)
@@ -127,6 +126,20 @@ module Datadog
127
126
  correlation.to_log_format
128
127
  end
129
128
 
129
+ # Returns the baggage for the current trace.
130
+ #
131
+ # If there is no active trace, a new one is created.
132
+ #
133
+ # @return [Datadog::Tracing::Distributed::Baggage] The baggage for the current trace.
134
+ # @public_api
135
+ def baggage
136
+ # Baggage should not be dependent on there being an active trace.
137
+ # So we create a new TraceOperation if there isn't one.
138
+ active_trace = self.active_trace || tracer.continue_trace!(nil)
139
+ active_trace.baggage ||= {}
140
+ active_trace.baggage
141
+ end
142
+
130
143
  # Gracefully shuts down the tracer.
131
144
  #
132
145
  # The public tracing API will still respond to method calls as usual
@@ -3,8 +3,8 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 12
7
- PATCH = 2
6
+ MINOR = 14
7
+ PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
10
10
  # PRE and BUILD above are modified for dev gems during gem build GHA workflow
data/lib/datadog.rb CHANGED
@@ -9,5 +9,5 @@ require_relative 'datadog/profiling'
9
9
  require_relative 'datadog/appsec'
10
10
  # Line probes will not work on Ruby < 2.6 because of lack of :script_compiled
11
11
  # trace point. Only load DI on supported Ruby versions.
12
- require_relative 'datadog/di' if RUBY_VERSION >= '2.6'
12
+ require_relative 'datadog/di' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'
13
13
  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.12.2
4
+ version: 2.14.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-03-17 00:00:00.000000000 Z
11
+ date: 2025-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.18.0.0.1
47
+ version: 1.21.0.0.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.18.0.0.1
54
+ version: 1.21.0.0.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: libdatadog
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -152,6 +152,8 @@ files:
152
152
  - lib/datadog.rb
153
153
  - lib/datadog/appsec.rb
154
154
  - lib/datadog/appsec/actions_handler.rb
155
+ - lib/datadog/appsec/actions_handler/serializable_backtrace.rb
156
+ - lib/datadog/appsec/anonymizer.rb
155
157
  - lib/datadog/appsec/assets.rb
156
158
  - lib/datadog/appsec/assets/blocked.html
157
159
  - lib/datadog/appsec/assets/blocked.json
@@ -171,15 +173,14 @@ files:
171
173
  - lib/datadog/appsec/contrib/active_record/patcher.rb
172
174
  - lib/datadog/appsec/contrib/auto_instrument.rb
173
175
  - lib/datadog/appsec/contrib/devise/configuration.rb
174
- - lib/datadog/appsec/contrib/devise/event.rb
176
+ - lib/datadog/appsec/contrib/devise/data_extractor.rb
175
177
  - lib/datadog/appsec/contrib/devise/ext.rb
176
178
  - lib/datadog/appsec/contrib/devise/integration.rb
177
179
  - lib/datadog/appsec/contrib/devise/patcher.rb
178
- - lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb
179
- - lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb
180
- - lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb
181
- - lib/datadog/appsec/contrib/devise/resource.rb
182
- - lib/datadog/appsec/contrib/devise/tracking.rb
180
+ - lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb
181
+ - lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb
182
+ - lib/datadog/appsec/contrib/devise/patches/skip_signin_tracking_patch.rb
183
+ - lib/datadog/appsec/contrib/devise/tracking_middleware.rb
183
184
  - lib/datadog/appsec/contrib/excon/integration.rb
184
185
  - lib/datadog/appsec/contrib/excon/patcher.rb
185
186
  - lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb
@@ -247,7 +248,6 @@ files:
247
248
  - lib/datadog/appsec/utils/http.rb
248
249
  - lib/datadog/appsec/utils/http/media_range.rb
249
250
  - lib/datadog/appsec/utils/http/media_type.rb
250
- - lib/datadog/appsec/utils/trace_operation.rb
251
251
  - lib/datadog/auto_instrument.rb
252
252
  - lib/datadog/auto_instrument_base.rb
253
253
  - lib/datadog/core.rb
@@ -421,6 +421,8 @@ files:
421
421
  - lib/datadog/kit/enable_core_dumps.rb
422
422
  - lib/datadog/kit/identity.rb
423
423
  - lib/datadog/opentelemetry.rb
424
+ - lib/datadog/opentelemetry/api/baggage.rb
425
+ - lib/datadog/opentelemetry/api/baggage.rbs
424
426
  - lib/datadog/opentelemetry/api/context.rb
425
427
  - lib/datadog/opentelemetry/api/trace/span.rb
426
428
  - lib/datadog/opentelemetry/sdk/configurator.rb
@@ -688,6 +690,13 @@ files:
688
690
  - lib/datadog/tracing/contrib/kafka/ext.rb
689
691
  - lib/datadog/tracing/contrib/kafka/integration.rb
690
692
  - lib/datadog/tracing/contrib/kafka/patcher.rb
693
+ - lib/datadog/tracing/contrib/karafka.rb
694
+ - lib/datadog/tracing/contrib/karafka/configuration/settings.rb
695
+ - lib/datadog/tracing/contrib/karafka/distributed/propagation.rb
696
+ - lib/datadog/tracing/contrib/karafka/ext.rb
697
+ - lib/datadog/tracing/contrib/karafka/integration.rb
698
+ - lib/datadog/tracing/contrib/karafka/monitor.rb
699
+ - lib/datadog/tracing/contrib/karafka/patcher.rb
691
700
  - lib/datadog/tracing/contrib/lograge/configuration/settings.rb
692
701
  - lib/datadog/tracing/contrib/lograge/ext.rb
693
702
  - lib/datadog/tracing/contrib/lograge/instrumentation.rb
@@ -864,12 +873,14 @@ files:
864
873
  - lib/datadog/tracing/diagnostics/health.rb
865
874
  - lib/datadog/tracing/distributed/b3_multi.rb
866
875
  - lib/datadog/tracing/distributed/b3_single.rb
876
+ - lib/datadog/tracing/distributed/baggage.rb
867
877
  - lib/datadog/tracing/distributed/datadog.rb
868
878
  - lib/datadog/tracing/distributed/datadog_tags_codec.rb
869
879
  - lib/datadog/tracing/distributed/fetcher.rb
870
880
  - lib/datadog/tracing/distributed/helpers.rb
871
881
  - lib/datadog/tracing/distributed/none.rb
872
882
  - lib/datadog/tracing/distributed/propagation.rb
883
+ - lib/datadog/tracing/distributed/propagation_policy.rb
873
884
  - lib/datadog/tracing/distributed/trace_context.rb
874
885
  - lib/datadog/tracing/event.rb
875
886
  - lib/datadog/tracing/flush.rb
@@ -933,8 +944,8 @@ licenses:
933
944
  - Apache-2.0
934
945
  metadata:
935
946
  allowed_push_host: https://rubygems.org
936
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.12.2/CHANGELOG.md
937
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.12.2
947
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.14.0/CHANGELOG.md
948
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.14.0
938
949
  post_install_message:
939
950
  rdoc_options: []
940
951
  require_paths:
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Devise
7
- # Class to extract event information from the resource
8
- class Event
9
- UUID_REGEX = /^\h{8}-\h{4}-\h{4}-\h{4}-\h{12}$/.freeze
10
-
11
- attr_reader :user_id
12
-
13
- def initialize(resource, mode)
14
- @resource = resource
15
- @mode = mode
16
- @user_id = nil
17
- @email = nil
18
- @username = nil
19
-
20
- extract if @resource
21
- end
22
-
23
- def to_h
24
- return @event if defined?(@event)
25
-
26
- @event = {}
27
- @event[:email] = @email if @email
28
- @event[:username] = @username if @username
29
- @event
30
- end
31
-
32
- private
33
-
34
- def extract
35
- @user_id = @resource.id
36
-
37
- case @mode
38
- when AppSec::Configuration::Settings::IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
39
- @email = @resource.email
40
- @username = @resource.username
41
- when AppSec::Configuration::Settings::ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE
42
- @user_id = nil unless @user_id && @user_id.to_s =~ UUID_REGEX
43
- else
44
- Datadog.logger.warn(
45
- "Invalid auto_user_instrumentation.mode: `#{@mode}`. " \
46
- "Supported modes are: #{AppSec::Configuration::Settings::AUTO_USER_INSTRUMENTATION_MODES.join(' | ')}."
47
- )
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../configuration'
4
- require_relative '../tracking'
5
- require_relative '../resource'
6
- require_relative '../event'
7
-
8
- module Datadog
9
- module AppSec
10
- module Contrib
11
- module Devise
12
- module Patcher
13
- # Hook in devise validate method
14
- module AuthenticatablePatch
15
- # rubocop:disable Metrics/MethodLength
16
- def validate(resource, &block)
17
- result = super
18
-
19
- return result unless AppSec.enabled?
20
- return result if @_datadog_appsec_skip_track_login_event
21
- return result unless Configuration.auto_user_instrumentation_enabled?
22
- return result unless AppSec.active_context
23
-
24
- devise_resource = resource ? Resource.new(resource) : nil
25
- event_information = Event.new(devise_resource, Configuration.auto_user_instrumentation_mode)
26
-
27
- if result
28
- if event_information.user_id
29
- Datadog.logger.debug { 'AppSec: User successful login event' }
30
- else
31
- Datadog.logger.debug do
32
- "AppSec: User successful login event, but can't extract user ID. Tracking empty event"
33
- end
34
- end
35
-
36
- Tracking.track_login_success(
37
- AppSec.active_context.trace,
38
- AppSec.active_context.span,
39
- user_id: event_information.user_id,
40
- **event_information.to_h
41
- )
42
-
43
- return result
44
- end
45
-
46
- user_exists = nil
47
-
48
- if resource
49
- user_exists = true
50
- Datadog.logger.debug { 'AppSec: User failed login event, but user exists' }
51
- else
52
- user_exists = false
53
- Datadog.logger.debug { 'AppSec: User failed login event and user does not exist' }
54
- end
55
-
56
- Tracking.track_login_failure(
57
- AppSec.active_context.trace,
58
- AppSec.active_context.span,
59
- user_id: event_information.user_id,
60
- user_exists: user_exists,
61
- **event_information.to_h
62
- )
63
-
64
- result
65
- end
66
- # rubocop:enable Metrics/MethodLength
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end