ddtrace 0.38.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (433) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +492 -0
  3. data/.circleci/images/primary/Dockerfile-2.0.0 +73 -0
  4. data/.circleci/images/primary/Dockerfile-2.1.10 +73 -0
  5. data/.circleci/images/primary/Dockerfile-2.2.10 +73 -0
  6. data/.circleci/images/primary/Dockerfile-2.3.8 +75 -0
  7. data/.circleci/images/primary/Dockerfile-2.4.6 +73 -0
  8. data/.circleci/images/primary/Dockerfile-2.5.6 +73 -0
  9. data/.circleci/images/primary/Dockerfile-2.6.4 +73 -0
  10. data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
  11. data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
  12. data/.dockerignore +1 -0
  13. data/.env +26 -0
  14. data/.github/CODEOWNERS +1 -0
  15. data/.gitignore +61 -0
  16. data/.gitlab-ci.yml +26 -0
  17. data/.rspec +1 -0
  18. data/.rubocop.yml +85 -0
  19. data/.yardopts +5 -0
  20. data/Appraisals +961 -0
  21. data/CHANGELOG.md +1402 -0
  22. data/CONTRIBUTING.md +85 -0
  23. data/Gemfile +7 -0
  24. data/LICENSE +6 -0
  25. data/LICENSE.Apache +200 -0
  26. data/LICENSE.BSD3 +24 -0
  27. data/NOTICE +4 -0
  28. data/README.md +23 -0
  29. data/Rakefile +753 -0
  30. data/benchmarks/postgres_database.yml +9 -0
  31. data/benchmarks/sidekiq_test.rb +154 -0
  32. data/ddtrace.gemspec +71 -0
  33. data/docker-compose.yml +370 -0
  34. data/docs/DevelopmentGuide.md +195 -0
  35. data/docs/GettingStarted.md +2224 -0
  36. data/lib/ddtrace.rb +76 -0
  37. data/lib/ddtrace/analytics.rb +36 -0
  38. data/lib/ddtrace/augmentation.rb +13 -0
  39. data/lib/ddtrace/augmentation/method_wrapper.rb +20 -0
  40. data/lib/ddtrace/augmentation/method_wrapping.rb +38 -0
  41. data/lib/ddtrace/augmentation/shim.rb +102 -0
  42. data/lib/ddtrace/buffer.rb +119 -0
  43. data/lib/ddtrace/chunker.rb +34 -0
  44. data/lib/ddtrace/configuration.rb +53 -0
  45. data/lib/ddtrace/configuration/base.rb +84 -0
  46. data/lib/ddtrace/configuration/components.rb +154 -0
  47. data/lib/ddtrace/configuration/dependency_resolver.rb +24 -0
  48. data/lib/ddtrace/configuration/option.rb +64 -0
  49. data/lib/ddtrace/configuration/option_definition.rb +123 -0
  50. data/lib/ddtrace/configuration/option_definition_set.rb +18 -0
  51. data/lib/ddtrace/configuration/option_set.rb +6 -0
  52. data/lib/ddtrace/configuration/options.rb +112 -0
  53. data/lib/ddtrace/configuration/pin_setup.rb +31 -0
  54. data/lib/ddtrace/configuration/settings.rb +273 -0
  55. data/lib/ddtrace/context.rb +305 -0
  56. data/lib/ddtrace/context_flush.rb +69 -0
  57. data/lib/ddtrace/context_provider.rb +50 -0
  58. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +25 -0
  59. data/lib/ddtrace/contrib/action_cable/event.rb +65 -0
  60. data/lib/ddtrace/contrib/action_cable/events.rb +33 -0
  61. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +49 -0
  62. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +55 -0
  63. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +50 -0
  64. data/lib/ddtrace/contrib/action_cable/ext.rb +23 -0
  65. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
  66. data/lib/ddtrace/contrib/action_cable/integration.rb +38 -0
  67. data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
  68. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +148 -0
  69. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +25 -0
  70. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +27 -0
  71. data/lib/ddtrace/contrib/action_pack/ext.rb +16 -0
  72. data/lib/ddtrace/contrib/action_pack/integration.rb +38 -0
  73. data/lib/ddtrace/contrib/action_pack/patcher.rb +23 -0
  74. data/lib/ddtrace/contrib/action_pack/utils.rb +36 -0
  75. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +26 -0
  76. data/lib/ddtrace/contrib/action_view/event.rb +39 -0
  77. data/lib/ddtrace/contrib/action_view/events.rb +30 -0
  78. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +45 -0
  79. data/lib/ddtrace/contrib/action_view/events/render_template.rb +48 -0
  80. data/lib/ddtrace/contrib/action_view/ext.rb +17 -0
  81. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +74 -0
  82. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
  83. data/lib/ddtrace/contrib/action_view/integration.rb +45 -0
  84. data/lib/ddtrace/contrib/action_view/patcher.rb +47 -0
  85. data/lib/ddtrace/contrib/action_view/utils.rb +32 -0
  86. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +25 -0
  87. data/lib/ddtrace/contrib/active_model_serializers/event.rb +68 -0
  88. data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
  89. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
  90. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
  91. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +17 -0
  92. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +40 -0
  93. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +29 -0
  94. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +45 -0
  95. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +30 -0
  96. data/lib/ddtrace/contrib/active_record/event.rb +30 -0
  97. data/lib/ddtrace/contrib/active_record/events.rb +30 -0
  98. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +60 -0
  99. data/lib/ddtrace/contrib/active_record/events/sql.rb +64 -0
  100. data/lib/ddtrace/contrib/active_record/ext.rb +21 -0
  101. data/lib/ddtrace/contrib/active_record/integration.rb +46 -0
  102. data/lib/ddtrace/contrib/active_record/patcher.rb +23 -0
  103. data/lib/ddtrace/contrib/active_record/utils.rb +76 -0
  104. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +157 -0
  105. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +48 -0
  106. data/lib/ddtrace/contrib/active_support/cache/redis.rb +47 -0
  107. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +25 -0
  108. data/lib/ddtrace/contrib/active_support/ext.rb +21 -0
  109. data/lib/ddtrace/contrib/active_support/integration.rb +40 -0
  110. data/lib/ddtrace/contrib/active_support/notifications/event.rb +64 -0
  111. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +66 -0
  112. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +159 -0
  113. data/lib/ddtrace/contrib/active_support/patcher.rb +23 -0
  114. data/lib/ddtrace/contrib/analytics.rb +24 -0
  115. data/lib/ddtrace/contrib/aws/configuration/settings.rb +25 -0
  116. data/lib/ddtrace/contrib/aws/ext.rb +20 -0
  117. data/lib/ddtrace/contrib/aws/instrumentation.rb +56 -0
  118. data/lib/ddtrace/contrib/aws/integration.rb +42 -0
  119. data/lib/ddtrace/contrib/aws/parsed_context.rb +56 -0
  120. data/lib/ddtrace/contrib/aws/patcher.rb +49 -0
  121. data/lib/ddtrace/contrib/aws/services.rb +115 -0
  122. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +15 -0
  123. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +41 -0
  124. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +11 -0
  125. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +23 -0
  126. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +38 -0
  127. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +28 -0
  128. data/lib/ddtrace/contrib/configurable.rb +76 -0
  129. data/lib/ddtrace/contrib/configuration/resolver.rb +16 -0
  130. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
  131. data/lib/ddtrace/contrib/configuration/settings.rb +53 -0
  132. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +25 -0
  133. data/lib/ddtrace/contrib/dalli/ext.rb +17 -0
  134. data/lib/ddtrace/contrib/dalli/instrumentation.rb +50 -0
  135. data/lib/ddtrace/contrib/dalli/integration.rb +38 -0
  136. data/lib/ddtrace/contrib/dalli/patcher.rb +63 -0
  137. data/lib/ddtrace/contrib/dalli/quantize.rb +22 -0
  138. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +25 -0
  139. data/lib/ddtrace/contrib/delayed_job/ext.rb +18 -0
  140. data/lib/ddtrace/contrib/delayed_job/integration.rb +38 -0
  141. data/lib/ddtrace/contrib/delayed_job/patcher.rb +28 -0
  142. data/lib/ddtrace/contrib/delayed_job/plugin.rb +61 -0
  143. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +26 -0
  144. data/lib/ddtrace/contrib/elasticsearch/ext.rb +19 -0
  145. data/lib/ddtrace/contrib/elasticsearch/integration.rb +39 -0
  146. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +117 -0
  147. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +80 -0
  148. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +27 -0
  149. data/lib/ddtrace/contrib/ethon/easy_patch.rb +148 -0
  150. data/lib/ddtrace/contrib/ethon/ext.rb +15 -0
  151. data/lib/ddtrace/contrib/ethon/integration.rb +43 -0
  152. data/lib/ddtrace/contrib/ethon/multi_patch.rb +80 -0
  153. data/lib/ddtrace/contrib/ethon/patcher.rb +25 -0
  154. data/lib/ddtrace/contrib/excon/configuration/settings.rb +28 -0
  155. data/lib/ddtrace/contrib/excon/ext.rb +14 -0
  156. data/lib/ddtrace/contrib/excon/integration.rb +43 -0
  157. data/lib/ddtrace/contrib/excon/middleware.rb +157 -0
  158. data/lib/ddtrace/contrib/excon/patcher.rb +27 -0
  159. data/lib/ddtrace/contrib/extensions.rb +93 -0
  160. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +33 -0
  161. data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
  162. data/lib/ddtrace/contrib/faraday/ext.rb +14 -0
  163. data/lib/ddtrace/contrib/faraday/integration.rb +43 -0
  164. data/lib/ddtrace/contrib/faraday/middleware.rb +83 -0
  165. data/lib/ddtrace/contrib/faraday/patcher.rb +80 -0
  166. data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
  167. data/lib/ddtrace/contrib/grape/configuration/settings.rb +27 -0
  168. data/lib/ddtrace/contrib/grape/endpoint.rb +208 -0
  169. data/lib/ddtrace/contrib/grape/ext.rb +19 -0
  170. data/lib/ddtrace/contrib/grape/instrumentation.rb +33 -0
  171. data/lib/ddtrace/contrib/grape/integration.rb +39 -0
  172. data/lib/ddtrace/contrib/grape/patcher.rb +73 -0
  173. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +27 -0
  174. data/lib/ddtrace/contrib/graphql/ext.rb +13 -0
  175. data/lib/ddtrace/contrib/graphql/integration.rb +39 -0
  176. data/lib/ddtrace/contrib/graphql/patcher.rb +60 -0
  177. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +25 -0
  178. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +74 -0
  179. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +54 -0
  180. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +76 -0
  181. data/lib/ddtrace/contrib/grpc/ext.rb +15 -0
  182. data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
  183. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
  184. data/lib/ddtrace/contrib/grpc/patcher.rb +68 -0
  185. data/lib/ddtrace/contrib/http/circuit_breaker.rb +39 -0
  186. data/lib/ddtrace/contrib/http/configuration/settings.rb +27 -0
  187. data/lib/ddtrace/contrib/http/ext.rb +14 -0
  188. data/lib/ddtrace/contrib/http/instrumentation.rb +175 -0
  189. data/lib/ddtrace/contrib/http/integration.rb +45 -0
  190. data/lib/ddtrace/contrib/http/patcher.rb +26 -0
  191. data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
  192. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +27 -0
  193. data/lib/ddtrace/contrib/httprb/ext.rb +14 -0
  194. data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
  195. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  196. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  197. data/lib/ddtrace/contrib/integration.rb +16 -0
  198. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +25 -0
  199. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  200. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  201. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  202. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  203. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  204. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  205. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  206. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  207. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  208. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  209. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  210. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  211. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  212. data/lib/ddtrace/contrib/kafka/ext.rb +38 -0
  213. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  214. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  215. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +28 -0
  216. data/lib/ddtrace/contrib/mongodb/ext.rb +20 -0
  217. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +67 -0
  218. data/lib/ddtrace/contrib/mongodb/integration.rb +38 -0
  219. data/lib/ddtrace/contrib/mongodb/parsers.rb +68 -0
  220. data/lib/ddtrace/contrib/mongodb/patcher.rb +31 -0
  221. data/lib/ddtrace/contrib/mongodb/subscribers.rb +108 -0
  222. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +25 -0
  223. data/lib/ddtrace/contrib/mysql2/ext.rb +15 -0
  224. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +60 -0
  225. data/lib/ddtrace/contrib/mysql2/integration.rb +38 -0
  226. data/lib/ddtrace/contrib/mysql2/patcher.rb +27 -0
  227. data/lib/ddtrace/contrib/patchable.rb +59 -0
  228. data/lib/ddtrace/contrib/patcher.rb +62 -0
  229. data/lib/ddtrace/contrib/presto/configuration/settings.rb +25 -0
  230. data/lib/ddtrace/contrib/presto/ext.rb +25 -0
  231. data/lib/ddtrace/contrib/presto/instrumentation.rb +107 -0
  232. data/lib/ddtrace/contrib/presto/integration.rb +38 -0
  233. data/lib/ddtrace/contrib/presto/patcher.rb +30 -0
  234. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +25 -0
  235. data/lib/ddtrace/contrib/racecar/event.rb +71 -0
  236. data/lib/ddtrace/contrib/racecar/events.rb +30 -0
  237. data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
  238. data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
  239. data/lib/ddtrace/contrib/racecar/ext.rb +21 -0
  240. data/lib/ddtrace/contrib/racecar/integration.rb +39 -0
  241. data/lib/ddtrace/contrib/racecar/patcher.rb +26 -0
  242. data/lib/ddtrace/contrib/rack/configuration/settings.rb +41 -0
  243. data/lib/ddtrace/contrib/rack/ext.rb +18 -0
  244. data/lib/ddtrace/contrib/rack/integration.rb +38 -0
  245. data/lib/ddtrace/contrib/rack/middlewares.rb +290 -0
  246. data/lib/ddtrace/contrib/rack/patcher.rb +107 -0
  247. data/lib/ddtrace/contrib/rack/request_queue.rb +39 -0
  248. data/lib/ddtrace/contrib/rails/configuration/settings.rb +83 -0
  249. data/lib/ddtrace/contrib/rails/ext.rb +13 -0
  250. data/lib/ddtrace/contrib/rails/framework.rb +124 -0
  251. data/lib/ddtrace/contrib/rails/integration.rb +44 -0
  252. data/lib/ddtrace/contrib/rails/middlewares.rb +38 -0
  253. data/lib/ddtrace/contrib/rails/patcher.rb +74 -0
  254. data/lib/ddtrace/contrib/rails/railtie.rb +17 -0
  255. data/lib/ddtrace/contrib/rails/utils.rb +20 -0
  256. data/lib/ddtrace/contrib/rake/configuration/settings.rb +27 -0
  257. data/lib/ddtrace/contrib/rake/ext.rb +18 -0
  258. data/lib/ddtrace/contrib/rake/instrumentation.rb +88 -0
  259. data/lib/ddtrace/contrib/rake/integration.rb +38 -0
  260. data/lib/ddtrace/contrib/rake/patcher.rb +30 -0
  261. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
  262. data/lib/ddtrace/contrib/redis/configuration/settings.rb +25 -0
  263. data/lib/ddtrace/contrib/redis/ext.rb +18 -0
  264. data/lib/ddtrace/contrib/redis/integration.rb +42 -0
  265. data/lib/ddtrace/contrib/redis/patcher.rb +97 -0
  266. data/lib/ddtrace/contrib/redis/quantize.rb +47 -0
  267. data/lib/ddtrace/contrib/redis/tags.rb +38 -0
  268. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
  269. data/lib/ddtrace/contrib/registerable.rb +33 -0
  270. data/lib/ddtrace/contrib/registry.rb +42 -0
  271. data/lib/ddtrace/contrib/resque/configuration/settings.rb +26 -0
  272. data/lib/ddtrace/contrib/resque/ext.rb +14 -0
  273. data/lib/ddtrace/contrib/resque/integration.rb +47 -0
  274. data/lib/ddtrace/contrib/resque/patcher.rb +29 -0
  275. data/lib/ddtrace/contrib/resque/resque_job.rb +80 -0
  276. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +26 -0
  277. data/lib/ddtrace/contrib/rest_client/ext.rb +14 -0
  278. data/lib/ddtrace/contrib/rest_client/integration.rb +38 -0
  279. data/lib/ddtrace/contrib/rest_client/patcher.rb +23 -0
  280. data/lib/ddtrace/contrib/rest_client/request_patch.rb +89 -0
  281. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +23 -0
  282. data/lib/ddtrace/contrib/sequel/database.rb +61 -0
  283. data/lib/ddtrace/contrib/sequel/dataset.rb +62 -0
  284. data/lib/ddtrace/contrib/sequel/ext.rb +15 -0
  285. data/lib/ddtrace/contrib/sequel/integration.rb +38 -0
  286. data/lib/ddtrace/contrib/sequel/patcher.rb +33 -0
  287. data/lib/ddtrace/contrib/sequel/utils.rb +46 -0
  288. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +24 -0
  289. data/lib/ddtrace/contrib/shoryuken/ext.rb +18 -0
  290. data/lib/ddtrace/contrib/shoryuken/integration.rb +39 -0
  291. data/lib/ddtrace/contrib/shoryuken/patcher.rb +24 -0
  292. data/lib/ddtrace/contrib/shoryuken/tracer.rb +49 -0
  293. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
  294. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +31 -0
  295. data/lib/ddtrace/contrib/sidekiq/ext.rb +24 -0
  296. data/lib/ddtrace/contrib/sidekiq/integration.rb +38 -0
  297. data/lib/ddtrace/contrib/sidekiq/patcher.rb +41 -0
  298. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +67 -0
  299. data/lib/ddtrace/contrib/sidekiq/tracing.rb +45 -0
  300. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +34 -0
  301. data/lib/ddtrace/contrib/sinatra/env.rb +58 -0
  302. data/lib/ddtrace/contrib/sinatra/ext.rb +24 -0
  303. data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
  304. data/lib/ddtrace/contrib/sinatra/integration.rb +38 -0
  305. data/lib/ddtrace/contrib/sinatra/patcher.rb +28 -0
  306. data/lib/ddtrace/contrib/sinatra/tracer.rb +150 -0
  307. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +78 -0
  308. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +25 -0
  309. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +26 -0
  310. data/lib/ddtrace/contrib/sucker_punch/ext.rb +18 -0
  311. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +84 -0
  312. data/lib/ddtrace/contrib/sucker_punch/integration.rb +38 -0
  313. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +42 -0
  314. data/lib/ddtrace/correlation.rb +38 -0
  315. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  316. data/lib/ddtrace/diagnostics/health.rb +33 -0
  317. data/lib/ddtrace/distributed_tracing/headers/b3.rb +44 -0
  318. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +56 -0
  319. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +42 -0
  320. data/lib/ddtrace/distributed_tracing/headers/headers.rb +70 -0
  321. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +45 -0
  322. data/lib/ddtrace/encoding.rb +69 -0
  323. data/lib/ddtrace/environment.rb +31 -0
  324. data/lib/ddtrace/error.rb +27 -0
  325. data/lib/ddtrace/event.rb +52 -0
  326. data/lib/ddtrace/ext/analytics.rb +12 -0
  327. data/lib/ddtrace/ext/app_types.rb +11 -0
  328. data/lib/ddtrace/ext/correlation.rb +11 -0
  329. data/lib/ddtrace/ext/diagnostics.rb +35 -0
  330. data/lib/ddtrace/ext/distributed.rb +33 -0
  331. data/lib/ddtrace/ext/environment.rb +16 -0
  332. data/lib/ddtrace/ext/errors.rb +10 -0
  333. data/lib/ddtrace/ext/forced_tracing.rb +25 -0
  334. data/lib/ddtrace/ext/http.rb +46 -0
  335. data/lib/ddtrace/ext/manual_tracing.rb +9 -0
  336. data/lib/ddtrace/ext/metrics.rb +15 -0
  337. data/lib/ddtrace/ext/net.rb +10 -0
  338. data/lib/ddtrace/ext/priority.rb +16 -0
  339. data/lib/ddtrace/ext/runtime.rb +26 -0
  340. data/lib/ddtrace/ext/sampling.rb +16 -0
  341. data/lib/ddtrace/ext/sql.rb +8 -0
  342. data/lib/ddtrace/ext/transport.rb +17 -0
  343. data/lib/ddtrace/forced_tracing.rb +36 -0
  344. data/lib/ddtrace/logger.rb +40 -0
  345. data/lib/ddtrace/metrics.rb +222 -0
  346. data/lib/ddtrace/monkey.rb +58 -0
  347. data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
  348. data/lib/ddtrace/opentelemetry/span.rb +33 -0
  349. data/lib/ddtrace/opentracer.rb +40 -0
  350. data/lib/ddtrace/opentracer/binary_propagator.rb +24 -0
  351. data/lib/ddtrace/opentracer/carrier.rb +6 -0
  352. data/lib/ddtrace/opentracer/distributed_headers.rb +52 -0
  353. data/lib/ddtrace/opentracer/global_tracer.rb +15 -0
  354. data/lib/ddtrace/opentracer/propagator.rb +22 -0
  355. data/lib/ddtrace/opentracer/rack_propagator.rb +60 -0
  356. data/lib/ddtrace/opentracer/scope.rb +15 -0
  357. data/lib/ddtrace/opentracer/scope_manager.rb +6 -0
  358. data/lib/ddtrace/opentracer/span.rb +98 -0
  359. data/lib/ddtrace/opentracer/span_context.rb +14 -0
  360. data/lib/ddtrace/opentracer/span_context_factory.rb +23 -0
  361. data/lib/ddtrace/opentracer/text_map_propagator.rb +75 -0
  362. data/lib/ddtrace/opentracer/thread_local_scope.rb +30 -0
  363. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +40 -0
  364. data/lib/ddtrace/opentracer/tracer.rb +208 -0
  365. data/lib/ddtrace/patcher.rb +47 -0
  366. data/lib/ddtrace/pin.rb +138 -0
  367. data/lib/ddtrace/pipeline.rb +46 -0
  368. data/lib/ddtrace/pipeline/span_filter.rb +38 -0
  369. data/lib/ddtrace/pipeline/span_processor.rb +20 -0
  370. data/lib/ddtrace/propagation/grpc_propagator.rb +61 -0
  371. data/lib/ddtrace/propagation/http_propagator.rb +75 -0
  372. data/lib/ddtrace/quantization/hash.rb +103 -0
  373. data/lib/ddtrace/quantization/http.rb +86 -0
  374. data/lib/ddtrace/runtime/cgroup.rb +44 -0
  375. data/lib/ddtrace/runtime/class_count.rb +17 -0
  376. data/lib/ddtrace/runtime/container.rb +73 -0
  377. data/lib/ddtrace/runtime/gc.rb +16 -0
  378. data/lib/ddtrace/runtime/identity.rb +41 -0
  379. data/lib/ddtrace/runtime/metrics.rb +96 -0
  380. data/lib/ddtrace/runtime/object_space.rb +19 -0
  381. data/lib/ddtrace/runtime/socket.rb +14 -0
  382. data/lib/ddtrace/runtime/thread_count.rb +16 -0
  383. data/lib/ddtrace/sampler.rb +292 -0
  384. data/lib/ddtrace/sampling.rb +2 -0
  385. data/lib/ddtrace/sampling/matcher.rb +57 -0
  386. data/lib/ddtrace/sampling/rate_limiter.rb +127 -0
  387. data/lib/ddtrace/sampling/rule.rb +61 -0
  388. data/lib/ddtrace/sampling/rule_sampler.rb +125 -0
  389. data/lib/ddtrace/span.rb +307 -0
  390. data/lib/ddtrace/sync_writer.rb +67 -0
  391. data/lib/ddtrace/tracer.rb +439 -0
  392. data/lib/ddtrace/transport/http.rb +91 -0
  393. data/lib/ddtrace/transport/http/adapters/net.rb +120 -0
  394. data/lib/ddtrace/transport/http/adapters/registry.rb +24 -0
  395. data/lib/ddtrace/transport/http/adapters/test.rb +81 -0
  396. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +68 -0
  397. data/lib/ddtrace/transport/http/api.rb +46 -0
  398. data/lib/ddtrace/transport/http/api/endpoint.rb +27 -0
  399. data/lib/ddtrace/transport/http/api/fallbacks.rb +22 -0
  400. data/lib/ddtrace/transport/http/api/instance.rb +33 -0
  401. data/lib/ddtrace/transport/http/api/map.rb +14 -0
  402. data/lib/ddtrace/transport/http/api/spec.rb +15 -0
  403. data/lib/ddtrace/transport/http/builder.rb +163 -0
  404. data/lib/ddtrace/transport/http/client.rb +50 -0
  405. data/lib/ddtrace/transport/http/env.rb +48 -0
  406. data/lib/ddtrace/transport/http/response.rb +26 -0
  407. data/lib/ddtrace/transport/http/statistics.rb +30 -0
  408. data/lib/ddtrace/transport/http/traces.rb +143 -0
  409. data/lib/ddtrace/transport/io.rb +26 -0
  410. data/lib/ddtrace/transport/io/client.rb +76 -0
  411. data/lib/ddtrace/transport/io/response.rb +25 -0
  412. data/lib/ddtrace/transport/io/traces.rb +91 -0
  413. data/lib/ddtrace/transport/parcel.rb +13 -0
  414. data/lib/ddtrace/transport/request.rb +13 -0
  415. data/lib/ddtrace/transport/response.rb +60 -0
  416. data/lib/ddtrace/transport/statistics.rb +72 -0
  417. data/lib/ddtrace/transport/traces.rb +183 -0
  418. data/lib/ddtrace/utils.rb +65 -0
  419. data/lib/ddtrace/utils/database.rb +25 -0
  420. data/lib/ddtrace/utils/time.rb +14 -0
  421. data/lib/ddtrace/vendor/active_record/connection_specification.rb +301 -0
  422. data/lib/ddtrace/version.rb +12 -0
  423. data/lib/ddtrace/worker.rb +20 -0
  424. data/lib/ddtrace/workers.rb +117 -0
  425. data/lib/ddtrace/workers/async.rb +165 -0
  426. data/lib/ddtrace/workers/loop.rb +105 -0
  427. data/lib/ddtrace/workers/polling.rb +48 -0
  428. data/lib/ddtrace/workers/queue.rb +39 -0
  429. data/lib/ddtrace/workers/runtime_metrics.rb +47 -0
  430. data/lib/ddtrace/workers/trace_writer.rb +202 -0
  431. data/lib/ddtrace/writer.rb +175 -0
  432. data/tasks/release_gem.rake +28 -0
  433. metadata +815 -0
@@ -0,0 +1,14 @@
1
+ module Datadog
2
+ module OpenTracer
3
+ # OpenTracing adapter for SpanContext
4
+ class SpanContext < ::OpenTracing::SpanContext
5
+ attr_reader \
6
+ :datadog_context
7
+
8
+ def initialize(datadog_context:, baggage: {})
9
+ @datadog_context = datadog_context
10
+ @baggage = baggage.freeze
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ module Datadog
2
+ module OpenTracer
3
+ # Creates new Datadog::OpenTracer::SpanContext
4
+ module SpanContextFactory
5
+ module_function
6
+
7
+ def build(datadog_context:, baggage: {})
8
+ SpanContext.new(
9
+ datadog_context: datadog_context,
10
+ baggage: baggage.dup
11
+ )
12
+ end
13
+
14
+ def clone(span_context:, baggage: {})
15
+ SpanContext.new(
16
+ datadog_context: span_context.datadog_context,
17
+ # Merge baggage from previous SpanContext
18
+ baggage: span_context.baggage.merge(baggage)
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,75 @@
1
+ require 'ddtrace/ext/distributed'
2
+
3
+ module Datadog
4
+ module OpenTracer
5
+ # OpenTracing propagator for Datadog::OpenTracer::Tracer
6
+ module TextMapPropagator
7
+ extend Propagator
8
+ extend Datadog::Ext::DistributedTracing
9
+ include Datadog::Ext::DistributedTracing
10
+
11
+ BAGGAGE_PREFIX = 'ot-baggage-'.freeze
12
+
13
+ class << self
14
+ # Inject a SpanContext into the given carrier
15
+ #
16
+ # @param span_context [SpanContext]
17
+ # @param carrier [Carrier] A carrier object of Rack type
18
+ def inject(span_context, carrier)
19
+ # Inject Datadog trace properties
20
+ span_context.datadog_context.tap do |datadog_context|
21
+ carrier[HTTP_HEADER_TRACE_ID] = datadog_context.trace_id
22
+ carrier[HTTP_HEADER_PARENT_ID] = datadog_context.span_id
23
+ carrier[HTTP_HEADER_SAMPLING_PRIORITY] = datadog_context.sampling_priority
24
+ carrier[HTTP_HEADER_ORIGIN] = datadog_context.origin
25
+ end
26
+
27
+ # Inject baggage
28
+ span_context.baggage.each do |key, value|
29
+ carrier[BAGGAGE_PREFIX + key] = value
30
+ end
31
+
32
+ nil
33
+ end
34
+
35
+ # Extract a SpanContext in TextMap format from the given carrier.
36
+ #
37
+ # @param carrier [Carrier] A carrier object of TextMap type
38
+ # @return [SpanContext, nil] the extracted SpanContext or nil if none could be found
39
+ def extract(carrier)
40
+ # First extract & build a Datadog context
41
+ headers = DistributedHeaders.new(carrier)
42
+
43
+ datadog_context = if headers.valid?
44
+ Datadog::Context.new(
45
+ trace_id: headers.trace_id,
46
+ span_id: headers.parent_id,
47
+ sampling_priority: headers.sampling_priority,
48
+ origin: headers.origin
49
+ )
50
+ else
51
+ Datadog::Context.new
52
+ end
53
+
54
+ # Then extract any other baggage
55
+ baggage = {}
56
+ carrier.each do |key, value|
57
+ baggage[item_to_baggage(key)] = value if baggage_item?(key)
58
+ end
59
+
60
+ SpanContextFactory.build(datadog_context: datadog_context, baggage: baggage)
61
+ end
62
+
63
+ private
64
+
65
+ def baggage_item?(item)
66
+ item.to_s.start_with?(BAGGAGE_PREFIX)
67
+ end
68
+
69
+ def item_to_baggage(key)
70
+ key[BAGGAGE_PREFIX.length, key.length]
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,30 @@
1
+ module Datadog
2
+ module OpenTracer
3
+ # OpenTracing adapter for thread local scopes
4
+ class ThreadLocalScope < Scope
5
+ attr_reader \
6
+ :finish_on_close
7
+
8
+ def initialize(
9
+ manager:,
10
+ span:,
11
+ finish_on_close: true
12
+ )
13
+ super(manager: manager, span: span)
14
+ @finish_on_close = finish_on_close
15
+ @previous_scope = manager.active
16
+ end
17
+
18
+ # Mark the end of the active period for the current thread and Scope,
19
+ # updating the ScopeManager#active in the process.
20
+ #
21
+ # NOTE: Calling close more than once on a single Scope instance leads to
22
+ # undefined behavior.
23
+ def close
24
+ return unless equal?(manager.active)
25
+ span.finish if finish_on_close
26
+ manager.send(:set_scope, @previous_scope)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,40 @@
1
+ module Datadog
2
+ module OpenTracer
3
+ # OpenTracing adapter for thread local scope management
4
+ class ThreadLocalScopeManager < ScopeManager
5
+ # Make a span instance active.
6
+ #
7
+ # @param span [Span] the Span that should become active
8
+ # @param finish_on_close [Boolean] whether the Span should automatically be
9
+ # finished when Scope#close is called
10
+ # @return [Scope] instance to control the end of the active period for the
11
+ # Span. It is a programming error to neglect to call Scope#close on the
12
+ # returned instance.
13
+ def activate(span, finish_on_close: true)
14
+ ThreadLocalScope.new(
15
+ manager: self,
16
+ span: span,
17
+ finish_on_close: finish_on_close
18
+ ).tap do |scope|
19
+ set_scope(scope)
20
+ end
21
+ end
22
+
23
+ # @return [Scope] the currently active Scope which can be used to access the
24
+ # currently active Span.
25
+ #
26
+ # If there is a non-null Scope, its wrapped Span becomes an implicit parent
27
+ # (as Reference#CHILD_OF) of any newly-created Span at Tracer#start_active_span
28
+ # or Tracer#start_span time.
29
+ def active
30
+ Thread.current[object_id.to_s]
31
+ end
32
+
33
+ private
34
+
35
+ def set_scope(scope)
36
+ Thread.current[object_id.to_s] = scope
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,208 @@
1
+ require 'ddtrace/tracer'
2
+
3
+ module Datadog
4
+ module OpenTracer
5
+ # OpenTracing adapter for Datadog::Tracer
6
+ class Tracer < ::OpenTracing::Tracer
7
+ extend Forwardable
8
+
9
+ attr_reader \
10
+ :datadog_tracer
11
+
12
+ def_delegators \
13
+ :datadog_tracer,
14
+ :configure
15
+
16
+ def initialize(options = {})
17
+ super()
18
+ @datadog_tracer = Datadog::Tracer.new(options)
19
+ end
20
+
21
+ # @return [ScopeManager] the current ScopeManager.
22
+ def scope_manager
23
+ @scope_manager ||= ThreadLocalScopeManager.new
24
+ end
25
+
26
+ # Returns a newly started and activated Scope.
27
+ #
28
+ # If the Tracer's ScopeManager#active is not nil, no explicit references
29
+ # are provided, and `ignore_active_scope` is false, then an inferred
30
+ # References#CHILD_OF reference is created to the ScopeManager#active's
31
+ # SpanContext when start_active is invoked.
32
+ #
33
+ # @param operation_name [String] The operation name for the Span
34
+ # @param child_of [SpanContext, Span] SpanContext that acts as a parent to
35
+ # the newly-started Span. If a Span instance is provided, its
36
+ # context is automatically substituted. See [Reference] for more
37
+ # information.
38
+ #
39
+ # If specified, the `references` parameter must be omitted.
40
+ # @param references [Array<Reference>] An array of reference
41
+ # objects that identify one or more parent SpanContexts.
42
+ # @param start_time [Time] When the Span started, if not now
43
+ # @param tags [Hash] Tags to assign to the Span at start time
44
+ # @param ignore_active_scope [Boolean] whether to create an implicit
45
+ # References#CHILD_OF reference to the ScopeManager#active.
46
+ # @param finish_on_close [Boolean] whether span should automatically be
47
+ # finished when Scope#close is called
48
+ # @yield [Scope] If an optional block is passed to start_active it will
49
+ # yield the newly-started Scope. If `finish_on_close` is true then the
50
+ # Span will be finished automatically after the block is executed.
51
+ # @return [Scope] The newly-started and activated Scope
52
+ def start_active_span(operation_name,
53
+ child_of: nil,
54
+ references: nil,
55
+ start_time: Time.now,
56
+ tags: nil,
57
+ ignore_active_scope: false,
58
+ finish_on_close: true)
59
+
60
+ # When meant to automatically determine the parent,
61
+ # Use the active scope first, otherwise fall back to any
62
+ # context generated by Datadog, so as to append to it and gain
63
+ # the benefit of any out-of-the-box tracing from Datadog preceding
64
+ # the OpenTracer::Tracer.
65
+ #
66
+ # We do this here instead of in #start_span because #start_span generates
67
+ # spans that are not assigned to a scope, a.k.a not supposed to be used by
68
+ # subsequent spans implicitly. By using the existing Datadog context, the span
69
+ # effectively ends up "assigned to a scope", by virtue of being added to the
70
+ # Context. Hence, it would behave more like an active span, which is why it
71
+ # should only be here.
72
+ unless child_of || ignore_active_scope
73
+ child_of = if scope_manager.active
74
+ scope_manager.active.span.context
75
+ else
76
+ SpanContextFactory.build(datadog_context: datadog_tracer.call_context)
77
+ end
78
+ end
79
+
80
+ # Create the span, and auto-add it to the Datadog context.
81
+ span = start_span(
82
+ operation_name,
83
+ child_of: child_of,
84
+ references: references,
85
+ start_time: start_time,
86
+ tags: tags,
87
+ ignore_active_scope: ignore_active_scope
88
+ )
89
+
90
+ # Overwrite the tracer context with the OpenTracing managed context.
91
+ # This is mostly for the benefit of any out-of-the-box tracing from Datadog,
92
+ # such that spans generated by that tracing will be attached to the OpenTracer
93
+ # parent span.
94
+ datadog_tracer.provider.context = span.datadog_span.context
95
+
96
+ scope_manager.activate(span, finish_on_close: finish_on_close).tap do |scope|
97
+ if block_given?
98
+ begin
99
+ yield(scope)
100
+ ensure
101
+ scope.close
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ # Like #start_active_span, but the returned Span has not been registered via the
108
+ # ScopeManager.
109
+ #
110
+ # @param operation_name [String] The operation name for the Span
111
+ # @param child_of [SpanContext, Span] SpanContext that acts as a parent to
112
+ # the newly-started Span. If a Span instance is provided, its
113
+ # context is automatically substituted. See [Reference] for more
114
+ # information.
115
+ #
116
+ # If specified, the `references` parameter must be omitted.
117
+ # @param references [Array<Reference>] An array of reference
118
+ # objects that identify one or more parent SpanContexts.
119
+ # @param start_time [Time] When the Span started, if not now
120
+ # @param tags [Hash] Tags to assign to the Span at start time
121
+ # @param ignore_active_scope [Boolean] whether to create an implicit
122
+ # References#CHILD_OF reference to the ScopeManager#active.
123
+ # @return [Span] the newly-started Span instance, which has not been
124
+ # automatically registered via the ScopeManager
125
+ def start_span(operation_name,
126
+ child_of: nil,
127
+ references: nil,
128
+ start_time: Time.now,
129
+ tags: nil,
130
+ ignore_active_scope: false)
131
+
132
+ # Derive the OpenTracer::SpanContext to inherit from.
133
+ parent_span_context = inherited_span_context(child_of, ignore_active_scope: ignore_active_scope)
134
+
135
+ # Retrieve Datadog::Context from parent SpanContext.
136
+ datadog_context = parent_span_context.nil? ? nil : parent_span_context.datadog_context
137
+
138
+ # Build the new Datadog span
139
+ datadog_span = datadog_tracer.start_span(
140
+ operation_name,
141
+ child_of: datadog_context,
142
+ start_time: start_time,
143
+ tags: tags || {}
144
+ )
145
+
146
+ # Build or extend the OpenTracer::SpanContext
147
+ span_context = if parent_span_context
148
+ SpanContextFactory.clone(span_context: parent_span_context)
149
+ else
150
+ SpanContextFactory.build(datadog_context: datadog_span.context)
151
+ end
152
+
153
+ # Wrap the Datadog span and OpenTracer::Span context in a OpenTracer::Span
154
+ Span.new(datadog_span: datadog_span, span_context: span_context)
155
+ end
156
+
157
+ # Inject a SpanContext into the given carrier
158
+ #
159
+ # @param span_context [SpanContext]
160
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
161
+ # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
162
+ def inject(span_context, format, carrier)
163
+ case format
164
+ when OpenTracing::FORMAT_TEXT_MAP
165
+ TextMapPropagator.inject(span_context, carrier)
166
+ when OpenTracing::FORMAT_BINARY
167
+ BinaryPropagator.inject(span_context, carrier)
168
+ when OpenTracing::FORMAT_RACK
169
+ RackPropagator.inject(span_context, carrier)
170
+ else
171
+ warn 'Unknown inject format'
172
+ end
173
+ end
174
+
175
+ # Extract a SpanContext in the given format from the given carrier.
176
+ #
177
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
178
+ # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
179
+ # @return [SpanContext, nil] the extracted SpanContext or nil if none could be found
180
+ def extract(format, carrier)
181
+ case format
182
+ when OpenTracing::FORMAT_TEXT_MAP
183
+ TextMapPropagator.extract(carrier)
184
+ when OpenTracing::FORMAT_BINARY
185
+ BinaryPropagator.extract(carrier)
186
+ when OpenTracing::FORMAT_RACK
187
+ RackPropagator.extract(carrier)
188
+ else
189
+ warn 'Unknown extract format'
190
+ nil
191
+ end
192
+ end
193
+
194
+ private
195
+
196
+ def inherited_span_context(parent, ignore_active_scope: false)
197
+ case parent
198
+ when Span
199
+ parent.context
200
+ when SpanContext
201
+ parent
202
+ else
203
+ ignore_active_scope ? nil : scope_manager.active && scope_manager.active.span.context
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,47 @@
1
+ module Datadog
2
+ # Defines some useful patching methods for integrations
3
+ module Patcher
4
+ def self.included(base)
5
+ base.send(:extend, CommonMethods)
6
+ base.send(:include, CommonMethods)
7
+ end
8
+
9
+ # Defines some common methods for patching, that can be used
10
+ # at the instance, class, or module level.
11
+ module CommonMethods
12
+ def without_warnings
13
+ # This is typically used when monkey patching functions such as
14
+ # intialize, which Ruby advices you not to. Use cautiously.
15
+ v = $VERBOSE
16
+ $VERBOSE = nil
17
+ begin
18
+ yield
19
+ ensure
20
+ $VERBOSE = v
21
+ end
22
+ end
23
+
24
+ def do_once(key = nil, options = {})
25
+ # If already done, don't do again
26
+ @done_once ||= Hash.new { |h, k| h[k] = {} }
27
+ if @done_once.key?(key) && @done_once[key].key?(options[:for])
28
+ return @done_once[key][options[:for]]
29
+ end
30
+
31
+ # Otherwise 'do'
32
+ yield.tap do
33
+ # Then add the key so we don't do again.
34
+ @done_once[key][options[:for]] = true
35
+ end
36
+ end
37
+
38
+ def done?(key, options = {})
39
+ return false unless instance_variable_defined?(:@done_once)
40
+ !@done_once.nil? && @done_once.key?(key) && @done_once[key].key?(options[:for])
41
+ end
42
+ end
43
+
44
+ # Extend the common methods so they're available as a module function.
45
+ extend(CommonMethods)
46
+ end
47
+ end
@@ -0,0 +1,138 @@
1
+ require 'ddtrace/patcher'
2
+
3
+ # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
4
+ module Datadog
5
+ # A \Pin (a.k.a Patch INfo) is a small class which is used to
6
+ # set tracing metadata on a particular traced object.
7
+ # This is useful if you wanted to, say, trace two different
8
+ # database clusters.
9
+ class Pin
10
+ def self.get_from(obj)
11
+ return nil unless obj.respond_to? :datadog_pin
12
+ obj.datadog_pin
13
+ end
14
+
15
+ attr_accessor :app
16
+ attr_accessor :app_type
17
+ attr_accessor :config
18
+ attr_accessor :name
19
+ attr_accessor :service_name
20
+ attr_accessor :tags
21
+ attr_reader :tracer
22
+ attr_accessor :writer
23
+
24
+ alias service= service_name=
25
+ alias service service_name
26
+
27
+ def initialize(service_name, options = {})
28
+ deprecation_warning unless options[:tracer].is_a?(Proc) || options[:tracer].nil?
29
+
30
+ @app = options[:app]
31
+ @app_type = options[:app_type]
32
+ @config = options[:config]
33
+ @name = nil # this would rarely be overriden as it's really span-specific
34
+ @service_name = service_name
35
+ @tags = options[:tags]
36
+ @tracer = options[:tracer]
37
+ end
38
+
39
+ def tracer
40
+ @tracer.is_a?(Proc) ? @tracer.call : (@tracer || Datadog.tracer)
41
+ end
42
+
43
+ def enabled?
44
+ return tracer.enabled if tracer
45
+ false
46
+ end
47
+
48
+ # rubocop:disable Style/TrivialAccessors
49
+ def onto(obj)
50
+ unless obj.respond_to? :datadog_pin=
51
+ obj.instance_exec do
52
+ def datadog_pin=(pin)
53
+ @datadog_pin = pin
54
+ end
55
+ end
56
+ end
57
+
58
+ unless obj.respond_to? :datadog_pin
59
+ obj.instance_exec do
60
+ def datadog_pin
61
+ @datadog_pin
62
+ end
63
+ end
64
+ end
65
+
66
+ obj.datadog_pin = self
67
+ end
68
+
69
+ def to_s
70
+ "Pin(service:#{service},app:#{app},app_type:#{app_type},name:#{name})"
71
+ end
72
+
73
+ private
74
+
75
+ DEPRECATION_WARNING = %(
76
+ Explicitly providing a tracer instance is DEPRECATED.
77
+ It's recommended to not provide an explicit tracer instance
78
+ and let Datadog::Pin resolve the correct tracer internally.
79
+ ).freeze
80
+
81
+ def deprecation_warning
82
+ log_deprecation_warning('Datadog::Pin.new')
83
+ end
84
+
85
+ include Datadog::Patcher
86
+
87
+ def log_deprecation_warning(method_name)
88
+ # Only log each deprecation warning once (safeguard against log spam)
89
+ do_once(method_name) do
90
+ Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
91
+ end
92
+ end
93
+ end
94
+
95
+ # Modification to Pin which logs deprecation warnings if accessed.
96
+ # Will be used by integrations which are phasing out the direct use of #datadog_pin.
97
+ module DeprecatedPin
98
+ include Datadog::Patcher
99
+
100
+ DEPRECATION_WARNING = %(
101
+ Use of Datadog::Pin is DEPRECATED.
102
+ Upgrade to the configuration API using the migration guide here:
103
+ https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
104
+
105
+ # Raise a deprecation warning when #datadog_pin or #datadog_pin= is accessed.
106
+ def onto(obj)
107
+ obj.instance_exec(self) do |pin|
108
+ @datadog_deprecated_pin = pin
109
+
110
+ unless respond_to? :datadog_pin=
111
+ def datadog_pin=(pin)
112
+ @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin=')
113
+ @datadog_pin = pin
114
+ end
115
+ end
116
+
117
+ unless respond_to? :datadog_pin
118
+ def datadog_pin
119
+ @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin')
120
+ @datadog_pin
121
+ end
122
+ end
123
+
124
+ # Set instance variable to avoid deprecation warnings
125
+ @datadog_pin = @datadog_deprecated_pin
126
+ end
127
+
128
+ self
129
+ end
130
+
131
+ def log_deprecation_warning(method_name)
132
+ # Only log each deprecation warning once (safeguard against log spam)
133
+ do_once(method_name) do
134
+ Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
135
+ end
136
+ end
137
+ end
138
+ end