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
@@ -1,132 +1,69 @@
1
- require 'set'
2
-
3
- require 'ddtrace/context'
4
-
5
1
  module Datadog
6
- # \ContextFlush is used to cap context size and avoid it using too much memory.
7
- # It performs memory flushes when required.
8
- class ContextFlush
9
- # by default, soft and hard limits are the same
10
- DEFAULT_MAX_SPANS_BEFORE_PARTIAL_FLUSH = Datadog::Context::DEFAULT_MAX_LENGTH
11
- # by default, never do a partial flush
12
- DEFAULT_MIN_SPANS_BEFORE_PARTIAL_FLUSH = Datadog::Context::DEFAULT_MAX_LENGTH
13
- # timeout should be lower than the trace agent window
14
- DEFAULT_PARTIAL_FLUSH_TIMEOUT = 10
15
-
16
- private_constant :DEFAULT_MAX_SPANS_BEFORE_PARTIAL_FLUSH
17
- private_constant :DEFAULT_MIN_SPANS_BEFORE_PARTIAL_FLUSH
18
- private_constant :DEFAULT_PARTIAL_FLUSH_TIMEOUT
19
-
20
- def initialize(options = {})
21
- # max_spans_before_partial_flush is the amount of spans collected before
22
- # the context starts to partially flush parts of traces. With a setting of 10k,
23
- # the memory overhead is about 10Mb per thread/context (depends on spans metadata,
24
- # this is just an order of magnitude).
25
- @max_spans_before_partial_flush = options.fetch(:max_spans_before_partial_flush,
26
- DEFAULT_MAX_SPANS_BEFORE_PARTIAL_FLUSH)
27
- # min_spans_before_partial_flush is the minimum number of spans required
28
- # for a partial flush to happen on a timeout. This is to prevent partial flush
29
- # of traces which last a very long time but yet have few spans.
30
- @min_spans_before_partial_flush = options.fetch(:min_spans_before_partial_flush,
31
- DEFAULT_MIN_SPANS_BEFORE_PARTIAL_FLUSH)
32
- # partial_flush_timeout is the limit (in seconds) above which the context
33
- # considers flushing parts of the trace. Partial flushes should not be done too
34
- # late else the agent rejects them with a "too far in the past" error.
35
- @partial_flush_timeout = options.fetch(:partial_flush_timeout,
36
- DEFAULT_PARTIAL_FLUSH_TIMEOUT)
37
- @partial_traces = []
2
+ module ContextFlush
3
+ # Consumes only completed traces (where all spans have finished)
4
+ class Finished
5
+ # Consumes and returns completed traces (where all spans have finished)
6
+ # from the provided +context+, if any.
7
+ #
8
+ # Any traces consumed are removed from +context+ as a side effect.
9
+ #
10
+ # @return [Array<Span>] trace to be flushed, or +nil+ if the trace is not finished
11
+ def consume!(context)
12
+ trace, sampled = context.get
13
+ trace if sampled
14
+ end
38
15
  end
39
16
 
40
- def add_children(m, spans, ids, leaf)
41
- spans << leaf
42
- ids.add(leaf.span_id)
17
+ # Performs partial trace flushing to avoid large traces residing in memory for too long
18
+ class Partial
19
+ # Start flushing partial trace after this many active spans in one trace
20
+ DEFAULT_MIN_SPANS_FOR_PARTIAL_FLUSH = 500
43
21
 
44
- if m[leaf.span_id]
45
- m[leaf.span_id].each do |sub|
46
- add_children(m, spans, ids, sub)
47
- end
22
+ def initialize(options = {})
23
+ @min_spans_for_partial = options.fetch(:min_spans_before_partial_flush, DEFAULT_MIN_SPANS_FOR_PARTIAL_FLUSH)
48
24
  end
49
- end
50
25
 
51
- def partial_traces(context)
52
- # 1st step, taint all parents of an unfinished span as unflushable
53
- unflushable_ids = Set.new
26
+ # Consumes and returns completed or partially completed
27
+ # traces from the provided +context+, if any.
28
+ #
29
+ # Partially completed traces, where not all spans have finished,
30
+ # will only be returned if there are at least
31
+ # +@min_spans_for_partial+ finished spans.
32
+ #
33
+ # Any spans consumed are removed from +context+ as a side effect.
34
+ #
35
+ # @return [Array<Span>] partial or complete trace to be flushed, or +nil+ if no spans are finished
36
+ def consume!(context)
37
+ trace, sampled = context.get
54
38
 
55
- context.send(:each_span) do |span|
56
- next if span.finished? || unflushable_ids.include?(span.span_id)
57
- unflushable_ids.add span.span_id
58
- while span.parent
59
- span = span.parent
60
- unflushable_ids.add span.span_id
61
- end
62
- end
39
+ return nil unless sampled
40
+ return trace if trace && !trace.empty?
63
41
 
64
- # 2nd step, find all spans which are at the border between flushable and unflushable
65
- # Along the road, collect a reverse-tree which allows direct walking from parents to
66
- # children but only for the ones we're interested it.
67
- roots = []
68
- children_map = {}
69
- context.send(:each_span) do |span|
70
- # There's no point in trying to put the real root in those partial roots, if
71
- # it's flushable, the default algorithm would figure way more quickly.
72
- if span.parent && !unflushable_ids.include?(span.span_id)
73
- if unflushable_ids.include?(span.parent.span_id)
74
- # span is flushable but is parent is not
75
- roots << span
76
- else
77
- # span is flushable and its parent is too, build the reverse
78
- # parent to child map for this one, it will be useful
79
- children_map[span.parent.span_id] ||= []
80
- children_map[span.parent.span_id] << span
81
- end
82
- end
42
+ partial_trace(context)
83
43
  end
84
44
 
85
- # 3rd step, find all children, as this can be costly, only perform it for partial roots
86
- partial_traces = []
87
- all_ids = Set.new
88
- roots.each do |root|
89
- spans = []
90
- add_children(children_map, spans, all_ids, root)
91
- partial_traces << spans
92
- end
45
+ private
93
46
 
94
- return [nil, nil] if partial_traces.empty?
95
- [partial_traces, all_ids]
96
- end
47
+ def partial_trace(context)
48
+ return nil if context.finished_span_count < @min_spans_for_partial
49
+
50
+ finished_spans(context)
51
+ end
97
52
 
98
- def partial_flush(context)
99
- traces, flushed_ids = partial_traces(context)
100
- return nil unless traces && flushed_ids
53
+ def finished_spans(context)
54
+ trace = context.delete_span_if(&:finished?)
101
55
 
102
- # We need to reject by span ID and not by value, because a span
103
- # value may be altered (typical example: it's finished by some other thread)
104
- # since we lock only the context, not all the spans which belong to it.
105
- context.send(:delete_span_if) { |span| flushed_ids.include? span.span_id }
106
- traces
107
- end
56
+ # Ensure that the first span in a partial trace has
57
+ # sampling and origin information.
58
+ if trace[0]
59
+ context.annotate_for_flush!(trace[0])
60
+ else
61
+ Datadog.logger.debug('Tried to retrieve trace from context, but got nothing. ' \
62
+ "Is there another consumer for this context? #{context.trace_id}")
63
+ end
108
64
 
109
- # Performs an operation which each partial trace it can get from the context.
110
- def each_partial_trace(context)
111
- start_time = context.send(:start_time)
112
- length = context.send(:length)
113
- # Stop and do not flush anything if there are not enough spans.
114
- return if length <= @min_spans_before_partial_flush
115
- # If there are enough spans, but not too many, check for start time.
116
- # If timeout is not given or 0, then wait
117
- return if length <= @max_spans_before_partial_flush &&
118
- (@partial_flush_timeout.nil? || @partial_flush_timeout <= 0 ||
119
- (start_time && start_time > Time.now.utc - @partial_flush_timeout))
120
- # Here, either the trace is old or we have too many spans, flush it.
121
- traces = partial_flush(context)
122
- return unless traces
123
- traces.each do |trace|
124
- yield trace
65
+ trace unless trace.empty?
125
66
  end
126
67
  end
127
-
128
- private :add_children
129
- private :partial_traces
130
- private :partial_flush
131
68
  end
132
69
  end
@@ -0,0 +1,50 @@
1
+ module Datadog
2
+ # DefaultContextProvider is a default context provider that retrieves
3
+ # all contexts from the current thread-local storage. It is suitable for
4
+ # synchronous programming.
5
+ class DefaultContextProvider
6
+ # Initializes the default context provider with a thread-bound context.
7
+ def initialize
8
+ @context = ThreadLocalContext.new
9
+ end
10
+
11
+ # Sets the current context.
12
+ def context=(ctx)
13
+ @context.local = ctx
14
+ end
15
+
16
+ # Return the current context.
17
+ def context
18
+ @context.local
19
+ end
20
+ end
21
+
22
+ # ThreadLocalContext can be used as a tracer global reference to create
23
+ # a different \Context for each thread. In synchronous tracer, this
24
+ # is required to prevent multiple threads sharing the same \Context
25
+ # in different executions.
26
+ class ThreadLocalContext
27
+ # ThreadLocalContext can be used as a tracer global reference to create
28
+ # a different \Context for each thread. In synchronous tracer, this
29
+ # is required to prevent multiple threads sharing the same \Context
30
+ # in different executions.
31
+ #
32
+ # To support multiple tracers simultaneously, each \ThreadLocalContext
33
+ # instance has its own thread-local variable.
34
+ def initialize
35
+ @key = "datadog_context_#{object_id}".to_sym
36
+
37
+ self.local = Datadog::Context.new
38
+ end
39
+
40
+ # Override the thread-local context with a new context.
41
+ def local=(ctx)
42
+ Thread.current[@key] = ctx
43
+ end
44
+
45
+ # Return the thread-local context.
46
+ def local
47
+ Thread.current[@key] ||= Datadog::Context.new
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/action_cable/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module ActionCable
7
+ module Configuration
8
+ # Custom settings for the ActionCable integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
15
+ option :analytics_enabled do |o|
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
17
+ o.lazy
18
+ end
19
+
20
+ option :analytics_sample_rate do |o|
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
22
+ o.lazy
23
+ end
24
+
25
+ option :service_name, default: Ext::SERVICE_NAME
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,65 @@
1
+ require 'ddtrace/contrib/analytics'
2
+ require 'ddtrace/contrib/active_support/notifications/event'
3
+ require 'ddtrace/contrib/action_cable/ext'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module ActionCable
8
+ # Defines basic behaviors for an event.
9
+ module Event
10
+ def self.included(base)
11
+ base.send(:include, ActiveSupport::Notifications::Event)
12
+ base.send(:extend, ClassMethods)
13
+ end
14
+
15
+ # Class methods for events.
16
+ module ClassMethods
17
+ def span_options
18
+ { service: configuration[:service_name] }
19
+ end
20
+
21
+ def tracer
22
+ -> { configuration[:tracer] }
23
+ end
24
+
25
+ def configuration
26
+ Datadog.configuration[:action_cable]
27
+ end
28
+ end
29
+ end
30
+
31
+ # Defines behavior for the first event of a thread execution.
32
+ #
33
+ # This event is not expected to be nested with other event,
34
+ # but to start a fresh tracing context.
35
+ module RootContextEvent
36
+ def self.included(base)
37
+ base.send(:include, ActiveSupport::Notifications::Event)
38
+ base.send(:extend, ClassMethods)
39
+ end
40
+
41
+ # Class methods for events.
42
+ module ClassMethods
43
+ include Contrib::ActionCable::Event::ClassMethods
44
+
45
+ def subscription(*args)
46
+ super.tap do |subscription|
47
+ subscription.before_trace { ensure_clean_context! }
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ # Context objects are thread-bound.
54
+ # If an integration re-uses threads, context from a previous trace
55
+ # could leak into the new trace. This "cleans" current context,
56
+ # preventing such a leak.
57
+ def ensure_clean_context!
58
+ return unless configuration[:tracer].call_context.current_span
59
+ configuration[:tracer].provider.context = Context.new
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,33 @@
1
+ require 'ddtrace/contrib/action_cable/event'
2
+ require 'ddtrace/contrib/action_cable/events/broadcast'
3
+ require 'ddtrace/contrib/action_cable/events/perform_action'
4
+ require 'ddtrace/contrib/action_cable/events/transmit'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module ActionCable
9
+ # Defines collection of instrumented ActionCable events
10
+ module Events
11
+ ALL = [
12
+ Events::Broadcast,
13
+ Events::PerformAction,
14
+ Events::Transmit
15
+ ].freeze
16
+
17
+ module_function
18
+
19
+ def all
20
+ self::ALL
21
+ end
22
+
23
+ def subscriptions
24
+ all.collect(&:subscriptions).collect(&:to_a).flatten
25
+ end
26
+
27
+ def subscribe!
28
+ all.each(&:subscribe!)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,49 @@
1
+ require 'ddtrace/contrib/analytics'
2
+ require 'ddtrace/contrib/action_cable/event'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module ActionCable
7
+ module Events
8
+ # Defines instrumentation for 'broadcast.action_cable' event.
9
+ #
10
+ # A single 'broadcast' event will trigger as many 'transmit' events
11
+ # as there are clients subscribed to a channel.
12
+ module Broadcast
13
+ include ActionCable::Event
14
+
15
+ EVENT_NAME = 'broadcast.action_cable'.freeze
16
+
17
+ module_function
18
+
19
+ def event_name
20
+ self::EVENT_NAME
21
+ end
22
+
23
+ def span_name
24
+ Ext::SPAN_BROADCAST
25
+ end
26
+
27
+ def span_type
28
+ # Starts a broadcast of messages over WebSockets
29
+ Datadog::Ext::AppTypes::WEB
30
+ end
31
+
32
+ def process(span, _event, _id, payload)
33
+ channel = payload[:broadcasting] # Channel has high cardinality
34
+ span.service = configuration[:service_name]
35
+ span.span_type = span_type
36
+
37
+ # Set analytics sample rate
38
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
39
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
40
+ end
41
+
42
+ span.set_tag(Ext::TAG_CHANNEL, channel)
43
+ span.set_tag(Ext::TAG_BROADCAST_CODER, payload[:coder])
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,55 @@
1
+ require 'ddtrace/contrib/analytics'
2
+ require 'ddtrace/contrib/action_cable/event'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module ActionCable
7
+ module Events
8
+ # Defines instrumentation for 'perform_action.action_cable' event.
9
+ #
10
+ # An action, triggered by a WebSockets client, invokes a method
11
+ # in the server's channel instance.
12
+ module PerformAction
13
+ include ActionCable::RootContextEvent
14
+
15
+ EVENT_NAME = 'perform_action.action_cable'.freeze
16
+
17
+ module_function
18
+
19
+ def event_name
20
+ self::EVENT_NAME
21
+ end
22
+
23
+ def span_name
24
+ Ext::SPAN_ACTION
25
+ end
26
+
27
+ def span_type
28
+ # A request to perform_action comes from a WebSocket connection
29
+ Datadog::Ext::AppTypes::WEB
30
+ end
31
+
32
+ def process(span, _event, _id, payload)
33
+ channel_class = payload[:channel_class]
34
+ action = payload[:action]
35
+
36
+ span.service = configuration[:service_name]
37
+ span.resource = "#{channel_class}##{action}"
38
+ span.span_type = span_type
39
+
40
+ # Set analytics sample rate
41
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
42
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
43
+ end
44
+
45
+ # Measure service stats
46
+ Contrib::Analytics.set_measured(span)
47
+
48
+ span.set_tag(Ext::TAG_CHANNEL_CLASS, channel_class)
49
+ span.set_tag(Ext::TAG_ACTION, action)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end