ddtrace 0.42.0 → 0.54.2

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 +1645 -370
  5. data/CONTRIBUTING.md +2 -6
  6. data/LICENSE-3rdparty.csv +2 -0
  7. data/README.md +1 -0
  8. data/bin/ddtracerb +15 -0
  9. data/ddtrace.gemspec +21 -39
  10. data/docs/DevelopmentGuide.md +46 -8
  11. data/docs/GettingStarted.md +439 -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 +197 -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 +38 -24
  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 +7 -9
  67. data/lib/ddtrace/configuration/pin_setup.rb +1 -0
  68. data/lib/ddtrace/configuration/settings.rb +142 -12
  69. data/lib/ddtrace/configuration.rb +132 -24
  70. data/lib/ddtrace/context.rb +51 -22
  71. data/lib/ddtrace/context_flush.rb +15 -2
  72. data/lib/ddtrace/context_provider.rb +13 -2
  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 +1 -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 +10 -5
  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 +32 -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 +2 -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 +2 -0
  177. data/lib/ddtrace/contrib/delayed_job/ext.rb +1 -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 +5 -3
  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 +2 -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 +13 -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 +2 -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 +10 -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 +2 -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 +68 -32
  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 +1 -0
  217. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -4
  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 +9 -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 +17 -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 +3 -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 +2 -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 +2 -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 +4 -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 +40 -21
  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 +6 -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 +3 -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 +2 -1
  352. data/lib/ddtrace/contrib/sequel/dataset.rb +2 -1
  353. data/lib/ddtrace/contrib/sequel/ext.rb +1 -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 +6 -6
  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 +1 -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 +53 -0
  419. data/lib/ddtrace/ext/runtime.rb +5 -7
  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 +4 -0
  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 +297 -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 +150 -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 +94 -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 +2 -0
  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 +35 -14
  497. data/lib/ddtrace/sampler.rb +20 -9
  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 +27 -14
  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 +61 -50
  508. data/lib/ddtrace/transport/http/adapters/net.rb +41 -11
  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 +3 -2
  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 +21 -3
  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 +23 -12
  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 → interval_loop.rb} +23 -12
  557. data/lib/ddtrace/workers/polling.rb +14 -6
  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 +182 -405
  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 -1121
  583. data/Gemfile +0 -7
  584. data/Rakefile +0 -788
  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
data/lib/ddtrace/span.rb CHANGED
@@ -1,12 +1,14 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'time'
4
- require 'thread'
5
-
6
5
  require 'ddtrace/utils'
6
+ require 'ddtrace/ext/distributed'
7
+ require 'ddtrace/ext/environment'
7
8
  require 'ddtrace/ext/errors'
9
+ require 'ddtrace/ext/http'
10
+ require 'ddtrace/ext/net'
8
11
  require 'ddtrace/ext/priority'
9
- require 'ddtrace/environment'
10
12
  require 'ddtrace/analytics'
11
13
  require 'ddtrace/forced_tracing'
12
14
  require 'ddtrace/diagnostics/health'
@@ -38,20 +40,34 @@ module Datadog
38
40
  EXTERNAL_MAX_ID = 1 << 64
39
41
 
40
42
  # This limit is for numeric tags because uint64 could end up rounded.
41
- NUMERIC_TAG_SIZE_RANGE = (-1 << 53..1 << 53)
43
+ NUMERIC_TAG_SIZE_RANGE = (-1 << 53..1 << 53).freeze
44
+
45
+ # Some associated values should always be sent as Tags, never as Metrics, regardless
46
+ # if their value is numeric or not.
47
+ # The Datadog agent will look for these values only as Tags, not Metrics.
48
+ # @see https://github.com/DataDog/datadog-agent/blob/2ae2cdd315bcda53166dd8fa0dedcfc448087b9d/pkg/trace/stats/aggregation.go#L13-L17
49
+ ENSURE_AGENT_TAGS = {
50
+ Ext::DistributedTracing::ORIGIN_KEY => true,
51
+ Ext::Environment::TAG_VERSION => true,
52
+ Ext::HTTP::STATUS_CODE => true,
53
+ Ext::NET::TAG_HOSTNAME => true
54
+ }.freeze
42
55
 
43
56
  attr_accessor :name, :service, :resource, :span_type,
44
57
  :span_id, :trace_id, :parent_id,
45
58
  :status, :sampled,
46
- :tracer, :context, :duration, :start_time, :end_time
59
+ :tracer, :context
60
+
61
+ attr_reader :parent, :start_time, :end_time, :resource_container
47
62
 
48
- attr_reader :parent
63
+ attr_writer :duration
49
64
 
50
65
  # Create a new span linked to the given tracer. Call the \Tracer method <tt>start_span()</tt>
51
66
  # and then <tt>finish()</tt> once the tracer operation is over.
52
67
  #
53
68
  # * +service+: the service name for this span
54
- # * +resource+: the resource this span refers, or +name+ if it's missing
69
+ # * +resource+: the resource this span refers, or +name+ if it's missing.
70
+ # +nil+ can be used as a placeholder, when the resource value is not yet known at +#initialize+ time.
55
71
  # * +span_type+: the type of the span (such as +http+, +db+ and so on)
56
72
  # * +parent_id+: the identifier of the parent span
57
73
  # * +trace_id+: the identifier of the root span for this trace
@@ -101,11 +117,8 @@ module Datadog
101
117
  # Keys must be unique between tags and metrics
102
118
  @metrics.delete(key)
103
119
 
104
- # Ensure `http.status_code` is always a string so it is added to
105
- # @meta instead of @metrics
106
- # DEV: This is necessary because the agent looks to `meta['http.status_code']` for
107
- # tagging necessary metrics
108
- value = value.to_s if key == Ext::HTTP::STATUS_CODE
120
+ # DEV: This is necessary because the agent looks at `meta[key]`, not `metrics[key]`.
121
+ value = value.to_s if ENSURE_AGENT_TAGS[key]
109
122
 
110
123
  # NOTE: Adding numeric tags as metrics is stop-gap support
111
124
  # for numeric typed tags. Eventually they will become
@@ -180,7 +193,7 @@ module Datadog
180
193
  # behavior and so we maintain it for backward compatibility for those
181
194
  # who are using async manual instrumentation that may rely on this
182
195
 
183
- @start_time = start_time || Time.now.utc
196
+ @start_time = start_time || Utils::Time.now.utc
184
197
  @duration_start = start_time.nil? ? duration_marker : nil
185
198
 
186
199
  self
@@ -206,7 +219,7 @@ module Datadog
206
219
 
207
220
  @allocation_count_finish = now_allocations
208
221
 
209
- now = Time.now.utc
222
+ now = Utils::Time.now.utc
210
223
 
211
224
  # Provide a default start_time if unset.
212
225
  # Using `now` here causes duration to be 0; this is expected
@@ -1,11 +1,19 @@
1
+ # typed: true
1
2
  require 'ddtrace/ext/net'
2
- require 'ddtrace/runtime/socket'
3
+ require 'datadog/core/environment/socket'
3
4
  require 'ddtrace/runtime/metrics'
5
+ require 'ddtrace/utils/only_once'
4
6
 
5
7
  module Datadog
6
8
  # SyncWriter flushes both services and traces synchronously
7
9
  # DEV: To be replaced by Datadog::Workers::TraceWriter.
10
+ #
11
+ # Note: If you're wondering if this class is used at all, since there are no other references to it on the codebase,
12
+ # the separate `datadog-lambda` uses it as of February 2021:
13
+ # <https://github.com/DataDog/datadog-lambda-rb/blob/c15f0f0916c90123416dc44e7d6800ef4a7cfdbf/lib/datadog/lambda.rb#L38>
8
14
  class SyncWriter
15
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
16
+
9
17
  attr_reader \
10
18
  :priority_sampler,
11
19
  :transport
@@ -13,7 +21,8 @@ module Datadog
13
21
  def initialize(options = {})
14
22
  @transport = options.fetch(:transport) do
15
23
  transport_options = options.fetch(:transport_options, {})
16
- Transport::HTTP.default(transport_options)
24
+ transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
25
+ Transport::HTTP.default(**transport_options)
17
26
  end
18
27
 
19
28
  @priority_sampler = options.fetch(:priority_sampler, nil)
@@ -21,17 +30,15 @@ module Datadog
21
30
 
22
31
  def write(trace, services = nil)
23
32
  unless services.nil?
24
- Datadog::Patcher.do_once('SyncWriter#write') do
33
+ DEPRECATION_WARN_ONLY_ONCE.run do
25
34
  Datadog.logger.warn(%(
26
35
  write: Writing services has been deprecated and no longer need to be provided.
27
- write(traces, services) can be updted to write(traces)
36
+ write(traces, services) can be updated to write(traces)
28
37
  ))
29
38
  end
30
39
  end
31
40
 
32
- perform_concurrently(
33
- proc { flush_trace(trace) }
34
- )
41
+ flush_trace(trace)
35
42
  rescue => e
36
43
  Datadog.logger.debug(e)
37
44
  end
@@ -44,23 +51,18 @@ module Datadog
44
51
 
45
52
  private
46
53
 
47
- def perform_concurrently(*tasks)
48
- tasks.map { |task| Thread.new(&task) }.each(&:join)
49
- end
50
-
51
54
  def flush_trace(trace)
52
55
  processed_traces = Pipeline.process!([trace])
53
56
  return if processed_traces.empty?
57
+
54
58
  inject_hostname!(processed_traces.first) if Datadog.configuration.report_hostname
55
59
  transport.send_traces(processed_traces)
56
60
  end
57
61
 
58
62
  def inject_hostname!(trace)
59
63
  unless trace.first.nil?
60
- hostname = Datadog::Runtime::Socket.hostname
61
- unless hostname.nil? || hostname.empty?
62
- trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname)
63
- end
64
+ hostname = Datadog::Core::Environment::Socket.hostname
65
+ trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname) unless hostname.nil? || hostname.empty?
64
66
  end
65
67
  end
66
68
  end
@@ -0,0 +1,47 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Tasks
4
+ # Wraps command with Datadog tracing
5
+ class Exec
6
+ attr_reader :args
7
+
8
+ def initialize(args)
9
+ @args = args
10
+ end
11
+
12
+ def run
13
+ set_rubyopt!
14
+ exec_with_error_handling(args)
15
+ end
16
+
17
+ def rubyopts
18
+ [
19
+ '-rddtrace/profiling/preload'
20
+ ]
21
+ end
22
+
23
+ private
24
+
25
+ def set_rubyopt!
26
+ existing_rubyopt = ENV['RUBYOPT']
27
+
28
+ ENV['RUBYOPT'] = existing_rubyopt ? "#{existing_rubyopt} #{rubyopts.join(' ')}" : rubyopts.join(' ')
29
+ end
30
+
31
+ # If there's an error here, rather than throwing a cryptic stack trace, let's instead have clearer messages, and
32
+ # follow the same status codes as the shell uses
33
+ # See also:
34
+ # * https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html
35
+ # * https://github.com/rubygems/rubygems/blob/dd93966cac224532035deda533cba2685dfa30cc/bundler/lib/bundler/cli/exec.rb#L45
36
+ def exec_with_error_handling(args)
37
+ Kernel.exec(*args)
38
+ rescue Errno::ENOENT => e
39
+ Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
40
+ Kernel.exit 127
41
+ rescue Errno::EACCES, Errno::ENOEXEC => e
42
+ Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
43
+ Kernel.exit 126
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Tasks
4
+ # Prints help message for usage of `ddtrace`
5
+ class Help
6
+ def run
7
+ puts %(
8
+ Usage: ddtrace [command] [arguments]
9
+ exec [command]: Executes command with tracing & profiling preloaded.
10
+ help: Prints this help message.
11
+ )
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,15 +1,18 @@
1
- require 'thread'
1
+ # typed: true
2
2
  require 'logger'
3
3
  require 'pathname'
4
4
 
5
- require 'ddtrace/environment'
5
+ require 'ddtrace/ext/environment'
6
6
  require 'ddtrace/span'
7
7
  require 'ddtrace/context'
8
8
  require 'ddtrace/logger'
9
9
  require 'ddtrace/writer'
10
+ require 'datadog/core/environment/identity'
10
11
  require 'ddtrace/sampler'
11
12
  require 'ddtrace/sampling'
12
13
  require 'ddtrace/correlation'
14
+ require 'ddtrace/event'
15
+ require 'ddtrace/utils/only_once'
13
16
 
14
17
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
15
18
  module Datadog
@@ -19,6 +22,9 @@ module Datadog
19
22
  # of these function calls and sub-requests would be encapsulated within a single trace.
20
23
  # rubocop:disable Metrics/ClassLength
21
24
  class Tracer
25
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
26
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
27
+
22
28
  attr_reader :sampler, :tags, :provider, :context_flush
23
29
  attr_accessor :enabled, :writer
24
30
  attr_writer :default_service
@@ -27,8 +33,7 @@ module Datadog
27
33
  DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
28
34
 
29
35
  def services
30
- # Only log each deprecation warning once (safeguard against log spam)
31
- Datadog::Patcher.do_once('Tracer#set_service_info') do
36
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE.run do
32
37
  Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
33
38
  end
34
39
 
@@ -70,7 +75,9 @@ module Datadog
70
75
  # by default.
71
76
  def initialize(options = {})
72
77
  # Configurable options
73
- @context_flush = if options[:partial_flush]
78
+ @context_flush = if options[:context_flush]
79
+ options[:context_flush]
80
+ elsif options[:partial_flush]
74
81
  Datadog::ContextFlush::Partial.new(options)
75
82
  else
76
83
  Datadog::ContextFlush::Finished.new
@@ -78,14 +85,13 @@ module Datadog
78
85
 
79
86
  @default_service = options[:default_service]
80
87
  @enabled = options.fetch(:enabled, true)
81
- @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
88
+ @provider = options[:context_provider] || Datadog::DefaultContextProvider.new
82
89
  @sampler = options.fetch(:sampler, Datadog::AllSampler.new)
83
90
  @tags = options.fetch(:tags, {})
84
- @writer = options.fetch(:writer, Datadog::Writer.new)
91
+ @writer = options.fetch(:writer) { Datadog::Writer.new }
85
92
 
86
93
  # Instance variables
87
94
  @mutex = Mutex.new
88
- @provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
89
95
 
90
96
  # Enable priority sampling by default
91
97
  activate_priority_sampling!(@sampler)
@@ -114,8 +120,10 @@ module Datadog
114
120
 
115
121
  configure_writer(options)
116
122
 
117
- if options.key?(:partial_flush)
118
- @context_flush = if options[:partial_flush]
123
+ if options.key?(:context_flush) || options.key?(:partial_flush)
124
+ @context_flush = if options[:context_flush]
125
+ options[:context_flush]
126
+ elsif options[:partial_flush]
119
127
  Datadog::ContextFlush::Partial.new(options)
120
128
  else
121
129
  Datadog::ContextFlush::Finished.new
@@ -129,8 +137,7 @@ module Datadog
129
137
  #
130
138
  # set_service_info is deprecated, no service information needs to be tracked
131
139
  def set_service_info(service, app, app_type)
132
- # Only log each deprecation warning once (safeguard against log spam)
133
- Datadog::Patcher.do_once('Tracer#set_service_info') do
140
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE.run do
134
141
  Datadog.logger.warn(%(
135
142
  set_service_info: Usage of set_service_info has been deprecated,
136
143
  service information no longer needs to be reported to the trace agent.
@@ -142,14 +149,7 @@ module Datadog
142
149
  # for non-root spans which have a parent. However, root spans without
143
150
  # a service would be invalid and rejected.
144
151
  def default_service
145
- return @default_service if instance_variable_defined?(:@default_service) && @default_service
146
- begin
147
- @default_service = File.basename($PROGRAM_NAME, '.*')
148
- rescue StandardError => e
149
- Datadog.logger.error("unable to guess default service: #{e}")
150
- @default_service = 'ruby'.freeze
151
- end
152
- @default_service
152
+ @default_service ||= Datadog::Ext::Environment::FALLBACK_SERVICE_NAME
153
153
  end
154
154
 
155
155
  # Set the given key / value tag pair at the tracer level. These tags will be
@@ -158,7 +158,7 @@ module Datadog
158
158
  #
159
159
  # tracer.set_tags('env' => 'prod', 'component' => 'core')
160
160
  def set_tags(tags)
161
- string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
161
+ string_tags = tags.collect { |k, v| [k.to_s, v] }.to_h
162
162
  @tags = @tags.merge(string_tags)
163
163
  end
164
164
 
@@ -200,7 +200,8 @@ module Datadog
200
200
  if parent.nil?
201
201
  # root span
202
202
  @sampler.sample!(span)
203
- span.set_tag('system.pid', Process.pid)
203
+ span.set_tag(Datadog::Ext::Runtime::TAG_PID, Process.pid)
204
+ span.set_tag(Datadog::Ext::Runtime::TAG_ID, Datadog::Core::Environment::Identity.id)
204
205
 
205
206
  if ctx && ctx.trace_id
206
207
  span.trace_id = ctx.trace_id
@@ -287,8 +288,19 @@ module Datadog
287
288
  # and it is user code which should be executed no matter what.
288
289
  # It's not a problem since we re-raise it afterwards so for example a
289
290
  # SignalException::Interrupt would still bubble up.
291
+ # rubocop:disable Metrics/BlockNesting
290
292
  rescue Exception => e
291
- (options[:on_error] || DEFAULT_ON_ERROR).call(span, e)
293
+ if (on_error_handler = options[:on_error]) && on_error_handler.respond_to?(:call)
294
+ begin
295
+ on_error_handler.call(span, e)
296
+ rescue
297
+ Datadog.logger.debug('Custom on_error handler failed, falling back to default')
298
+ DEFAULT_ON_ERROR.call(span, e)
299
+ end
300
+ else
301
+ Datadog.logger.debug('Custom on_error handler must be a callable, falling back to default') if on_error_handler
302
+ DEFAULT_ON_ERROR.call(span, e)
303
+ end
292
304
  raise e
293
305
  ensure
294
306
  span.finish unless span.nil?
@@ -300,6 +312,10 @@ module Datadog
300
312
  end
301
313
  end
302
314
 
315
+ def trace_completed
316
+ @trace_completed ||= TraceCompleted.new
317
+ end
318
+
303
319
  # Record the given +context+. For compatibility with previous versions,
304
320
  # +context+ can also be a span. It is similar to the +child_of+ argument,
305
321
  # method will figure out what to do, submitting a +span+ for recording
@@ -351,24 +367,34 @@ module Datadog
351
367
  end
352
368
 
353
369
  @writer.write(trace)
370
+ trace_completed.publish(trace)
371
+ end
372
+
373
+ # Triggered whenever a trace is completed
374
+ class TraceCompleted < Datadog::Event
375
+ def initialize
376
+ super(:trace_completed)
377
+ end
378
+
379
+ # NOTE: Ignore Rubocop rule. This definition allows for
380
+ # description of and constraints on arguments.
381
+ # rubocop:disable Lint/UselessMethodDefinition
382
+ def publish(trace)
383
+ super(trace)
384
+ end
385
+ # rubocop:enable Lint/UselessMethodDefinition
354
386
  end
355
387
 
356
388
  # TODO: Move this kind of configuration building out of the tracer.
357
389
  # Tracer should not have this kind of knowledge of writer.
358
- # rubocop:disable Metrics/PerceivedComplexity
359
- # rubocop:disable Metrics/CyclomaticComplexity
360
- # rubocop:disable Metrics/MethodLength
361
390
  def configure_writer(options = {})
362
- hostname = options.fetch(:hostname, nil)
363
- port = options.fetch(:port, nil)
364
391
  sampler = options.fetch(:sampler, nil)
365
392
  priority_sampling = options.fetch(:priority_sampling, nil)
366
393
  writer = options.fetch(:writer, nil)
367
- transport_options = options.fetch(:transport_options, {}).dup
394
+ agent_settings = options.fetch(:agent_settings, nil)
368
395
 
369
396
  # Compile writer options
370
397
  writer_options = options.fetch(:writer_options, {}).dup
371
- rebuild_writer = !writer_options.empty?
372
398
 
373
399
  # Re-build the sampler and writer if priority sampling is enabled,
374
400
  # but neither are configured. Verify the sampler isn't already a
@@ -381,35 +407,20 @@ module Datadog
381
407
  end
382
408
  elsif priority_sampling != false && !@sampler.is_a?(PrioritySampler)
383
409
  writer_options[:priority_sampler] = activate_priority_sampling!(@sampler)
384
- rebuild_writer = true
385
410
  elsif priority_sampling == false
386
411
  deactivate_priority_sampling!(sampler)
387
- rebuild_writer = true
388
412
  elsif @sampler.is_a?(PrioritySampler)
389
413
  # Make sure to add sampler to options if transport is rebuilt.
390
414
  writer_options[:priority_sampler] = @sampler
391
415
  end
392
416
 
393
- # Apply options to transport
394
- if transport_options.is_a?(Proc)
395
- transport_options = { on_build: transport_options }
396
- rebuild_writer = true
397
- end
417
+ writer_options[:agent_settings] = agent_settings if agent_settings
398
418
 
399
- if hostname || port
400
- transport_options[:hostname] = hostname unless hostname.nil?
401
- transport_options[:port] = port unless port.nil?
402
- rebuild_writer = true
403
- end
404
-
405
- writer_options[:transport_options] = transport_options
419
+ # Make sure old writer is shut down before throwing away.
420
+ # Don't want additional threads running...
421
+ @writer.stop unless writer.nil?
406
422
 
407
- if rebuild_writer || writer
408
- # Make sure old writer is shut down before throwing away.
409
- # Don't want additional threads running...
410
- @writer.stop unless writer.nil?
411
- @writer = writer || Writer.new(writer_options)
412
- end
423
+ @writer = writer || Writer.new(writer_options)
413
424
  end
414
425
 
415
426
  def activate_priority_sampling!(base_sampler = nil)
@@ -1,4 +1,6 @@
1
+ # typed: true
1
2
  require 'ddtrace/transport/response'
3
+ require 'ddtrace/vendor/multipart-post/net/http/post/multipart'
2
4
 
3
5
  module Datadog
4
6
  module Transport
@@ -9,27 +11,38 @@ module Datadog
9
11
  attr_reader \
10
12
  :hostname,
11
13
  :port,
12
- :timeout
14
+ :timeout,
15
+ :ssl
13
16
 
14
- DEFAULT_TIMEOUT = 1
17
+ DEFAULT_TIMEOUT = 30
15
18
 
16
- def initialize(hostname, port, options = {})
17
- @hostname = hostname
18
- @port = port
19
+ # @deprecated Positional parameters are deprecated. Use named parameters instead.
20
+ def initialize(hostname = nil, port = nil, **options)
21
+ @hostname = hostname || options.fetch(:hostname)
22
+ @port = port || options.fetch(:port)
19
23
  @timeout = options[:timeout] || DEFAULT_TIMEOUT
24
+ @ssl = options.key?(:ssl) ? options[:ssl] == true : false
20
25
  end
21
26
 
22
- def open
27
+ def self.build(agent_settings)
28
+ new(
29
+ hostname: agent_settings.hostname,
30
+ port: agent_settings.port,
31
+ timeout: agent_settings.timeout_seconds,
32
+ ssl: agent_settings.ssl
33
+ )
34
+ end
35
+
36
+ def open(&block)
23
37
  # DEV Initializing +Net::HTTP+ directly help us avoid expensive
24
38
  # options processing done in +Net::HTTP.start+:
25
39
  # https://github.com/ruby/ruby/blob/b2d96abb42abbe2e01f010ffc9ac51f0f9a50002/lib/net/http.rb#L614-L618
26
40
  req = ::Net::HTTP.new(hostname, port, nil)
27
41
 
42
+ req.use_ssl = ssl
28
43
  req.open_timeout = req.read_timeout = timeout
29
44
 
30
- req.start do |http|
31
- yield(http)
32
- end
45
+ req.start(&block)
33
46
  end
34
47
 
35
48
  def call(env)
@@ -41,8 +54,18 @@ module Datadog
41
54
  end
42
55
 
43
56
  def post(env)
44
- post = ::Net::HTTP::Post.new(env.path, env.headers)
45
- post.body = env.body
57
+ post = nil
58
+
59
+ if env.form.nil? || env.form.empty?
60
+ post = ::Net::HTTP::Post.new(env.path, env.headers)
61
+ post.body = env.body
62
+ else
63
+ post = ::Datadog::Vendor::Net::HTTP::Post::Multipart.new(
64
+ env.path,
65
+ env.form,
66
+ env.headers
67
+ )
68
+ end
46
69
 
47
70
  # Connect and send the request
48
71
  http_response = open do |http|
@@ -82,36 +105,43 @@ module Datadog
82
105
 
83
106
  def payload
84
107
  return super if http_response.nil?
108
+
85
109
  http_response.body
86
110
  end
87
111
 
88
112
  def code
89
113
  return super if http_response.nil?
114
+
90
115
  http_response.code.to_i
91
116
  end
92
117
 
93
118
  def ok?
94
119
  return super if http_response.nil?
120
+
95
121
  code.between?(200, 299)
96
122
  end
97
123
 
98
124
  def unsupported?
99
125
  return super if http_response.nil?
126
+
100
127
  code == 415
101
128
  end
102
129
 
103
130
  def not_found?
104
131
  return super if http_response.nil?
132
+
105
133
  code == 404
106
134
  end
107
135
 
108
136
  def client_error?
109
137
  return super if http_response.nil?
138
+
110
139
  code.between?(400, 499)
111
140
  end
112
141
 
113
142
  def server_error?
114
143
  return super if http_response.nil?
144
+
115
145
  code.between?(500, 599)
116
146
  end
117
147
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Datadog
2
3
  module Transport
3
4
  module HTTP
@@ -15,6 +16,7 @@ module Datadog
15
16
  def set(klass, name = nil)
16
17
  name ||= klass.to_s
17
18
  return if name.nil?
19
+
18
20
  @adapters[name] = klass
19
21
  end
20
22
  end
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'ddtrace/transport/response'
2
3
 
3
4
  module Datadog
@@ -10,8 +11,10 @@ module Datadog
10
11
  :buffer,
11
12
  :status
12
13
 
13
- def initialize(buffer = nil)
14
- @buffer = buffer
14
+ # @param buffer [Array] an optional array that will capture all spans sent to this adapter, defaults to +nil+
15
+ # @deprecated Positional parameters are deprecated. Use named parameters instead.
16
+ def initialize(buffer = nil, **options)
17
+ @buffer = buffer || options[:buffer]
15
18
  @mutex = Mutex.new
16
19
  @status = 200
17
20
  end