datadog 2.29.0 → 2.31.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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +21 -12
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +9 -7
  5. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +18 -0
  6. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  7. data/ext/datadog_profiling_native_extension/extconf.rb +6 -24
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +5 -6
  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 +29 -43
  15. data/ext/libdatadog_api/crashtracker.c +5 -8
  16. data/ext/libdatadog_api/crashtracker_report_exception.c +34 -144
  17. data/ext/libdatadog_api/datadog_ruby_common.c +18 -0
  18. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  19. data/ext/libdatadog_api/di.c +79 -0
  20. data/ext/libdatadog_api/extconf.rb +5 -20
  21. data/ext/libdatadog_api/init.c +5 -2
  22. data/ext/libdatadog_extconf_helpers.rb +57 -11
  23. data/lib/datadog/ai_guard/component.rb +2 -0
  24. data/lib/datadog/ai_guard/configuration/settings.rb +3 -0
  25. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +41 -3
  26. data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
  27. data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
  28. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +3 -1
  29. data/lib/datadog/ai_guard/evaluation/request.rb +14 -9
  30. data/lib/datadog/ai_guard/evaluation/result.rb +3 -1
  31. data/lib/datadog/ai_guard/evaluation.rb +36 -7
  32. data/lib/datadog/ai_guard.rb +26 -8
  33. data/lib/datadog/appsec/autoload.rb +1 -1
  34. data/lib/datadog/appsec/component.rb +11 -7
  35. data/lib/datadog/appsec/contrib/active_record/patcher.rb +3 -0
  36. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
  37. data/lib/datadog/appsec/contrib/excon/patcher.rb +2 -0
  38. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +1 -1
  39. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  40. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  41. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +10 -11
  42. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  43. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +25 -2
  44. data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
  45. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  46. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  47. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  48. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +2 -0
  49. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  50. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +3 -3
  51. data/lib/datadog/appsec/event.rb +1 -17
  52. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
  53. data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
  54. data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -2
  55. data/lib/datadog/appsec/utils/http/media_type.rb +1 -2
  56. data/lib/datadog/appsec/utils/http/url_encoded.rb +2 -2
  57. data/lib/datadog/appsec.rb +5 -9
  58. data/lib/datadog/core/configuration/base.rb +17 -5
  59. data/lib/datadog/core/configuration/components.rb +21 -8
  60. data/lib/datadog/core/configuration/config_helper.rb +9 -0
  61. data/lib/datadog/core/configuration/option.rb +32 -6
  62. data/lib/datadog/core/configuration/option_definition.rb +38 -12
  63. data/lib/datadog/core/configuration/options.rb +41 -7
  64. data/lib/datadog/core/configuration/settings.rb +42 -3
  65. data/lib/datadog/core/configuration/supported_configurations.rb +17 -0
  66. data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
  67. data/lib/datadog/core/contrib/rails/utils.rb +7 -3
  68. data/lib/datadog/core/crashtracking/component.rb +7 -15
  69. data/lib/datadog/core/environment/container.rb +2 -2
  70. data/lib/datadog/core/environment/ext.rb +1 -0
  71. data/lib/datadog/core/environment/identity.rb +25 -3
  72. data/lib/datadog/core/environment/process.rb +12 -0
  73. data/lib/datadog/core/metrics/client.rb +5 -5
  74. data/lib/datadog/core/process_discovery.rb +5 -0
  75. data/lib/datadog/core/remote/component.rb +38 -21
  76. data/lib/datadog/core/runtime/metrics.rb +2 -3
  77. data/lib/datadog/core/telemetry/component.rb +3 -0
  78. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -3
  79. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
  80. data/lib/datadog/core/telemetry/event/app_started.rb +151 -169
  81. data/lib/datadog/core/telemetry/event.rb +1 -7
  82. data/lib/datadog/core/telemetry/ext.rb +1 -0
  83. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +5 -0
  84. data/lib/datadog/core/telemetry/worker.rb +20 -0
  85. data/lib/datadog/core/utils/base64.rb +1 -1
  86. data/lib/datadog/core/utils/only_once.rb +1 -1
  87. data/lib/datadog/core/utils/spawn_monkey_patch.rb +36 -0
  88. data/lib/datadog/core/workers/async.rb +1 -1
  89. data/lib/datadog/core/workers/interval_loop.rb +13 -6
  90. data/lib/datadog/core/workers/queue.rb +0 -4
  91. data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
  92. data/lib/datadog/core.rb +0 -1
  93. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  94. data/lib/datadog/data_streams/processor.rb +1 -0
  95. data/lib/datadog/di/boot.rb +3 -4
  96. data/lib/datadog/di/component.rb +20 -4
  97. data/lib/datadog/di/instrumenter.rb +20 -10
  98. data/lib/datadog/di/probe_manager.rb +79 -62
  99. data/lib/datadog/di/probe_notification_builder.rb +148 -33
  100. data/lib/datadog/di/probe_notifier_worker.rb +52 -6
  101. data/lib/datadog/di/probe_repository.rb +198 -0
  102. data/lib/datadog/di/remote.rb +5 -6
  103. data/lib/datadog/di/serializer.rb +127 -9
  104. data/lib/datadog/di/transport/http.rb +12 -3
  105. data/lib/datadog/di/transport/input.rb +46 -8
  106. data/lib/datadog/di.rb +81 -0
  107. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  108. data/lib/datadog/open_feature/configuration.rb +2 -0
  109. data/lib/datadog/open_feature/evaluation_engine.rb +1 -1
  110. data/lib/datadog/open_feature/exposures/reporter.rb +1 -1
  111. data/lib/datadog/open_feature/exposures/worker.rb +1 -1
  112. data/lib/datadog/open_feature/remote.rb +1 -1
  113. data/lib/datadog/open_feature/transport.rb +1 -1
  114. data/lib/datadog/opentelemetry/configuration/settings.rb +2 -0
  115. data/lib/datadog/profiling/collectors/code_provenance.rb +2 -3
  116. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -1
  117. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  118. data/lib/datadog/profiling/component.rb +31 -1
  119. data/lib/datadog/profiling/http_transport.rb +5 -6
  120. data/lib/datadog/profiling/load_native_extension.rb +1 -1
  121. data/lib/datadog/profiling/profiler.rb +15 -12
  122. data/lib/datadog/profiling/scheduler.rb +2 -2
  123. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  124. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  125. data/lib/datadog/profiling.rb +1 -2
  126. data/lib/datadog/single_step_instrument.rb +1 -1
  127. data/lib/datadog/tracing/buffer.rb +3 -3
  128. data/lib/datadog/tracing/component.rb +11 -0
  129. data/lib/datadog/tracing/configuration/settings.rb +2 -1
  130. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  131. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +20 -0
  132. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
  133. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  134. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  135. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  136. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  137. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  138. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  139. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  140. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  141. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  142. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  143. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
  144. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  145. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -1
  146. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  147. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  148. data/lib/datadog/tracing/contrib/configurable.rb +18 -3
  149. data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
  150. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -1
  151. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
  152. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  153. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -2
  154. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  155. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  156. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -2
  157. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  158. data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -2
  159. data/lib/datadog/tracing/contrib/grape/endpoint.rb +7 -7
  160. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
  161. data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
  162. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
  163. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  164. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +5 -2
  165. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  166. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -1
  167. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +5 -2
  168. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  169. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +5 -2
  170. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  171. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -1
  172. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
  173. data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
  174. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -1
  175. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
  176. data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
  177. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +5 -1
  178. data/lib/datadog/tracing/contrib/rack/ext.rb +1 -0
  179. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
  180. data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
  181. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  182. data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
  183. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  184. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +2 -2
  185. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  186. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
  187. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  188. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
  189. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  190. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
  191. data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
  192. data/lib/datadog/tracing/contrib/status_range_matcher.rb +4 -0
  193. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  194. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +5 -1
  195. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +1 -0
  196. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  197. data/lib/datadog/tracing/event.rb +1 -1
  198. data/lib/datadog/tracing/metadata/ext.rb +4 -0
  199. data/lib/datadog/tracing/remote.rb +1 -1
  200. data/lib/datadog/tracing/sampling/ext.rb +2 -0
  201. data/lib/datadog/tracing/sampling/priority_sampler.rb +13 -0
  202. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  203. data/lib/datadog/tracing/sampling/rule_sampler.rb +54 -25
  204. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  205. data/lib/datadog/tracing/span_operation.rb +1 -1
  206. data/lib/datadog/tracing/sync_writer.rb +0 -1
  207. data/lib/datadog/tracing/trace_operation.rb +50 -6
  208. data/lib/datadog/tracing/tracer.rb +25 -0
  209. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  210. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  211. data/lib/datadog/tracing/writer.rb +0 -1
  212. data/lib/datadog/version.rb +1 -1
  213. metadata +15 -8
  214. data/lib/datadog/tracing/workers/trace_writer.rb +0 -204
@@ -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
@@ -35,7 +35,7 @@ module Datadog
35
35
  global_config: Datadog.configuration.tracing[:httprb],
36
36
  trace: trace
37
37
  )
38
- Contrib::HTTP.inject(trace, req)
38
+ Contrib::HTTP.inject(trace, req.headers)
39
39
  end
40
40
 
41
41
  # Add additional request specific tags to the span.
@@ -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'
@@ -84,7 +84,7 @@ module Datadog
84
84
  span.resource = "#{method} #{quantized_url}"
85
85
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
86
86
  rescue => e
87
- Datadog.logger.error(e.message)
87
+ Datadog.logger.error("#{e.class}: #{e}")
88
88
  Datadog::Core::Telemetry::Logger.report(e)
89
89
  # TODO: Refactor the code to streamline the execution without ensure
90
90
  ensure
@@ -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'
@@ -51,8 +51,11 @@ module Datadog
51
51
  end
52
52
  end
53
53
 
54
- option :distributed_tracing, default: true, type: :bool
55
-
54
+ option :distributed_tracing do |o|
55
+ o.type :bool
56
+ o.env Ext::ENV_DISTRIBUTED_TRACING
57
+ o.default true
58
+ end
56
59
  option :request_queuing do |o|
57
60
  o.type :bool
58
61
  o.default false
@@ -9,6 +9,7 @@ module Datadog
9
9
  module Ext
10
10
  APP = 'rails'
11
11
  ENV_ENABLED = 'DD_TRACE_RAILS_ENABLED'
12
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_RAILS_DISTRIBUTED_TRACING'
12
13
  # @!visibility private
13
14
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_RAILS_ANALYTICS_ENABLED'
14
15
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE'
@@ -18,7 +18,7 @@ module Datadog
18
18
  app_config.log_tags << proc { Tracing.log_correlation if Datadog.configuration.tracing.log_injection }
19
19
  rescue => e
20
20
  Datadog.logger.warn(
21
- "Unable to add Datadog Trace context to ActiveSupport::TaggedLogging: #{e.class.name} #{e.message}"
21
+ "Unable to add Datadog Trace context to ActiveSupport::TaggedLogging: #{e.class}: #{e}"
22
22
  )
23
23
  false
24
24
  end
@@ -6,7 +6,6 @@ require_relative 'framework'
6
6
  require_relative 'log_injection'
7
7
  require_relative 'middlewares'
8
8
  require_relative 'runner'
9
- require_relative '../../../core/contrib/rails/utils'
10
9
  require_relative '../semantic_logger/patcher'
11
10
 
12
11
  module Datadog
@@ -86,7 +86,7 @@ module Datadog
86
86
  # Reads one more byte than the limit to allow us to check if the source exceeds the limit.
87
87
  source = File.read(file, MAX_TAG_VALUE_SIZE + 1)
88
88
  rescue => e
89
- Datadog.logger.debug("Failed to read file '#{file}' for Rails runner: #{e.message}")
89
+ Datadog.logger.debug { "Failed to read file '#{file}' for Rails runner: #{e.class}: #{e}" }
90
90
  end
91
91
 
92
92
  Tracing.trace(
@@ -66,7 +66,7 @@ module Datadog
66
66
  span.set_tag(Ext::TAG_TASK_ARG_NAMES, arg_names)
67
67
  span.set_tag(Ext::TAG_INVOKE_ARGS, quantize_args(args)) unless args.nil?
68
68
  rescue => e
69
- Datadog.logger.debug("Error while tracing Rake invoke: #{e.class.name} #{e.message}")
69
+ Datadog.logger.debug { "Error while tracing Rake invoke: #{e.class}: #{e}" }
70
70
  end
71
71
 
72
72
  def annotate_execute!(span, args)
@@ -75,7 +75,7 @@ module Datadog
75
75
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_EXECUTE)
76
76
  span.set_tag(Ext::TAG_EXECUTE_ARGS, quantize_args(args.to_hash)) unless args.nil?
77
77
  rescue => e
78
- Datadog.logger.debug("Error while tracing Rake execute: #{e.class.name} #{e.message}")
78
+ Datadog.logger.debug { "Error while tracing Rake execute: #{e.class}: #{e}" }
79
79
  end
80
80
 
81
81
  def quantize_args(args)
@@ -47,7 +47,7 @@ module Datadog
47
47
 
48
48
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
49
49
  rescue => e
50
- Datadog.logger.error(e.message)
50
+ Datadog.logger.error("#{e.class}: #{e}")
51
51
  Datadog::Core::Telemetry::Logger.report(e)
52
52
  end
53
53
 
@@ -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.default do
37
40
  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_REST_CLIENT_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_REST_CLIENT_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_REST_CLIENT_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_REST_CLIENT_PEER_SERVICE'
13
14
  # @!visibility private
@@ -38,7 +38,11 @@ module Datadog
38
38
  end
39
39
 
40
40
  option :quantize, default: {}, type: :hash
41
- option :distributed_tracing, default: false, type: :bool
41
+ option :distributed_tracing do |o|
42
+ o.type :bool
43
+ o.env Ext::ENV_DISTRIBUTED_TRACING
44
+ o.default false
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -12,6 +12,7 @@ module Datadog
12
12
  # @!visibility private
13
13
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_SIDEKIQ_ANALYTICS_ENABLED'
14
14
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SIDEKIQ_ANALYTICS_SAMPLE_RATE'
15
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_SIDEKIQ_DISTRIBUTED_TRACING'
15
16
  SERVICE_NAME = 'sidekiq'
16
17
  SIDEKIQ_8_SECONDS_PER_INTEGER = 0.001 # Sidekiq 8 uses integer epoch milliseconds, rather than epoch floats
17
18
  SPAN_PUSH = 'sidekiq.push'
@@ -33,7 +33,11 @@ module Datadog
33
33
  o.default 1.0
34
34
  end
35
35
 
36
- option :distributed_tracing, default: true, type: :bool
36
+ option :distributed_tracing do |o|
37
+ o.type :bool
38
+ o.env Ext::ENV_DISTRIBUTED_TRACING
39
+ o.default true
40
+ end
37
41
  option :headers, default: DEFAULT_HEADERS, type: :hash
38
42
  option :resource_script_names, default: false, type: :bool
39
43
 
@@ -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_SINATRA_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_SINATRA_DISTRIBUTED_TRACING'
11
12
  # @!visibility private
12
13
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_SINATRA_ANALYTICS_ENABLED'
13
14
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SINATRA_ANALYTICS_SAMPLE_RATE'
@@ -27,6 +27,10 @@ module Datadog
27
27
  end
28
28
  end
29
29
  end
30
+
31
+ def to_s
32
+ @ranges.map { |range| range.is_a?(Range) ? "#{range.begin}-#{range.end}" : range.to_s }.join(',')
33
+ end
30
34
  end
31
35
  end
32
36
  end
@@ -55,7 +55,7 @@ module Datadog
55
55
  span.set_tag(Ext::TAG_REQUEST_PATH, event.path)
56
56
  span.set_tag(Ext::TAG_REQUEST_NUM_RETRIES, event.num_retries.to_s)
57
57
  rescue => e
58
- Datadog.logger.debug(e.message)
58
+ Datadog.logger.debug { "#{e.class}: #{e}" }
59
59
  end
60
60
 
61
61
  def configuration
@@ -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 WaterDrop
7
7
  module Ext
8
8
  ENV_ENABLED = 'DD_TRACE_WATERDROP_ENABLED'
9
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_WATERDROP_DISTRIBUTED_TRACING'
9
10
 
10
11
  SPAN_PRODUCER = 'karafka.produce'
11
12
 
@@ -140,8 +140,9 @@ module Datadog
140
140
  rescue => e
141
141
  set_tags_propagation_error(reason: 'encoding_error')
142
142
  ::Datadog.logger.warn(
143
- "Failed to inject x-datadog-tags: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
143
+ "Failed to inject x-datadog-tags: #{e.class}: #{e} at #{Array(e.backtrace).first}"
144
144
  )
145
+ nil
145
146
  end
146
147
 
147
148
  # Import `x-datadog-tags` tags as trace distributed tags.
@@ -166,8 +167,9 @@ module Datadog
166
167
  rescue => e
167
168
  set_tags_propagation_error(reason: 'decoding_error')
168
169
  ::Datadog.logger.warn(
169
- "Failed to extract x-datadog-tags: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
170
+ "Failed to extract x-datadog-tags: #{e.class}: #{e} at #{Array(e.backtrace).first}"
170
171
  )
172
+ nil
171
173
  end
172
174
 
173
175
  def set_tags_propagation_error(reason:)
@@ -62,7 +62,7 @@ module Datadog
62
62
  block.call(*args)
63
63
  rescue => e
64
64
  Datadog.logger.debug do
65
- "Error while handling '#{name}' event with '#{block}': #{e.class.name} #{e.message} " \
65
+ "Error while handling '#{name}' event with '#{block}': #{e.class}: #{e} " \
66
66
  "at #{Array(e.backtrace).first}"
67
67
  end
68
68
  end
@@ -66,6 +66,10 @@ module Datadog
66
66
  TAG_DD_PARENT_ID = '_dd.parent_id'
67
67
  DD_PARENT_ID_DEFAULT = '0000000000000000'
68
68
 
69
+ # Knuth Sampling Rate: the sampling rate applied by agent-based or rule-based sampling.
70
+ # This is a propagated tag (prefixed with `_dd.p.`) that is included in `x-datadog-tags`.
71
+ TAG_KNUTH_SAMPLING_RATE = '_dd.p.ksr'
72
+
69
73
  # Trace tags with this prefix will propagate from a trace through distributed tracing.
70
74
  # Distributed headers tags with this prefix will be injected into the active trace.
71
75
  TAGS_PREFIX = '_dd.p.'
@@ -43,7 +43,7 @@ module Datadog
43
43
 
44
44
  Datadog.send(:components).telemetry.client_configuration_change!(env_vars)
45
45
  rescue => e
46
- content.errored("#{e.class.name} #{e.message}: #{Array(e.backtrace).join("\n")}")
46
+ content.errored("#{e.class}: #{e}: #{Array(e.backtrace).join("\n")}")
47
47
  end
48
48
 
49
49
  def receivers(_telemetry)
@@ -47,6 +47,8 @@ module Datadog
47
47
  MANUAL = '-4'
48
48
  # Formerly AppSec.
49
49
  ASM = '-5'
50
+ # AI Guard.
51
+ AI_GUARD = '-13'
50
52
  # Dynamically configured rule, explicitly created by the user.
51
53
  REMOTE_USER_RULE = '-11'
52
54
  # Dynamically configured rule, automatically generated by Datadog.
@@ -77,6 +77,19 @@ module Datadog
77
77
  end
78
78
  end
79
79
 
80
+ def reconsider_sample_resource!(trace)
81
+ return unless @priority_sampler.respond_to?(:reconsider_sample_resource!)
82
+
83
+ preserving_sampling(trace) do
84
+ @priority_sampler.reconsider_sample_resource!(trace)
85
+ end
86
+ end
87
+
88
+ def resource_sampling?
89
+ @priority_sampler.respond_to?(:resource_sampling?) &&
90
+ @priority_sampler.resource_sampling?
91
+ end
92
+
80
93
  # (see Datadog::Tracing::Sampling::RateByServiceSampler#update)
81
94
  def update(rate_by_service, decision: nil)
82
95
  @priority_sampler.update(rate_by_service, decision: decision)
@@ -34,7 +34,7 @@ module Datadog
34
34
  @matcher.match?(trace)
35
35
  rescue => e
36
36
  Datadog.logger.error(
37
- "Matcher failed. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
37
+ "Matcher failed. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
38
38
  )
39
39
  Datadog::Core::Telemetry::Logger.report(e, description: 'Matcher failed')
40
40
  nil
@@ -50,6 +50,7 @@ module Datadog
50
50
  # TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
51
51
  RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
52
52
  end
53
+ @reconsider_sample_resource_enabled = @rules.any? { |rule| resource_rule?(rule) }
53
54
  end
54
55
 
55
56
  def self.parse(rules, rate_limit, default_sample_rate)
@@ -84,7 +85,7 @@ module Datadog
84
85
  new(parsed_rules, rate_limit: rate_limit, default_sample_rate: default_sample_rate)
85
86
  rescue => e
86
87
  Datadog.logger.warn do
87
- "Could not parse trace sampling rules '#{rules}': #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
88
+ "Could not parse trace sampling rules '#{rules}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
88
89
  end
89
90
 
90
91
  nil
@@ -103,6 +104,18 @@ module Datadog
103
104
  trace.sampled = sampled
104
105
  end
105
106
 
107
+ def reconsider_sample_resource!(trace)
108
+ rule = @rules.find { |r| resource_rule?(r) && r.match?(trace) }
109
+ return if rule.nil?
110
+
111
+ reconsider_matching_rule!(trace, rule)
112
+ end
113
+
114
+ # Do any rules match on the resource name?
115
+ def resource_sampling?
116
+ @reconsider_sample_resource_enabled
117
+ end
118
+
106
119
  # @!visibility private
107
120
  def update(*args, **kwargs)
108
121
  return false unless @default_sampler.respond_to?(:update)
@@ -117,32 +130,10 @@ module Datadog
117
130
 
118
131
  return yield(trace) if rule.nil?
119
132
 
120
- sampled = rule.sample!(trace)
121
- sample_rate = rule.sample_rate(trace)
122
-
123
- set_priority(trace, sampled)
124
- set_rule_metrics(trace, sample_rate)
125
-
126
- return false unless sampled
127
-
128
- rate_limiter.allow?.tap do |allowed|
129
- set_priority(trace, allowed)
130
- set_limiter_metrics(trace, rate_limiter.effective_rate)
131
-
132
- provenance = case rule.provenance
133
- when Rule::PROVENANCE_REMOTE_USER
134
- Ext::Decision::REMOTE_USER_RULE
135
- when Rule::PROVENANCE_REMOTE_DYNAMIC
136
- Ext::Decision::REMOTE_DYNAMIC_RULE
137
- else
138
- Ext::Decision::TRACE_SAMPLING_RULE
139
- end
140
-
141
- trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, provenance)
142
- end
133
+ apply_rule!(trace, rule)
143
134
  rescue => e
144
135
  Datadog.logger.error(
145
- "Rule sampling failed. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
136
+ "Rule sampling failed. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
146
137
  )
147
138
  Datadog::Core::Telemetry::Logger.report(e, description: 'Rule sampling failed')
148
139
 
@@ -166,6 +157,44 @@ module Datadog
166
157
  def set_limiter_metrics(trace, limiter_rate)
167
158
  trace.rate_limiter_rate = limiter_rate
168
159
  end
160
+
161
+ def apply_rule!(trace, rule)
162
+ sampled = rule.sample!(trace)
163
+ sample_rate = rule.sample_rate(trace)
164
+
165
+ set_priority(trace, sampled)
166
+ set_rule_metrics(trace, sample_rate)
167
+
168
+ return false unless sampled
169
+
170
+ rate_limiter.allow?.tap do |allowed|
171
+ set_priority(trace, allowed)
172
+ set_limiter_metrics(trace, rate_limiter.effective_rate)
173
+ trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, provenance_for(rule))
174
+ end
175
+ end
176
+
177
+ def provenance_for(rule)
178
+ case rule.provenance
179
+ when Rule::PROVENANCE_REMOTE_USER
180
+ Ext::Decision::REMOTE_USER_RULE
181
+ when Rule::PROVENANCE_REMOTE_DYNAMIC
182
+ Ext::Decision::REMOTE_DYNAMIC_RULE
183
+ else
184
+ Ext::Decision::TRACE_SAMPLING_RULE
185
+ end
186
+ end
187
+
188
+ def resource_rule?(rule)
189
+ matcher = rule.matcher
190
+ matcher.respond_to?(:resource) && matcher.resource != Matcher::MATCH_ALL
191
+ end
192
+
193
+ def reconsider_matching_rule!(trace, rule)
194
+ trace.agent_sample_rate = nil
195
+ trace.clear_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
196
+ apply_rule!(trace, rule)
197
+ end
169
198
  end
170
199
  end
171
200
  end
@@ -29,7 +29,7 @@ module Datadog
29
29
  rescue => e
30
30
  Datadog.logger.warn(
31
31
  "Error parsing Span Sampling Rules `#{rules.inspect}`: " \
32
- "#{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
32
+ "#{e.class}: #{e} at #{Array(e.backtrace).first}"
33
33
  )
34
34
  return nil
35
35
  end
@@ -166,7 +166,7 @@ module Datadog
166
166
  # end its execution (either due to a system error or graceful shutdown).
167
167
  # @type var e: Exception?
168
168
  # Steep: https://github.com/soutaro/steep/issues/919
169
- return_value = yield(self) unless e && !e.is_a?(StandardError) # steep:ignore FallbackAny
169
+ return_value = yield(self) unless e && !e.is_a?(StandardError)
170
170
  end
171
171
  # rubocop:disable Lint/RescueException
172
172
  # Here we really want to catch *any* exception, not only StandardError,
@@ -9,7 +9,6 @@ require_relative 'transport/http'
9
9
  module Datadog
10
10
  module Tracing
11
11
  # SyncWriter flushes both services and traces synchronously
12
- # DEV: To be replaced by Datadog::Tracing::Workers::TraceWriter.
13
12
  #
14
13
  # Note: If you're wondering if this class is used at all, since there are no other references to it on the codebase,
15
14
  # the separate `datadog-lambda` uses it as of February 2021: