ddtrace 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,67 @@
1
+ require 'ddtrace/ext/net'
2
+ require 'ddtrace/runtime/socket'
3
+ require 'ddtrace/runtime/metrics'
4
+
5
+ module Datadog
6
+ # SyncWriter flushes both services and traces synchronously
7
+ # DEV: To be replaced by Datadog::Workers::TraceWriter.
8
+ class SyncWriter
9
+ attr_reader \
10
+ :priority_sampler,
11
+ :transport
12
+
13
+ def initialize(options = {})
14
+ @transport = options.fetch(:transport) do
15
+ transport_options = options.fetch(:transport_options, {})
16
+ Transport::HTTP.default(transport_options)
17
+ end
18
+
19
+ @priority_sampler = options.fetch(:priority_sampler, nil)
20
+ end
21
+
22
+ def write(trace, services = nil)
23
+ unless services.nil?
24
+ Datadog::Patcher.do_once('SyncWriter#write') do
25
+ Datadog.logger.warn(%(
26
+ write: Writing services has been deprecated and no longer need to be provided.
27
+ write(traces, services) can be updted to write(traces)
28
+ ))
29
+ end
30
+ end
31
+
32
+ perform_concurrently(
33
+ proc { flush_trace(trace) }
34
+ )
35
+ rescue => e
36
+ Datadog.logger.debug(e)
37
+ end
38
+
39
+ # Added for interface completeness
40
+ def stop
41
+ # No cleanup to do for the SyncWriter
42
+ true
43
+ end
44
+
45
+ private
46
+
47
+ def perform_concurrently(*tasks)
48
+ tasks.map { |task| Thread.new(&task) }.each(&:join)
49
+ end
50
+
51
+ def flush_trace(trace)
52
+ processed_traces = Pipeline.process!([trace])
53
+ return if processed_traces.empty?
54
+ inject_hostname!(processed_traces.first) if Datadog.configuration.report_hostname
55
+ transport.send_traces(processed_traces)
56
+ end
57
+
58
+ def inject_hostname!(trace)
59
+ 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
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,439 @@
1
+ require 'pp'
2
+ require 'thread'
3
+ require 'logger'
4
+ require 'pathname'
5
+
6
+ require 'ddtrace/environment'
7
+ require 'ddtrace/span'
8
+ require 'ddtrace/context'
9
+ require 'ddtrace/logger'
10
+ require 'ddtrace/writer'
11
+ require 'ddtrace/sampler'
12
+ require 'ddtrace/sampling'
13
+ require 'ddtrace/correlation'
14
+
15
+ # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
16
+ module Datadog
17
+ # A \Tracer keeps track of the time spent by an application processing a single operation. For
18
+ # example, a trace can be used to track the entire time spent processing a complicated web request.
19
+ # Even though the request may require multiple resources and machines to handle the request, all
20
+ # of these function calls and sub-requests would be encapsulated within a single trace.
21
+ # rubocop:disable Metrics/ClassLength
22
+ class Tracer
23
+ attr_reader :sampler, :tags, :provider, :context_flush
24
+ attr_accessor :enabled, :writer
25
+ attr_writer :default_service
26
+
27
+ ALLOWED_SPAN_OPTIONS = [:service, :resource, :span_type].freeze
28
+ DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
29
+
30
+ def services
31
+ # Only log each deprecation warning once (safeguard against log spam)
32
+ Datadog::Patcher.do_once('Tracer#set_service_info') do
33
+ Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
34
+ end
35
+
36
+ {}
37
+ end
38
+
39
+ # Shorthand that calls the `shutdown!` method of a registered worker.
40
+ # It's useful to ensure that the Trace Buffer is properly flushed before
41
+ # shutting down the application.
42
+ #
43
+ # For instance:
44
+ #
45
+ # tracer.trace('operation_name', service='rake_tasks') do |span|
46
+ # span.set_tag('task.name', 'script')
47
+ # end
48
+ #
49
+ # tracer.shutdown!
50
+ #
51
+ def shutdown!
52
+ return unless @enabled
53
+
54
+ @writer.stop unless @writer.nil?
55
+ end
56
+
57
+ # Return the current active \Context for this traced execution. This method is
58
+ # automatically called when calling Tracer.trace or Tracer.start_span,
59
+ # but it can be used in the application code during manual instrumentation.
60
+ #
61
+ # This method makes use of a \ContextProvider that is automatically set during the tracer
62
+ # initialization, or while using a library instrumentation.
63
+ def call_context
64
+ @provider.context
65
+ end
66
+
67
+ # Initialize a new \Tracer used to create, sample and submit spans that measure the
68
+ # time of sections of code. Available +options+ are:
69
+ #
70
+ # * +enabled+: set if the tracer submits or not spans to the local agent. It's enabled
71
+ # by default.
72
+ def initialize(options = {})
73
+ # Configurable options
74
+ @context_flush = if options[:partial_flush]
75
+ Datadog::ContextFlush::Partial.new(options)
76
+ else
77
+ Datadog::ContextFlush::Finished.new
78
+ end
79
+
80
+ @default_service = options[:default_service]
81
+ @enabled = options.fetch(:enabled, true)
82
+ @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
83
+ @sampler = options.fetch(:sampler, Datadog::AllSampler.new)
84
+ @tags = options.fetch(:tags, {})
85
+ @writer = options.fetch(:writer, Datadog::Writer.new)
86
+
87
+ # Instance variables
88
+ @mutex = Mutex.new
89
+ @provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
90
+
91
+ # Enable priority sampling by default
92
+ activate_priority_sampling!(@sampler)
93
+ end
94
+
95
+ # Updates the current \Tracer instance, so that the tracer can be configured after the
96
+ # initialization. Available +options+ are:
97
+ #
98
+ # * +enabled+: set if the tracer submits or not spans to the trace agent
99
+ # * +hostname+: change the location of the trace agent
100
+ # * +port+: change the port of the trace agent
101
+ # * +partial_flush+: enable partial trace flushing
102
+ #
103
+ # For instance, if the trace agent runs in a different location, just:
104
+ #
105
+ # tracer.configure(hostname: 'agent.service.consul', port: '8777')
106
+ #
107
+ def configure(options = {})
108
+ enabled = options.fetch(:enabled, nil)
109
+
110
+ # Those are rare "power-user" options.
111
+ sampler = options.fetch(:sampler, nil)
112
+
113
+ @enabled = enabled unless enabled.nil?
114
+ @sampler = sampler unless sampler.nil?
115
+
116
+ configure_writer(options)
117
+
118
+ if options.key?(:partial_flush)
119
+ @context_flush = if options[:partial_flush]
120
+ Datadog::ContextFlush::Partial.new(options)
121
+ else
122
+ Datadog::ContextFlush::Finished.new
123
+ end
124
+ end
125
+ end
126
+
127
+ # Set the information about the given service. A valid example is:
128
+ #
129
+ # tracer.set_service_info('web-application', 'rails', 'web')
130
+ #
131
+ # set_service_info is deprecated, no service information needs to be tracked
132
+ def set_service_info(service, app, app_type)
133
+ # Only log each deprecation warning once (safeguard against log spam)
134
+ Datadog::Patcher.do_once('Tracer#set_service_info') do
135
+ Datadog.logger.warn(%(
136
+ set_service_info: Usage of set_service_info has been deprecated,
137
+ service information no longer needs to be reported to the trace agent.
138
+ ))
139
+ end
140
+ end
141
+
142
+ # A default value for service. One should really override this one
143
+ # for non-root spans which have a parent. However, root spans without
144
+ # a service would be invalid and rejected.
145
+ def default_service
146
+ return @default_service if instance_variable_defined?(:@default_service) && @default_service
147
+ begin
148
+ @default_service = File.basename($PROGRAM_NAME, '.*')
149
+ rescue StandardError => e
150
+ Datadog.logger.error("unable to guess default service: #{e}")
151
+ @default_service = 'ruby'.freeze
152
+ end
153
+ @default_service
154
+ end
155
+
156
+ # Set the given key / value tag pair at the tracer level. These tags will be
157
+ # appended to each span created by the tracer. Keys and values must be strings.
158
+ # A valid example is:
159
+ #
160
+ # tracer.set_tags('env' => 'prod', 'component' => 'core')
161
+ def set_tags(tags)
162
+ string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
163
+ @tags = @tags.merge(string_tags)
164
+ end
165
+
166
+ # Guess context and parent from child_of entry.
167
+ def guess_context_and_parent(child_of)
168
+ # call_context should not be in this code path, as start_span
169
+ # should never try and pick an existing context, but only get
170
+ # it from the parameters passed to it (child_of)
171
+ return [Datadog::Context.new, nil] unless child_of
172
+
173
+ return [child_of, child_of.current_span] if child_of.is_a?(Context)
174
+
175
+ [child_of.context, child_of]
176
+ end
177
+
178
+ # Return a span that will trace an operation called \name. This method allows
179
+ # parenting passing \child_of as an option. If it's missing, the newly created span is a
180
+ # root span. Available options are:
181
+ #
182
+ # * +service+: the service name for this span
183
+ # * +resource+: the resource this span refers, or \name if it's missing
184
+ # * +span_type+: the type of the span (such as \http, \db and so on)
185
+ # * +child_of+: a \Span or a \Context instance representing the parent for this span.
186
+ # * +start_time+: when the span actually starts (defaults to \now)
187
+ # * +tags+: extra tags which should be added to the span.
188
+ def start_span(name, options = {})
189
+ start_time = options.fetch(:start_time, Time.now.utc)
190
+
191
+ tags = options.fetch(:tags, {})
192
+
193
+ span_options = options.select do |k, _v|
194
+ # Filter options, we want no side effects with unexpected args.
195
+ ALLOWED_SPAN_OPTIONS.include?(k)
196
+ end
197
+
198
+ ctx, parent = guess_context_and_parent(options[:child_of])
199
+ span_options[:context] = ctx unless ctx.nil?
200
+
201
+ span = Span.new(self, name, span_options)
202
+ if parent.nil?
203
+ # root span
204
+ @sampler.sample!(span)
205
+ span.set_tag('system.pid', Process.pid)
206
+
207
+ if ctx && ctx.trace_id
208
+ span.trace_id = ctx.trace_id
209
+ span.parent_id = ctx.span_id unless ctx.span_id.nil?
210
+ end
211
+ else
212
+ # child span
213
+ span.parent = parent # sets service, trace_id, parent_id, sampled
214
+ end
215
+ span.set_tags(@tags) unless @tags.empty?
216
+ span.set_tags(tags) unless tags.empty?
217
+ span.start_time = start_time
218
+
219
+ # this could at some point be optional (start_active_span vs start_manual_span)
220
+ ctx.add_span(span) unless ctx.nil?
221
+
222
+ span
223
+ end
224
+
225
+ # Return a +span+ that will trace an operation called +name+. You could trace your code
226
+ # using a <tt>do-block</tt> like:
227
+ #
228
+ # tracer.trace('web.request') do |span|
229
+ # span.service = 'my-web-site'
230
+ # span.resource = '/'
231
+ # span.set_tag('http.method', request.request_method)
232
+ # do_something()
233
+ # end
234
+ #
235
+ # The <tt>tracer.trace()</tt> method can also be used without a block in this way:
236
+ #
237
+ # span = tracer.trace('web.request', service: 'my-web-site')
238
+ # do_something()
239
+ # span.finish()
240
+ #
241
+ # Remember that in this case, calling <tt>span.finish()</tt> is mandatory.
242
+ #
243
+ # When a Trace is started, <tt>trace()</tt> will store the created span; subsequent spans will
244
+ # become it's children and will inherit some properties:
245
+ #
246
+ # parent = tracer.trace('parent') # has no parent span
247
+ # child = tracer.trace('child') # is a child of 'parent'
248
+ # child.finish()
249
+ # parent.finish()
250
+ # parent2 = tracer.trace('parent2') # has no parent span
251
+ # parent2.finish()
252
+ #
253
+ # Available options are:
254
+ #
255
+ # * +service+: the service name for this span
256
+ # * +resource+: the resource this span refers, or \name if it's missing
257
+ # * +span_type+: the type of the span (such as \http, \db and so on)
258
+ # * +child_of+: a \Span or a \Context instance representing the parent for this span.
259
+ # If not set, defaults to Tracer.call_context
260
+ # * +tags+: extra tags which should be added to the span.
261
+ def trace(name, options = {})
262
+ options[:child_of] ||= call_context
263
+
264
+ # call the finish only if a block is given; this ensures
265
+ # that a call to tracer.trace() without a block, returns
266
+ # a span that should be manually finished.
267
+ if block_given?
268
+ span = nil
269
+ return_value = nil
270
+
271
+ begin
272
+ begin
273
+ span = start_span(name, options)
274
+ rescue StandardError => e
275
+ Datadog.logger.debug("Failed to start span: #{e}")
276
+ ensure
277
+ # We should yield to the provided block when possible, as this
278
+ # block is application code that we don't want to hinder. We call:
279
+ # * `yield(span)` during normal execution.
280
+ # * `yield(nil)` if `start_span` fails with a runtime error.
281
+ # * We don't yield during a fatal error, as the application is likely trying to
282
+ # end its execution (either due to a system error or graceful shutdown).
283
+ return_value = yield(span) if span || e.is_a?(StandardError)
284
+ end
285
+ # rubocop:disable Lint/RescueException
286
+ # Here we really want to catch *any* exception, not only StandardError,
287
+ # as we really have no clue of what is in the block,
288
+ # and it is user code which should be executed no matter what.
289
+ # It's not a problem since we re-raise it afterwards so for example a
290
+ # SignalException::Interrupt would still bubble up.
291
+ rescue Exception => e
292
+ (options[:on_error] || DEFAULT_ON_ERROR).call(span, e)
293
+ raise e
294
+ ensure
295
+ span.finish unless span.nil?
296
+ end
297
+
298
+ return_value
299
+ else
300
+ start_span(name, options)
301
+ end
302
+ end
303
+
304
+ # Record the given +context+. For compatibility with previous versions,
305
+ # +context+ can also be a span. It is similar to the +child_of+ argument,
306
+ # method will figure out what to do, submitting a +span+ for recording
307
+ # is like trying to record its +context+.
308
+ def record(context)
309
+ context = context.context if context.is_a?(Datadog::Span)
310
+ return if context.nil?
311
+
312
+ record_context(context)
313
+ end
314
+
315
+ # Consume trace from +context+, according to +@context_flush+
316
+ # criteria.
317
+ #
318
+ # \ContextFlush#consume! can return nil or an empty list if the
319
+ # trace is not available to flush or if the trace has not been
320
+ # chosen to be sampled.
321
+ def record_context(context)
322
+ trace = @context_flush.consume!(context)
323
+
324
+ write(trace) if @enabled && trace && !trace.empty?
325
+ end
326
+
327
+ # Return the current active span or +nil+.
328
+ def active_span
329
+ call_context.current_span
330
+ end
331
+
332
+ # Return the current active root span or +nil+.
333
+ def active_root_span
334
+ call_context.current_root_span
335
+ end
336
+
337
+ # Return a CorrelationIdentifier for active span
338
+ def active_correlation
339
+ Datadog::Correlation.identifier_from_context(call_context)
340
+ end
341
+
342
+ # Send the trace to the writer to enqueue the spans list in the agent
343
+ # sending queue.
344
+ def write(trace)
345
+ return if @writer.nil?
346
+
347
+ if Datadog.configuration.diagnostics.debug
348
+ Datadog.logger.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
349
+ str = String.new('')
350
+ PP.pp(trace, str)
351
+ Datadog.logger.debug(str)
352
+ end
353
+
354
+ @writer.write(trace)
355
+ end
356
+
357
+ # TODO: Move this kind of configuration building out of the tracer.
358
+ # Tracer should not have this kind of knowledge of writer.
359
+ # rubocop:disable Metrics/PerceivedComplexity
360
+ # rubocop:disable Metrics/CyclomaticComplexity
361
+ # rubocop:disable Metrics/MethodLength
362
+ def configure_writer(options = {})
363
+ hostname = options.fetch(:hostname, nil)
364
+ port = options.fetch(:port, nil)
365
+ sampler = options.fetch(:sampler, nil)
366
+ priority_sampling = options.fetch(:priority_sampling, nil)
367
+ writer = options.fetch(:writer, nil)
368
+ transport_options = options.fetch(:transport_options, {}).dup
369
+
370
+ # Compile writer options
371
+ writer_options = options.fetch(:writer_options, {}).dup
372
+ rebuild_writer = !writer_options.empty?
373
+
374
+ # Re-build the sampler and writer if priority sampling is enabled,
375
+ # but neither are configured. Verify the sampler isn't already a
376
+ # priority sampler too, so we don't wrap one with another.
377
+ if options.key?(:writer)
378
+ if writer.priority_sampler.nil?
379
+ deactivate_priority_sampling!(sampler)
380
+ else
381
+ activate_priority_sampling!(writer.priority_sampler)
382
+ end
383
+ elsif priority_sampling != false && !@sampler.is_a?(PrioritySampler)
384
+ writer_options[:priority_sampler] = activate_priority_sampling!(@sampler)
385
+ rebuild_writer = true
386
+ elsif priority_sampling == false
387
+ deactivate_priority_sampling!(sampler)
388
+ rebuild_writer = true
389
+ elsif @sampler.is_a?(PrioritySampler)
390
+ # Make sure to add sampler to options if transport is rebuilt.
391
+ writer_options[:priority_sampler] = @sampler
392
+ end
393
+
394
+ # Apply options to transport
395
+ if transport_options.is_a?(Proc)
396
+ transport_options = { on_build: transport_options }
397
+ rebuild_writer = true
398
+ end
399
+
400
+ if hostname || port
401
+ transport_options[:hostname] = hostname unless hostname.nil?
402
+ transport_options[:port] = port unless port.nil?
403
+ rebuild_writer = true
404
+ end
405
+
406
+ writer_options[:transport_options] = transport_options
407
+
408
+ if rebuild_writer || writer
409
+ # Make sure old writer is shut down before throwing away.
410
+ # Don't want additional threads running...
411
+ @writer.stop unless writer.nil?
412
+ @writer = writer || Writer.new(writer_options)
413
+ end
414
+ end
415
+
416
+ def activate_priority_sampling!(base_sampler = nil)
417
+ @sampler = if base_sampler.is_a?(PrioritySampler)
418
+ base_sampler
419
+ else
420
+ PrioritySampler.new(
421
+ base_sampler: base_sampler,
422
+ post_sampler: Sampling::RuleSampler.new
423
+ )
424
+ end
425
+ end
426
+
427
+ def deactivate_priority_sampling!(base_sampler = nil)
428
+ @sampler = base_sampler || Datadog::AllSampler.new if @sampler.is_a?(PrioritySampler)
429
+ end
430
+
431
+ private \
432
+ :activate_priority_sampling!,
433
+ :configure_writer,
434
+ :deactivate_priority_sampling!,
435
+ :guess_context_and_parent,
436
+ :record_context,
437
+ :write
438
+ end
439
+ end