ddtrace 0.40.0 → 0.54.1

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 (602) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +22 -0
  3. data/.gitignore +7 -1
  4. data/CHANGELOG.md +1667 -350
  5. data/CONTRIBUTING.md +3 -7
  6. data/LICENSE-3rdparty.csv +2 -0
  7. data/README.md +1 -0
  8. data/bin/ddtracerb +15 -0
  9. data/ddtrace.gemspec +21 -37
  10. data/docs/DevelopmentGuide.md +56 -8
  11. data/docs/GettingStarted.md +438 -92
  12. data/docs/ProfilingDevelopment.md +107 -0
  13. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +86 -0
  14. data/ext/ddtrace_profiling_native_extension/clock_id.h +4 -0
  15. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +52 -0
  16. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +14 -0
  17. data/ext/ddtrace_profiling_native_extension/extconf.rb +166 -0
  18. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +35 -0
  19. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
  20. data/ext/ddtrace_profiling_native_extension/profiling.c +22 -0
  21. data/lib/datadog/ci/configuration/components.rb +31 -0
  22. data/lib/datadog/ci/configuration/settings.rb +37 -0
  23. data/lib/datadog/ci/context_flush.rb +29 -0
  24. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +31 -0
  25. data/lib/datadog/ci/contrib/cucumber/ext.rb +20 -0
  26. data/lib/datadog/ci/contrib/cucumber/formatter.rb +99 -0
  27. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +27 -0
  28. data/lib/datadog/ci/contrib/cucumber/integration.rb +48 -0
  29. data/lib/datadog/ci/contrib/cucumber/patcher.rb +26 -0
  30. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +31 -0
  31. data/lib/datadog/ci/contrib/rspec/example.rb +75 -0
  32. data/lib/datadog/ci/contrib/rspec/ext.rb +19 -0
  33. data/lib/datadog/ci/contrib/rspec/integration.rb +49 -0
  34. data/lib/datadog/ci/contrib/rspec/patcher.rb +26 -0
  35. data/lib/datadog/ci/ext/app_types.rb +10 -0
  36. data/lib/datadog/ci/ext/environment.rb +485 -0
  37. data/lib/datadog/ci/ext/settings.rb +11 -0
  38. data/lib/datadog/ci/ext/test.rb +36 -0
  39. data/lib/datadog/ci/extensions.rb +18 -0
  40. data/lib/datadog/ci/test.rb +81 -0
  41. data/lib/datadog/ci.rb +17 -0
  42. data/lib/datadog/contrib.rb +71 -0
  43. data/lib/datadog/core/environment/cgroup.rb +52 -0
  44. data/lib/datadog/core/environment/class_count.rb +20 -0
  45. data/lib/datadog/core/environment/container.rb +91 -0
  46. data/lib/datadog/core/environment/ext.rb +27 -0
  47. data/lib/datadog/core/environment/gc.rb +19 -0
  48. data/lib/datadog/core/environment/identity.rb +51 -0
  49. data/lib/datadog/core/environment/socket.rb +17 -0
  50. data/lib/datadog/core/environment/thread_count.rb +19 -0
  51. data/lib/datadog/core/environment/variable_helpers.rb +42 -0
  52. data/lib/datadog/core/environment/vm_cache.rb +46 -0
  53. data/lib/ddtrace/analytics.rb +3 -0
  54. data/lib/ddtrace/auto_instrument.rb +5 -0
  55. data/lib/ddtrace/auto_instrument_base.rb +7 -0
  56. data/lib/ddtrace/buffer.rb +278 -57
  57. data/lib/ddtrace/chunker.rb +1 -0
  58. data/lib/ddtrace/configuration/agent_settings_resolver.rb +309 -0
  59. data/lib/ddtrace/configuration/base.rb +9 -11
  60. data/lib/ddtrace/configuration/components.rb +167 -26
  61. data/lib/ddtrace/configuration/dependency_resolver.rb +1 -0
  62. data/lib/ddtrace/configuration/option.rb +1 -0
  63. data/lib/ddtrace/configuration/option_definition.rb +2 -3
  64. data/lib/ddtrace/configuration/option_definition_set.rb +1 -0
  65. data/lib/ddtrace/configuration/option_set.rb +1 -0
  66. data/lib/ddtrace/configuration/options.rb +10 -10
  67. data/lib/ddtrace/configuration/pin_setup.rb +1 -0
  68. data/lib/ddtrace/configuration/settings.rb +147 -13
  69. data/lib/ddtrace/configuration.rb +133 -22
  70. data/lib/ddtrace/context.rb +51 -22
  71. data/lib/ddtrace/context_flush.rb +15 -2
  72. data/lib/ddtrace/context_provider.rb +17 -5
  73. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +1 -0
  74. data/lib/ddtrace/contrib/action_cable/event.rb +6 -4
  75. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +1 -0
  76. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +1 -0
  77. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +1 -0
  78. data/lib/ddtrace/contrib/action_cable/events.rb +1 -0
  79. data/lib/ddtrace/contrib/action_cable/ext.rb +1 -0
  80. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +47 -0
  81. data/lib/ddtrace/contrib/action_cable/integration.rb +8 -0
  82. data/lib/ddtrace/contrib/action_cable/patcher.rb +2 -0
  83. data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +32 -0
  84. data/lib/ddtrace/contrib/action_mailer/event.rb +50 -0
  85. data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +54 -0
  86. data/lib/ddtrace/contrib/action_mailer/events/process.rb +41 -0
  87. data/lib/ddtrace/contrib/action_mailer/events.rb +31 -0
  88. data/lib/ddtrace/contrib/action_mailer/ext.rb +32 -0
  89. data/lib/ddtrace/contrib/action_mailer/integration.rb +45 -0
  90. data/lib/ddtrace/contrib/action_mailer/patcher.rb +27 -0
  91. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +22 -13
  92. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +2 -1
  93. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +1 -0
  94. data/lib/ddtrace/contrib/action_pack/ext.rb +1 -0
  95. data/lib/ddtrace/contrib/action_pack/integration.rb +8 -0
  96. data/lib/ddtrace/contrib/action_pack/patcher.rb +1 -0
  97. data/lib/ddtrace/contrib/action_pack/utils.rb +2 -1
  98. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +1 -0
  99. data/lib/ddtrace/contrib/action_view/event.rb +4 -7
  100. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +2 -0
  101. data/lib/ddtrace/contrib/action_view/events/render_template.rb +2 -0
  102. data/lib/ddtrace/contrib/action_view/events.rb +1 -0
  103. data/lib/ddtrace/contrib/action_view/ext.rb +1 -0
  104. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
  105. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +1 -0
  106. data/lib/ddtrace/contrib/action_view/integration.rb +8 -0
  107. data/lib/ddtrace/contrib/action_view/patcher.rb +5 -4
  108. data/lib/ddtrace/contrib/action_view/utils.rb +2 -1
  109. data/lib/ddtrace/contrib/active_job/configuration/settings.rb +33 -0
  110. data/lib/ddtrace/contrib/active_job/event.rb +54 -0
  111. data/lib/ddtrace/contrib/active_job/events/discard.rb +46 -0
  112. data/lib/ddtrace/contrib/active_job/events/enqueue.rb +45 -0
  113. data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +45 -0
  114. data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +47 -0
  115. data/lib/ddtrace/contrib/active_job/events/perform.rb +45 -0
  116. data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +46 -0
  117. data/lib/ddtrace/contrib/active_job/events.rb +39 -0
  118. data/lib/ddtrace/contrib/active_job/ext.rb +32 -0
  119. data/lib/ddtrace/contrib/active_job/integration.rb +46 -0
  120. data/lib/ddtrace/contrib/active_job/log_injection.rb +21 -0
  121. data/lib/ddtrace/contrib/active_job/patcher.rb +33 -0
  122. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +1 -0
  123. data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -2
  124. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +1 -0
  125. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +1 -0
  126. data/lib/ddtrace/contrib/active_model_serializers/events.rb +1 -0
  127. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +1 -0
  128. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +1 -0
  129. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +1 -0
  130. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +31 -0
  131. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +108 -18
  132. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +1 -0
  133. data/lib/ddtrace/contrib/active_record/event.rb +3 -2
  134. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -0
  135. data/lib/ddtrace/contrib/active_record/events/sql.rb +5 -0
  136. data/lib/ddtrace/contrib/active_record/events.rb +1 -0
  137. data/lib/ddtrace/contrib/active_record/ext.rb +1 -0
  138. data/lib/ddtrace/contrib/active_record/integration.rb +8 -0
  139. data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
  140. data/lib/ddtrace/contrib/active_record/utils.rb +69 -21
  141. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +105 -3
  142. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +26 -4
  143. data/lib/ddtrace/contrib/active_support/cache/redis.rb +2 -5
  144. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +1 -0
  145. data/lib/ddtrace/contrib/active_support/ext.rb +4 -0
  146. data/lib/ddtrace/contrib/active_support/integration.rb +8 -1
  147. data/lib/ddtrace/contrib/active_support/notifications/event.rb +15 -3
  148. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -1
  149. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +12 -7
  150. data/lib/ddtrace/contrib/active_support/patcher.rb +1 -0
  151. data/lib/ddtrace/contrib/analytics.rb +1 -0
  152. data/lib/ddtrace/contrib/auto_instrument.rb +48 -0
  153. data/lib/ddtrace/contrib/aws/configuration/settings.rb +1 -0
  154. data/lib/ddtrace/contrib/aws/ext.rb +1 -0
  155. data/lib/ddtrace/contrib/aws/instrumentation.rb +36 -1
  156. data/lib/ddtrace/contrib/aws/integration.rb +1 -0
  157. data/lib/ddtrace/contrib/aws/parsed_context.rb +1 -0
  158. data/lib/ddtrace/contrib/aws/patcher.rb +6 -1
  159. data/lib/ddtrace/contrib/aws/services.rb +4 -0
  160. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +1 -0
  161. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -0
  162. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  163. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +1 -0
  164. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +1 -0
  165. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +3 -1
  166. data/lib/ddtrace/contrib/configurable.rb +65 -38
  167. data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
  168. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +21 -20
  169. data/lib/ddtrace/contrib/configuration/settings.rb +8 -6
  170. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +1 -0
  171. data/lib/ddtrace/contrib/dalli/ext.rb +1 -0
  172. data/lib/ddtrace/contrib/dalli/instrumentation.rb +6 -1
  173. data/lib/ddtrace/contrib/dalli/integration.rb +1 -0
  174. data/lib/ddtrace/contrib/dalli/patcher.rb +2 -39
  175. data/lib/ddtrace/contrib/dalli/quantize.rb +1 -0
  176. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +3 -0
  177. data/lib/ddtrace/contrib/delayed_job/ext.rb +3 -0
  178. data/lib/ddtrace/contrib/delayed_job/integration.rb +1 -0
  179. data/lib/ddtrace/contrib/delayed_job/patcher.rb +1 -0
  180. data/lib/ddtrace/contrib/delayed_job/plugin.rb +40 -16
  181. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +1 -0
  182. data/lib/ddtrace/contrib/elasticsearch/ext.rb +1 -0
  183. data/lib/ddtrace/contrib/elasticsearch/integration.rb +1 -0
  184. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +6 -0
  185. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +6 -2
  186. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +1 -0
  187. data/lib/ddtrace/contrib/ethon/easy_patch.rb +15 -11
  188. data/lib/ddtrace/contrib/ethon/ext.rb +2 -0
  189. data/lib/ddtrace/contrib/ethon/integration.rb +1 -0
  190. data/lib/ddtrace/contrib/ethon/multi_patch.rb +6 -1
  191. data/lib/ddtrace/contrib/ethon/patcher.rb +4 -2
  192. data/lib/ddtrace/contrib/excon/configuration/settings.rb +1 -0
  193. data/lib/ddtrace/contrib/excon/ext.rb +1 -0
  194. data/lib/ddtrace/contrib/excon/integration.rb +1 -0
  195. data/lib/ddtrace/contrib/excon/middleware.rb +14 -7
  196. data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
  197. data/lib/ddtrace/contrib/extensions.rb +90 -14
  198. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +1 -0
  199. data/lib/ddtrace/contrib/faraday/connection.rb +1 -0
  200. data/lib/ddtrace/contrib/faraday/ext.rb +1 -0
  201. data/lib/ddtrace/contrib/faraday/integration.rb +1 -0
  202. data/lib/ddtrace/contrib/faraday/middleware.rb +6 -3
  203. data/lib/ddtrace/contrib/faraday/patcher.rb +3 -38
  204. data/lib/ddtrace/contrib/faraday/rack_builder.rb +1 -0
  205. data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -0
  206. data/lib/ddtrace/contrib/grape/endpoint.rb +73 -35
  207. data/lib/ddtrace/contrib/grape/ext.rb +2 -0
  208. data/lib/ddtrace/contrib/grape/instrumentation.rb +4 -3
  209. data/lib/ddtrace/contrib/grape/integration.rb +1 -0
  210. data/lib/ddtrace/contrib/grape/patcher.rb +2 -43
  211. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -0
  212. data/lib/ddtrace/contrib/graphql/ext.rb +1 -0
  213. data/lib/ddtrace/contrib/graphql/integration.rb +1 -0
  214. data/lib/ddtrace/contrib/graphql/patcher.rb +1 -0
  215. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +2 -0
  216. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +6 -1
  217. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -1
  218. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +13 -8
  219. data/lib/ddtrace/contrib/grpc/ext.rb +1 -0
  220. data/lib/ddtrace/contrib/grpc/integration.rb +1 -0
  221. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +1 -0
  222. data/lib/ddtrace/contrib/grpc/patcher.rb +3 -37
  223. data/lib/ddtrace/contrib/http/circuit_breaker.rb +2 -3
  224. data/lib/ddtrace/contrib/http/configuration/settings.rb +1 -0
  225. data/lib/ddtrace/contrib/http/ext.rb +1 -0
  226. data/lib/ddtrace/contrib/http/instrumentation.rb +13 -8
  227. data/lib/ddtrace/contrib/http/integration.rb +1 -0
  228. data/lib/ddtrace/contrib/http/patcher.rb +2 -1
  229. data/lib/ddtrace/contrib/http_annotation_helper.rb +1 -0
  230. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +33 -0
  231. data/lib/ddtrace/contrib/httpclient/ext.rb +18 -0
  232. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +148 -0
  233. data/lib/ddtrace/contrib/httpclient/integration.rb +44 -0
  234. data/lib/ddtrace/contrib/httpclient/patcher.rb +39 -0
  235. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +1 -0
  236. data/lib/ddtrace/contrib/httprb/ext.rb +1 -0
  237. data/lib/ddtrace/contrib/httprb/instrumentation.rb +20 -22
  238. data/lib/ddtrace/contrib/httprb/integration.rb +1 -0
  239. data/lib/ddtrace/contrib/httprb/patcher.rb +8 -4
  240. data/lib/ddtrace/contrib/integration.rb +4 -3
  241. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +1 -0
  242. data/lib/ddtrace/contrib/kafka/consumer_event.rb +1 -0
  243. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +1 -0
  244. data/lib/ddtrace/contrib/kafka/event.rb +4 -3
  245. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +1 -0
  246. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +1 -0
  247. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +1 -0
  248. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
  249. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +1 -0
  250. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
  251. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
  252. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  253. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  254. data/lib/ddtrace/contrib/kafka/events.rb +1 -0
  255. data/lib/ddtrace/contrib/kafka/ext.rb +1 -0
  256. data/lib/ddtrace/contrib/kafka/integration.rb +1 -0
  257. data/lib/ddtrace/contrib/kafka/patcher.rb +1 -0
  258. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +19 -0
  259. data/lib/ddtrace/contrib/lograge/ext.rb +11 -0
  260. data/lib/ddtrace/contrib/lograge/instrumentation.rb +39 -0
  261. data/lib/ddtrace/contrib/lograge/integration.rb +46 -0
  262. data/lib/ddtrace/contrib/lograge/patcher.rb +26 -0
  263. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +1 -0
  264. data/lib/ddtrace/contrib/mongodb/ext.rb +1 -0
  265. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +6 -3
  266. data/lib/ddtrace/contrib/mongodb/integration.rb +6 -0
  267. data/lib/ddtrace/contrib/mongodb/parsers.rb +1 -0
  268. data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -2
  269. data/lib/ddtrace/contrib/mongodb/subscribers.rb +7 -3
  270. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +1 -0
  271. data/lib/ddtrace/contrib/mysql2/ext.rb +1 -0
  272. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +6 -1
  273. data/lib/ddtrace/contrib/mysql2/integration.rb +1 -0
  274. data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -1
  275. data/lib/ddtrace/contrib/patchable.rb +21 -9
  276. data/lib/ddtrace/contrib/patcher.rb +12 -8
  277. data/lib/ddtrace/contrib/presto/configuration/settings.rb +1 -0
  278. data/lib/ddtrace/contrib/presto/ext.rb +1 -0
  279. data/lib/ddtrace/contrib/presto/instrumentation.rb +5 -1
  280. data/lib/ddtrace/contrib/presto/integration.rb +1 -0
  281. data/lib/ddtrace/contrib/presto/patcher.rb +7 -3
  282. data/lib/ddtrace/contrib/qless/configuration/settings.rb +36 -0
  283. data/lib/ddtrace/contrib/qless/ext.rb +21 -0
  284. data/lib/ddtrace/contrib/qless/integration.rb +39 -0
  285. data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
  286. data/lib/ddtrace/contrib/qless/qless_job.rb +74 -0
  287. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +34 -0
  288. data/lib/ddtrace/contrib/que/configuration/settings.rb +2 -0
  289. data/lib/ddtrace/contrib/que/ext.rb +20 -19
  290. data/lib/ddtrace/contrib/que/integration.rb +1 -0
  291. data/lib/ddtrace/contrib/que/patcher.rb +1 -0
  292. data/lib/ddtrace/contrib/que/tracer.rb +4 -2
  293. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -0
  294. data/lib/ddtrace/contrib/racecar/event.rb +8 -2
  295. data/lib/ddtrace/contrib/racecar/events/batch.rb +1 -0
  296. data/lib/ddtrace/contrib/racecar/events/consume.rb +1 -0
  297. data/lib/ddtrace/contrib/racecar/events/message.rb +1 -0
  298. data/lib/ddtrace/contrib/racecar/events.rb +1 -0
  299. data/lib/ddtrace/contrib/racecar/ext.rb +1 -0
  300. data/lib/ddtrace/contrib/racecar/integration.rb +1 -0
  301. data/lib/ddtrace/contrib/racecar/patcher.rb +1 -0
  302. data/lib/ddtrace/contrib/rack/configuration/settings.rb +4 -3
  303. data/lib/ddtrace/contrib/rack/ext.rb +1 -0
  304. data/lib/ddtrace/contrib/rack/integration.rb +8 -0
  305. data/lib/ddtrace/contrib/rack/middlewares.rb +8 -12
  306. data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
  307. data/lib/ddtrace/contrib/rack/request_queue.rb +7 -1
  308. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  309. data/lib/ddtrace/contrib/rails/configuration/settings.rb +8 -0
  310. data/lib/ddtrace/contrib/rails/ext.rb +1 -0
  311. data/lib/ddtrace/contrib/rails/framework.rb +50 -2
  312. data/lib/ddtrace/contrib/rails/integration.rb +1 -0
  313. data/lib/ddtrace/contrib/rails/log_injection.rb +1 -40
  314. data/lib/ddtrace/contrib/rails/middlewares.rb +1 -0
  315. data/lib/ddtrace/contrib/rails/patcher.rb +47 -17
  316. data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
  317. data/lib/ddtrace/contrib/rails/utils.rb +5 -0
  318. data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -0
  319. data/lib/ddtrace/contrib/rake/ext.rb +1 -0
  320. data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -3
  321. data/lib/ddtrace/contrib/rake/integration.rb +2 -1
  322. data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
  323. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +15 -5
  324. data/lib/ddtrace/contrib/redis/configuration/settings.rb +6 -0
  325. data/lib/ddtrace/contrib/redis/ext.rb +2 -0
  326. data/lib/ddtrace/contrib/redis/instrumentation.rb +90 -0
  327. data/lib/ddtrace/contrib/redis/integration.rb +1 -0
  328. data/lib/ddtrace/contrib/redis/patcher.rb +3 -67
  329. data/lib/ddtrace/contrib/redis/quantize.rb +29 -0
  330. data/lib/ddtrace/contrib/redis/tags.rb +10 -1
  331. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  332. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +7 -7
  333. data/lib/ddtrace/contrib/registerable.rb +4 -4
  334. data/lib/ddtrace/contrib/registry.rb +3 -2
  335. data/lib/ddtrace/contrib/resque/configuration/settings.rb +19 -1
  336. data/lib/ddtrace/contrib/resque/ext.rb +1 -0
  337. data/lib/ddtrace/contrib/resque/integration.rb +2 -5
  338. data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
  339. data/lib/ddtrace/contrib/resque/resque_job.rb +26 -2
  340. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -0
  341. data/lib/ddtrace/contrib/rest_client/ext.rb +1 -0
  342. data/lib/ddtrace/contrib/rest_client/integration.rb +1 -0
  343. data/lib/ddtrace/contrib/rest_client/patcher.rb +3 -1
  344. data/lib/ddtrace/contrib/rest_client/request_patch.rb +7 -4
  345. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +19 -0
  346. data/lib/ddtrace/contrib/semantic_logger/ext.rb +11 -0
  347. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +43 -0
  348. data/lib/ddtrace/contrib/semantic_logger/integration.rb +48 -0
  349. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +26 -0
  350. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +1 -0
  351. data/lib/ddtrace/contrib/sequel/database.rb +5 -2
  352. data/lib/ddtrace/contrib/sequel/dataset.rb +5 -3
  353. data/lib/ddtrace/contrib/sequel/ext.rb +2 -0
  354. data/lib/ddtrace/contrib/sequel/integration.rb +1 -0
  355. data/lib/ddtrace/contrib/sequel/patcher.rb +3 -2
  356. data/lib/ddtrace/contrib/sequel/utils.rb +16 -5
  357. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +3 -0
  358. data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -0
  359. data/lib/ddtrace/contrib/shoryuken/integration.rb +1 -0
  360. data/lib/ddtrace/contrib/shoryuken/patcher.rb +1 -0
  361. data/lib/ddtrace/contrib/shoryuken/tracer.rb +9 -2
  362. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
  363. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +2 -0
  364. data/lib/ddtrace/contrib/sidekiq/ext.rb +4 -0
  365. data/lib/ddtrace/contrib/sidekiq/integration.rb +11 -0
  366. data/lib/ddtrace/contrib/sidekiq/patcher.rb +27 -0
  367. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +30 -0
  368. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +30 -0
  369. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +29 -0
  370. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +6 -7
  371. data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
  372. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -0
  373. data/lib/ddtrace/contrib/sinatra/env.rb +4 -4
  374. data/lib/ddtrace/contrib/sinatra/ext.rb +1 -0
  375. data/lib/ddtrace/contrib/sinatra/headers.rb +2 -3
  376. data/lib/ddtrace/contrib/sinatra/integration.rb +1 -0
  377. data/lib/ddtrace/contrib/sinatra/patcher.rb +3 -1
  378. data/lib/ddtrace/contrib/sinatra/tracer.rb +28 -7
  379. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +13 -6
  380. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +2 -0
  381. data/lib/ddtrace/contrib/sneakers/ext.rb +12 -11
  382. data/lib/ddtrace/contrib/sneakers/integration.rb +1 -0
  383. data/lib/ddtrace/contrib/sneakers/patcher.rb +1 -0
  384. data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -21
  385. data/lib/ddtrace/contrib/status_code_matcher.rb +70 -0
  386. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -0
  387. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +5 -6
  388. data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -0
  389. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +5 -0
  390. data/lib/ddtrace/contrib/sucker_punch/integration.rb +1 -0
  391. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +2 -0
  392. data/lib/ddtrace/correlation.rb +3 -1
  393. data/lib/ddtrace/diagnostics/environment_logger.rb +9 -7
  394. data/lib/ddtrace/diagnostics/health.rb +1 -0
  395. data/lib/ddtrace/distributed_tracing/headers/b3.rb +1 -0
  396. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +1 -0
  397. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -0
  398. data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
  399. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +2 -3
  400. data/lib/ddtrace/encoding.rb +3 -0
  401. data/lib/ddtrace/error.rb +78 -8
  402. data/lib/ddtrace/event.rb +1 -0
  403. data/lib/ddtrace/ext/analytics.rb +1 -0
  404. data/lib/ddtrace/ext/app_types.rb +1 -0
  405. data/lib/ddtrace/ext/correlation.rb +1 -0
  406. data/lib/ddtrace/ext/diagnostics.rb +1 -0
  407. data/lib/ddtrace/ext/distributed.rb +9 -2
  408. data/lib/ddtrace/ext/environment.rb +8 -0
  409. data/lib/ddtrace/ext/errors.rb +1 -0
  410. data/lib/ddtrace/ext/forced_tracing.rb +1 -0
  411. data/lib/ddtrace/ext/git.rb +32 -0
  412. data/lib/ddtrace/ext/http.rb +2 -1
  413. data/lib/ddtrace/ext/integration.rb +9 -0
  414. data/lib/ddtrace/ext/manual_tracing.rb +1 -0
  415. data/lib/ddtrace/ext/metrics.rb +1 -0
  416. data/lib/ddtrace/ext/net.rb +1 -0
  417. data/lib/ddtrace/ext/priority.rb +7 -4
  418. data/lib/ddtrace/ext/profiling.rb +57 -0
  419. data/lib/ddtrace/ext/runtime.rb +5 -6
  420. data/lib/ddtrace/ext/sampling.rb +1 -0
  421. data/lib/ddtrace/ext/sql.rb +1 -0
  422. data/lib/ddtrace/ext/test.rb +9 -0
  423. data/lib/ddtrace/ext/transport.rb +14 -0
  424. data/lib/ddtrace/forced_tracing.rb +3 -0
  425. data/lib/ddtrace/logger.rb +2 -1
  426. data/lib/ddtrace/metrics.rb +84 -24
  427. data/lib/ddtrace/opentelemetry/extensions.rb +2 -1
  428. data/lib/ddtrace/opentelemetry/span.rb +1 -0
  429. data/lib/ddtrace/opentracer/binary_propagator.rb +1 -0
  430. data/lib/ddtrace/opentracer/carrier.rb +1 -0
  431. data/lib/ddtrace/opentracer/distributed_headers.rb +5 -1
  432. data/lib/ddtrace/opentracer/global_tracer.rb +1 -0
  433. data/lib/ddtrace/opentracer/propagator.rb +1 -0
  434. data/lib/ddtrace/opentracer/rack_propagator.rb +1 -0
  435. data/lib/ddtrace/opentracer/scope.rb +1 -0
  436. data/lib/ddtrace/opentracer/scope_manager.rb +1 -0
  437. data/lib/ddtrace/opentracer/span.rb +3 -6
  438. data/lib/ddtrace/opentracer/span_context.rb +1 -0
  439. data/lib/ddtrace/opentracer/span_context_factory.rb +1 -0
  440. data/lib/ddtrace/opentracer/text_map_propagator.rb +1 -0
  441. data/lib/ddtrace/opentracer/thread_local_scope.rb +2 -0
  442. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +1 -0
  443. data/lib/ddtrace/opentracer/tracer.rb +1 -0
  444. data/lib/ddtrace/opentracer.rb +21 -39
  445. data/lib/ddtrace/patcher.rb +28 -6
  446. data/lib/ddtrace/pin.rb +9 -61
  447. data/lib/ddtrace/pipeline/span_filter.rb +2 -1
  448. data/lib/ddtrace/pipeline/span_processor.rb +1 -0
  449. data/lib/ddtrace/pipeline.rb +1 -0
  450. data/lib/ddtrace/profiling/backtrace_location.rb +33 -0
  451. data/lib/ddtrace/profiling/buffer.rb +42 -0
  452. data/lib/ddtrace/profiling/collectors/stack.rb +301 -0
  453. data/lib/ddtrace/profiling/encoding/profile.rb +46 -0
  454. data/lib/ddtrace/profiling/event.rb +14 -0
  455. data/lib/ddtrace/profiling/events/stack.rb +81 -0
  456. data/lib/ddtrace/profiling/exporter.rb +24 -0
  457. data/lib/ddtrace/profiling/ext/forking.rb +98 -0
  458. data/lib/ddtrace/profiling/flush.rb +44 -0
  459. data/lib/ddtrace/profiling/native_extension.rb +40 -0
  460. data/lib/ddtrace/profiling/pprof/builder.rb +126 -0
  461. data/lib/ddtrace/profiling/pprof/converter.rb +103 -0
  462. data/lib/ddtrace/profiling/pprof/message_set.rb +15 -0
  463. data/lib/ddtrace/profiling/pprof/payload.rb +19 -0
  464. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  465. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +82 -0
  466. data/lib/ddtrace/profiling/pprof/stack_sample.rb +140 -0
  467. data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
  468. data/lib/ddtrace/profiling/pprof/template.rb +119 -0
  469. data/lib/ddtrace/profiling/preload.rb +4 -0
  470. data/lib/ddtrace/profiling/profiler.rb +31 -0
  471. data/lib/ddtrace/profiling/recorder.rb +96 -0
  472. data/lib/ddtrace/profiling/scheduler.rb +134 -0
  473. data/lib/ddtrace/profiling/tasks/setup.rb +90 -0
  474. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +42 -0
  475. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
  476. data/lib/ddtrace/profiling/transport/client.rb +15 -0
  477. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +101 -0
  478. data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
  479. data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
  480. data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
  481. data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
  482. data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
  483. data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
  484. data/lib/ddtrace/profiling/transport/http.rb +111 -0
  485. data/lib/ddtrace/profiling/transport/io/client.rb +28 -0
  486. data/lib/ddtrace/profiling/transport/io/response.rb +17 -0
  487. data/lib/ddtrace/profiling/transport/io.rb +31 -0
  488. data/lib/ddtrace/profiling/transport/parcel.rb +18 -0
  489. data/lib/ddtrace/profiling/transport/request.rb +16 -0
  490. data/lib/ddtrace/profiling/transport/response.rb +9 -0
  491. data/lib/ddtrace/profiling.rb +149 -0
  492. data/lib/ddtrace/propagation/grpc_propagator.rb +20 -6
  493. data/lib/ddtrace/propagation/http_propagator.rb +18 -2
  494. data/lib/ddtrace/quantization/hash.rb +1 -0
  495. data/lib/ddtrace/quantization/http.rb +4 -0
  496. data/lib/ddtrace/runtime/metrics.rb +40 -15
  497. data/lib/ddtrace/sampler.rb +22 -11
  498. data/lib/ddtrace/sampling/matcher.rb +1 -0
  499. data/lib/ddtrace/sampling/rate_limiter.rb +66 -16
  500. data/lib/ddtrace/sampling/rule.rb +2 -1
  501. data/lib/ddtrace/sampling/rule_sampler.rb +19 -11
  502. data/lib/ddtrace/sampling.rb +1 -0
  503. data/lib/ddtrace/span.rb +174 -36
  504. data/lib/ddtrace/sync_writer.rb +17 -15
  505. data/lib/ddtrace/tasks/exec.rb +47 -0
  506. data/lib/ddtrace/tasks/help.rb +15 -0
  507. data/lib/ddtrace/tracer.rb +72 -62
  508. data/lib/ddtrace/transport/http/adapters/net.rb +48 -12
  509. data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
  510. data/lib/ddtrace/transport/http/adapters/test.rb +5 -2
  511. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +26 -16
  512. data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
  513. data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
  514. data/lib/ddtrace/transport/http/api/instance.rb +1 -0
  515. data/lib/ddtrace/transport/http/api/map.rb +1 -0
  516. data/lib/ddtrace/transport/http/api/spec.rb +1 -0
  517. data/lib/ddtrace/transport/http/api.rb +1 -0
  518. data/lib/ddtrace/transport/http/builder.rb +21 -7
  519. data/lib/ddtrace/transport/http/client.rb +3 -1
  520. data/lib/ddtrace/transport/http/env.rb +9 -0
  521. data/lib/ddtrace/transport/http/response.rb +1 -0
  522. data/lib/ddtrace/transport/http/statistics.rb +17 -3
  523. data/lib/ddtrace/transport/http/traces.rb +6 -6
  524. data/lib/ddtrace/transport/http.rb +48 -41
  525. data/lib/ddtrace/transport/io/client.rb +17 -9
  526. data/lib/ddtrace/transport/io/response.rb +2 -3
  527. data/lib/ddtrace/transport/io/traces.rb +10 -1
  528. data/lib/ddtrace/transport/io.rb +2 -1
  529. data/lib/ddtrace/transport/parcel.rb +7 -0
  530. data/lib/ddtrace/transport/request.rb +1 -0
  531. data/lib/ddtrace/transport/response.rb +1 -0
  532. data/lib/ddtrace/transport/statistics.rb +1 -0
  533. data/lib/ddtrace/transport/traces.rb +28 -5
  534. data/lib/ddtrace/utils/compression.rb +28 -0
  535. data/lib/ddtrace/utils/database.rb +1 -0
  536. data/lib/ddtrace/utils/forking.rb +53 -0
  537. data/lib/ddtrace/utils/object_set.rb +40 -0
  538. data/lib/ddtrace/utils/only_once.rb +41 -0
  539. data/lib/ddtrace/utils/sequence.rb +18 -0
  540. data/lib/ddtrace/utils/string_table.rb +46 -0
  541. data/lib/ddtrace/utils/time.rb +40 -3
  542. data/lib/ddtrace/utils.rb +29 -14
  543. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  544. data/lib/ddtrace/vendor/active_record/connection_specification.rb +1 -0
  545. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  546. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +117 -0
  547. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +58 -0
  548. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +136 -0
  549. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +10 -0
  550. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +9 -0
  551. data/lib/ddtrace/vendor/multipart-post/multipart.rb +13 -0
  552. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +33 -0
  553. data/lib/ddtrace/version.rb +16 -3
  554. data/lib/ddtrace/worker.rb +1 -0
  555. data/lib/ddtrace/workers/async.rb +15 -5
  556. data/lib/ddtrace/workers/loop.rb +32 -5
  557. data/lib/ddtrace/workers/polling.rb +13 -5
  558. data/lib/ddtrace/workers/queue.rb +3 -1
  559. data/lib/ddtrace/workers/runtime_metrics.rb +22 -4
  560. data/lib/ddtrace/workers/trace_writer.rb +14 -16
  561. data/lib/ddtrace/workers.rb +8 -2
  562. data/lib/ddtrace/writer.rb +33 -8
  563. data/lib/ddtrace.rb +22 -48
  564. metadata +180 -374
  565. data/.circleci/config.yml +0 -548
  566. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
  567. data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
  568. data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
  569. data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
  570. data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
  571. data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
  572. data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
  573. data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
  574. data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
  575. data/.dockerignore +0 -1
  576. data/.env +0 -26
  577. data/.github/CODEOWNERS +0 -1
  578. data/.gitlab-ci.yml +0 -27
  579. data/.rspec +0 -1
  580. data/.rubocop.yml +0 -85
  581. data/.simplecov +0 -38
  582. data/Appraisals +0 -1071
  583. data/Gemfile +0 -7
  584. data/Rakefile +0 -791
  585. data/benchmarks/postgres_database.yml +0 -9
  586. data/benchmarks/sidekiq_test.rb +0 -154
  587. data/docker-compose.yml +0 -370
  588. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  589. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  590. data/lib/ddtrace/augmentation/shim.rb +0 -102
  591. data/lib/ddtrace/augmentation.rb +0 -13
  592. data/lib/ddtrace/environment.rb +0 -41
  593. data/lib/ddtrace/monkey.rb +0 -58
  594. data/lib/ddtrace/runtime/cgroup.rb +0 -44
  595. data/lib/ddtrace/runtime/class_count.rb +0 -17
  596. data/lib/ddtrace/runtime/container.rb +0 -73
  597. data/lib/ddtrace/runtime/gc.rb +0 -16
  598. data/lib/ddtrace/runtime/identity.rb +0 -41
  599. data/lib/ddtrace/runtime/object_space.rb +0 -19
  600. data/lib/ddtrace/runtime/socket.rb +0 -14
  601. data/lib/ddtrace/runtime/thread_count.rb +0 -16
  602. data/tasks/release_gem.rake +0 -28
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/logger'
2
3
 
3
4
  module Datadog
@@ -12,13 +13,13 @@ module Datadog
12
13
  SHUTDOWN_TIMEOUT = 1
13
14
 
14
15
  def self.included(base)
15
- base.send(:prepend, PrependedMethods)
16
+ base.prepend(PrependedMethods)
16
17
  end
17
18
 
18
19
  # Methods that must be prepended
19
20
  module PrependedMethods
20
21
  def perform(*args)
21
- start { self.result = super(*args) } unless started?
22
+ start_async { self.result = super(*args) } unless started?
22
23
  end
23
24
  end
24
25
 
@@ -31,18 +32,22 @@ module Datadog
31
32
 
32
33
  def join(timeout = nil)
33
34
  return true unless running?
35
+
34
36
  !worker.join(timeout).nil?
35
37
  end
36
38
 
37
39
  def terminate
38
40
  return false unless running?
41
+
39
42
  @run_async = false
43
+ Datadog.logger.debug { "Forcibly terminating worker thread for: #{self}" }
40
44
  worker.terminate
41
45
  true
42
46
  end
43
47
 
44
48
  def run_async?
45
49
  return false unless instance_variable_defined?(:@run_async)
50
+
46
51
  @run_async == true
47
52
  end
48
53
 
@@ -56,6 +61,7 @@ module Datadog
56
61
 
57
62
  def error?
58
63
  return false unless instance_variable_defined?(:@error)
64
+
59
65
  !@error.nil?
60
66
  end
61
67
 
@@ -101,9 +107,10 @@ module Datadog
101
107
  @worker ||= nil
102
108
  end
103
109
 
104
- def start(&block)
110
+ def start_async(&block)
105
111
  mutex.synchronize do
106
112
  return if running?
113
+
107
114
  if forked?
108
115
  case fork_policy
109
116
  when FORK_POLICY_STOP
@@ -121,7 +128,7 @@ module Datadog
121
128
  @run_async = true
122
129
  @pid = Process.pid
123
130
  @error = nil
124
- Datadog.logger.debug("Starting thread in the process: #{Process.pid}")
131
+ Datadog.logger.debug { "Starting thread for: #{self}" }
125
132
 
126
133
  @worker = ::Thread.new do
127
134
  begin
@@ -129,10 +136,13 @@ module Datadog
129
136
  # rubocop:disable Lint/RescueException
130
137
  rescue Exception => e
131
138
  @error = e
132
- Datadog.logger.debug("Worker thread error. Cause #{e.message} Location: #{e.backtrace.first}")
139
+ Datadog.logger.debug("Worker thread error. Cause #{e.message} Location: #{Array(e.backtrace).first}")
133
140
  raise
134
141
  end
135
142
  end
143
+ @worker.name = self.class.name unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3')
144
+
145
+ nil
136
146
  end
137
147
 
138
148
  def stop_fork
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  module Datadog
2
3
  module Workers
3
4
  # Adds looping behavior to workers, with a sleep
@@ -8,7 +9,7 @@ module Datadog
8
9
  BASE_INTERVAL = 1
9
10
 
10
11
  def self.included(base)
11
- base.send(:prepend, PrependedMethods)
12
+ base.prepend(PrependedMethods)
12
13
  end
13
14
 
14
15
  # Methods that must be prepended
@@ -21,6 +22,7 @@ module Datadog
21
22
  def stop_loop
22
23
  mutex.synchronize do
23
24
  return false unless run_loop?
25
+
24
26
  @run_loop = false
25
27
  shutdown.signal
26
28
  end
@@ -34,6 +36,7 @@ module Datadog
34
36
 
35
37
  def run_loop?
36
38
  return false unless instance_variable_defined?(:@run_loop)
39
+
37
40
  @run_loop == true
38
41
  end
39
42
 
@@ -53,12 +56,29 @@ module Datadog
53
56
  @loop_wait_time ||= loop_base_interval
54
57
  end
55
58
 
59
+ def loop_wait_time=(value)
60
+ @loop_wait_time = value
61
+ end
62
+
63
+ def reset_loop_wait_time
64
+ self.loop_wait_time = loop_base_interval
65
+ end
66
+
67
+ # Should the loop "back off" when there's no work?
56
68
  def loop_back_off?
57
69
  false
58
70
  end
59
71
 
60
- def loop_back_off!(amount = nil)
61
- @loop_wait_time = amount || [loop_wait_time * BACK_OFF_RATIO, BACK_OFF_MAX].min
72
+ def loop_back_off!
73
+ self.loop_wait_time = [loop_wait_time * BACK_OFF_RATIO, BACK_OFF_MAX].min
74
+ end
75
+
76
+ # Should perform_loop just straight into work, or start by waiting?
77
+ #
78
+ # The use case is if we want to report some information (like profiles) from time to time, we may not want to
79
+ # report empty/zero/some residual value immediately when the worker starts.
80
+ def loop_wait_before_first_iteration?
81
+ false
62
82
  end
63
83
 
64
84
  protected
@@ -75,16 +95,22 @@ module Datadog
75
95
  private
76
96
 
77
97
  def perform_loop
78
- @run_loop = true
98
+ mutex.synchronize do
99
+ @run_loop = true
100
+
101
+ shutdown.wait(mutex, loop_wait_time) if loop_wait_before_first_iteration?
102
+ end
79
103
 
80
104
  loop do
81
105
  if work_pending?
106
+ # There's work to do...
82
107
  # Run the task
83
108
  yield
84
109
 
85
110
  # Reset the wait interval
86
- loop_back_off!(loop_base_interval)
111
+ reset_loop_wait_time if loop_back_off?
87
112
  elsif loop_back_off?
113
+ # There's no work to do...
88
114
  # Back off the wait interval a bit
89
115
  loop_back_off!
90
116
  end
@@ -92,6 +118,7 @@ module Datadog
92
118
  # Wait for an interval, unless shutdown has been signaled.
93
119
  mutex.synchronize do
94
120
  return unless run_loop? || work_pending?
121
+
95
122
  shutdown.wait(mutex, loop_wait_time) if run_loop?
96
123
  end
97
124
  end
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/workers/async'
2
3
  require 'ddtrace/workers/loop'
3
4
 
@@ -8,9 +9,9 @@ module Datadog
8
9
  SHUTDOWN_TIMEOUT = 1
9
10
 
10
11
  def self.included(base)
11
- base.send(:include, Workers::IntervalLoop)
12
- base.send(:include, Workers::Async::Thread)
13
- base.send(:prepend, PrependedMethods)
12
+ base.include(Workers::IntervalLoop)
13
+ base.include(Workers::Async::Thread)
14
+ base.prepend(PrependedMethods)
14
15
  end
15
16
 
16
17
  # Methods that must be prepended
@@ -26,8 +27,14 @@ module Datadog
26
27
  stop_loop
27
28
  graceful = join(timeout)
28
29
 
29
- # If timeout and force stop...
30
- !graceful && force_stop ? terminate : graceful
30
+ if !graceful && force_stop
31
+ Datadog.logger.debug do
32
+ "Timeout while waiting for worker to finish gracefully, forcing termination for: #{self}"
33
+ end
34
+ terminate
35
+ else
36
+ graceful
37
+ end
31
38
  else
32
39
  false
33
40
  end
@@ -35,6 +42,7 @@ module Datadog
35
42
 
36
43
  def enabled?
37
44
  return true unless instance_variable_defined?(:@enabled)
45
+
38
46
  @enabled
39
47
  end
40
48
 
@@ -1,10 +1,11 @@
1
+ # typed: false
1
2
  module Datadog
2
3
  module Workers
3
4
  # Adds queue behavior to workers, with a buffer
4
5
  # to which items can be queued then dequeued.
5
6
  module Queue
6
7
  def self.included(base)
7
- base.send(:prepend, PrependedMethods)
8
+ base.prepend(PrependedMethods)
8
9
  end
9
10
 
10
11
  # Methods that must be prepended
@@ -26,6 +27,7 @@ module Datadog
26
27
  buffer.shift
27
28
  end
28
29
 
30
+ # Are there more items to be processed next?
29
31
  def work_pending?
30
32
  !buffer.empty?
31
33
  end
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'forwardable'
2
3
 
3
4
  require 'ddtrace/runtime/metrics'
@@ -12,19 +13,23 @@ module Datadog
12
13
  extend Forwardable
13
14
  include Workers::Polling
14
15
 
16
+ # In seconds
17
+ DEFAULT_FLUSH_INTERVAL = 10
18
+ DEFAULT_BACK_OFF_MAX = 30
19
+
15
20
  attr_reader \
16
21
  :metrics
17
22
 
18
23
  def initialize(options = {})
19
- @metrics = options.fetch(:metrics, Runtime::Metrics.new)
24
+ @metrics = options.fetch(:metrics) { Runtime::Metrics.new }
20
25
 
21
26
  # Workers::Async::Thread settings
22
27
  self.fork_policy = options.fetch(:fork_policy, Workers::Async::Thread::FORK_POLICY_STOP)
23
28
 
24
29
  # Workers::IntervalLoop settings
25
- self.interval = options[:interval] if options.key?(:interval)
26
- self.back_off_ratio = options[:back_off_ratio] if options.key?(:back_off_ratio)
27
- self.back_off_max = options[:back_off_max] if options.key?(:back_off_max)
30
+ self.loop_base_interval = options.fetch(:interval, DEFAULT_FLUSH_INTERVAL)
31
+ self.loop_back_off_ratio = options[:back_off_ratio] if options.key?(:back_off_ratio)
32
+ self.loop_back_off_max = options.fetch(:back_off_max, DEFAULT_BACK_OFF_MAX)
28
33
 
29
34
  self.enabled = options.fetch(:enabled, false)
30
35
  end
@@ -39,6 +44,19 @@ module Datadog
39
44
  metrics.associate_with_span(*args).tap { perform }
40
45
  end
41
46
 
47
+ # TODO: `close_metrics` is only needed because
48
+ # Datadog::Components directly manipulates the lifecycle of
49
+ # Runtime::Metrics.statsd instances.
50
+ # This should be avoided, as it prevents this class from
51
+ # ensuring correct resource decommission of its internal
52
+ # dependencies.
53
+ def stop(*args, close_metrics: true)
54
+ self.enabled = false
55
+ result = super(*args)
56
+ @metrics.close if close_metrics
57
+ result
58
+ end
59
+
42
60
  def_delegators \
43
61
  :metrics,
44
62
  :register_service
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/logger'
2
3
  require 'ddtrace/transport/http'
3
4
 
@@ -16,15 +17,10 @@ module Datadog
16
17
  def initialize(options = {})
17
18
  transport_options = options.fetch(:transport_options, {})
18
19
 
19
- if transport_options.is_a?(Proc)
20
- transport_options = { on_build: transport_options }
21
- end
22
-
23
- transport_options[:hostname] = options[:hostname] if options.key?(:hostname)
24
- transport_options[:port] = options[:port] if options.key?(:port)
20
+ transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
25
21
 
26
22
  @transport = options.fetch(:transport) do
27
- Transport::HTTP.default(transport_options)
23
+ Transport::HTTP.default(**transport_options)
28
24
  end
29
25
  end
30
26
 
@@ -41,7 +37,7 @@ module Datadog
41
37
  flush_traces(traces)
42
38
  rescue StandardError => e
43
39
  Datadog.logger.error(
44
- "Error while writing traces: dropped #{traces.length} items. Cause: #{e} Location: #{e.backtrace.first}"
40
+ "Error while writing traces: dropped #{traces.length} items. Cause: #{e} Location: #{Array(e.backtrace).first}"
45
41
  )
46
42
  end
47
43
 
@@ -65,10 +61,8 @@ module Datadog
65
61
  traces.each do |trace|
66
62
  next if trace.first.nil?
67
63
 
68
- hostname = Datadog::Runtime::Socket.hostname
69
- unless hostname.nil? || hostname.empty?
70
- trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname)
71
- end
64
+ hostname = Datadog::Core::Environment::Socket.hostname
65
+ trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname) unless hostname.nil? || hostname.empty?
72
66
  end
73
67
  end
74
68
 
@@ -84,10 +78,6 @@ module Datadog
84
78
  def initialize
85
79
  super(:flush_completed)
86
80
  end
87
-
88
- def publish(response)
89
- super(response)
90
- end
91
81
  end
92
82
  end
93
83
 
@@ -127,10 +117,15 @@ module Datadog
127
117
 
128
118
  # NOTE: #perform is wrapped by other modules:
129
119
  # Polling --> Async --> IntervalLoop --> AsyncTraceWriter --> TraceWriter
120
+ #
121
+ # WARNING: This method breaks the Liskov Substitution Principle -- TraceWriter#perform is spec'd to return the
122
+ # result from the writer, whereas this method always returns nil.
130
123
  def perform(traces)
131
124
  super(traces).tap do |responses|
132
125
  loop_back_off! if responses.find(&:server_error?)
133
126
  end
127
+
128
+ nil
134
129
  end
135
130
 
136
131
  def stop(*args)
@@ -148,6 +143,7 @@ module Datadog
148
143
  [buffer.pop]
149
144
  end
150
145
 
146
+ # Are there more traces to be processed next?
151
147
  def work_pending?
152
148
  !buffer.empty?
153
149
  end
@@ -187,6 +183,8 @@ module Datadog
187
183
  @async = false if @writer_fork_policy == FORK_POLICY_SYNC
188
184
  end
189
185
 
186
+ # WARNING: This method breaks the Liskov Substitution Principle -- TraceWriter#write is spec'd to return the
187
+ # result from the writer, whereas this method returns something else when running in async mode.
190
188
  def write(trace)
191
189
  # Start worker thread. If the process has forked, it will trigger #after_fork to
192
190
  # reconfigure the worker accordingly.
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'time'
2
3
 
3
4
  require 'ddtrace/workers/trace_writer'
@@ -58,7 +59,7 @@ module Datadog
58
59
  # TODO[manu]: findout the reason and reschedule the send if it's not
59
60
  # a fatal exception
60
61
  Datadog.logger.error(
61
- "Error during traces flush: dropped #{traces.length} items. Cause: #{e} Location: #{e.backtrace.first}"
62
+ "Error during traces flush: dropped #{traces.length} items. Cause: #{e} Location: #{Array(e.backtrace).first}"
62
63
  )
63
64
  end
64
65
  end
@@ -67,9 +68,13 @@ module Datadog
67
68
  def start
68
69
  @mutex.synchronize do
69
70
  return if @run
71
+
70
72
  @run = true
71
- Datadog.logger.debug("Starting thread in the process: #{Process.pid}")
73
+ Datadog.logger.debug { "Starting thread for: #{self}" }
72
74
  @worker = Thread.new { perform }
75
+ @worker.name = self.class.name unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3')
76
+
77
+ nil
73
78
  end
74
79
  end
75
80
 
@@ -108,6 +113,7 @@ module Datadog
108
113
 
109
114
  @mutex.synchronize do
110
115
  return if !@run && @trace_buffer.empty?
116
+
111
117
  @shutdown.wait(@mutex, @back_off) if @run # do not wait when shutting down
112
118
  end
113
119
  end
@@ -1,17 +1,22 @@
1
+ # typed: true
1
2
  require 'json'
2
3
 
3
4
  require 'ddtrace/ext/net'
4
- require 'ddtrace/runtime/socket'
5
+ require 'datadog/core/environment/socket'
5
6
 
7
+ require 'ddtrace/configuration/agent_settings_resolver'
6
8
  require 'ddtrace/transport/http'
7
9
  require 'ddtrace/transport/io'
8
10
  require 'ddtrace/encoding'
9
11
  require 'ddtrace/workers'
10
12
  require 'ddtrace/diagnostics/environment_logger'
13
+ require 'ddtrace/utils/only_once'
11
14
 
12
15
  module Datadog
13
16
  # Processor that sends traces and metadata to the agent
14
17
  class Writer
18
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
19
+
15
20
  attr_reader \
16
21
  :priority_sampler,
17
22
  :transport,
@@ -23,6 +28,8 @@ module Datadog
23
28
  @flush_interval = options.fetch(:flush_interval, Workers::AsyncTransport::DEFAULT_FLUSH_INTERVAL)
24
29
  transport_options = options.fetch(:transport_options, {})
25
30
 
31
+ transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
32
+
26
33
  # priority sampling
27
34
  if options[:priority_sampler]
28
35
  @priority_sampler = options[:priority_sampler]
@@ -31,7 +38,7 @@ module Datadog
31
38
 
32
39
  # transport and buffers
33
40
  @transport = options.fetch(:transport) do
34
- Transport::HTTP.default(transport_options)
41
+ Transport::HTTP.default(**transport_options)
35
42
  end
36
43
 
37
44
  # handles the thread creation after an eventual fork
@@ -42,13 +49,23 @@ module Datadog
42
49
 
43
50
  # one worker for traces
44
51
  @worker = nil
52
+
53
+ # Once stopped, this writer instance cannot be restarted.
54
+ # This allow for graceful shutdown, while preventing
55
+ # the host application from inadvertently start new
56
+ # threads during shutdown.
57
+ @stopped = false
45
58
  end
46
59
 
47
60
  def start
48
61
  @mutex_after_fork.synchronize do
62
+ return false if @stopped
63
+
49
64
  pid = Process.pid
50
65
  return if @worker && pid == @pid
66
+
51
67
  @pid = pid
68
+
52
69
  start_worker
53
70
  true
54
71
  end
@@ -67,14 +84,24 @@ module Datadog
67
84
  @worker.start
68
85
  end
69
86
 
87
+ # Gracefully shuts down this writer.
88
+ #
89
+ # Once stopped methods calls won't fail, but
90
+ # no internal work will be performed.
91
+ #
92
+ # It is not possible to restart a stopped writer instance.
70
93
  def stop
71
94
  @mutex_after_fork.synchronize { stop_worker }
72
95
  end
73
96
 
74
97
  def stop_worker
98
+ @stopped = true
99
+
75
100
  return if @worker.nil?
101
+
76
102
  @worker.stop
77
103
  @worker = nil
104
+
78
105
  true
79
106
  end
80
107
 
@@ -107,7 +134,7 @@ module Datadog
107
134
  # enqueue the trace for submission to the API
108
135
  def write(trace, services = nil)
109
136
  unless services.nil?
110
- Datadog::Patcher.do_once('Writer#write') do
137
+ DEPRECATION_WARN_ONLY_ONCE.run do
111
138
  Datadog.logger.warn(%(
112
139
  write: Writing services has been deprecated and no longer need to be provided.
113
140
  write(traces, services) can be updated to write(traces)
@@ -136,7 +163,7 @@ module Datadog
136
163
 
137
164
  if worker_local
138
165
  worker_local.enqueue_trace(trace)
139
- else
166
+ elsif !@stopped
140
167
  Datadog.logger.debug('Writer either failed to start or was stopped before #write could complete')
141
168
  end
142
169
  end
@@ -155,10 +182,8 @@ module Datadog
155
182
  traces.each do |trace|
156
183
  next if trace.first.nil?
157
184
 
158
- hostname = Datadog::Runtime::Socket.hostname
159
- unless hostname.nil? || hostname.empty?
160
- trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname)
161
- end
185
+ hostname = Datadog::Core::Environment::Socket.hostname
186
+ trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname) unless hostname.nil? || hostname.empty?
162
187
  end
163
188
  end
164
189
 
data/lib/ddtrace.rb CHANGED
@@ -1,5 +1,4 @@
1
- require 'thread'
2
-
1
+ # typed: strict
3
2
  # During development, we load `ddtrace` by through `ddtrace.gemspec`,
4
3
  # which in turn eager loads 'ddtrace/version'.
5
4
  #
@@ -15,64 +14,39 @@ require 'ddtrace/quantization/http'
15
14
  require 'ddtrace/pipeline'
16
15
  require 'ddtrace/configuration'
17
16
  require 'ddtrace/patcher'
18
- require 'ddtrace/augmentation'
19
17
  require 'ddtrace/metrics'
18
+ require 'ddtrace/auto_instrument_base'
19
+ require 'ddtrace/profiling'
20
+
21
+ require 'datadog/contrib'
22
+ require 'ddtrace/contrib/auto_instrument'
23
+ require 'ddtrace/contrib/extensions'
24
+
25
+ require 'ddtrace/opentelemetry/extensions'
20
26
 
21
27
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
22
28
  module Datadog
23
- extend Augmentation
24
29
  extend Configuration
30
+ extend AutoInstrumentBase
25
31
 
26
- # Load and extend Contrib by default
27
- require 'ddtrace/contrib/extensions'
32
+ # Load built-in Datadog integrations
28
33
  extend Contrib::Extensions
34
+ # Load Contrib auto instrumentation
35
+ extend Contrib::AutoInstrument
36
+ # Load Contrib extension to global Datadog objects
37
+ Configuration::Settings.include Contrib::Extensions::Configuration::Settings
29
38
 
30
39
  # Load and extend OpenTelemetry compatibility by default
31
- require 'ddtrace/opentelemetry/extensions'
32
40
  extend OpenTelemetry::Extensions
33
41
 
34
42
  # Add shutdown hook:
35
43
  # Ensures the tracer has an opportunity to flush traces
36
44
  # and cleanup before terminating the process.
37
- at_exit { Datadog.shutdown! }
45
+ at_exit do
46
+ if Interrupt === $! # rubocop:disable Style/SpecialGlobalVars is process terminating due to a ctrl+c or similar?
47
+ Datadog.send(:handle_interrupt_shutdown!)
48
+ else
49
+ Datadog.shutdown!
50
+ end
51
+ end
38
52
  end
39
-
40
- require 'ddtrace/contrib/action_cable/integration'
41
- require 'ddtrace/contrib/action_pack/integration'
42
- require 'ddtrace/contrib/action_view/integration'
43
- require 'ddtrace/contrib/active_model_serializers/integration'
44
- require 'ddtrace/contrib/active_record/integration'
45
- require 'ddtrace/contrib/active_support/integration'
46
- require 'ddtrace/contrib/aws/integration'
47
- require 'ddtrace/contrib/concurrent_ruby/integration'
48
- require 'ddtrace/contrib/dalli/integration'
49
- require 'ddtrace/contrib/delayed_job/integration'
50
- require 'ddtrace/contrib/elasticsearch/integration'
51
- require 'ddtrace/contrib/ethon/integration'
52
- require 'ddtrace/contrib/excon/integration'
53
- require 'ddtrace/contrib/faraday/integration'
54
- require 'ddtrace/contrib/grape/integration'
55
- require 'ddtrace/contrib/graphql/integration'
56
- require 'ddtrace/contrib/grpc/integration'
57
- require 'ddtrace/contrib/http/integration'
58
- require 'ddtrace/contrib/httprb/integration'
59
- require 'ddtrace/contrib/integration'
60
- require 'ddtrace/contrib/kafka/integration'
61
- require 'ddtrace/contrib/presto/integration'
62
- require 'ddtrace/contrib/que/integration'
63
- require 'ddtrace/contrib/mysql2/integration'
64
- require 'ddtrace/contrib/mongodb/integration'
65
- require 'ddtrace/contrib/racecar/integration'
66
- require 'ddtrace/contrib/rack/integration'
67
- require 'ddtrace/contrib/rails/integration'
68
- require 'ddtrace/contrib/rake/integration'
69
- require 'ddtrace/contrib/redis/integration'
70
- require 'ddtrace/contrib/resque/integration'
71
- require 'ddtrace/contrib/rest_client/integration'
72
- require 'ddtrace/contrib/sequel/integration'
73
- require 'ddtrace/contrib/shoryuken/integration'
74
- require 'ddtrace/contrib/sidekiq/integration'
75
- require 'ddtrace/contrib/sinatra/integration'
76
- require 'ddtrace/contrib/sneakers/integration'
77
- require 'ddtrace/contrib/sucker_punch/integration'
78
- require 'ddtrace/monkey'