datadog 2.12.1 → 2.13.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 (123) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -2
  3. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +14 -13
  4. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +8 -0
  5. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  6. data/lib/datadog/appsec/actions_handler.rb +22 -1
  7. data/lib/datadog/appsec/anonymizer.rb +16 -0
  8. data/lib/datadog/appsec/configuration/settings.rb +62 -10
  9. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  10. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  11. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +79 -0
  12. data/lib/datadog/appsec/contrib/devise/ext.rb +21 -0
  13. data/lib/datadog/appsec/contrib/devise/integration.rb +0 -1
  14. data/lib/datadog/appsec/contrib/devise/patcher.rb +36 -23
  15. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  16. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  17. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  18. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +93 -0
  19. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  20. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +27 -0
  21. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -2
  22. data/lib/datadog/appsec/event.rb +1 -1
  23. data/lib/datadog/appsec/ext.rb +4 -2
  24. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +4 -2
  25. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  26. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  27. data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -3
  28. data/lib/datadog/appsec/processor/rule_merger.rb +2 -1
  29. data/lib/datadog/appsec/remote.rb +7 -0
  30. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  31. data/lib/datadog/appsec/utils.rb +0 -2
  32. data/lib/datadog/core/configuration/components.rb +2 -1
  33. data/lib/datadog/core/configuration/ext.rb +4 -0
  34. data/lib/datadog/core/configuration/options.rb +2 -2
  35. data/lib/datadog/core/configuration/settings.rb +53 -30
  36. data/lib/datadog/core/environment/agent_info.rb +4 -3
  37. data/lib/datadog/core/remote/component.rb +3 -6
  38. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  39. data/lib/datadog/core/remote/negotiation.rb +9 -9
  40. data/lib/datadog/core/remote/transport/config.rb +4 -3
  41. data/lib/datadog/core/remote/transport/http/client.rb +4 -3
  42. data/lib/datadog/core/remote/transport/http/config.rb +6 -32
  43. data/lib/datadog/core/remote/transport/http/negotiation.rb +6 -32
  44. data/lib/datadog/core/remote/transport/http.rb +22 -57
  45. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  46. data/lib/datadog/core/runtime/metrics.rb +8 -1
  47. data/lib/datadog/core/telemetry/http/adapters/net.rb +1 -1
  48. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  49. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  50. data/lib/datadog/core/transport/http/builder.rb +5 -3
  51. data/lib/datadog/core/transport/http.rb +39 -2
  52. data/lib/datadog/di/component.rb +0 -2
  53. data/lib/datadog/di/probe_notifier_worker.rb +16 -16
  54. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  55. data/lib/datadog/di/transport/http/api.rb +2 -12
  56. data/lib/datadog/di/transport/http/client.rb +4 -3
  57. data/lib/datadog/di/transport/http/diagnostics.rb +7 -33
  58. data/lib/datadog/di/transport/http/input.rb +7 -33
  59. data/lib/datadog/di/transport/http.rb +14 -56
  60. data/lib/datadog/di/transport/input.rb +4 -3
  61. data/lib/datadog/di/utils.rb +5 -0
  62. data/lib/datadog/kit/appsec/events.rb +9 -0
  63. data/lib/datadog/kit/identity.rb +5 -1
  64. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  65. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  66. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  67. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  68. data/lib/datadog/opentelemetry.rb +2 -1
  69. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  70. data/lib/datadog/profiling.rb +5 -2
  71. data/lib/datadog/tracing/component.rb +15 -12
  72. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  73. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  74. data/lib/datadog/tracing/context_provider.rb +1 -1
  75. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  76. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  77. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  78. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  79. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  80. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  81. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  82. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  83. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -5
  84. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -11
  85. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +6 -10
  86. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  87. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  88. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  89. data/lib/datadog/tracing/correlation.rb +9 -2
  90. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  91. data/lib/datadog/tracing/distributed/datadog.rb +2 -0
  92. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  93. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  94. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  95. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  96. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  97. data/lib/datadog/tracing/metadata.rb +2 -0
  98. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  99. data/lib/datadog/tracing/span.rb +10 -1
  100. data/lib/datadog/tracing/span_operation.rb +8 -2
  101. data/lib/datadog/tracing/sync_writer.rb +1 -2
  102. data/lib/datadog/tracing/trace_digest.rb +9 -2
  103. data/lib/datadog/tracing/trace_operation.rb +29 -17
  104. data/lib/datadog/tracing/trace_segment.rb +6 -4
  105. data/lib/datadog/tracing/tracer.rb +38 -2
  106. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  107. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  108. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  109. data/lib/datadog/tracing/transport/http.rb +11 -44
  110. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  111. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  112. data/lib/datadog/tracing/transport/traces.rb +21 -9
  113. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  114. data/lib/datadog/tracing/writer.rb +2 -6
  115. data/lib/datadog/tracing.rb +16 -3
  116. data/lib/datadog/version.rb +2 -2
  117. metadata +20 -13
  118. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  119. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  120. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  121. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  122. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  123. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
@@ -34,7 +34,8 @@ module Datadog
34
34
  :sampling_decision_maker,
35
35
  :sampling_priority,
36
36
  :service,
37
- :profiling_enabled
37
+ :profiling_enabled,
38
+ :apm_tracing_enabled
38
39
 
39
40
  # rubocop:disable Metrics/CyclomaticComplexity
40
41
  # rubocop:disable Metrics/PerceivedComplexity
@@ -58,7 +59,8 @@ module Datadog
58
59
  service: nil,
59
60
  tags: nil,
60
61
  metrics: nil,
61
- profiling_enabled: nil
62
+ profiling_enabled: nil,
63
+ apm_tracing_enabled: nil
62
64
  )
63
65
  @id = id
64
66
  @root_span_id = root_span_id
@@ -85,6 +87,7 @@ module Datadog
85
87
  @sampling_priority = sampling_priority || sampling_priority_tag
86
88
  @service = Core::Utils::SafeDup.frozen_or_dup(service || service_tag)
87
89
  @profiling_enabled = profiling_enabled
90
+ @apm_tracing_enabled = apm_tracing_enabled
88
91
  end
89
92
  # rubocop:enable Metrics/PerceivedComplexity
90
93
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -128,8 +131,7 @@ module Datadog
128
131
  end
129
132
 
130
133
  def sampled?
131
- sampling_priority == Sampling::Ext::Priority::AUTO_KEEP \
132
- || sampling_priority == Sampling::Ext::Priority::USER_KEEP
134
+ [Sampling::Ext::Priority::AUTO_KEEP, Sampling::Ext::Priority::USER_KEEP].include?(sampling_priority)
133
135
  end
134
136
 
135
137
  # Returns the high order part of the trace id as a hexadecimal string; the most significant 64 bits.
@@ -338,24 +338,30 @@ module Datadog
338
338
  hostname = hostname && !hostname.empty? ? hostname : nil
339
339
 
340
340
  if digest
341
+ sampling_priority = if propagate_sampling_priority?(upstream_tags: digest.trace_distributed_tags)
342
+ digest.trace_sampling_priority
343
+ end
341
344
  TraceOperation.new(
342
345
  hostname: hostname,
343
346
  profiling_enabled: profiling_enabled,
347
+ apm_tracing_enabled: apm_tracing_enabled,
344
348
  id: digest.trace_id,
345
349
  origin: digest.trace_origin,
346
350
  parent_span_id: digest.span_id,
347
- sampling_priority: digest.trace_sampling_priority,
351
+ sampling_priority: sampling_priority,
348
352
  # Distributed tags are just regular trace tags with special meaning to Datadog
349
353
  tags: digest.trace_distributed_tags,
350
354
  trace_state: digest.trace_state,
351
355
  trace_state_unknown_fields: digest.trace_state_unknown_fields,
352
356
  remote_parent: digest.span_remote,
353
- tracer: self
357
+ tracer: self,
358
+ baggage: digest.baggage
354
359
  )
355
360
  else
356
361
  TraceOperation.new(
357
362
  hostname: hostname,
358
363
  profiling_enabled: profiling_enabled,
364
+ apm_tracing_enabled: apm_tracing_enabled,
359
365
  remote_parent: false,
360
366
  tracer: self
361
367
  )
@@ -545,10 +551,40 @@ module Datadog
545
551
  end
546
552
  end
547
553
 
554
+ # Decide whether upstream sampling priority should be propagated, by taking into account
555
+ # the upstream tags and the configuration.
556
+ # We should always propagate if APM is enabled.
557
+ #
558
+ # e.g.: upstream tags containing dd.p.ts: 02, and appsec is enabled, return true.
559
+ def propagate_sampling_priority?(upstream_tags:)
560
+ return true if apm_tracing_enabled
561
+
562
+ if upstream_tags&.key?(Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE)
563
+ appsec_bit = upstream_tags[Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE].to_i(16) &
564
+ Datadog::AppSec::Ext::PRODUCT_BIT
565
+ return appsec_enabled if appsec_bit != 0
566
+ end
567
+
568
+ false
569
+ end
570
+
548
571
  def profiling_enabled
549
572
  @profiling_enabled ||=
550
573
  !!(defined?(Datadog::Profiling) && Datadog::Profiling.respond_to?(:enabled?) && Datadog::Profiling.enabled?)
551
574
  end
575
+
576
+ def appsec_enabled
577
+ @appsec_enabled ||= Datadog.configuration.appsec.enabled
578
+ end
579
+
580
+ # Due to APM Tracing (the product) and Tracing (the transport) being intertwined, we cannot completely disabled APM
581
+ # without also disabling the tracer. When setting `@apm_tracing_enabled` to `false`, it does not disable the tracer,
582
+ # but rather only sends heartbeat traces (1 per minutes), so that the service is considered alive in the backend.
583
+ # Other products (like ASM) can then set the sampling priority of their traces to `MANUAL_KEEP`,
584
+ # effectively allowing standalone products to work without APM.
585
+ def apm_tracing_enabled
586
+ @apm_tracing_enabled ||= Datadog.configuration.apm.tracing.enabled
587
+ end
552
588
  end
553
589
  end
554
590
  end
@@ -22,14 +22,14 @@ module Datadog
22
22
 
23
23
  def defaults
24
24
  Core::Transport::HTTP::API::Map[
25
- V4 => Spec.new do |s|
25
+ V4 => Traces::API::Spec.new do |s|
26
26
  s.traces = Traces::API::Endpoint.new(
27
27
  '/v0.4/traces',
28
28
  Core::Encoding::MsgpackEncoder,
29
29
  service_rates: true
30
30
  )
31
31
  end,
32
- V3 => Spec.new do |s|
32
+ V3 => Traces::API::Spec.new do |s|
33
33
  s.traces = Traces::API::Endpoint.new(
34
34
  '/v0.3/traces',
35
35
  Core::Encoding::MsgpackEncoder
@@ -37,14 +37,6 @@ module Datadog
37
37
  end,
38
38
  ].with_fallbacks(V4 => V3)
39
39
  end
40
-
41
- class Instance < Core::Transport::HTTP::API::Instance
42
- include Traces::API::Instance
43
- end
44
-
45
- class Spec < Core::Transport::HTTP::API::Spec
46
- include Traces::API::Spec
47
- end
48
40
  end
49
41
  end
50
42
  end
@@ -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)
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:,
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
@@ -69,7 +69,7 @@ module Datadog
69
69
  def to_msgpack(packer = nil)
70
70
  packer ||= MessagePack::Packer.new
71
71
 
72
- number_of_elements_to_write = 11
72
+ number_of_elements_to_write = 12
73
73
 
74
74
  number_of_elements_to_write += 1 if span.events.any? && @native_events_supported
75
75
 
@@ -117,6 +117,8 @@ module Datadog
117
117
  packer.write(span.meta)
118
118
  packer.write('metrics')
119
119
  packer.write(span.metrics)
120
+ packer.write('meta_struct')
121
+ packer.write(span.metastruct)
120
122
  packer.write('span_links')
121
123
  packer.write(span.links.map(&:to_hash))
122
124
  packer.write('error')
@@ -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,11 @@ 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(encoder, trace, logger, native_events_supported: @native_events_supported)
82
84
 
83
85
  if encoded.size > max_size
84
86
  # This single trace is too large, we can't flush it
85
- Datadog.logger.debug { "Dropping trace. Payload too large: '#{trace.inspect}'" }
87
+ logger.debug { "Dropping trace. Payload too large: '#{trace.inspect}'" }
86
88
  Datadog.health_metrics.transport_trace_too_large(1)
87
89
 
88
90
  return nil
@@ -96,7 +98,7 @@ module Datadog
96
98
  module Encoder
97
99
  module_function
98
100
 
99
- def encode_trace(encoder, trace, native_events_supported:)
101
+ def encode_trace(encoder, trace, logger, native_events_supported:)
100
102
  # Format the trace for transport
101
103
  TraceFormatter.format!(trace)
102
104
 
@@ -106,7 +108,7 @@ module Datadog
106
108
  # Encode the trace
107
109
  encoder.encode(serializable_trace).tap do |encoded|
108
110
  # Print the actual serialized trace, since the encoder can change make non-trivial changes
109
- Datadog.logger.debug { "Flushing trace: #{encoder.decode(encoded)}" }
111
+ logger.debug { "Flushing trace: #{encoder.decode(encoded)}" }
110
112
  end
111
113
  end
112
114
  end
@@ -117,11 +119,12 @@ module Datadog
117
119
  # batches of traces into smaller chunks and handles
118
120
  # API version downgrade handshake.
119
121
  class Transport
120
- attr_reader :client, :apis, :default_api, :current_api_id
122
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
121
123
 
122
- def initialize(apis, default_api)
124
+ def initialize(apis, default_api, logger)
123
125
  @apis = apis
124
126
  @default_api = default_api
127
+ @logger = logger
125
128
 
126
129
  change_api!(default_api)
127
130
  end
@@ -130,6 +133,7 @@ module Datadog
130
133
  encoder = current_api.encoder
131
134
  chunker = Datadog::Tracing::Transport::Traces::Chunker.new(
132
135
  encoder,
136
+ logger,
133
137
  native_events_supported: native_events_supported?
134
138
  )
135
139
 
@@ -190,7 +194,7 @@ module Datadog
190
194
  raise UnknownApiVersionError, api_id unless apis.key?(api_id)
191
195
 
192
196
  @current_api_id = api_id
193
- @client = HTTP::Client.new(current_api)
197
+ @client = HTTP::Client.new(current_api, logger)
194
198
  end
195
199
 
196
200
  # Queries the agent for native span events serialization support.
@@ -198,6 +202,14 @@ module Datadog
198
202
  def native_events_supported?
199
203
  return @native_events_supported if defined?(@native_events_supported)
200
204
 
205
+ # Check for an explicit override
206
+ option = Datadog.configuration.tracing.native_span_events
207
+ unless option.nil?
208
+ @native_events_supported = option
209
+ return option
210
+ end
211
+
212
+ # Otherwise, check for agent support, to ensure a configuration-less setup.
201
213
  if (res = Datadog.send(:components).agent_info.fetch)
202
214
  @native_events_supported = res.span_events == true
203
215
  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 = 1
6
+ MINOR = 13
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