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
@@ -45,6 +45,8 @@ module Datadog
45
45
 
46
46
  overhead_target_percentage = valid_overhead_target(settings.profiling.advanced.overhead_target_percentage, logger)
47
47
  upload_period_seconds = [60, settings.profiling.advanced.upload_period_seconds].max
48
+ cpu_sampling_interval_ms =
49
+ valid_cpu_sampling_interval(settings.profiling.advanced.experimental_cpu_sampling_interval_ms, logger)
48
50
 
49
51
  recorder = Datadog::Profiling::StackRecorder.new(
50
52
  cpu_time_enabled: RUBY_PLATFORM.include?("linux"), # Only supported on Linux currently
@@ -65,6 +67,7 @@ module Datadog
65
67
  allocation_counting_enabled: settings.profiling.advanced.allocation_counting_enabled,
66
68
  gvl_profiling_enabled: enable_gvl_profiling?(settings, logger),
67
69
  sighandler_sampling_enabled: settings.profiling.advanced.sighandler_sampling_enabled,
70
+ cpu_sampling_interval_ms: cpu_sampling_interval_ms,
68
71
  )
69
72
 
70
73
  internal_metadata = {
@@ -123,6 +126,7 @@ module Datadog
123
126
  site: settings.site,
124
127
  api_key: settings.api_key,
125
128
  upload_timeout_seconds: settings.profiling.upload.timeout_seconds,
129
+ use_system_dns: settings.profiling.advanced.experimental_use_system_dns,
126
130
  )
127
131
  end
128
132
 
@@ -219,12 +223,6 @@ module Datadog
219
223
  "Please upgrade to Ruby >= 3.1 in order to use this feature. Heap profiling has been disabled."
220
224
  )
221
225
  return false
222
- elsif RUBY_VERSION.start_with?("4.")
223
- logger.warn(
224
- "Datadog Ruby heap profiler is currently incompatible with Ruby 4. " \
225
- "Heap profiling has been disabled."
226
- )
227
- return false
228
226
  end
229
227
 
230
228
  unless allocation_profiling_enabled
@@ -403,6 +401,22 @@ module Datadog
403
401
  end
404
402
  end
405
403
 
404
+ private_class_method def self.valid_cpu_sampling_interval(cpu_sampling_interval_ms, logger)
405
+ if cpu_sampling_interval_ms > 10
406
+ logger.warn(
407
+ "Profiling cpu_sampling_interval_ms is set to #{cpu_sampling_interval_ms}ms, but values above 10ms are " \
408
+ "not supported. Using 10ms instead. To reduce profiler overhead, consider adjusting the " \
409
+ "overhead_target_percentage setting."
410
+ )
411
+ 10
412
+ elsif cpu_sampling_interval_ms < 10
413
+ logger.debug { "Profiling cpu_sampling_interval_ms set to #{cpu_sampling_interval_ms}ms" }
414
+ cpu_sampling_interval_ms
415
+ else
416
+ cpu_sampling_interval_ms
417
+ end
418
+ end
419
+
406
420
  # To add just a bit more complexity to our detection code, in https://github.com/DataDog/dd-trace-rb/issues/3334
407
421
  # a user reported that our code was incorrectly flagging the mariadb variant of libmysqlclient as being
408
422
  # incompatible. In fact we have no reports of the mariadb variant needing the "no signals" workaround,
@@ -10,17 +10,17 @@ module Datadog
10
10
  class HttpTransport
11
11
  attr_reader :exporter_configuration
12
12
 
13
- def initialize(agent_settings:, site:, api_key:, upload_timeout_seconds:)
14
- @upload_timeout_milliseconds = (upload_timeout_seconds * 1_000).to_i
13
+ def initialize(agent_settings:, site:, api_key:, upload_timeout_seconds:, use_system_dns:)
14
+ timeout_milliseconds = (upload_timeout_seconds * 1_000).to_i
15
15
 
16
16
  # Steep: multiple issues here
17
17
  # first https://github.com/soutaro/steep/issues/363
18
18
  # then https://github.com/soutaro/steep/issues/1603 (remove the .freeze to see it)
19
19
  @exporter_configuration = # steep:ignore IncompatibleAssignment
20
20
  if agentless?(site, api_key)
21
- [:agentless, site, api_key].freeze
21
+ [:agentless, timeout_milliseconds, use_system_dns, site, api_key].freeze
22
22
  else
23
- [:agent, agent_settings.url].freeze
23
+ [:agent, timeout_milliseconds, use_system_dns, agent_settings.url].freeze
24
24
  end
25
25
 
26
26
  status, result = self.class._native_validate_exporter(exporter_configuration)
@@ -31,7 +31,6 @@ module Datadog
31
31
  def export(flush)
32
32
  status, result = self.class._native_do_export(
33
33
  exporter_configuration,
34
- @upload_timeout_milliseconds,
35
34
  flush
36
35
  )
37
36
 
@@ -63,7 +62,7 @@ module Datadog
63
62
  end
64
63
 
65
64
  def config_without_api_key
66
- "#{exporter_configuration[0]}: #{exporter_configuration[1]}"
65
+ "#{exporter_configuration[0]}: #{exporter_configuration[3]}"
67
66
  end
68
67
  end
69
68
  end
@@ -27,7 +27,12 @@ module Datadog
27
27
  scheduler.reset_after_fork
28
28
  end
29
29
 
30
- worker.start(on_failure_proc: proc { component_failed(:worker) })
30
+ worker.start(
31
+ on_failure_proc: ->(log_failure: true) do
32
+ # @type var log_failure: bool
33
+ component_failed(:worker, log_failure: log_failure)
34
+ end
35
+ )
31
36
  scheduler.start(on_failure_proc: proc { component_failed(:scheduler) })
32
37
  end
33
38
 
@@ -50,13 +55,15 @@ module Datadog
50
55
  scheduler.stop(true)
51
56
  end
52
57
 
53
- def component_failed(failed_component)
54
- Datadog.logger.warn(
55
- "Detected issue with profiler (#{failed_component} component), stopping profiling. " \
56
- "See previous log messages for details."
57
- )
58
- Datadog::Core::Telemetry::Logger
59
- .error("Detected issue with profiler (#{failed_component} component), stopping profiling")
58
+ def component_failed(failed_component, log_failure: true)
59
+ if log_failure
60
+ Datadog.logger.warn(
61
+ "Detected issue with profiler (#{failed_component} component), stopping profiling. " \
62
+ "See previous log messages for details."
63
+ )
64
+ Datadog::Core::Telemetry::Logger
65
+ .error("Detected issue with profiler (#{failed_component} component), stopping profiling")
66
+ end
60
67
 
61
68
  if failed_component == :worker
62
69
  scheduler.disable_reporting
@@ -14,6 +14,7 @@ module Datadog
14
14
 
15
15
  MINIMUM_VERSION = Gem::Version.new('2.0.0')
16
16
  DALLI_PROTOCOL_BINARY_VERSION = Gem::Version.new('3.0.0')
17
+ DALLI_PROTOCOL_META_VERSION = Gem::Version.new('5.0.0')
17
18
 
18
19
  # @public_api Changing the integration name or integration options can cause breaking changes
19
20
  register_as :dalli, auto_patch: true
@@ -31,7 +32,9 @@ module Datadog
31
32
  end
32
33
 
33
34
  def self.dalli_class
34
- if version >= DALLI_PROTOCOL_BINARY_VERSION
35
+ if version >= DALLI_PROTOCOL_META_VERSION
36
+ ::Dalli::Protocol::Meta
37
+ elsif version >= DALLI_PROTOCOL_BINARY_VERSION
35
38
  ::Dalli::Protocol::Binary
36
39
  else
37
40
  ::Dalli::Server
@@ -30,7 +30,11 @@ module Datadog
30
30
  o.default 1.0
31
31
  end
32
32
 
33
- option :distributed_tracing, default: true, type: :bool
33
+ option :distributed_tracing do |o|
34
+ o.type :bool
35
+ o.env Ext::ENV_DISTRIBUTED_TRACING
36
+ o.default true
37
+ end
34
38
 
35
39
  option :split_by_domain, default: false, type: :bool
36
40
 
@@ -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_ETHON_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_ETHON_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_ETHON_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_ETHON_PEER_SERVICE'
13
14
 
@@ -33,8 +33,11 @@ module Datadog
33
33
  o.default 1.0
34
34
  end
35
35
 
36
- option :distributed_tracing, default: true, type: :bool
37
-
36
+ option :distributed_tracing do |o|
37
+ o.type :bool
38
+ o.env Ext::ENV_DISTRIBUTED_TRACING
39
+ o.default true
40
+ end
38
41
  option :on_error do |o|
39
42
  o.type :proc, nilable: true
40
43
  end
@@ -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_EXCON_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_EXCON_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_EXCON_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_EXCON_PEER_SERVICE'
13
14
 
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :on_error do |o|
38
41
  o.type :proc, nilable: true
39
42
  end
@@ -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_FARADAY_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_FARADAY_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_FARADAY_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_FARADAY_PEER_SERVICE'
13
14
  ENV_ERROR_STATUS_CODES = 'DD_TRACE_FARADAY_ERROR_STATUS_CODES'
@@ -253,10 +253,10 @@ module Datadog
253
253
  end
254
254
 
255
255
  def api_view(api)
256
- # If the API inherits from Grape::API in version >= 1.2.0
256
+ # If the API inherits from Grape::API in version >= 1.2.0 and version <= 2.3.0
257
257
  # then the API will be an instance and the name must be derived from the base.
258
258
  # See https://github.com/ruby-grape/grape/issues/1825
259
- if defined?(::Grape::API::Instance) && api <= ::Grape::API::Instance
259
+ if defined?(::Grape::API::Instance) && api <= ::Grape::API::Instance && api.respond_to?(:base)
260
260
  api.base.to_s
261
261
  else
262
262
  api.to_s
@@ -6,13 +6,8 @@ module Datadog
6
6
  module Grape
7
7
  # Instrumentation for Grape::Endpoint
8
8
  module Instrumentation
9
- def self.included(base)
10
- base.singleton_class.prepend(ClassMethods)
11
- base.prepend(InstanceMethods)
12
- end
13
-
14
- # ClassMethods - implementing instrumentation
15
- module ClassMethods
9
+ # GenerateApiMethodPatch - class method instrumentation for endpoint render (Grape < 3.0.0)
10
+ module GenerateApiMethodPatch
16
11
  def generate_api_method(*params, &block)
17
12
  method_api = super
18
13
 
@@ -23,7 +18,17 @@ module Datadog
23
18
  end
24
19
  end
25
20
 
26
- # InstanceMethods - implementing instrumentation
21
+ # ExecutePatch - instance method instrumentation for endpoint render (Grape >= 3.0.0)
22
+ module ExecutePatch
23
+ def execute(*args)
24
+ return unless @source
25
+
26
+ ::ActiveSupport::Notifications.instrument('endpoint_render.grape.start_render')
27
+ super
28
+ end
29
+ end
30
+
31
+ # InstanceMethods - instance method instrumentation for endpoint run
27
32
  module InstanceMethods
28
33
  def run(*args)
29
34
  ::ActiveSupport::Notifications.instrument('endpoint_run.grape.start_process', endpoint: self, env: env)
@@ -21,7 +21,12 @@ module Datadog
21
21
 
22
22
  def patch
23
23
  # Patch endpoints
24
- ::Grape::Endpoint.include(Instrumentation)
24
+ ::Grape::Endpoint.prepend(Instrumentation::InstanceMethods)
25
+ if target_version < Gem::Version.new('3.0.0')
26
+ ::Grape::Endpoint.singleton_class.prepend(Instrumentation::GenerateApiMethodPatch)
27
+ else
28
+ ::Grape::Endpoint.prepend(Instrumentation::ExecutePatch)
29
+ end
25
30
 
26
31
  # Subscribe to ActiveSupport events
27
32
  Endpoint.subscribe
@@ -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.type :string, nilable: true
37
40
  o.default do
@@ -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_GRPC_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_GRPC_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_GRPC_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_GRPC_PEER_SERVICE'
13
14
  # @!visibility private
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :service_name do |o|
38
41
  o.type :string, nilable: true
39
42
  o.default do
@@ -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_HTTP_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_HTTP_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_NET_HTTP_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_NET_HTTP_PEER_SERVICE'
13
14
  # @!visibility private
@@ -18,8 +18,6 @@ module Datadog
18
18
  class Integration
19
19
  include Contrib::Integration
20
20
 
21
- MINIMUM_VERSION = Datadog::VERSION::MINIMUM_RUBY_VERSION
22
-
23
21
  # @public_api Changing the integration name or integration options can cause breaking changes
24
22
  register_as :http, auto_patch: true
25
23
  def self.gem_name
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :service_name do |o|
38
41
  o.default do
39
42
  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_HTTPCLIENT_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_HTTPCLIENT_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_HTTPCLIENT_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_HTTPCLIENT_PEER_SERVICE'
13
14
 
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :service_name do |o|
38
41
  o.default do
39
42
  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_HTTPRB_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_HTTPRB_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_HTTPRB_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_HTTPRB_PEER_SERVICE'
13
14
  # @!visibility private
@@ -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 Karafka
7
7
  module Ext
8
8
  ENV_ENABLED = 'DD_TRACE_KARAFKA_ENABLED'
9
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_KARAFKA_DISTRIBUTED_TRACING'
9
10
 
10
11
  SPAN_MESSAGE_CONSUME = 'karafka.consume'
11
12
  SPAN_WORKER_PROCESS = 'worker.process'
@@ -53,6 +53,12 @@ module Datadog
53
53
  o.default false
54
54
  end
55
55
 
56
+ option :inject_sql_basehash do |o|
57
+ o.type :bool
58
+ o.env Contrib::Propagation::SqlComment::Ext::ENV_DBM_INJECT_SQL_BASEHASH
59
+ o.default false
60
+ end
61
+
56
62
  option :peer_service do |o|
57
63
  o.type :string, nilable: true
58
64
  o.env Ext::ENV_PEER_SERVICE
@@ -65,7 +65,8 @@ module Datadog
65
65
  def inject_propagation(span, sql, trace_op)
66
66
  propagation_mode = Contrib::Propagation::SqlComment::Mode.new(
67
67
  datadog_configuration[:comment_propagation],
68
- datadog_configuration[:append_comment]
68
+ datadog_configuration[:append_comment],
69
+ datadog_configuration[:inject_sql_basehash]
69
70
  )
70
71
 
71
72
  Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
@@ -57,6 +57,12 @@ module Datadog
57
57
  o.default false
58
58
  end
59
59
 
60
+ option :inject_sql_basehash do |o|
61
+ o.type :bool
62
+ o.env Contrib::Propagation::SqlComment::Ext::ENV_DBM_INJECT_SQL_BASEHASH
63
+ o.default false
64
+ end
65
+
60
66
  option :peer_service do |o|
61
67
  o.type :string, nilable: true
62
68
  o.env Ext::ENV_PEER_SERVICE
@@ -116,7 +116,8 @@ module Datadog
116
116
  if sql
117
117
  propagation_mode = Contrib::Propagation::SqlComment::Mode.new(
118
118
  comment_propagation,
119
- datadog_configuration[:append_comment]
119
+ datadog_configuration[:append_comment],
120
+ datadog_configuration[:inject_sql_basehash]
120
121
  )
121
122
  Contrib::Propagation::SqlComment.annotate!(span, propagation_mode)
122
123
  propagated_sql_statement = Contrib::Propagation::SqlComment.prepend_comment(
@@ -8,6 +8,10 @@ module Datadog
8
8
  module Ext
9
9
  ENV_DBM_PROPAGATION_MODE = 'DD_DBM_PROPAGATION_MODE'
10
10
 
11
+ # Determines whether to inject the propagation hash into the SQL comment
12
+ # TODO: BASEHASH is confusing as a name, so look into better names that can apply cross tracer in the future
13
+ ENV_DBM_INJECT_SQL_BASEHASH = 'DD_DBM_INJECT_SQL_BASEHASH'
14
+
11
15
  # The default mode for sql comment propagation
12
16
  DISABLED = 'disabled'
13
17
 
@@ -20,6 +24,9 @@ module Datadog
20
24
  # The value should be `true` when `full` mode
21
25
  TAG_DBM_TRACE_INJECTED = '_dd.dbm_trace_injected'
22
26
 
27
+ # Checksum of the agent's container tags and this process' tags
28
+ TAG_PROPAGATED_HASH = '_dd.propagated_hash'
29
+
23
30
  # Database service/sql span service (i.e. the service executing the actual query)
24
31
  #
25
32
  # If fake services are disabled:
@@ -52,6 +59,9 @@ module Datadog
52
59
  # @see Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE
53
60
  KEY_PEER_SERVICE = 'ddprs'
54
61
 
62
+ # DBM service hash (ddsh) for propagation
63
+ KEY_BASE_HASH = 'ddsh'
64
+
55
65
  KEY_TRACEPARENT = 'traceparent'
56
66
  end
57
67
  end
@@ -8,7 +8,7 @@ module Datadog
8
8
  module Propagation
9
9
  # Implements sql comment propagation related contracts.
10
10
  module SqlComment
11
- Mode = Struct.new(:mode, :append) do
11
+ Mode = Struct.new(:mode, :append, :inject_sql_basehash) do
12
12
  def enabled?
13
13
  service? || full?
14
14
  end
@@ -24,6 +24,10 @@ module Datadog
24
24
  def append?
25
25
  append
26
26
  end
27
+
28
+ def inject_sql_basehash?
29
+ inject_sql_basehash
30
+ end
27
31
  end
28
32
  end
29
33
  end
@@ -14,6 +14,16 @@ module Datadog
14
14
  def self.annotate!(span_op, mode)
15
15
  return unless mode.enabled?
16
16
 
17
+ config = Datadog.configuration
18
+
19
+ # Add DBM propagation hash when enabled and available.
20
+ # This matches the behavior in the Python tracer:
21
+ # https://github.com/DataDog/dd-trace-py/blob/5e94be5c97b42060e5800e35d8fa41472fb8c569/ddtrace/propagation/_database_monitoring.py#L89
22
+ if inject_hash?(mode, config)
23
+ checksum = Datadog.send(:components).agent_info.propagation_checksum
24
+ span_op.set_tag(Ext::TAG_PROPAGATED_HASH, checksum.to_s) if checksum
25
+ end
26
+
17
27
  span_op.set_tag(Ext::TAG_DBM_TRACE_INJECTED, true) if mode.full?
18
28
  end
19
29
 
@@ -36,6 +46,14 @@ module Datadog
36
46
  Ext::KEY_PEER_SERVICE => peer_service,
37
47
  }
38
48
 
49
+ # Add DBM propagation hash to SQL comment when enabled and available.
50
+ # This matches the behavior in the Python tracer:
51
+ # https://github.com/DataDog/dd-trace-py/blob/5e94be5c97b42060e5800e35d8fa41472fb8c569/ddtrace/propagation/_database_monitoring.py#L139
52
+ if inject_hash?(mode, config)
53
+ checksum = Datadog.send(:components).agent_info.propagation_checksum
54
+ tags[Ext::KEY_BASE_HASH] = checksum.to_s if checksum
55
+ end
56
+
39
57
  db_service = peer_service || span_op.service
40
58
  if parent_service != db_service # Only set if it's different from parent_service; otherwise it's redundant
41
59
  tags[Ext::KEY_DATABASE_SERVICE] = db_service
@@ -60,6 +78,12 @@ module Datadog
60
78
  "#{Comment.new(tags)} #{sql}"
61
79
  end
62
80
  end
81
+
82
+ # @return [Boolean] whether to inject the propagation checksum (basehash)
83
+ def self.inject_hash?(mode, config)
84
+ mode.inject_sql_basehash? && config.experimental_propagate_process_tags_enabled
85
+ end
86
+ private_class_method :inject_hash?
63
87
  end
64
88
  end
65
89
  end
@@ -11,8 +11,11 @@ module Datadog
11
11
  # Default settings for the Que integration
12
12
  class Settings < Contrib::Configuration::Settings
13
13
  option :service_name
14
- option :distributed_tracing, default: true, type: :bool
15
-
14
+ option :distributed_tracing do |o|
15
+ o.type :bool
16
+ o.env Ext::ENV_DISTRIBUTED_TRACING
17
+ o.default true
18
+ end
16
19
  option :enabled do |o|
17
20
  o.type :bool
18
21
  o.env Ext::ENV_ENABLED
@@ -11,6 +11,7 @@ module Datadog
11
11
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_QUE_ANALYTICS_ENABLED'
12
12
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_QUE_ANALYTICS_SAMPLE_RATE'
13
13
  ENV_ENABLED = 'DD_TRACE_QUE_ENABLED'
14
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_QUE_DISTRIBUTED_TRACING'
14
15
  ENV_TAG_ARGS_ENABLED = 'DD_TRACE_QUE_TAG_ARGS_ENABLED'
15
16
  ENV_TAG_DATA_ENABLED = 'DD_TRACE_QUE_TAG_DATA_ENABLED'
16
17
  SERVICE_NAME = 'que'
@@ -37,7 +37,11 @@ module Datadog
37
37
  end
38
38
 
39
39
  option :application
40
- option :distributed_tracing, default: true, type: :bool
40
+ option :distributed_tracing do |o|
41
+ o.type :bool
42
+ o.env Ext::ENV_DISTRIBUTED_TRACING
43
+ o.default true
44
+ end
41
45
  option :headers, default: DEFAULT_HEADERS, type: :hash
42
46
  option :middleware_names, default: false, type: :bool
43
47
  option :quantize, default: {}, type: :hash
@@ -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_RACK_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_RACK_DISTRIBUTED_TRACING'
11
12
  # @!visibility private
12
13
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_RACK_ANALYTICS_ENABLED'
13
14
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RACK_ANALYTICS_SAMPLE_RATE'