ls-trace 0.1.2 → 0.2.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 (337) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +419 -544
  3. data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
  4. data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
  5. data/.env +2 -0
  6. data/.gitignore +2 -0
  7. data/.gitlab-ci.yml +27 -0
  8. data/.rubocop.yml +8 -0
  9. data/.simplecov +38 -0
  10. data/Appraisals +299 -48
  11. data/CHANGELOG.md +3 -4
  12. data/LICENSE +4 -22
  13. data/LICENSE.Apache +200 -0
  14. data/LICENSE.BSD3 +24 -0
  15. data/NOTICE +4 -0
  16. data/README.md +4 -3
  17. data/Rakefile +561 -405
  18. data/ddtrace.gemspec +13 -4
  19. data/docker-compose.yml +96 -2
  20. data/docs/DevelopmentGuide.md +17 -1
  21. data/docs/GettingStarted.md +433 -138
  22. data/lib/ddtrace.rb +15 -0
  23. data/lib/ddtrace/analytics.rb +7 -0
  24. data/lib/ddtrace/buffer.rb +9 -9
  25. data/lib/ddtrace/chunker.rb +34 -0
  26. data/lib/ddtrace/configuration.rb +59 -5
  27. data/lib/ddtrace/configuration/base.rb +4 -2
  28. data/lib/ddtrace/configuration/components.rb +151 -0
  29. data/lib/ddtrace/configuration/option.rb +12 -3
  30. data/lib/ddtrace/configuration/option_definition.rb +1 -5
  31. data/lib/ddtrace/configuration/options.rb +6 -1
  32. data/lib/ddtrace/configuration/pin_setup.rb +3 -2
  33. data/lib/ddtrace/configuration/settings.rb +214 -40
  34. data/lib/ddtrace/context.rb +84 -63
  35. data/lib/ddtrace/context_flush.rb +51 -114
  36. data/lib/ddtrace/context_provider.rb +50 -0
  37. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +30 -0
  38. data/lib/ddtrace/contrib/action_cable/event.rb +65 -0
  39. data/lib/ddtrace/contrib/action_cable/events.rb +33 -0
  40. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +49 -0
  41. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +55 -0
  42. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +50 -0
  43. data/lib/ddtrace/contrib/action_cable/ext.rb +26 -0
  44. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
  45. data/lib/ddtrace/contrib/action_cable/integration.rb +38 -0
  46. data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
  47. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +6 -2
  48. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +3 -15
  49. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  50. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  51. data/lib/ddtrace/contrib/action_pack/integration.rb +5 -3
  52. data/lib/ddtrace/contrib/action_pack/patcher.rb +3 -9
  53. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  54. data/lib/ddtrace/contrib/action_view/event.rb +39 -0
  55. data/lib/ddtrace/contrib/action_view/events.rb +30 -0
  56. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +45 -0
  57. data/lib/ddtrace/contrib/action_view/events/render_template.rb +48 -0
  58. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  59. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +9 -13
  60. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +16 -16
  61. data/lib/ddtrace/contrib/action_view/integration.rb +5 -3
  62. data/lib/ddtrace/contrib/action_view/patcher.rb +19 -25
  63. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  64. data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -0
  65. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  66. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +6 -5
  67. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +3 -10
  68. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +4 -5
  69. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  70. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +4 -1
  71. data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -1
  72. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  73. data/lib/ddtrace/contrib/active_record/integration.rb +5 -3
  74. data/lib/ddtrace/contrib/active_record/patcher.rb +3 -9
  75. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +2 -2
  76. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +10 -24
  77. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
  78. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  79. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  80. data/lib/ddtrace/contrib/active_support/integration.rb +5 -3
  81. data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
  82. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +3 -3
  83. data/lib/ddtrace/contrib/active_support/patcher.rb +3 -9
  84. data/lib/ddtrace/contrib/analytics.rb +5 -1
  85. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  86. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  87. data/lib/ddtrace/contrib/aws/integration.rb +8 -2
  88. data/lib/ddtrace/contrib/aws/patcher.rb +15 -15
  89. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  90. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
  91. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  92. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +8 -2
  93. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +4 -11
  94. data/lib/ddtrace/contrib/configurable.rb +30 -13
  95. data/lib/ddtrace/contrib/configuration/resolver.rb +7 -3
  96. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
  97. data/lib/ddtrace/contrib/configuration/settings.rb +20 -1
  98. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  99. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  100. data/lib/ddtrace/contrib/dalli/integration.rb +5 -3
  101. data/lib/ddtrace/contrib/dalli/patcher.rb +6 -16
  102. data/lib/ddtrace/contrib/dalli/quantize.rb +1 -1
  103. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
  104. data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
  105. data/lib/ddtrace/contrib/delayed_job/integration.rb +8 -2
  106. data/lib/ddtrace/contrib/delayed_job/patcher.rb +4 -10
  107. data/lib/ddtrace/contrib/delayed_job/plugin.rb +4 -0
  108. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  109. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  110. data/lib/ddtrace/contrib/elasticsearch/integration.rb +5 -3
  111. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +10 -17
  112. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +8 -2
  113. data/lib/ddtrace/contrib/ethon/easy_patch.rb +22 -13
  114. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  115. data/lib/ddtrace/contrib/ethon/integration.rb +14 -2
  116. data/lib/ddtrace/contrib/ethon/patcher.rb +7 -9
  117. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  118. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  119. data/lib/ddtrace/contrib/excon/integration.rb +13 -2
  120. data/lib/ddtrace/contrib/excon/middleware.rb +15 -12
  121. data/lib/ddtrace/contrib/excon/patcher.rb +4 -11
  122. data/lib/ddtrace/contrib/extensions.rb +39 -5
  123. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  124. data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
  125. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  126. data/lib/ddtrace/contrib/faraday/integration.rb +10 -3
  127. data/lib/ddtrace/contrib/faraday/middleware.rb +24 -34
  128. data/lib/ddtrace/contrib/faraday/patcher.rb +26 -19
  129. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  130. data/lib/ddtrace/contrib/grape/endpoint.rb +14 -5
  131. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  132. data/lib/ddtrace/contrib/grape/integration.rb +6 -3
  133. data/lib/ddtrace/contrib/grape/patcher.rb +9 -15
  134. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  135. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  136. data/lib/ddtrace/contrib/graphql/integration.rb +6 -5
  137. data/lib/ddtrace/contrib/graphql/patcher.rb +11 -14
  138. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  139. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
  140. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +2 -4
  141. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -2
  142. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  143. data/lib/ddtrace/contrib/grpc/integration.rb +5 -3
  144. data/lib/ddtrace/contrib/grpc/patcher.rb +9 -19
  145. data/lib/ddtrace/contrib/http/circuit_breaker.rb +8 -32
  146. data/lib/ddtrace/contrib/http/configuration/settings.rb +8 -2
  147. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  148. data/lib/ddtrace/contrib/http/instrumentation.rb +89 -28
  149. data/lib/ddtrace/contrib/http/integration.rb +13 -0
  150. data/lib/ddtrace/contrib/http/patcher.rb +3 -9
  151. data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
  152. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  153. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  154. data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
  155. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  156. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  157. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  158. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  159. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  160. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  161. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  162. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  163. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  164. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  165. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  166. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  167. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  168. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  169. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  170. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  171. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  172. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  173. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  174. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  175. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  176. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
  177. data/lib/ddtrace/contrib/mongodb/integration.rb +5 -3
  178. data/lib/ddtrace/contrib/mongodb/patcher.rb +5 -11
  179. data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -2
  180. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  181. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  182. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  183. data/lib/ddtrace/contrib/mysql2/integration.rb +8 -2
  184. data/lib/ddtrace/contrib/mysql2/patcher.rb +3 -9
  185. data/lib/ddtrace/contrib/patchable.rb +21 -4
  186. data/lib/ddtrace/contrib/patcher.rb +44 -10
  187. data/lib/ddtrace/contrib/presto/configuration/settings.rb +30 -0
  188. data/lib/ddtrace/contrib/presto/ext.rb +28 -0
  189. data/lib/ddtrace/contrib/presto/instrumentation.rb +107 -0
  190. data/lib/ddtrace/contrib/presto/integration.rb +38 -0
  191. data/lib/ddtrace/contrib/presto/patcher.rb +30 -0
  192. data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
  193. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  194. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  195. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  196. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  197. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  198. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  199. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  200. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  201. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  202. data/lib/ddtrace/contrib/racecar/integration.rb +6 -3
  203. data/lib/ddtrace/contrib/racecar/patcher.rb +4 -10
  204. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  205. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  206. data/lib/ddtrace/contrib/rack/integration.rb +8 -2
  207. data/lib/ddtrace/contrib/rack/middlewares.rb +23 -14
  208. data/lib/ddtrace/contrib/rack/patcher.rb +57 -22
  209. data/lib/ddtrace/contrib/rack/request_queue.rb +1 -1
  210. data/lib/ddtrace/contrib/rails/configuration/settings.rb +23 -10
  211. data/lib/ddtrace/contrib/rails/ext.rb +7 -2
  212. data/lib/ddtrace/contrib/rails/framework.rb +59 -35
  213. data/lib/ddtrace/contrib/rails/integration.rb +12 -5
  214. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  215. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  216. data/lib/ddtrace/contrib/rails/patcher.rb +19 -8
  217. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  218. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  219. data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -2
  220. data/lib/ddtrace/contrib/rake/integration.rb +8 -2
  221. data/lib/ddtrace/contrib/rake/patcher.rb +4 -10
  222. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
  223. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  224. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  225. data/lib/ddtrace/contrib/redis/integration.rb +9 -3
  226. data/lib/ddtrace/contrib/redis/patcher.rb +20 -17
  227. data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
  228. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
  229. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  230. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  231. data/lib/ddtrace/contrib/resque/integration.rb +12 -2
  232. data/lib/ddtrace/contrib/resque/patcher.rb +4 -10
  233. data/lib/ddtrace/contrib/resque/resque_job.rb +6 -2
  234. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  235. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  236. data/lib/ddtrace/contrib/rest_client/integration.rb +9 -2
  237. data/lib/ddtrace/contrib/rest_client/patcher.rb +5 -7
  238. data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
  239. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  240. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  241. data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
  242. data/lib/ddtrace/contrib/sequel/integration.rb +8 -2
  243. data/lib/ddtrace/contrib/sequel/patcher.rb +4 -10
  244. data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
  245. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  246. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  247. data/lib/ddtrace/contrib/shoryuken/integration.rb +11 -7
  248. data/lib/ddtrace/contrib/shoryuken/patcher.rb +4 -10
  249. data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -0
  250. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +12 -2
  251. data/lib/ddtrace/contrib/sidekiq/ext.rb +8 -2
  252. data/lib/ddtrace/contrib/sidekiq/integration.rb +5 -3
  253. data/lib/ddtrace/contrib/sidekiq/patcher.rb +19 -18
  254. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +12 -3
  255. data/lib/ddtrace/contrib/sidekiq/tracing.rb +19 -2
  256. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  257. data/lib/ddtrace/contrib/sinatra/env.rb +25 -4
  258. data/lib/ddtrace/contrib/sinatra/ext.rb +11 -2
  259. data/lib/ddtrace/contrib/sinatra/integration.rb +5 -3
  260. data/lib/ddtrace/contrib/sinatra/patcher.rb +5 -10
  261. data/lib/ddtrace/contrib/sinatra/tracer.rb +79 -34
  262. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +48 -15
  263. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  264. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  265. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  266. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  267. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  268. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  269. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  270. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +14 -0
  271. data/lib/ddtrace/contrib/sucker_punch/integration.rb +5 -3
  272. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +8 -14
  273. data/lib/ddtrace/correlation.rb +15 -5
  274. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  275. data/lib/ddtrace/diagnostics/health.rb +11 -8
  276. data/lib/ddtrace/encoding.rb +15 -11
  277. data/lib/ddtrace/environment.rb +21 -3
  278. data/lib/ddtrace/event.rb +52 -0
  279. data/lib/ddtrace/ext/analytics.rb +1 -0
  280. data/lib/ddtrace/ext/correlation.rb +11 -0
  281. data/lib/ddtrace/ext/diagnostics.rb +11 -0
  282. data/lib/ddtrace/ext/environment.rb +16 -0
  283. data/lib/ddtrace/ext/forced_tracing.rb +1 -1
  284. data/lib/ddtrace/ext/sampling.rb +16 -0
  285. data/lib/ddtrace/ext/transport.rb +1 -0
  286. data/lib/ddtrace/logger.rb +4 -3
  287. data/lib/ddtrace/metrics.rb +12 -5
  288. data/lib/ddtrace/monkey.rb +1 -1
  289. data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
  290. data/lib/ddtrace/opentelemetry/span.rb +33 -0
  291. data/lib/ddtrace/opentracer/global_tracer.rb +1 -1
  292. data/lib/ddtrace/pin.rb +40 -16
  293. data/lib/ddtrace/pipeline.rb +1 -1
  294. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  295. data/lib/ddtrace/propagation/http_propagator.rb +2 -2
  296. data/lib/ddtrace/runtime/cgroup.rb +1 -1
  297. data/lib/ddtrace/runtime/container.rb +1 -1
  298. data/lib/ddtrace/runtime/metrics.rb +23 -6
  299. data/lib/ddtrace/sampler.rb +126 -29
  300. data/lib/ddtrace/sampling.rb +2 -0
  301. data/lib/ddtrace/sampling/matcher.rb +57 -0
  302. data/lib/ddtrace/sampling/rate_limiter.rb +127 -0
  303. data/lib/ddtrace/sampling/rule.rb +61 -0
  304. data/lib/ddtrace/sampling/rule_sampler.rb +125 -0
  305. data/lib/ddtrace/span.rb +54 -7
  306. data/lib/ddtrace/sync_writer.rb +13 -8
  307. data/lib/ddtrace/tracer.rb +72 -92
  308. data/lib/ddtrace/transport/http.rb +16 -1
  309. data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
  310. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  311. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  312. data/lib/ddtrace/transport/http/api/instance.rb +4 -0
  313. data/lib/ddtrace/transport/http/builder.rb +3 -5
  314. data/lib/ddtrace/transport/http/client.rb +7 -64
  315. data/lib/ddtrace/transport/http/response.rb +1 -1
  316. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  317. data/lib/ddtrace/transport/http/traces.rb +10 -7
  318. data/lib/ddtrace/transport/io.rb +26 -0
  319. data/lib/ddtrace/transport/io/client.rb +76 -0
  320. data/lib/ddtrace/transport/io/response.rb +25 -0
  321. data/lib/ddtrace/transport/io/traces.rb +91 -0
  322. data/lib/ddtrace/transport/response.rb +11 -0
  323. data/lib/ddtrace/transport/statistics.rb +2 -2
  324. data/lib/ddtrace/transport/traces.rb +160 -10
  325. data/lib/ddtrace/utils.rb +1 -1
  326. data/lib/ddtrace/version.rb +2 -2
  327. data/lib/ddtrace/worker.rb +20 -0
  328. data/lib/ddtrace/workers.rb +5 -13
  329. data/lib/ddtrace/workers/async.rb +165 -0
  330. data/lib/ddtrace/workers/loop.rb +105 -0
  331. data/lib/ddtrace/workers/polling.rb +48 -0
  332. data/lib/ddtrace/workers/queue.rb +39 -0
  333. data/lib/ddtrace/workers/runtime_metrics.rb +47 -0
  334. data/lib/ddtrace/workers/trace_writer.rb +202 -0
  335. data/lib/ddtrace/writer.rb +56 -38
  336. metadata +185 -25
  337. data/lib/ddtrace/provider.rb +0 -21
@@ -3,13 +3,13 @@ require 'thread'
3
3
  require 'logger'
4
4
  require 'pathname'
5
5
 
6
+ require 'ddtrace/environment'
6
7
  require 'ddtrace/span'
7
8
  require 'ddtrace/context'
8
- require 'ddtrace/context_flush'
9
- require 'ddtrace/provider'
10
9
  require 'ddtrace/logger'
11
10
  require 'ddtrace/writer'
12
11
  require 'ddtrace/sampler'
12
+ require 'ddtrace/sampling'
13
13
  require 'ddtrace/correlation'
14
14
 
15
15
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
@@ -20,57 +20,17 @@ module Datadog
20
20
  # of these function calls and sub-requests would be encapsulated within a single trace.
21
21
  # rubocop:disable Metrics/ClassLength
22
22
  class Tracer
23
- attr_reader :sampler, :tags, :provider
23
+ attr_reader :sampler, :tags, :provider, :context_flush
24
24
  attr_accessor :enabled, :writer
25
25
  attr_writer :default_service
26
26
 
27
27
  ALLOWED_SPAN_OPTIONS = [:service, :resource, :span_type].freeze
28
28
  DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
29
29
 
30
- # Global, memoized, lazy initialized instance of a logger that is used within the the Datadog
31
- # namespace. This logger outputs to +STDOUT+ by default, and is considered thread-safe.
32
- def self.log
33
- unless defined? @logger
34
- @logger = Datadog::Logger.new(STDOUT)
35
- @logger.level = Logger::WARN
36
- end
37
- @logger
38
- end
39
-
40
- # Override the default logger with a custom one.
41
- def self.log=(logger)
42
- return unless logger
43
- return unless logger.respond_to? :methods
44
- return unless logger.respond_to? :error
45
- if logger.respond_to? :methods
46
- unimplemented = Logger.new(STDOUT).methods - logger.methods
47
- unless unimplemented.empty?
48
- logger.error("logger #{logger} does not implement #{unimplemented}")
49
- return
50
- end
51
- end
52
- @logger = logger
53
- end
54
-
55
- # Activate the debug mode providing more information related to tracer usage
56
- # Default to Warn level unless using custom logger
57
- def self.debug_logging=(value)
58
- if value
59
- log.level = Logger::DEBUG
60
- elsif log.is_a?(Datadog::Logger)
61
- log.level = Logger::WARN
62
- end
63
- end
64
-
65
- # Return if the debug mode is activated or not
66
- def self.debug_logging
67
- log.level == Logger::DEBUG
68
- end
69
-
70
30
  def services
71
31
  # Only log each deprecation warning once (safeguard against log spam)
72
32
  Datadog::Patcher.do_once('Tracer#set_service_info') do
73
- Datadog::Tracer.log.warn('services: Usage of Tracer.services has been deprecated')
33
+ Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
74
34
  end
75
35
 
76
36
  {}
@@ -89,8 +49,9 @@ module Datadog
89
49
  # tracer.shutdown!
90
50
  #
91
51
  def shutdown!
92
- return if !@enabled || @writer.worker.nil?
93
- @writer.worker.stop
52
+ return unless @enabled
53
+
54
+ @writer.stop unless @writer.nil?
94
55
  end
95
56
 
96
57
  # Return the current active \Context for this traced execution. This method is
@@ -109,17 +70,26 @@ module Datadog
109
70
  # * +enabled+: set if the tracer submits or not spans to the local agent. It's enabled
110
71
  # by default.
111
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]
112
81
  @enabled = options.fetch(:enabled, true)
113
- @writer = options.fetch(:writer, Datadog::Writer.new)
82
+ @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
114
83
  @sampler = options.fetch(:sampler, Datadog::AllSampler.new)
84
+ @tags = options.fetch(:tags, {})
85
+ @writer = options.fetch(:writer, Datadog::Writer.new)
115
86
 
116
- @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
87
+ # Instance variables
88
+ @mutex = Mutex.new
117
89
  @provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
118
90
 
119
- @context_flush = options[:partial_flush] ? Datadog::ContextFlush.new(options) : nil
120
-
121
- @mutex = Mutex.new
122
- @tags = {}
91
+ # Enable priority sampling by default
92
+ activate_priority_sampling!(@sampler)
123
93
  end
124
94
 
125
95
  # Updates the current \Tracer instance, so that the tracer can be configured after the
@@ -128,6 +98,7 @@ module Datadog
128
98
  # * +enabled+: set if the tracer submits or not spans to the trace agent
129
99
  # * +hostname+: change the location of the trace agent
130
100
  # * +port+: change the port of the trace agent
101
+ # * +partial_flush+: enable partial trace flushing
131
102
  #
132
103
  # For instance, if the trace agent runs in a different location, just:
133
104
  #
@@ -138,18 +109,19 @@ module Datadog
138
109
 
139
110
  # Those are rare "power-user" options.
140
111
  sampler = options.fetch(:sampler, nil)
141
- max_spans_before_partial_flush = options.fetch(:max_spans_before_partial_flush, nil)
142
- min_spans_before_partial_flush = options.fetch(:min_spans_before_partial_flush, nil)
143
- partial_flush_timeout = options.fetch(:partial_flush_timeout, nil)
144
112
 
145
113
  @enabled = enabled unless enabled.nil?
146
114
  @sampler = sampler unless sampler.nil?
147
115
 
148
116
  configure_writer(options)
149
117
 
150
- @context_flush = Datadog::ContextFlush.new(options) unless min_spans_before_partial_flush.nil? &&
151
- max_spans_before_partial_flush.nil? &&
152
- partial_flush_timeout.nil?
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
153
125
  end
154
126
 
155
127
  # Set the information about the given service. A valid example is:
@@ -160,7 +132,7 @@ module Datadog
160
132
  def set_service_info(service, app, app_type)
161
133
  # Only log each deprecation warning once (safeguard against log spam)
162
134
  Datadog::Patcher.do_once('Tracer#set_service_info') do
163
- Datadog::Tracer.log.warn(%(
135
+ Datadog.logger.warn(%(
164
136
  set_service_info: Usage of set_service_info has been deprecated,
165
137
  service information no longer needs to be reported to the trace agent.
166
138
  ))
@@ -175,7 +147,7 @@ module Datadog
175
147
  begin
176
148
  @default_service = File.basename($PROGRAM_NAME, '.*')
177
149
  rescue StandardError => e
178
- Datadog::Tracer.log.error("unable to guess default service: #{e}")
150
+ Datadog.logger.error("unable to guess default service: #{e}")
179
151
  @default_service = 'ruby'.freeze
180
152
  end
181
153
  @default_service
@@ -187,7 +159,8 @@ module Datadog
187
159
  #
188
160
  # tracer.set_tags('env' => 'prod', 'component' => 'core')
189
161
  def set_tags(tags)
190
- @tags.update(tags)
162
+ string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
163
+ @tags = @tags.merge(string_tags)
191
164
  end
192
165
 
193
166
  # Guess context and parent from child_of entry.
@@ -239,8 +212,8 @@ module Datadog
239
212
  # child span
240
213
  span.parent = parent # sets service, trace_id, parent_id, sampled
241
214
  end
242
- tags.each { |k, v| span.set_tag(k, v) } unless tags.empty?
243
- @tags.each { |k, v| span.set_tag(k, v) } unless @tags.empty?
215
+ span.set_tags(@tags) unless @tags.empty?
216
+ span.set_tags(tags) unless tags.empty?
244
217
  span.start_time = start_time
245
218
 
246
219
  # this could at some point be optional (start_active_span vs start_manual_span)
@@ -282,9 +255,11 @@ module Datadog
282
255
  # * +service+: the service name for this span
283
256
  # * +resource+: the resource this span refers, or \name if it's missing
284
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
285
260
  # * +tags+: extra tags which should be added to the span.
286
261
  def trace(name, options = {})
287
- options[:child_of] = call_context
262
+ options[:child_of] ||= call_context
288
263
 
289
264
  # call the finish only if a block is given; this ensures
290
265
  # that a call to tracer.trace() without a block, returns
@@ -296,11 +271,16 @@ module Datadog
296
271
  begin
297
272
  begin
298
273
  span = start_span(name, options)
299
- # rubocop:disable Lint/UselessAssignment
300
274
  rescue StandardError => e
301
- Datadog::Tracer.log.debug('Failed to start span: #{e}')
275
+ Datadog.logger.debug("Failed to start span: #{e}")
302
276
  ensure
303
- return_value = yield(span)
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)
304
284
  end
305
285
  # rubocop:disable Lint/RescueException
306
286
  # Here we really want to catch *any* exception, not only StandardError,
@@ -328,24 +308,20 @@ module Datadog
328
308
  def record(context)
329
309
  context = context.context if context.is_a?(Datadog::Span)
330
310
  return if context.nil?
331
- trace, sampled = context.get
332
-
333
- # If context flushing is configured...
334
- if @context_flush
335
- if sampled
336
- if trace.nil? || trace.empty?
337
- @context_flush.each_partial_trace(context) do |t|
338
- write(t)
339
- end
340
- else
341
- write(trace)
342
- end
343
- end
344
- # Default behavior
345
- else
346
- ready = !trace.nil? && !trace.empty? && sampled
347
- write(trace) if ready
348
- end
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?
349
325
  end
350
326
 
351
327
  # Return the current active span or +nil+.
@@ -366,13 +342,13 @@ module Datadog
366
342
  # Send the trace to the writer to enqueue the spans list in the agent
367
343
  # sending queue.
368
344
  def write(trace)
369
- return if @writer.nil? || !@enabled
345
+ return if @writer.nil?
370
346
 
371
- if Datadog::Tracer.debug_logging
372
- Datadog::Tracer.log.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
347
+ if Datadog.configuration.diagnostics.debug
348
+ Datadog.logger.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
373
349
  str = String.new('')
374
350
  PP.pp(trace, str)
375
- Datadog::Tracer.log.debug(str)
351
+ Datadog.logger.debug(str)
376
352
  end
377
353
 
378
354
  @writer.write(trace)
@@ -389,10 +365,10 @@ module Datadog
389
365
  sampler = options.fetch(:sampler, nil)
390
366
  priority_sampling = options.fetch(:priority_sampling, nil)
391
367
  writer = options.fetch(:writer, nil)
392
- transport_options = options.fetch(:transport_options, {})
368
+ transport_options = options.fetch(:transport_options, {}).dup
393
369
 
394
370
  # Compile writer options
395
- writer_options = options.fetch(:writer_options, {})
371
+ writer_options = options.fetch(:writer_options, {}).dup
396
372
  rebuild_writer = !writer_options.empty?
397
373
 
398
374
  # Re-build the sampler and writer if priority sampling is enabled,
@@ -441,7 +417,10 @@ module Datadog
441
417
  @sampler = if base_sampler.is_a?(PrioritySampler)
442
418
  base_sampler
443
419
  else
444
- PrioritySampler.new(base_sampler: base_sampler)
420
+ PrioritySampler.new(
421
+ base_sampler: base_sampler,
422
+ post_sampler: Sampling::RuleSampler.new
423
+ )
445
424
  end
446
425
  end
447
426
 
@@ -454,6 +433,7 @@ module Datadog
454
433
  :configure_writer,
455
434
  :deactivate_priority_sampling!,
456
435
  :guess_context_and_parent,
436
+ :record_context,
457
437
  :write
458
438
  end
459
439
  end
@@ -10,6 +10,7 @@ require 'ddtrace/transport/http/api'
10
10
  require 'ddtrace/transport/http/adapters/net'
11
11
  require 'ddtrace/transport/http/adapters/test'
12
12
  require 'ddtrace/transport/http/adapters/unix_socket'
13
+ require 'uri'
13
14
 
14
15
  module Datadog
15
16
  module Transport
@@ -19,7 +20,7 @@ module Datadog
19
20
 
20
21
  # Builds a new Transport::HTTP::Client
21
22
  def new(&block)
22
- Builder.new(&block).to_client
23
+ Builder.new(&block).to_transport
23
24
  end
24
25
 
25
26
  # Builds a new Transport::HTTP::Client with default settings
@@ -75,13 +76,27 @@ module Datadog
75
76
  end
76
77
 
77
78
  def default_hostname
79
+ return default_url.hostname if default_url
80
+
78
81
  ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_HOST, Datadog::Ext::Transport::HTTP::DEFAULT_HOST)
79
82
  end
80
83
 
81
84
  def default_port
85
+ return default_url.port if default_url
86
+
82
87
  ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_PORT, Datadog::Ext::Transport::HTTP::DEFAULT_PORT).to_i
83
88
  end
84
89
 
90
+ def default_url
91
+ url_env = ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL, nil)
92
+
93
+ if url_env
94
+ uri_parsed = URI.parse(url_env)
95
+
96
+ uri_parsed if %w[http https].include?(uri_parsed.scheme)
97
+ end
98
+ end
99
+
85
100
  # Add adapters to registry
86
101
  Builder::REGISTRY.set(Adapters::Net, :net_http)
87
102
  Builder::REGISTRY.set(Adapters::Test, :test)
@@ -47,6 +47,10 @@ module Datadog
47
47
  Response.new(http_response)
48
48
  end
49
49
 
50
+ def url
51
+ "http://#{hostname}:#{port}?timeout=#{timeout}"
52
+ end
53
+
50
54
  # Raised when called with an unknown HTTP method
51
55
  class UnknownHTTPMethod < StandardError
52
56
  attr_reader :verb
@@ -104,6 +108,10 @@ module Datadog
104
108
  return super if http_response.nil?
105
109
  code.between?(500, 599)
106
110
  end
111
+
112
+ def inspect
113
+ "#{super}, http_response:#{http_response}"
114
+ end
107
115
  end
108
116
  end
109
117
  end
@@ -33,6 +33,8 @@ module Datadog
33
33
  @status = status
34
34
  end
35
35
 
36
+ def url; end
37
+
36
38
  # Response for test adapter
37
39
  class Response
38
40
  include Datadog::Transport::Response
@@ -69,6 +71,10 @@ module Datadog
69
71
  def server_error?
70
72
  code.between?(500, 599)
71
73
  end
74
+
75
+ def inspect
76
+ "#{super}, code:#{code}"
77
+ end
72
78
  end
73
79
  end
74
80
  end
@@ -31,6 +31,10 @@ module Datadog
31
31
  end
32
32
  end
33
33
 
34
+ def url
35
+ "http+unix://#{filepath}?timeout=#{timeout}"
36
+ end
37
+
34
38
  # Re-implements Net:HTTP with underlying Unix socket
35
39
  class HTTP < ::Net::HTTP
36
40
  DEFAULT_TIMEOUT = 1
@@ -15,6 +15,10 @@ module Datadog
15
15
  @headers = options.fetch(:headers, {})
16
16
  end
17
17
 
18
+ def encoder
19
+ spec.encoder
20
+ end
21
+
18
22
  def call(env)
19
23
  # Add headers to request env, unless empty.
20
24
  env.headers.merge!(headers) unless headers.empty?
@@ -70,13 +70,11 @@ module Datadog
70
70
  @default_api = key
71
71
  end
72
72
 
73
- def to_client
73
+ def to_transport
74
74
  raise NoDefaultApiError if @default_api.nil?
75
75
 
76
- @client ||= Client.new(
77
- to_api_instances,
78
- @default_api
79
- )
76
+ # DEV: Should not be specific to traces
77
+ Transport::Traces::Transport.new(to_api_instances, @default_api)
80
78
  end
81
79
 
82
80
  def to_api_instances
@@ -8,42 +8,31 @@ module Datadog
8
8
  class Client
9
9
  include Transport::HTTP::Statistics
10
10
 
11
- attr_reader \
12
- :apis,
13
- :current_api_id
11
+ attr_reader :api
14
12
 
15
- def initialize(apis, current_api_id)
16
- @apis = apis
17
-
18
- # Activate initial API
19
- change_api!(current_api_id)
13
+ def initialize(api)
14
+ @api = api
20
15
  end
21
16
 
22
17
  def send_request(request, &block)
23
18
  # Build request into env
24
19
  env = build_env(request)
25
20
 
26
- # Get response from API
27
- response = yield(current_api, env)
21
+ # Get responses from API
22
+ response = yield(api, env)
28
23
 
29
24
  # Update statistics
30
25
  update_stats_from_response!(response)
31
26
 
32
- # If API should be downgraded, downgrade and try again.
33
- if downgrade?(response)
34
- downgrade!
35
- response = send_request(request, &block)
36
- end
37
-
38
27
  response
39
28
  rescue StandardError => e
40
29
  message = "Internal error during HTTP transport request. Cause: #{e.message} Location: #{e.backtrace.first}"
41
30
 
42
31
  # Log error
43
32
  if stats.consecutive_errors > 0
44
- Datadog::Tracer.log.debug(message)
33
+ Datadog.logger.debug(message)
45
34
  else
46
- Datadog::Tracer.log.error(message)
35
+ Datadog.logger.error(message)
47
36
  end
48
37
 
49
38
  # Update statistics
@@ -55,52 +44,6 @@ module Datadog
55
44
  def build_env(request)
56
45
  Env.new(request)
57
46
  end
58
-
59
- def downgrade?(response)
60
- return false unless apis.fallbacks.key?(current_api_id)
61
- response.not_found? || response.unsupported?
62
- end
63
-
64
- def current_api
65
- apis[current_api_id]
66
- end
67
-
68
- def change_api!(api_id)
69
- raise UnknownApiVersionError, api_id unless apis.key?(api_id)
70
- @current_api_id = api_id
71
- end
72
-
73
- def downgrade!
74
- downgrade_api_id = apis.fallbacks[current_api_id]
75
- raise NoDowngradeAvailableError, current_api_id if downgrade_api_id.nil?
76
- change_api!(downgrade_api_id)
77
- end
78
-
79
- # Raised when configured with an unknown API version
80
- class UnknownApiVersionError < StandardError
81
- attr_reader :version
82
-
83
- def initialize(version)
84
- @version = version
85
- end
86
-
87
- def message
88
- "No matching transport API for version #{version}!"
89
- end
90
- end
91
-
92
- # Raised when configured with an unknown API version
93
- class NoDowngradeAvailableError < StandardError
94
- attr_reader :version
95
-
96
- def initialize(version)
97
- @version = version
98
- end
99
-
100
- def message
101
- "No downgrade from transport API version #{version} is available!"
102
- end
103
- end
104
47
  end
105
48
  end
106
49
  end