ddtrace 1.14.0 → 1.16.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 (283) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +146 -2
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +0 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +207 -32
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +8 -2
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +26 -10
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -16
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +17 -12
  21. data/ext/ddtrace_profiling_native_extension/profiling.c +0 -2
  22. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +74 -37
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  24. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  26. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  27. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  28. data/lib/datadog/appsec/assets.rb +8 -0
  29. data/lib/datadog/appsec/component.rb +9 -2
  30. data/lib/datadog/appsec/configuration/settings.rb +67 -2
  31. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  32. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +46 -0
  33. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  34. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
  35. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
  36. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +7 -5
  37. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  38. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +34 -10
  39. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  40. data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
  41. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
  42. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  43. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  44. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
  45. data/lib/datadog/appsec/event.rb +106 -50
  46. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  47. data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
  48. data/lib/datadog/appsec/processor/actions.rb +49 -0
  49. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  50. data/lib/datadog/appsec/processor.rb +34 -6
  51. data/lib/datadog/appsec/remote.rb +4 -1
  52. data/lib/datadog/appsec/response.rb +82 -4
  53. data/lib/datadog/appsec/sample_rate.rb +21 -0
  54. data/lib/datadog/appsec.rb +2 -2
  55. data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
  56. data/lib/datadog/core/configuration/base.rb +1 -11
  57. data/lib/datadog/core/configuration/components.rb +7 -2
  58. data/lib/datadog/core/configuration/ext.rb +21 -0
  59. data/lib/datadog/core/configuration/option.rb +2 -4
  60. data/lib/datadog/core/configuration/option_definition.rb +17 -41
  61. data/lib/datadog/core/configuration/options.rb +5 -5
  62. data/lib/datadog/core/configuration/settings.rb +47 -45
  63. data/lib/datadog/core/environment/execution.rb +47 -9
  64. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  65. data/lib/datadog/core/error.rb +1 -0
  66. data/lib/datadog/core/git/ext.rb +2 -0
  67. data/lib/datadog/core/remote/client/capabilities.rb +1 -1
  68. data/lib/datadog/core/remote/component.rb +2 -2
  69. data/lib/datadog/core/remote/negotiation.rb +2 -2
  70. data/lib/datadog/core/remote/transport/config.rb +60 -0
  71. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  72. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  73. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  74. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  75. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  76. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  77. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  78. data/lib/datadog/core/remote/transport/http.rb +179 -0
  79. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  80. data/lib/datadog/core/remote/worker.rb +3 -1
  81. data/lib/datadog/core/telemetry/collector.rb +3 -2
  82. data/lib/datadog/core/telemetry/http/transport.rb +2 -1
  83. data/lib/datadog/core/transport/ext.rb +47 -0
  84. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  85. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  86. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  87. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  88. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  89. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  90. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  91. data/lib/datadog/core/transport/http/env.rb +62 -0
  92. data/lib/datadog/core/transport/http/response.rb +60 -0
  93. data/lib/datadog/core/transport/parcel.rb +22 -0
  94. data/lib/datadog/core/transport/request.rb +17 -0
  95. data/lib/datadog/core/transport/response.rb +64 -0
  96. data/lib/datadog/core/workers/polling.rb +2 -2
  97. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  98. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  99. data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
  100. data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
  101. data/lib/datadog/opentelemetry/trace.rb +58 -0
  102. data/lib/datadog/opentelemetry.rb +1 -0
  103. data/lib/datadog/opentracer.rb +9 -0
  104. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -19
  105. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  106. data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
  107. data/lib/datadog/profiling/component.rb +24 -99
  108. data/lib/datadog/profiling/ext.rb +0 -12
  109. data/lib/datadog/profiling/flush.rb +0 -3
  110. data/lib/datadog/profiling/http_transport.rb +6 -3
  111. data/lib/datadog/profiling/native_extension.rb +0 -21
  112. data/lib/datadog/profiling/profiler.rb +36 -13
  113. data/lib/datadog/profiling/scheduler.rb +16 -9
  114. data/lib/datadog/profiling.rb +8 -81
  115. data/lib/datadog/tracing/component.rb +10 -4
  116. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  117. data/lib/datadog/tracing/configuration/ext.rb +4 -2
  118. data/lib/datadog/tracing/configuration/settings.rb +14 -7
  119. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
  120. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
  121. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
  122. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -197
  123. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  124. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
  125. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  126. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  127. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  128. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  129. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  130. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  131. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
  132. data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
  133. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
  134. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
  135. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
  136. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
  137. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
  138. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
  139. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  140. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  141. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
  142. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
  143. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
  144. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
  145. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  146. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
  147. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
  148. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
  149. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
  150. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
  151. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
  152. data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
  153. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
  154. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
  155. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
  156. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  157. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
  158. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
  159. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
  160. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
  161. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
  162. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
  163. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  164. data/lib/datadog/tracing/contrib/redis/tags.rb +7 -2
  165. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  166. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
  167. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
  168. data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
  169. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
  170. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
  171. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  172. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  173. data/lib/datadog/tracing/diagnostics/environment_logger.rb +6 -0
  174. data/lib/datadog/tracing/distributed/propagation.rb +13 -33
  175. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  176. data/lib/datadog/tracing/sync_writer.rb +3 -3
  177. data/lib/datadog/tracing/tracer.rb +2 -0
  178. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  179. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  180. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  181. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  182. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  183. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  184. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  185. data/lib/datadog/tracing/transport/http.rb +124 -0
  186. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  187. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  188. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  189. data/lib/datadog/tracing/transport/io.rb +30 -0
  190. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  191. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  192. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  193. data/lib/datadog/tracing/transport/traces.rb +224 -0
  194. data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
  195. data/lib/datadog/tracing/workers.rb +3 -2
  196. data/lib/datadog/tracing/writer.rb +5 -2
  197. data/lib/ddtrace/transport/ext.rb +17 -15
  198. data/lib/ddtrace/version.rb +1 -1
  199. data/lib/ddtrace.rb +1 -1
  200. metadata +73 -96
  201. data/lib/datadog/ci/configuration/components.rb +0 -32
  202. data/lib/datadog/ci/configuration/settings.rb +0 -51
  203. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
  204. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
  205. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  206. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  207. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  208. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  209. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
  210. data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
  211. data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
  212. data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
  213. data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
  214. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
  215. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  216. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
  217. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  218. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  219. data/lib/datadog/ci/ext/app_types.rb +0 -9
  220. data/lib/datadog/ci/ext/environment.rb +0 -575
  221. data/lib/datadog/ci/ext/settings.rb +0 -10
  222. data/lib/datadog/ci/ext/test.rb +0 -35
  223. data/lib/datadog/ci/extensions.rb +0 -19
  224. data/lib/datadog/ci/flush.rb +0 -38
  225. data/lib/datadog/ci/test.rb +0 -81
  226. data/lib/datadog/ci.rb +0 -21
  227. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  228. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  229. data/lib/datadog/core/configuration/option_set.rb +0 -10
  230. data/lib/datadog/core/transport/config.rb +0 -58
  231. data/lib/datadog/core/transport/http/api.rb +0 -57
  232. data/lib/datadog/core/transport/http/client.rb +0 -45
  233. data/lib/datadog/core/transport/http/config.rb +0 -278
  234. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  235. data/lib/datadog/core/transport/http.rb +0 -169
  236. data/lib/datadog/core/utils/object_set.rb +0 -43
  237. data/lib/datadog/core/utils/string_table.rb +0 -47
  238. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  239. data/lib/datadog/profiling/buffer.rb +0 -43
  240. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  241. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  242. data/lib/datadog/profiling/event.rb +0 -15
  243. data/lib/datadog/profiling/events/stack.rb +0 -82
  244. data/lib/datadog/profiling/old_recorder.rb +0 -107
  245. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  246. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  247. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  248. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  249. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  250. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  251. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  252. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  253. data/lib/datadog/profiling/pprof/template.rb +0 -118
  254. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  255. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  256. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  257. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  258. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  259. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  260. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  261. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  262. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  263. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  264. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  265. data/lib/ddtrace/transport/http/api.rb +0 -39
  266. data/lib/ddtrace/transport/http/builder.rb +0 -176
  267. data/lib/ddtrace/transport/http/client.rb +0 -52
  268. data/lib/ddtrace/transport/http/env.rb +0 -58
  269. data/lib/ddtrace/transport/http/response.rb +0 -58
  270. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  271. data/lib/ddtrace/transport/http/traces.rb +0 -144
  272. data/lib/ddtrace/transport/http.rb +0 -117
  273. data/lib/ddtrace/transport/io/client.rb +0 -85
  274. data/lib/ddtrace/transport/io/response.rb +0 -25
  275. data/lib/ddtrace/transport/io/traces.rb +0 -99
  276. data/lib/ddtrace/transport/io.rb +0 -28
  277. data/lib/ddtrace/transport/parcel.rb +0 -20
  278. data/lib/ddtrace/transport/request.rb +0 -15
  279. data/lib/ddtrace/transport/response.rb +0 -60
  280. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  281. data/lib/ddtrace/transport/statistics.rb +0 -75
  282. data/lib/ddtrace/transport/trace_formatter.rb +0 -207
  283. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -15,27 +15,6 @@ module Datadog
15
15
  false
16
16
  end
17
17
  end
18
-
19
- unless singleton_class.method_defined?(:clock_id_for)
20
- def self.clock_id_for(_)
21
- nil
22
- end
23
- end
24
-
25
- def self.cpu_time_ns_for(thread)
26
- clock_id =
27
- begin
28
- clock_id_for(thread)
29
- rescue Errno::ESRCH
30
- nil
31
- end
32
-
33
- begin
34
- ::Process.clock_gettime(clock_id, :nanosecond) if clock_id
35
- rescue Errno::EINVAL
36
- nil
37
- end
38
- end
39
18
  end
40
19
  end
41
20
  end
@@ -1,39 +1,62 @@
1
1
  module Datadog
2
2
  module Profiling
3
- # Profiling entry point, which coordinates collectors and a scheduler
3
+ # Profiling entry point, which coordinates the worker and scheduler threads
4
4
  class Profiler
5
5
  include Datadog::Core::Utils::Forking
6
6
 
7
- attr_reader \
8
- :collectors,
9
- :scheduler
7
+ private
10
8
 
11
- def initialize(collectors, scheduler)
12
- @collectors = collectors
9
+ attr_reader :worker, :scheduler
10
+
11
+ public
12
+
13
+ def initialize(worker:, scheduler:)
14
+ @worker = worker
13
15
  @scheduler = scheduler
14
16
  end
15
17
 
16
18
  def start
17
19
  after_fork! do
18
- collectors.each(&:reset_after_fork)
20
+ worker.reset_after_fork
19
21
  scheduler.reset_after_fork
20
22
  end
21
23
 
22
- collectors.each(&:start)
23
- scheduler.start
24
+ worker.start(on_failure_proc: proc { component_failed(:worker) })
25
+ scheduler.start(on_failure_proc: proc { component_failed(:scheduler) })
24
26
  end
25
27
 
26
28
  def shutdown!
27
29
  Datadog.logger.debug('Shutting down profiler')
28
30
 
29
- collectors.each do |collector|
30
- collector.enabled = false
31
- collector.stop(true)
32
- end
31
+ stop_worker
32
+ stop_scheduler
33
+ end
34
+
35
+ private
33
36
 
37
+ def stop_worker
38
+ worker.stop
39
+ end
40
+
41
+ def stop_scheduler
34
42
  scheduler.enabled = false
35
43
  scheduler.stop(true)
36
44
  end
45
+
46
+ def component_failed(failed_component)
47
+ Datadog.logger.warn(
48
+ "Detected issue with profiler (#{failed_component} component), stopping profiling. " \
49
+ 'See previous log messages for details.'
50
+ )
51
+
52
+ if failed_component == :worker
53
+ stop_scheduler
54
+ elsif failed_component == :scheduler
55
+ stop_worker
56
+ else
57
+ raise ArgumentError, "Unexpected failed_component: #{failed_component.inspect}"
58
+ end
59
+ end
37
60
  end
38
61
  end
39
62
  end
@@ -45,20 +45,27 @@ module Datadog
45
45
  self.enabled = enabled
46
46
  end
47
47
 
48
- def start
49
- perform
48
+ def start(on_failure_proc: nil)
49
+ perform(on_failure_proc)
50
50
  end
51
51
 
52
- def perform
53
- # A profiling flush may be called while the VM is shutting down, to report the last profile. When we do so,
54
- # we impose a strict timeout. This means this last profile may or may not be sent, depending on if the flush can
55
- # successfully finish in the strict timeout.
56
- # This can be somewhat confusing (why did it not get reported?), so let's at least log what happened.
57
- interrupted = true
58
-
52
+ def perform(on_failure_proc)
59
53
  begin
54
+ # A profiling flush may be called while the VM is shutting down, to report the last profile. When we do so,
55
+ # we impose a strict timeout. This means this last profile may or may not be sent, depending on if the flush can
56
+ # successfully finish in the strict timeout.
57
+ # This can be somewhat confusing (why did it not get reported?), so let's at least log what happened.
58
+ interrupted = true
59
+
60
60
  flush_and_wait
61
61
  interrupted = false
62
+ rescue Exception => e # rubocop:disable Lint/RescueException
63
+ Datadog.logger.warn(
64
+ 'Profiling::Scheduler thread error. ' \
65
+ "Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
66
+ )
67
+ on_failure_proc&.call
68
+ raise
62
69
  ensure
63
70
  Datadog.logger.debug('#flush was interrupted or failed before it could complete') if interrupted
64
71
  end
@@ -5,22 +5,15 @@ require_relative 'core/utils/only_once'
5
5
  module Datadog
6
6
  # Datadog Continuous Profiler implementation: https://docs.datadoghq.com/profiler/
7
7
  module Profiling
8
- GOOGLE_PROTOBUF_MINIMUM_VERSION = Gem::Version.new('3.0')
9
- private_constant :GOOGLE_PROTOBUF_MINIMUM_VERSION
10
-
11
8
  def self.supported?
12
9
  unsupported_reason.nil?
13
10
  end
14
11
 
15
12
  def self.unsupported_reason
16
13
  # NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons -- e.g. tell users
17
- # first that they can't use this on JRuby before telling them that they are missing protobuf
14
+ # first that they can't use this on JRuby before telling them that something else failed
18
15
 
19
- native_library_compilation_skipped? ||
20
- native_library_failed_to_load? ||
21
- protobuf_gem_unavailable? ||
22
- protobuf_version_unsupported? ||
23
- protobuf_failed_to_load?
16
+ native_library_compilation_skipped? || native_library_failed_to_load?
24
17
  end
25
18
 
26
19
  # Starts the profiler, if the profiler is supported by in
@@ -53,9 +46,7 @@ module Datadog
53
46
  #
54
47
  # Note 2: All fibers in the same thread will share the same counter values.
55
48
  #
56
- # Only available when the profiler is running, the new CPU Profiling 2.0 profiler is in use, and allocation-related
57
- # features are not disabled via configuration.
58
- # For instructions on enabling CPU Profiling 2.0 see the ddtrace release notes.
49
+ # Only available when the profiler is running, and allocation-related features are not disabled via configuration.
59
50
  #
60
51
  # @return [Integer] number of allocations observed in the current thread.
61
52
  # @return [nil] when not available.
@@ -68,11 +59,12 @@ module Datadog
68
59
 
69
60
  def self.enabled?
70
61
  profiler = Datadog.send(:components).profiler
71
- !!(profiler.scheduler.running? if profiler)
62
+ # Use .send(...) to avoid exposing the attr_reader as an API to the outside
63
+ !!(profiler.send(:scheduler).running? if profiler)
72
64
  end
73
65
 
74
66
  private_class_method def self.replace_noop_allocation_count
75
- def self.allocation_count # rubocop:disable Lint/DuplicateMethods, Lint/NestedMethodDefinition (On purpose!)
67
+ def self.allocation_count # rubocop:disable Lint/NestedMethodDefinition (On purpose!)
76
68
  Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_allocation_count
77
69
  end
78
70
  end
@@ -97,66 +89,6 @@ module Datadog
97
89
  end
98
90
  end
99
91
 
100
- private_class_method def self.protobuf_gem_unavailable?
101
- # NOTE: On environments where protobuf is already loaded, we skip the check. This allows us to support environments
102
- # where no Gem.loaded_version is NOT available but customers are able to load protobuf; see for instance
103
- # https://github.com/teamcapybara/capybara/commit/caf3bcd7664f4f2691d0ca9ef3be9a2a954fecfb
104
- if !protobuf_already_loaded? && Gem.loaded_specs['google-protobuf'].nil?
105
- "Missing google-protobuf dependency; please add `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
106
- end
107
- end
108
-
109
- private_class_method def self.protobuf_version_unsupported?
110
- # See above for why we skip the check when protobuf is already loaded; note that when protobuf was already loaded
111
- # we skip the version check to avoid the call to Gem.loaded_specs. Unfortunately, protobuf does not seem to
112
- # expose the gem version constant elsewhere, so in that setup we are not able to check the version.
113
- if !protobuf_already_loaded? && Gem.loaded_specs['google-protobuf'].version < GOOGLE_PROTOBUF_MINIMUM_VERSION
114
- 'Your google-protobuf is too old; ensure that you have google-protobuf >= 3.0 by ' \
115
- "adding `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
116
- end
117
- end
118
-
119
- private_class_method def self.protobuf_already_loaded?
120
- defined?(::Google::Protobuf) && !defined?(::Protobuf)
121
- !!(defined?(::Google::Protobuf) && !defined?(::Protobuf))
122
- end
123
-
124
- private_class_method def self.protobuf_failed_to_load?
125
- unless protobuf_loaded_successfully?
126
- 'There was an error loading the google-protobuf library; see previous warning message for details'
127
- end
128
- end
129
-
130
- # The `google-protobuf` gem depends on a native component, and its creators helpfully tried to provide precompiled
131
- # versions of this extension on rubygems.org.
132
- #
133
- # Unfortunately, for a long time, the supported Ruby versions metadata on these precompiled versions of the extension
134
- # was not correctly set. (This is fixed in newer versions -- but not all Ruby versions we want to support can use
135
- # these.)
136
- #
137
- # Thus, the gem can still be installed, but can be in a broken state. To avoid breaking customer applications, we
138
- # use this helper to load it and gracefully handle failures.
139
- private_class_method def self.protobuf_loaded_successfully?
140
- return @protobuf_loaded if defined?(@protobuf_loaded)
141
-
142
- begin
143
- require 'google/protobuf'
144
- @protobuf_loaded = true
145
- rescue LoadError => e
146
- # NOTE: We use Kernel#warn here because this code gets run BEFORE Datadog.logger is actually set up.
147
- # In the future it'd be nice to shuffle the logger startup to happen first to avoid this special case.
148
- Kernel.warn(
149
- '[ddtrace] Error while loading google-protobuf gem. ' \
150
- "Cause: '#{e.class.name} #{e.message}' Location: '#{Array(e.backtrace).first}'. " \
151
- 'This can happen when google-protobuf is missing its native components. ' \
152
- 'To fix this, try removing and reinstalling the gem, forcing it to recompile the components: ' \
153
- '`gem uninstall google-protobuf -a; BUNDLE_FORCE_RUBY_PLATFORM=true bundle install`. ' \
154
- 'If the error persists, please contact Datadog support at <https://docs.datadoghq.com/help/>.'
155
- )
156
- @protobuf_loaded = false
157
- end
158
- end
159
-
160
92
  private_class_method def self.native_library_failed_to_load?
161
93
  success, exception = try_loading_native_library
162
94
 
@@ -184,7 +116,7 @@ module Datadog
184
116
  end
185
117
 
186
118
  # All requires for the profiler should be directly added here; and everything should be loaded eagerly.
187
- # (Currently there's a few exceptions for the old profiler, but we should avoid other exceptions.)
119
+ # (Currently there's a leftovers that need to be cleaned up, but we should avoid other exceptions.)
188
120
  #
189
121
  # All of the profiler should be loaded and ready to go when this method returns `true`.
190
122
  private_class_method def self.load_profiling
@@ -195,21 +127,16 @@ module Datadog
195
127
  require_relative 'profiling/collectors/cpu_and_wall_time_worker'
196
128
  require_relative 'profiling/collectors/dynamic_sampling_rate'
197
129
  require_relative 'profiling/collectors/idle_sampling_helper'
198
- require_relative 'profiling/collectors/old_stack'
199
130
  require_relative 'profiling/collectors/stack'
200
131
  require_relative 'profiling/collectors/thread_context'
201
132
  require_relative 'profiling/diagnostics/environment_logger'
202
133
  require_relative 'profiling/stack_recorder'
203
- require_relative 'profiling/old_recorder'
204
134
  require_relative 'profiling/exporter'
135
+ require_relative 'profiling/flush'
205
136
  require_relative 'profiling/scheduler'
206
137
  require_relative 'profiling/tasks/setup'
207
138
  require_relative 'profiling/profiler'
208
139
  require_relative 'profiling/native_extension'
209
- require_relative 'profiling/trace_identifiers/helper'
210
- # This file is no longer eagerly loaded as a workaround for an issue. It only gets loaded dynamically if the old
211
- # profiler is in use. See Profiling::Component#load_pprof_support for more details.
212
- # require_relative 'profiling/pprof/pprof_pb'
213
140
  require_relative 'profiling/tag_builder'
214
141
  require_relative 'profiling/http_transport'
215
142
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'tracer'
4
+ require_relative 'configuration/agent_settings_resolver'
4
5
  require_relative 'flush'
5
6
  require_relative 'sync_writer'
6
7
  require_relative 'sampling/span/rule_parser'
@@ -22,12 +23,14 @@ module Datadog
22
23
  end
23
24
  end
24
25
 
25
- def build_tracer(settings, agent_settings)
26
+ def build_tracer(settings, logger:)
26
27
  # If a custom tracer has been provided, use it instead.
27
28
  # Ignore all other options (they should already be configured.)
28
29
  tracer = settings.tracing.instance
29
30
  return tracer unless tracer.nil?
30
31
 
32
+ agent_settings = Configuration::AgentSettingsResolver.call(settings, logger: logger)
33
+
31
34
  # Apply test mode settings if test mode is activated
32
35
  if settings.tracing.test_mode.enabled
33
36
  trace_flush = build_test_mode_trace_flush(settings)
@@ -131,12 +134,12 @@ module Datadog
131
134
  # process, but can take a variety of options (including
132
135
  # a fully custom instance) that makes the Tracer
133
136
  # initialization process complex.
134
- def build_writer(settings, agent_settings)
137
+ def build_writer(settings, agent_settings, options = settings.tracing.writer_options)
135
138
  if (writer = settings.tracing.writer)
136
139
  return writer
137
140
  end
138
141
 
139
- Tracing::Writer.new(agent_settings: agent_settings, **settings.tracing.writer_options)
142
+ Tracing::Writer.new(agent_settings: agent_settings, **options)
140
143
  end
141
144
 
142
145
  def subscribe_to_writer_events!(writer, sampler_delegator, test_mode)
@@ -220,8 +223,11 @@ module Datadog
220
223
  end
221
224
 
222
225
  def build_test_mode_writer(settings, agent_settings)
223
- # Flush traces synchronously, to guarantee they are written.
224
226
  writer_options = settings.tracing.test_mode.writer_options || {}
227
+
228
+ return build_writer(settings, agent_settings, writer_options) if settings.tracing.test_mode.async
229
+
230
+ # Flush traces synchronously, to guarantee they are written.
225
231
  Tracing::SyncWriter.new(agent_settings: agent_settings, **writer_options)
226
232
  end
227
233
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../core/configuration/agent_settings_resolver'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Configuration
8
+ # This class encapsulates any tracing specific agent settings
9
+ class AgentSettingsResolver < Datadog::Core::Configuration::AgentSettingsResolver
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../core/configuration/ext'
4
+
3
5
  module Datadog
4
6
  module Tracing
5
7
  module Configuration
@@ -88,8 +90,8 @@ module Datadog
88
90
 
89
91
  # @public_api
90
92
  module Transport
91
- ENV_DEFAULT_PORT = 'DD_TRACE_AGENT_PORT'
92
- ENV_DEFAULT_URL = 'DD_TRACE_AGENT_URL'
93
+ ENV_DEFAULT_PORT = Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_PORT
94
+ ENV_DEFAULT_URL = Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_URL
93
95
  end
94
96
 
95
97
  # @public_api
@@ -1,4 +1,5 @@
1
1
  require_relative '../../tracing/configuration/ext'
2
+ require_relative '../../core/environment/variable_helpers'
2
3
  require_relative 'http'
3
4
 
4
5
  module Datadog
@@ -64,7 +65,7 @@ module Datadog
64
65
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER,
65
66
  ]
66
67
  )
67
- o.on_set do |styles|
68
+ o.after_set do |styles|
68
69
  # Modernize B3 options
69
70
  # DEV-2.0: Can be removed with the removal of deprecated B3 constants.
70
71
  styles.map! do |style|
@@ -93,7 +94,7 @@ module Datadog
93
94
  o.env Tracing::Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE_INJECT
94
95
  # DEV-2.0: Change default value to `tracecontext, Datadog`.
95
96
  o.default [Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG]
96
- o.on_set do |styles|
97
+ o.after_set do |styles|
97
98
  # Modernize B3 options
98
99
  # DEV-2.0: Can be removed with the removal of deprecated B3 constants.
99
100
  styles.map! do |style|
@@ -121,7 +122,7 @@ module Datadog
121
122
  o.type :array
122
123
  o.env Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE
123
124
  o.default []
124
- o.on_set do |styles|
125
+ o.after_set do |styles|
125
126
  next if styles.empty?
126
127
 
127
128
  # Modernize B3 options
@@ -371,6 +372,12 @@ module Datadog
371
372
  o.env Tracing::Configuration::Ext::Test::ENV_MODE_ENABLED
372
373
  end
373
374
 
375
+ # Use async writer in test mode
376
+ option :async do |o|
377
+ o.type :bool
378
+ o.default false
379
+ end
380
+
374
381
  option :trace_flush
375
382
 
376
383
  option :writer_options do |o|
@@ -382,8 +389,8 @@ module Datadog
382
389
  # @see file:docs/GettingStarted.md#configuring-the-transport-layer Configuring the transport layer
383
390
  #
384
391
  # A {Proc} that configures a custom tracer transport.
385
- # @yield Receives a {Datadog::Transport::HTTP} that can be modified with custom adapters and settings.
386
- # @yieldparam [Datadog::Transport::HTTP] t transport to be configured.
392
+ # @yield Receives a {Datadog::Tracing::Transport::HTTP} that can be modified with custom adapters and settings.
393
+ # @yieldparam [Datadog::Tracing::Transport::HTTP] t transport to be configured.
387
394
  # @default `nil`
388
395
  # @return [Proc,nil]
389
396
  option :transport_options do |o|
@@ -425,7 +432,7 @@ module Datadog
425
432
  option :enabled do |o|
426
433
  o.type :bool
427
434
  o.default do
428
- disabled = env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_DISABLED)
435
+ disabled = Core::Environment::VariableHelpers.env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_DISABLED)
429
436
 
430
437
  enabled = if disabled.nil?
431
438
  false
@@ -438,7 +445,7 @@ module Datadog
438
445
  end
439
446
 
440
447
  # ENABLED env var takes precedence over deprecated DISABLED
441
- env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_ENABLED, enabled)
448
+ Core::Environment::VariableHelpers.env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_ENABLED, enabled)
442
449
  end
443
450
  end
444
451
 
@@ -30,7 +30,7 @@ module Datadog
30
30
 
31
31
  # DEV-2.0: Breaking changes for removal.
32
32
  option :exception_controller do |o|
33
- o.on_set do |value|
33
+ o.after_set do |value|
34
34
  if value
35
35
  Datadog::Core.log_deprecation do
36
36
  'The error controller is now automatically detected. '\
@@ -33,7 +33,7 @@ module Datadog
33
33
  option :service_name
34
34
  option :error_handler do |o|
35
35
  o.type :proc
36
- o.experimental_default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
36
+ o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
37
37
  end
38
38
  end
39
39
  end
@@ -45,6 +45,10 @@ module Datadog
45
45
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
46
46
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_SQL)
47
47
 
48
+ if service_name != Datadog.configuration.service
49
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
50
+ end
51
+
48
52
  # Set analytics sample rate
49
53
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
50
54
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])