ddtrace 0.45.0 → 0.52.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 (586) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +22 -0
  3. data/.gitignore +7 -1
  4. data/CHANGELOG.md +406 -1
  5. data/CONTRIBUTING.md +1 -5
  6. data/LICENSE-3rdparty.csv +2 -0
  7. data/bin/ddtracerb +15 -0
  8. data/ddtrace.gemspec +19 -38
  9. data/docs/DevelopmentGuide.md +43 -0
  10. data/docs/GettingStarted.md +164 -76
  11. data/docs/ProfilingDevelopment.md +107 -0
  12. data/ext/ddtrace_profiling_native_extension/extconf.rb +28 -0
  13. data/ext/ddtrace_profiling_native_extension/profiling.c +17 -0
  14. data/lib/datadog/ci/configuration/components.rb +31 -0
  15. data/lib/datadog/ci/configuration/settings.rb +37 -0
  16. data/lib/datadog/ci/context_flush.rb +29 -0
  17. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +31 -0
  18. data/lib/datadog/ci/contrib/cucumber/ext.rb +20 -0
  19. data/lib/datadog/ci/contrib/cucumber/formatter.rb +98 -0
  20. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +27 -0
  21. data/lib/datadog/ci/contrib/cucumber/integration.rb +48 -0
  22. data/lib/datadog/ci/contrib/cucumber/patcher.rb +26 -0
  23. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +31 -0
  24. data/lib/datadog/ci/contrib/rspec/example.rb +74 -0
  25. data/lib/datadog/ci/contrib/rspec/ext.rb +19 -0
  26. data/lib/datadog/ci/contrib/rspec/integration.rb +49 -0
  27. data/lib/datadog/ci/contrib/rspec/patcher.rb +26 -0
  28. data/lib/datadog/ci/ext/app_types.rb +10 -0
  29. data/lib/datadog/ci/ext/environment.rb +443 -0
  30. data/lib/datadog/ci/ext/settings.rb +11 -0
  31. data/lib/datadog/ci/ext/test.rb +35 -0
  32. data/lib/datadog/ci/extensions.rb +18 -0
  33. data/lib/datadog/ci/test.rb +77 -0
  34. data/lib/datadog/ci.rb +17 -0
  35. data/lib/datadog/contrib.rb +69 -0
  36. data/lib/datadog/core/environment/cgroup.rb +52 -0
  37. data/lib/datadog/core/environment/class_count.rb +20 -0
  38. data/lib/datadog/core/environment/container.rb +91 -0
  39. data/lib/datadog/core/environment/ext.rb +27 -0
  40. data/lib/datadog/core/environment/gc.rb +19 -0
  41. data/lib/datadog/core/environment/identity.rb +51 -0
  42. data/lib/datadog/core/environment/socket.rb +17 -0
  43. data/lib/datadog/core/environment/thread_count.rb +19 -0
  44. data/lib/datadog/core/environment/variable_helpers.rb +42 -0
  45. data/lib/ddtrace/analytics.rb +3 -0
  46. data/lib/ddtrace/auto_instrument.rb +2 -0
  47. data/lib/ddtrace/auto_instrument_base.rb +1 -0
  48. data/lib/ddtrace/buffer.rb +10 -8
  49. data/lib/ddtrace/chunker.rb +1 -0
  50. data/lib/ddtrace/configuration/agent_settings_resolver.rb +231 -0
  51. data/lib/ddtrace/configuration/base.rb +9 -11
  52. data/lib/ddtrace/configuration/components.rb +167 -26
  53. data/lib/ddtrace/configuration/dependency_resolver.rb +1 -0
  54. data/lib/ddtrace/configuration/option.rb +1 -0
  55. data/lib/ddtrace/configuration/option_definition.rb +2 -3
  56. data/lib/ddtrace/configuration/option_definition_set.rb +1 -0
  57. data/lib/ddtrace/configuration/option_set.rb +1 -0
  58. data/lib/ddtrace/configuration/options.rb +7 -9
  59. data/lib/ddtrace/configuration/pin_setup.rb +1 -0
  60. data/lib/ddtrace/configuration/settings.rb +128 -10
  61. data/lib/ddtrace/configuration.rb +118 -26
  62. data/lib/ddtrace/context.rb +23 -20
  63. data/lib/ddtrace/context_flush.rb +15 -2
  64. data/lib/ddtrace/context_provider.rb +1 -1
  65. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +1 -0
  66. data/lib/ddtrace/contrib/action_cable/event.rb +6 -4
  67. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +1 -0
  68. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +1 -0
  69. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +1 -0
  70. data/lib/ddtrace/contrib/action_cable/events.rb +1 -0
  71. data/lib/ddtrace/contrib/action_cable/ext.rb +1 -0
  72. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +1 -0
  73. data/lib/ddtrace/contrib/action_cable/integration.rb +1 -0
  74. data/lib/ddtrace/contrib/action_cable/patcher.rb +1 -0
  75. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +22 -13
  76. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +2 -1
  77. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +1 -0
  78. data/lib/ddtrace/contrib/action_pack/ext.rb +1 -0
  79. data/lib/ddtrace/contrib/action_pack/integration.rb +1 -0
  80. data/lib/ddtrace/contrib/action_pack/patcher.rb +1 -0
  81. data/lib/ddtrace/contrib/action_pack/utils.rb +2 -1
  82. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +1 -0
  83. data/lib/ddtrace/contrib/action_view/event.rb +4 -3
  84. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
  85. data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -0
  86. data/lib/ddtrace/contrib/action_view/events.rb +1 -0
  87. data/lib/ddtrace/contrib/action_view/ext.rb +1 -0
  88. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
  89. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +1 -0
  90. data/lib/ddtrace/contrib/action_view/integration.rb +1 -0
  91. data/lib/ddtrace/contrib/action_view/patcher.rb +5 -4
  92. data/lib/ddtrace/contrib/action_view/utils.rb +2 -1
  93. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +1 -0
  94. data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -2
  95. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +1 -0
  96. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +1 -0
  97. data/lib/ddtrace/contrib/active_model_serializers/events.rb +1 -0
  98. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +1 -0
  99. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +1 -0
  100. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +1 -0
  101. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +31 -0
  102. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +108 -18
  103. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +1 -0
  104. data/lib/ddtrace/contrib/active_record/event.rb +3 -2
  105. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -0
  106. data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -0
  107. data/lib/ddtrace/contrib/active_record/events.rb +1 -0
  108. data/lib/ddtrace/contrib/active_record/ext.rb +1 -0
  109. data/lib/ddtrace/contrib/active_record/integration.rb +1 -0
  110. data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
  111. data/lib/ddtrace/contrib/active_record/utils.rb +5 -3
  112. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +1 -0
  113. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +8 -7
  114. data/lib/ddtrace/contrib/active_support/cache/redis.rb +2 -5
  115. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +1 -0
  116. data/lib/ddtrace/contrib/active_support/ext.rb +1 -0
  117. data/lib/ddtrace/contrib/active_support/integration.rb +1 -0
  118. data/lib/ddtrace/contrib/active_support/notifications/event.rb +5 -3
  119. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -1
  120. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +10 -5
  121. data/lib/ddtrace/contrib/active_support/patcher.rb +1 -0
  122. data/lib/ddtrace/contrib/analytics.rb +1 -0
  123. data/lib/ddtrace/contrib/auto_instrument.rb +4 -3
  124. data/lib/ddtrace/contrib/aws/configuration/settings.rb +1 -0
  125. data/lib/ddtrace/contrib/aws/ext.rb +1 -0
  126. data/lib/ddtrace/contrib/aws/instrumentation.rb +30 -0
  127. data/lib/ddtrace/contrib/aws/integration.rb +1 -0
  128. data/lib/ddtrace/contrib/aws/parsed_context.rb +1 -0
  129. data/lib/ddtrace/contrib/aws/patcher.rb +6 -0
  130. data/lib/ddtrace/contrib/aws/services.rb +3 -0
  131. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +1 -0
  132. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -0
  133. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  134. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +1 -0
  135. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +1 -0
  136. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +3 -1
  137. data/lib/ddtrace/contrib/configurable.rb +65 -40
  138. data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
  139. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +20 -20
  140. data/lib/ddtrace/contrib/configuration/settings.rb +8 -6
  141. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +1 -0
  142. data/lib/ddtrace/contrib/dalli/ext.rb +1 -0
  143. data/lib/ddtrace/contrib/dalli/instrumentation.rb +2 -1
  144. data/lib/ddtrace/contrib/dalli/integration.rb +1 -0
  145. data/lib/ddtrace/contrib/dalli/patcher.rb +2 -39
  146. data/lib/ddtrace/contrib/dalli/quantize.rb +1 -0
  147. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +1 -0
  148. data/lib/ddtrace/contrib/delayed_job/ext.rb +1 -0
  149. data/lib/ddtrace/contrib/delayed_job/integration.rb +1 -0
  150. data/lib/ddtrace/contrib/delayed_job/patcher.rb +1 -0
  151. data/lib/ddtrace/contrib/delayed_job/plugin.rb +1 -1
  152. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +1 -0
  153. data/lib/ddtrace/contrib/elasticsearch/ext.rb +1 -0
  154. data/lib/ddtrace/contrib/elasticsearch/integration.rb +1 -0
  155. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -0
  156. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +6 -2
  157. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +1 -0
  158. data/lib/ddtrace/contrib/ethon/easy_patch.rb +7 -6
  159. data/lib/ddtrace/contrib/ethon/ext.rb +1 -0
  160. data/lib/ddtrace/contrib/ethon/integration.rb +1 -0
  161. data/lib/ddtrace/contrib/ethon/multi_patch.rb +2 -1
  162. data/lib/ddtrace/contrib/ethon/patcher.rb +4 -2
  163. data/lib/ddtrace/contrib/excon/configuration/settings.rb +1 -0
  164. data/lib/ddtrace/contrib/excon/ext.rb +1 -0
  165. data/lib/ddtrace/contrib/excon/integration.rb +1 -0
  166. data/lib/ddtrace/contrib/excon/middleware.rb +3 -6
  167. data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
  168. data/lib/ddtrace/contrib/extensions.rb +64 -14
  169. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +1 -0
  170. data/lib/ddtrace/contrib/faraday/connection.rb +1 -0
  171. data/lib/ddtrace/contrib/faraday/ext.rb +1 -0
  172. data/lib/ddtrace/contrib/faraday/integration.rb +1 -0
  173. data/lib/ddtrace/contrib/faraday/middleware.rb +2 -3
  174. data/lib/ddtrace/contrib/faraday/patcher.rb +3 -38
  175. data/lib/ddtrace/contrib/faraday/rack_builder.rb +1 -0
  176. data/lib/ddtrace/contrib/grape/configuration/settings.rb +1 -0
  177. data/lib/ddtrace/contrib/grape/endpoint.rb +34 -31
  178. data/lib/ddtrace/contrib/grape/ext.rb +1 -0
  179. data/lib/ddtrace/contrib/grape/instrumentation.rb +4 -3
  180. data/lib/ddtrace/contrib/grape/integration.rb +1 -0
  181. data/lib/ddtrace/contrib/grape/patcher.rb +2 -43
  182. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -0
  183. data/lib/ddtrace/contrib/graphql/ext.rb +1 -0
  184. data/lib/ddtrace/contrib/graphql/integration.rb +1 -0
  185. data/lib/ddtrace/contrib/graphql/patcher.rb +1 -0
  186. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +2 -0
  187. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -0
  188. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -4
  189. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +13 -8
  190. data/lib/ddtrace/contrib/grpc/ext.rb +1 -0
  191. data/lib/ddtrace/contrib/grpc/integration.rb +1 -0
  192. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +1 -0
  193. data/lib/ddtrace/contrib/grpc/patcher.rb +3 -37
  194. data/lib/ddtrace/contrib/http/circuit_breaker.rb +2 -3
  195. data/lib/ddtrace/contrib/http/configuration/settings.rb +1 -0
  196. data/lib/ddtrace/contrib/http/ext.rb +1 -0
  197. data/lib/ddtrace/contrib/http/instrumentation.rb +7 -6
  198. data/lib/ddtrace/contrib/http/integration.rb +1 -0
  199. data/lib/ddtrace/contrib/http/patcher.rb +2 -1
  200. data/lib/ddtrace/contrib/http_annotation_helper.rb +1 -0
  201. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +1 -0
  202. data/lib/ddtrace/contrib/httpclient/ext.rb +1 -0
  203. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +16 -20
  204. data/lib/ddtrace/contrib/httpclient/integration.rb +1 -0
  205. data/lib/ddtrace/contrib/httpclient/patcher.rb +8 -4
  206. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +1 -0
  207. data/lib/ddtrace/contrib/httprb/ext.rb +1 -0
  208. data/lib/ddtrace/contrib/httprb/instrumentation.rb +16 -21
  209. data/lib/ddtrace/contrib/httprb/integration.rb +1 -0
  210. data/lib/ddtrace/contrib/httprb/patcher.rb +8 -4
  211. data/lib/ddtrace/contrib/integration.rb +4 -3
  212. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +1 -0
  213. data/lib/ddtrace/contrib/kafka/consumer_event.rb +1 -0
  214. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +1 -0
  215. data/lib/ddtrace/contrib/kafka/event.rb +3 -2
  216. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +1 -0
  217. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +1 -0
  218. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +1 -0
  219. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
  220. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +1 -0
  221. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
  222. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
  223. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  224. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  225. data/lib/ddtrace/contrib/kafka/events.rb +1 -0
  226. data/lib/ddtrace/contrib/kafka/ext.rb +1 -0
  227. data/lib/ddtrace/contrib/kafka/integration.rb +1 -0
  228. data/lib/ddtrace/contrib/kafka/patcher.rb +1 -0
  229. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +19 -0
  230. data/lib/ddtrace/contrib/lograge/ext.rb +11 -0
  231. data/lib/ddtrace/contrib/lograge/instrumentation.rb +39 -0
  232. data/lib/ddtrace/contrib/lograge/integration.rb +46 -0
  233. data/lib/ddtrace/contrib/{cucumber → lograge}/patcher.rb +7 -4
  234. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +1 -0
  235. data/lib/ddtrace/contrib/mongodb/ext.rb +1 -0
  236. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +5 -2
  237. data/lib/ddtrace/contrib/mongodb/integration.rb +1 -0
  238. data/lib/ddtrace/contrib/mongodb/parsers.rb +1 -0
  239. data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -2
  240. data/lib/ddtrace/contrib/mongodb/subscribers.rb +3 -3
  241. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +1 -0
  242. data/lib/ddtrace/contrib/mysql2/ext.rb +1 -0
  243. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +2 -1
  244. data/lib/ddtrace/contrib/mysql2/integration.rb +1 -0
  245. data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -1
  246. data/lib/ddtrace/contrib/patchable.rb +3 -2
  247. data/lib/ddtrace/contrib/patcher.rb +12 -8
  248. data/lib/ddtrace/contrib/presto/configuration/settings.rb +1 -0
  249. data/lib/ddtrace/contrib/presto/ext.rb +1 -0
  250. data/lib/ddtrace/contrib/presto/instrumentation.rb +2 -1
  251. data/lib/ddtrace/contrib/presto/integration.rb +1 -0
  252. data/lib/ddtrace/contrib/presto/patcher.rb +7 -3
  253. data/lib/ddtrace/contrib/qless/configuration/settings.rb +1 -0
  254. data/lib/ddtrace/contrib/qless/ext.rb +1 -0
  255. data/lib/ddtrace/contrib/qless/integration.rb +1 -0
  256. data/lib/ddtrace/contrib/qless/patcher.rb +5 -5
  257. data/lib/ddtrace/contrib/qless/qless_job.rb +2 -0
  258. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +2 -0
  259. data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
  260. data/lib/ddtrace/contrib/que/ext.rb +20 -19
  261. data/lib/ddtrace/contrib/que/integration.rb +1 -0
  262. data/lib/ddtrace/contrib/que/patcher.rb +1 -0
  263. data/lib/ddtrace/contrib/que/tracer.rb +2 -1
  264. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -0
  265. data/lib/ddtrace/contrib/racecar/event.rb +4 -2
  266. data/lib/ddtrace/contrib/racecar/events/batch.rb +1 -0
  267. data/lib/ddtrace/contrib/racecar/events/consume.rb +1 -0
  268. data/lib/ddtrace/contrib/racecar/events/message.rb +1 -0
  269. data/lib/ddtrace/contrib/racecar/events.rb +1 -0
  270. data/lib/ddtrace/contrib/racecar/ext.rb +1 -0
  271. data/lib/ddtrace/contrib/racecar/integration.rb +1 -0
  272. data/lib/ddtrace/contrib/racecar/patcher.rb +1 -0
  273. data/lib/ddtrace/contrib/rack/configuration/settings.rb +4 -3
  274. data/lib/ddtrace/contrib/rack/ext.rb +1 -0
  275. data/lib/ddtrace/contrib/rack/integration.rb +1 -0
  276. data/lib/ddtrace/contrib/rack/middlewares.rb +7 -11
  277. data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
  278. data/lib/ddtrace/contrib/rack/request_queue.rb +1 -0
  279. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +1 -0
  280. data/lib/ddtrace/contrib/rails/configuration/settings.rb +1 -0
  281. data/lib/ddtrace/contrib/rails/ext.rb +1 -0
  282. data/lib/ddtrace/contrib/rails/framework.rb +26 -1
  283. data/lib/ddtrace/contrib/rails/integration.rb +1 -0
  284. data/lib/ddtrace/contrib/rails/log_injection.rb +1 -40
  285. data/lib/ddtrace/contrib/rails/middlewares.rb +1 -0
  286. data/lib/ddtrace/contrib/rails/patcher.rb +18 -11
  287. data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
  288. data/lib/ddtrace/contrib/rails/utils.rb +1 -0
  289. data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -0
  290. data/lib/ddtrace/contrib/rake/ext.rb +1 -0
  291. data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -3
  292. data/lib/ddtrace/contrib/rake/integration.rb +1 -0
  293. data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
  294. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +12 -4
  295. data/lib/ddtrace/contrib/redis/configuration/settings.rb +1 -0
  296. data/lib/ddtrace/contrib/redis/ext.rb +1 -0
  297. data/lib/ddtrace/contrib/redis/integration.rb +1 -0
  298. data/lib/ddtrace/contrib/redis/patcher.rb +1 -0
  299. data/lib/ddtrace/contrib/redis/quantize.rb +2 -0
  300. data/lib/ddtrace/contrib/redis/tags.rb +1 -0
  301. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  302. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +7 -7
  303. data/lib/ddtrace/contrib/registerable.rb +5 -4
  304. data/lib/ddtrace/contrib/registry.rb +3 -2
  305. data/lib/ddtrace/contrib/resque/configuration/settings.rb +18 -1
  306. data/lib/ddtrace/contrib/resque/ext.rb +1 -0
  307. data/lib/ddtrace/contrib/resque/integration.rb +2 -1
  308. data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
  309. data/lib/ddtrace/contrib/resque/resque_job.rb +25 -1
  310. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -0
  311. data/lib/ddtrace/contrib/rest_client/ext.rb +1 -0
  312. data/lib/ddtrace/contrib/rest_client/integration.rb +1 -0
  313. data/lib/ddtrace/contrib/rest_client/patcher.rb +3 -1
  314. data/lib/ddtrace/contrib/rest_client/request_patch.rb +3 -4
  315. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +19 -0
  316. data/lib/ddtrace/contrib/semantic_logger/ext.rb +11 -0
  317. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +43 -0
  318. data/lib/ddtrace/contrib/semantic_logger/integration.rb +48 -0
  319. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +26 -0
  320. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +1 -0
  321. data/lib/ddtrace/contrib/sequel/database.rb +2 -1
  322. data/lib/ddtrace/contrib/sequel/dataset.rb +2 -1
  323. data/lib/ddtrace/contrib/sequel/ext.rb +1 -0
  324. data/lib/ddtrace/contrib/sequel/integration.rb +1 -0
  325. data/lib/ddtrace/contrib/sequel/patcher.rb +3 -2
  326. data/lib/ddtrace/contrib/sequel/utils.rb +6 -6
  327. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +2 -0
  328. data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -0
  329. data/lib/ddtrace/contrib/shoryuken/integration.rb +1 -0
  330. data/lib/ddtrace/contrib/shoryuken/patcher.rb +1 -0
  331. data/lib/ddtrace/contrib/shoryuken/tracer.rb +8 -4
  332. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
  333. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
  334. data/lib/ddtrace/contrib/sidekiq/ext.rb +1 -0
  335. data/lib/ddtrace/contrib/sidekiq/integration.rb +1 -0
  336. data/lib/ddtrace/contrib/sidekiq/patcher.rb +1 -0
  337. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +3 -7
  338. data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
  339. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -0
  340. data/lib/ddtrace/contrib/sinatra/env.rb +2 -3
  341. data/lib/ddtrace/contrib/sinatra/ext.rb +1 -0
  342. data/lib/ddtrace/contrib/sinatra/headers.rb +2 -3
  343. data/lib/ddtrace/contrib/sinatra/integration.rb +1 -0
  344. data/lib/ddtrace/contrib/sinatra/patcher.rb +3 -1
  345. data/lib/ddtrace/contrib/sinatra/tracer.rb +14 -6
  346. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +11 -4
  347. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
  348. data/lib/ddtrace/contrib/sneakers/ext.rb +12 -11
  349. data/lib/ddtrace/contrib/sneakers/integration.rb +1 -0
  350. data/lib/ddtrace/contrib/sneakers/patcher.rb +1 -0
  351. data/lib/ddtrace/contrib/sneakers/tracer.rb +3 -4
  352. data/lib/ddtrace/contrib/status_code_matcher.rb +6 -3
  353. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -0
  354. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +5 -6
  355. data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -0
  356. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +5 -0
  357. data/lib/ddtrace/contrib/sucker_punch/integration.rb +1 -0
  358. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +2 -0
  359. data/lib/ddtrace/correlation.rb +3 -1
  360. data/lib/ddtrace/diagnostics/environment_logger.rb +9 -7
  361. data/lib/ddtrace/diagnostics/health.rb +1 -0
  362. data/lib/ddtrace/distributed_tracing/headers/b3.rb +1 -0
  363. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +1 -0
  364. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -0
  365. data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
  366. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +2 -3
  367. data/lib/ddtrace/encoding.rb +3 -0
  368. data/lib/ddtrace/error.rb +78 -8
  369. data/lib/ddtrace/event.rb +1 -0
  370. data/lib/ddtrace/ext/analytics.rb +1 -0
  371. data/lib/ddtrace/ext/app_types.rb +1 -1
  372. data/lib/ddtrace/ext/correlation.rb +1 -0
  373. data/lib/ddtrace/ext/diagnostics.rb +1 -0
  374. data/lib/ddtrace/ext/distributed.rb +2 -1
  375. data/lib/ddtrace/ext/environment.rb +8 -0
  376. data/lib/ddtrace/ext/errors.rb +1 -0
  377. data/lib/ddtrace/ext/forced_tracing.rb +1 -0
  378. data/lib/ddtrace/ext/git.rb +10 -1
  379. data/lib/ddtrace/ext/http.rb +2 -1
  380. data/lib/ddtrace/ext/integration.rb +1 -0
  381. data/lib/ddtrace/ext/manual_tracing.rb +1 -0
  382. data/lib/ddtrace/ext/metrics.rb +1 -0
  383. data/lib/ddtrace/ext/net.rb +1 -0
  384. data/lib/ddtrace/ext/priority.rb +1 -0
  385. data/lib/ddtrace/ext/profiling.rb +56 -0
  386. data/lib/ddtrace/ext/runtime.rb +1 -7
  387. data/lib/ddtrace/ext/sampling.rb +1 -0
  388. data/lib/ddtrace/ext/sql.rb +1 -0
  389. data/lib/ddtrace/ext/test.rb +3 -18
  390. data/lib/ddtrace/ext/transport.rb +3 -0
  391. data/lib/ddtrace/forced_tracing.rb +3 -0
  392. data/lib/ddtrace/logger.rb +2 -1
  393. data/lib/ddtrace/metrics.rb +84 -24
  394. data/lib/ddtrace/opentelemetry/extensions.rb +2 -1
  395. data/lib/ddtrace/opentelemetry/span.rb +1 -0
  396. data/lib/ddtrace/opentracer/binary_propagator.rb +1 -0
  397. data/lib/ddtrace/opentracer/carrier.rb +1 -0
  398. data/lib/ddtrace/opentracer/distributed_headers.rb +4 -0
  399. data/lib/ddtrace/opentracer/global_tracer.rb +1 -0
  400. data/lib/ddtrace/opentracer/propagator.rb +1 -0
  401. data/lib/ddtrace/opentracer/rack_propagator.rb +1 -0
  402. data/lib/ddtrace/opentracer/scope.rb +1 -0
  403. data/lib/ddtrace/opentracer/scope_manager.rb +1 -0
  404. data/lib/ddtrace/opentracer/span.rb +3 -6
  405. data/lib/ddtrace/opentracer/span_context.rb +1 -0
  406. data/lib/ddtrace/opentracer/span_context_factory.rb +1 -0
  407. data/lib/ddtrace/opentracer/text_map_propagator.rb +1 -0
  408. data/lib/ddtrace/opentracer/thread_local_scope.rb +2 -0
  409. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +1 -0
  410. data/lib/ddtrace/opentracer/tracer.rb +1 -0
  411. data/lib/ddtrace/opentracer.rb +21 -39
  412. data/lib/ddtrace/patcher.rb +28 -6
  413. data/lib/ddtrace/pin.rb +9 -61
  414. data/lib/ddtrace/pipeline/span_filter.rb +2 -1
  415. data/lib/ddtrace/pipeline/span_processor.rb +1 -0
  416. data/lib/ddtrace/pipeline.rb +1 -0
  417. data/lib/ddtrace/profiling/backtrace_location.rb +33 -0
  418. data/lib/ddtrace/profiling/buffer.rb +42 -0
  419. data/lib/ddtrace/profiling/collectors/stack.rb +257 -0
  420. data/lib/ddtrace/profiling/encoding/profile.rb +38 -0
  421. data/lib/ddtrace/profiling/event.rb +14 -0
  422. data/lib/ddtrace/profiling/events/stack.rb +81 -0
  423. data/lib/ddtrace/profiling/exporter.rb +24 -0
  424. data/lib/ddtrace/profiling/ext/cpu.rb +67 -0
  425. data/lib/ddtrace/profiling/ext/cthread.rb +156 -0
  426. data/lib/ddtrace/profiling/ext/forking.rb +98 -0
  427. data/lib/ddtrace/profiling/flush.rb +44 -0
  428. data/lib/ddtrace/profiling/native_extension.rb +18 -0
  429. data/lib/ddtrace/profiling/pprof/builder.rb +120 -0
  430. data/lib/ddtrace/profiling/pprof/converter.rb +90 -0
  431. data/lib/ddtrace/profiling/pprof/message_set.rb +15 -0
  432. data/lib/ddtrace/profiling/pprof/payload.rb +19 -0
  433. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  434. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +82 -0
  435. data/lib/ddtrace/profiling/pprof/stack_sample.rb +117 -0
  436. data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
  437. data/lib/ddtrace/profiling/pprof/template.rb +119 -0
  438. data/lib/ddtrace/profiling/preload.rb +4 -0
  439. data/lib/ddtrace/profiling/profiler.rb +31 -0
  440. data/lib/ddtrace/profiling/recorder.rb +96 -0
  441. data/lib/ddtrace/profiling/scheduler.rb +134 -0
  442. data/lib/ddtrace/profiling/tasks/setup.rb +82 -0
  443. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +41 -0
  444. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
  445. data/lib/ddtrace/profiling/transport/client.rb +15 -0
  446. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +101 -0
  447. data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
  448. data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
  449. data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
  450. data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
  451. data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
  452. data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
  453. data/lib/ddtrace/profiling/transport/http.rb +120 -0
  454. data/lib/ddtrace/profiling/transport/io/client.rb +28 -0
  455. data/lib/ddtrace/profiling/transport/io/response.rb +17 -0
  456. data/lib/ddtrace/profiling/transport/io.rb +31 -0
  457. data/lib/ddtrace/profiling/transport/parcel.rb +18 -0
  458. data/lib/ddtrace/profiling/transport/request.rb +16 -0
  459. data/lib/ddtrace/profiling/transport/response.rb +9 -0
  460. data/lib/ddtrace/profiling.rb +151 -0
  461. data/lib/ddtrace/propagation/grpc_propagator.rb +2 -0
  462. data/lib/ddtrace/propagation/http_propagator.rb +3 -2
  463. data/lib/ddtrace/quantization/hash.rb +1 -0
  464. data/lib/ddtrace/quantization/http.rb +4 -0
  465. data/lib/ddtrace/runtime/metrics.rb +21 -14
  466. data/lib/ddtrace/sampler.rb +2 -1
  467. data/lib/ddtrace/sampling/matcher.rb +1 -0
  468. data/lib/ddtrace/sampling/rate_limiter.rb +1 -0
  469. data/lib/ddtrace/sampling/rule.rb +2 -1
  470. data/lib/ddtrace/sampling/rule_sampler.rb +6 -10
  471. data/lib/ddtrace/sampling.rb +1 -0
  472. data/lib/ddtrace/span.rb +44 -19
  473. data/lib/ddtrace/sync_writer.rb +17 -15
  474. data/lib/ddtrace/tasks/exec.rb +47 -0
  475. data/lib/ddtrace/tasks/help.rb +15 -0
  476. data/lib/ddtrace/tracer.rb +48 -50
  477. data/lib/ddtrace/transport/http/adapters/net.rb +28 -8
  478. data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
  479. data/lib/ddtrace/transport/http/adapters/test.rb +1 -0
  480. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +3 -4
  481. data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
  482. data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
  483. data/lib/ddtrace/transport/http/api/instance.rb +1 -0
  484. data/lib/ddtrace/transport/http/api/map.rb +1 -0
  485. data/lib/ddtrace/transport/http/api/spec.rb +1 -0
  486. data/lib/ddtrace/transport/http/api.rb +1 -0
  487. data/lib/ddtrace/transport/http/builder.rb +8 -1
  488. data/lib/ddtrace/transport/http/client.rb +3 -1
  489. data/lib/ddtrace/transport/http/env.rb +9 -0
  490. data/lib/ddtrace/transport/http/response.rb +1 -0
  491. data/lib/ddtrace/transport/http/statistics.rb +3 -2
  492. data/lib/ddtrace/transport/http/traces.rb +6 -6
  493. data/lib/ddtrace/transport/http.rb +51 -38
  494. data/lib/ddtrace/transport/io/client.rb +17 -9
  495. data/lib/ddtrace/transport/io/response.rb +2 -3
  496. data/lib/ddtrace/transport/io/traces.rb +10 -1
  497. data/lib/ddtrace/transport/io.rb +2 -1
  498. data/lib/ddtrace/transport/parcel.rb +7 -0
  499. data/lib/ddtrace/transport/request.rb +1 -0
  500. data/lib/ddtrace/transport/response.rb +1 -0
  501. data/lib/ddtrace/transport/statistics.rb +1 -0
  502. data/lib/ddtrace/transport/traces.rb +21 -3
  503. data/lib/ddtrace/utils/compression.rb +28 -0
  504. data/lib/ddtrace/utils/database.rb +1 -0
  505. data/lib/ddtrace/utils/forking.rb +2 -1
  506. data/lib/ddtrace/utils/object_set.rb +40 -0
  507. data/lib/ddtrace/utils/only_once.rb +41 -0
  508. data/lib/ddtrace/utils/sequence.rb +18 -0
  509. data/lib/ddtrace/utils/string_table.rb +46 -0
  510. data/lib/ddtrace/utils/time.rb +34 -2
  511. data/lib/ddtrace/utils.rb +14 -2
  512. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  513. data/lib/ddtrace/vendor/active_record/connection_specification.rb +1 -0
  514. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  515. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +117 -0
  516. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +58 -0
  517. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +136 -0
  518. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +10 -0
  519. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +9 -0
  520. data/lib/ddtrace/vendor/multipart-post/multipart.rb +13 -0
  521. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +33 -0
  522. data/lib/ddtrace/version.rb +15 -2
  523. data/lib/ddtrace/worker.rb +1 -0
  524. data/lib/ddtrace/workers/async.rb +15 -5
  525. data/lib/ddtrace/workers/loop.rb +32 -5
  526. data/lib/ddtrace/workers/polling.rb +13 -5
  527. data/lib/ddtrace/workers/queue.rb +3 -1
  528. data/lib/ddtrace/workers/runtime_metrics.rb +15 -1
  529. data/lib/ddtrace/workers/trace_writer.rb +14 -16
  530. data/lib/ddtrace/workers.rb +8 -2
  531. data/lib/ddtrace/writer.rb +14 -7
  532. data/lib/ddtrace.rb +20 -56
  533. metadata +130 -446
  534. data/.circleci/config.yml +0 -566
  535. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
  536. data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
  537. data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
  538. data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
  539. data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
  540. data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
  541. data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
  542. data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
  543. data/.circleci/images/primary/Dockerfile-3.0.0 +0 -73
  544. data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
  545. data/.dockerignore +0 -1
  546. data/.env +0 -26
  547. data/.github/CODEOWNERS +0 -1
  548. data/.github/workflows/add-milestone-to-pull-requests.yml +0 -42
  549. data/.github/workflows/create-next-milestone.yml +0 -20
  550. data/.gitlab-ci.yml +0 -27
  551. data/.rspec +0 -1
  552. data/.rubocop.yml +0 -85
  553. data/.simplecov +0 -41
  554. data/Appraisals +0 -1350
  555. data/Gemfile +0 -9
  556. data/Rakefile +0 -993
  557. data/benchmarks/postgres_database.yml +0 -9
  558. data/benchmarks/sidekiq_test.rb +0 -154
  559. data/docker-compose.yml +0 -400
  560. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  561. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  562. data/lib/ddtrace/augmentation/shim.rb +0 -102
  563. data/lib/ddtrace/augmentation.rb +0 -13
  564. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -38
  565. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -19
  566. data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -104
  567. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
  568. data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
  569. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -38
  570. data/lib/ddtrace/contrib/rspec/example.rb +0 -61
  571. data/lib/ddtrace/contrib/rspec/example_group.rb +0 -61
  572. data/lib/ddtrace/contrib/rspec/ext.rb +0 -19
  573. data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
  574. data/lib/ddtrace/contrib/rspec/patcher.rb +0 -25
  575. data/lib/ddtrace/environment.rb +0 -41
  576. data/lib/ddtrace/ext/ci.rb +0 -297
  577. data/lib/ddtrace/monkey.rb +0 -58
  578. data/lib/ddtrace/runtime/cgroup.rb +0 -44
  579. data/lib/ddtrace/runtime/class_count.rb +0 -17
  580. data/lib/ddtrace/runtime/container.rb +0 -73
  581. data/lib/ddtrace/runtime/gc.rb +0 -16
  582. data/lib/ddtrace/runtime/identity.rb +0 -40
  583. data/lib/ddtrace/runtime/object_space.rb +0 -19
  584. data/lib/ddtrace/runtime/socket.rb +0 -14
  585. data/lib/ddtrace/runtime/thread_count.rb +0 -16
  586. data/tasks/release_gem.rake +0 -28
@@ -1,10 +1,13 @@
1
+ # typed: false
1
2
  require 'logger'
2
3
  require 'ddtrace/configuration/base'
3
4
 
4
5
  require 'ddtrace/ext/analytics'
5
6
  require 'ddtrace/ext/distributed'
6
- require 'ddtrace/ext/runtime'
7
+ require 'ddtrace/ext/environment'
8
+ require 'ddtrace/ext/profiling'
7
9
  require 'ddtrace/ext/sampling'
10
+ require 'ddtrace/ext/test'
8
11
 
9
12
  module Datadog
10
13
  module Configuration
@@ -13,9 +16,32 @@ module Datadog
13
16
  class Settings
14
17
  include Base
15
18
 
16
- #
17
- # Configuration options
18
- #
19
+ def initialize(*_)
20
+ super
21
+
22
+ # WORKAROUND: The values for services, version, and env can get set either directly OR as a side effect of
23
+ # accessing tags (reading or writing). This is of course really confusing and error-prone, e.g. in an app
24
+ # WITHOUT this workaround where you define `DD_TAGS=env:envenvtag,service:envservicetag,version:envversiontag`
25
+ # and do:
26
+ #
27
+ # puts Datadog.configuration.instance_exec { "#{service} #{env} #{version}" }
28
+ # Datadog.configuration.tags
29
+ # puts Datadog.configuration.instance_exec { "#{service} #{env} #{version}" }
30
+ #
31
+ # the output will be:
32
+ #
33
+ # [empty]
34
+ # envservicetag envenvtag envversiontag
35
+ #
36
+ # That is -- the proper values for service/env/version are only set AFTER something accidentally or not triggers
37
+ # the resolution of the tags.
38
+ # This is really confusing, error prone, etc, so calling tags here is a really hacky but effective way to
39
+ # avoid this. I could not think of a better way of fixing this issue without massive refactoring of tags parsing
40
+ # (so that the individual service/env/version get correctly set even from their tags values, not as a side
41
+ # effect). Sorry :(
42
+ tags
43
+ end
44
+
19
45
  settings :analytics do
20
46
  option :enabled do |o|
21
47
  o.default { env_to_bool(Ext::Analytics::ENV_TRACE_ANALYTICS_ENABLED, nil) }
@@ -92,6 +118,7 @@ module Datadog
92
118
  end
93
119
 
94
120
  option :env do |o|
121
+ # NOTE: env also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
95
122
  o.default { ENV.fetch(Ext::Environment::ENV_ENVIRONMENT, nil) }
96
123
  o.lazy
97
124
  end
@@ -108,6 +135,55 @@ module Datadog
108
135
  get_option(:logger).instance = logger
109
136
  end
110
137
 
138
+ settings :profiling do
139
+ option :enabled do |o|
140
+ o.default { env_to_bool(Ext::Profiling::ENV_ENABLED, false) }
141
+ o.lazy
142
+ end
143
+
144
+ settings :exporter do
145
+ option :transport
146
+ option :transport_options do |o|
147
+ o.setter do
148
+ # NOTE: As of April 2021 there may be a few profiler private beta customers with this setting, but since I'm
149
+ # marking this as deprecated before public beta, we can remove this for 1.0 without concern.
150
+ Datadog.logger.warn(
151
+ 'Configuring the profiler c.profiling.exporter.transport_options is no longer needed, as the profiler ' \
152
+ 'will reuse your existing global or tracer configuration. ' \
153
+ 'This setting is deprecated for removal in a future ddtrace version ' \
154
+ '(1.0 or profiling GA, whichever comes first).'
155
+ )
156
+ nil
157
+ end
158
+ o.default { nil }
159
+ o.lazy
160
+ end
161
+ end
162
+
163
+ settings :advanced do
164
+ option :max_events, default: 32768
165
+
166
+ # Controls the maximum number of frames for each thread sampled. Can be tuned to avoid omitted frames in the
167
+ # produced profiles. Increasing this may increase the overhead of profiling.
168
+ option :max_frames do |o|
169
+ o.default { env_to_int(Ext::Profiling::ENV_MAX_FRAMES, 400) }
170
+ o.lazy
171
+ end
172
+
173
+ # When using profiling together with tracing, this controls if trace resources (usually the endpoint names)
174
+ # are gathered and reported together with profiles.
175
+ option :extract_trace_resource, default: true
176
+ end
177
+
178
+ settings :upload do
179
+ option :timeout_seconds do |o|
180
+ o.setter { |value| value.nil? ? 30.0 : value.to_f }
181
+ o.default { env_to_float(Ext::Profiling::ENV_UPLOAD_TIMEOUT, 30.0) }
182
+ o.lazy
183
+ end
184
+ end
185
+ end
186
+
111
187
  option :report_hostname do |o|
112
188
  o.default { env_to_bool(Ext::NET::ENV_REPORT_HOSTNAME, false) }
113
189
  o.lazy
@@ -156,8 +232,17 @@ module Datadog
156
232
  end
157
233
 
158
234
  option :service do |o|
159
- o.default { ENV.fetch(Ext::Environment::ENV_SERVICE, nil) }
235
+ # NOTE: service also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
236
+ o.default { ENV.fetch(Ext::Environment::ENV_SERVICE, Ext::Environment::FALLBACK_SERVICE_NAME) }
160
237
  o.lazy
238
+
239
+ # There's a few cases where we don't want to use the fallback service name, so this helper allows us to get a
240
+ # nil instead so that one can do
241
+ # nice_service_name = Datadog.configure.service_without_fallback || nice_service_name_default
242
+ o.helper(:service_without_fallback) do
243
+ service_name = service
244
+ service_name unless service_name.equal?(Ext::Environment::FALLBACK_SERVICE_NAME)
245
+ end
161
246
  end
162
247
 
163
248
  option :site do |o|
@@ -184,18 +269,17 @@ module Datadog
184
269
 
185
270
  o.setter do |new_value, old_value|
186
271
  # Coerce keys to strings
187
- string_tags = Hash[new_value.collect { |k, v| [k.to_s, v] }]
272
+ string_tags = new_value.collect { |k, v| [k.to_s, v] }.to_h
188
273
 
189
274
  # Cross-populate tag values with other settings
190
- if env.nil? && string_tags.key?(Ext::Environment::TAG_ENV)
191
- self.env = string_tags[Ext::Environment::TAG_ENV]
192
- end
275
+
276
+ self.env = string_tags[Ext::Environment::TAG_ENV] if env.nil? && string_tags.key?(Ext::Environment::TAG_ENV)
193
277
 
194
278
  if version.nil? && string_tags.key?(Ext::Environment::TAG_VERSION)
195
279
  self.version = string_tags[Ext::Environment::TAG_VERSION]
196
280
  end
197
281
 
198
- if service.nil? && string_tags.key?(Ext::Environment::TAG_SERVICE)
282
+ if service_without_fallback.nil? && string_tags.key?(Ext::Environment::TAG_SERVICE)
199
283
  self.service = string_tags[Ext::Environment::TAG_SERVICE]
200
284
  end
201
285
 
@@ -206,6 +290,39 @@ module Datadog
206
290
  o.lazy
207
291
  end
208
292
 
293
+ settings :test_mode do
294
+ option :enabled do |o|
295
+ o.default { env_to_bool(Ext::Test::ENV_MODE_ENABLED, false) }
296
+ o.lazy
297
+ end
298
+
299
+ option :context_flush do |o|
300
+ o.default { nil }
301
+ o.lazy
302
+ end
303
+
304
+ option :writer_options do |o|
305
+ o.default { {} }
306
+ o.lazy
307
+ end
308
+ end
309
+
310
+ option :time_now_provider do |o|
311
+ o.default { ::Time.now }
312
+
313
+ o.on_set do |time_provider|
314
+ Utils::Time.now_provider = time_provider
315
+ end
316
+
317
+ o.resetter do |_value|
318
+ # TODO: Resetter needs access to the default value
319
+ # TODO: to help reduce duplication.
320
+ -> { ::Time.now }.tap do |default|
321
+ Utils::Time.now_provider = default
322
+ end
323
+ end
324
+ end
325
+
209
326
  settings :tracer do
210
327
  option :enabled do |o|
211
328
  o.default { env_to_bool(Datadog::Ext::Diagnostics::DD_TRACE_ENABLED, true) }
@@ -277,6 +394,7 @@ module Datadog
277
394
  end
278
395
 
279
396
  option :version do |o|
397
+ # NOTE: version also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
280
398
  o.default { ENV.fetch(Ext::Environment::ENV_VERSION, nil) }
281
399
  o.lazy
282
400
  end
@@ -1,14 +1,42 @@
1
+ # typed: true
1
2
  require 'forwardable'
2
-
3
3
  require 'ddtrace/configuration/pin_setup'
4
4
  require 'ddtrace/configuration/settings'
5
5
  require 'ddtrace/configuration/components'
6
6
 
7
7
  module Datadog
8
8
  # Configuration provides a unique access point for configurations
9
- module Configuration
9
+ module Configuration # rubocop:disable Metrics/ModuleLength
10
+ include Kernel # Ensure that kernel methods are always available (https://sorbet.org/docs/error-reference#7003)
10
11
  extend Forwardable
11
12
 
13
+ # Used to ensure that @components initialization/reconfiguration is performed one-at-a-time, by a single thread.
14
+ #
15
+ # This is important because components can end up being accessed from multiple application threads (for instance on
16
+ # a threaded webserver), and we don't want their initialization to clash (for instance, starting two profilers...).
17
+ #
18
+ # Note that a Mutex **IS NOT** reentrant: the same thread cannot grab the same Mutex more than once.
19
+ # This means below we are careful not to nest calls to methods that would trigger initialization and grab the lock.
20
+ #
21
+ # Every method that directly or indirectly mutates @components should be holding the lock (through
22
+ # #safely_synchronize) while doing so.
23
+ COMPONENTS_WRITE_LOCK = Mutex.new
24
+ private_constant :COMPONENTS_WRITE_LOCK
25
+
26
+ # We use a separate lock when reading the @components, so that they continue to be accessible during reconfiguration.
27
+ # This was needed because we ran into several issues where we still needed to read the old
28
+ # components while the COMPONENTS_WRITE_LOCK was being held (see https://github.com/DataDog/dd-trace-rb/pull/1387
29
+ # and https://github.com/DataDog/dd-trace-rb/pull/1373#issuecomment-799593022 ).
30
+ #
31
+ # Technically on MRI we could get away without this lock, but on non-MRI Rubies, we may run into issues because
32
+ # we fall into the "UnsafeDCLFactory" case of https://shipilev.net/blog/2014/safe-public-construction/ .
33
+ # Specifically, on JRuby reads from the @components do NOT have volatile semantics, and on TruffleRuby they do
34
+ # BUT just as an implementation detail, see https://github.com/jruby/jruby/wiki/Concurrency-in-jruby#volatility and
35
+ # https://github.com/DataDog/dd-trace-rb/pull/1329#issuecomment-776750377 .
36
+ # Concurrency is hard.
37
+ COMPONENTS_READ_LOCK = Mutex.new
38
+ private_constant :COMPONENTS_READ_LOCK
39
+
12
40
  attr_writer :configuration
13
41
 
14
42
  def configuration
@@ -19,13 +47,15 @@ module Datadog
19
47
  if target.is_a?(Settings)
20
48
  yield(target) if block_given?
21
49
 
22
- # Build immutable components from settings
23
- @components ||= nil
24
- @components = if @components
25
- replace_components!(target, @components)
26
- else
27
- build_components(target)
28
- end
50
+ safely_synchronize do |write_components|
51
+ write_components.call(
52
+ if components?
53
+ replace_components!(target, @components)
54
+ else
55
+ build_components(target)
56
+ end
57
+ )
58
+ end
29
59
 
30
60
  target
31
61
  else
@@ -36,22 +66,19 @@ module Datadog
36
66
  def_delegators \
37
67
  :components,
38
68
  :health_metrics,
69
+ :profiler,
39
70
  :runtime_metrics,
40
71
  :tracer
41
72
 
42
73
  def logger
43
- if instance_variable_defined?(:@components) && @components
74
+ # avoid initializing components if they didn't already exist
75
+ current_components = components(allow_initialization: false)
76
+
77
+ if current_components
44
78
  @temp_logger = nil
45
- components.logger
79
+ current_components.logger
46
80
  else
47
- # Use default logger without initializing components.
48
- # This prevents recursive loops while initializing.
49
- # e.g. Get logger --> Build components --> Log message --> Repeat...
50
- @temp_logger ||= begin
51
- logger = configuration.logger.instance || Datadog::Logger.new(STDOUT)
52
- logger.level = configuration.diagnostics.debug ? ::Logger::DEBUG : configuration.logger.level
53
- logger
54
- end
81
+ logger_without_components
55
82
  end
56
83
  end
57
84
 
@@ -65,26 +92,64 @@ module Datadog
65
92
  #
66
93
  # Components won't be automatically reinitialized after a shutdown.
67
94
  def shutdown!
68
- components.shutdown! if instance_variable_defined?(:@components) && @components
95
+ safely_synchronize do
96
+ @components.shutdown! if components?
97
+ end
69
98
  end
70
99
 
100
+ protected
101
+
102
+ def components(allow_initialization: true)
103
+ current_components = COMPONENTS_READ_LOCK.synchronize { defined?(@components) && @components }
104
+ return current_components if current_components || !allow_initialization
105
+
106
+ safely_synchronize do |write_components|
107
+ (defined?(@components) && @components) || write_components.call(build_components(configuration))
108
+ end
109
+ end
110
+
111
+ private
112
+
71
113
  # Gracefully shuts down the tracer and disposes of component references,
72
114
  # allowing execution to start anew.
73
115
  #
74
116
  # In contrast with +#shutdown!+, components will be automatically
75
117
  # reinitialized after a reset.
118
+ #
119
+ # Used internally to ensure a clean environment between test runs.
76
120
  def reset!
77
- shutdown!
78
- @components = nil
121
+ safely_synchronize do |write_components|
122
+ @components.shutdown! if components?
123
+ write_components.call(nil)
124
+ configuration.reset!
125
+ end
79
126
  end
80
127
 
81
- protected
128
+ def safely_synchronize
129
+ # Writes to @components should only happen through this proc. Because this proc is only accessible to callers of
130
+ # safely_synchronize, this forces all writers to go through this method.
131
+ write_components = proc do |new_value|
132
+ COMPONENTS_READ_LOCK.synchronize { @components = new_value }
133
+ end
82
134
 
83
- def components
84
- @components ||= build_components(configuration)
135
+ COMPONENTS_WRITE_LOCK.synchronize do
136
+ begin
137
+ yield write_components
138
+ rescue ThreadError => e
139
+ logger_without_components.error(
140
+ 'Detected deadlock during ddtrace initialization. ' \
141
+ 'Please report this at https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug' \
142
+ "\n\tSource:\n\t#{Array(e.backtrace).join("\n\t")}"
143
+ )
144
+ nil
145
+ end
146
+ end
85
147
  end
86
148
 
87
- private
149
+ def components?
150
+ # This does not need to grab the COMPONENTS_READ_LOCK because it's not returning the components
151
+ (defined?(@components) && @components) != nil
152
+ end
88
153
 
89
154
  def build_components(settings)
90
155
  components = Components.new(settings)
@@ -99,5 +164,32 @@ module Datadog
99
164
  components.startup!(settings)
100
165
  components
101
166
  end
167
+
168
+ def logger_without_components
169
+ # Use default logger without initializing components.
170
+ # This enables logging during initialization, otherwise we'd run into deadlocks.
171
+ @temp_logger ||= begin
172
+ logger = configuration.logger.instance || Datadog::Logger.new($stdout)
173
+ logger.level = configuration.diagnostics.debug ? ::Logger::DEBUG : configuration.logger.level
174
+ logger
175
+ end
176
+ end
177
+
178
+ # Called from our at_exit hook whenever there was a pending Interrupt exception (e.g. typically due to ctrl+c)
179
+ # to print a nice message whenever we're taking a bit longer than usual to finish the process.
180
+ def handle_interrupt_shutdown!
181
+ logger = Datadog.logger
182
+ shutdown_thread = Thread.new { shutdown! }
183
+ print_message_treshold_seconds = 0.2
184
+
185
+ slow_shutdown = shutdown_thread.join(print_message_treshold_seconds).nil?
186
+
187
+ if slow_shutdown
188
+ logger.info 'Reporting remaining data... Press ctrl+c to exit immediately.'
189
+ shutdown_thread.join
190
+ end
191
+
192
+ nil
193
+ end
102
194
  end
103
195
  end
@@ -1,4 +1,4 @@
1
- require 'thread'
1
+ # typed: true
2
2
  require 'ddtrace/diagnostics/health'
3
3
 
4
4
  require 'ddtrace/context_flush'
@@ -126,6 +126,7 @@ module Datadog
126
126
  # on per-instrumentation code to retrieve handle parent/child relations.
127
127
  set_current_span(span.parent)
128
128
  return if span.tracer.nil?
129
+
129
130
  if span.parent.nil? && !all_spans_finished?
130
131
  if Datadog.configuration.diagnostics.debug
131
132
  opened_spans = @trace.length - @finished_spans
@@ -189,6 +190,9 @@ module Datadog
189
190
  # Root span is finished at this point, we can configure it
190
191
  annotate_for_flush!(@current_root_span)
191
192
 
193
+ # Allow caller to modify trace before context is reset
194
+ yield(trace) if block_given?
195
+
192
196
  reset
193
197
  [trace, sampled]
194
198
  end
@@ -227,10 +231,24 @@ module Datadog
227
231
  attach_origin(span) if @origin
228
232
  end
229
233
 
234
+ def attach_sampling_priority(span)
235
+ span.set_metric(
236
+ Ext::DistributedTracing::SAMPLING_PRIORITY_KEY,
237
+ @sampling_priority
238
+ )
239
+ end
240
+
241
+ def attach_origin(span)
242
+ span.set_tag(
243
+ Ext::DistributedTracing::ORIGIN_KEY,
244
+ @origin
245
+ )
246
+ end
247
+
230
248
  # Return a string representation of the context.
231
249
  def to_s
232
250
  @mutex.synchronize do
233
- # rubocop:disable Metrics/LineLength
251
+ # rubocop:disable Layout/LineLength
234
252
  "Context(trace.length:#{@trace.length},sampled:#{@sampled},finished_spans:#{@finished_spans},current_span:#{@current_span})"
235
253
  end
236
254
  end
@@ -282,24 +300,11 @@ module Datadog
282
300
  @finished_spans > 0 && @trace.length == @finished_spans
283
301
  end
284
302
 
285
- def attach_sampling_priority(span)
286
- span.set_metric(
287
- Ext::DistributedTracing::SAMPLING_PRIORITY_KEY,
288
- @sampling_priority
289
- )
290
- end
291
-
292
- def attach_origin(span)
293
- span.set_tag(
294
- Ext::DistributedTracing::ORIGIN_KEY,
295
- @origin
296
- )
297
- end
298
-
299
303
  # Return the start time of the root span, or nil if there are no spans or this is undefined.
300
304
  def start_time
301
305
  @mutex.synchronize do
302
306
  return nil if @trace.empty?
307
+
303
308
  @trace[0].start_time
304
309
  end
305
310
  end
@@ -312,11 +317,9 @@ module Datadog
312
317
  end
313
318
 
314
319
  # Iterate on each span within the trace. This is thread safe.
315
- def each_span
320
+ def each_span(&block)
316
321
  @mutex.synchronize do
317
- @trace.each do |span|
318
- yield span
319
- end
322
+ @trace.each(&block)
320
323
  end
321
324
  end
322
325
  end
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Datadog
2
3
  module ContextFlush
3
4
  # Consumes only completed traces (where all spans have finished)
@@ -9,9 +10,15 @@ module Datadog
9
10
  #
10
11
  # @return [Array<Span>] trace to be flushed, or +nil+ if the trace is not finished
11
12
  def consume!(context)
12
- trace, sampled = context.get
13
+ trace, sampled = get_trace(context)
13
14
  trace if sampled
14
15
  end
16
+
17
+ protected
18
+
19
+ def get_trace(context)
20
+ context.get
21
+ end
15
22
  end
16
23
 
17
24
  # Performs partial trace flushing to avoid large traces residing in memory for too long
@@ -34,7 +41,7 @@ module Datadog
34
41
  #
35
42
  # @return [Array<Span>] partial or complete trace to be flushed, or +nil+ if no spans are finished
36
43
  def consume!(context)
37
- trace, sampled = context.get
44
+ trace, sampled = get_trace(context)
38
45
 
39
46
  return nil unless sampled
40
47
  return trace if trace && !trace.empty?
@@ -42,6 +49,12 @@ module Datadog
42
49
  partial_trace(context)
43
50
  end
44
51
 
52
+ protected
53
+
54
+ def get_trace(context)
55
+ context.get
56
+ end
57
+
45
58
  private
46
59
 
47
60
  def partial_trace(context)
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Datadog
2
3
  # DefaultContextProvider is a default context provider that retrieves
3
4
  # all contexts from the current thread-local storage. It is suitable for
@@ -55,7 +56,6 @@ module Datadog
55
56
 
56
57
  # Return the thread-local context.
57
58
  def local(thread = Thread.current)
58
- raise ArgumentError, '\'thread\' must be a Thread.' unless thread.is_a?(Thread)
59
59
  thread[@key] ||= Datadog::Context.new
60
60
  end
61
61
  end
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/contrib/configuration/settings'
2
3
  require 'ddtrace/contrib/action_cable/ext'
3
4
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'ddtrace/contrib/analytics'
2
3
  require 'ddtrace/contrib/active_support/notifications/event'
3
4
  require 'ddtrace/contrib/action_cable/ext'
@@ -8,8 +9,8 @@ module Datadog
8
9
  # Defines basic behaviors for an event.
9
10
  module Event
10
11
  def self.included(base)
11
- base.send(:include, ActiveSupport::Notifications::Event)
12
- base.send(:extend, ClassMethods)
12
+ base.include(ActiveSupport::Notifications::Event)
13
+ base.extend(ClassMethods)
13
14
  end
14
15
 
15
16
  # Class methods for events.
@@ -34,8 +35,8 @@ module Datadog
34
35
  # but to start a fresh tracing context.
35
36
  module RootContextEvent
36
37
  def self.included(base)
37
- base.send(:include, ActiveSupport::Notifications::Event)
38
- base.send(:extend, ClassMethods)
38
+ base.include(ActiveSupport::Notifications::Event)
39
+ base.extend(ClassMethods)
39
40
  end
40
41
 
41
42
  # Class methods for events.
@@ -56,6 +57,7 @@ module Datadog
56
57
  # preventing such a leak.
57
58
  def ensure_clean_context!
58
59
  return unless configuration[:tracer].call_context.current_span
60
+
59
61
  configuration[:tracer].provider.context = Context.new
60
62
  end
61
63
  end
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/contrib/analytics'
2
3
  require 'ddtrace/contrib/action_cable/event'
3
4
 
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/contrib/analytics'
2
3
  require 'ddtrace/contrib/action_cable/event'
3
4
 
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/contrib/analytics'
2
3
  require 'ddtrace/contrib/action_cable/event'
3
4
 
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/contrib/action_cable/event'
2
3
  require 'ddtrace/contrib/action_cable/events/broadcast'
3
4
  require 'ddtrace/contrib/action_cable/events/perform_action'
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Datadog
2
3
  module Contrib
3
4
  module ActionCable
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  module Datadog
2
3
  module Contrib
3
4
  module ActionCable
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'ddtrace/contrib/integration'
2
3
  require 'ddtrace/contrib/action_cable/configuration/settings'
3
4
  require 'ddtrace/contrib/action_cable/patcher'
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'ddtrace/contrib/patcher'
2
3
  require 'ddtrace/ext/app_types'
3
4
  require 'ddtrace/contrib/action_cable/ext'