ls-trace 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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