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
@@ -30,7 +30,7 @@ module Datadog
30
30
  rescue StandardError => e
31
31
  # in case of an Exception we don't create a
32
32
  # `request.queuing` span
33
- Datadog::Tracer.log.debug("[rack] unable to parse request queue headers: #{e}")
33
+ Datadog.logger.debug("[rack] unable to parse request queue headers: #{e}")
34
34
  nil
35
35
  end
36
36
  end
@@ -6,8 +6,26 @@ module Datadog
6
6
  module Configuration
7
7
  # Custom settings for the Rails integration
8
8
  class Settings < Contrib::Configuration::Settings
9
+ def initialize(options = {})
10
+ super(options)
11
+
12
+ # NOTE: Eager load these
13
+ # Rails integration is responsible for orchestrating other integrations.
14
+ # When using environment variables, settings will not be automatically
15
+ # filled because nothing explicitly calls them. They must though, so
16
+ # integrations like ActionPack can receive the value as it should.
17
+ # Trigger these manually to force an eager load and propagate them.
18
+ analytics_enabled
19
+ analytics_sample_rate
20
+ end
21
+
22
+ option :enabled do |o|
23
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
24
+ o.lazy
25
+ end
26
+
9
27
  option :analytics_enabled do |o|
10
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
28
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
11
29
  o.lazy
12
30
  o.on_set do |value|
13
31
  # Update ActionPack analytics too
@@ -16,7 +34,7 @@ module Datadog
16
34
  end
17
35
 
18
36
  option :analytics_sample_rate do |o|
19
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
37
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
20
38
  o.lazy
21
39
  o.on_set do |value|
22
40
  # Update ActionPack analytics too
@@ -64,14 +82,9 @@ module Datadog
64
82
  end
65
83
  end
66
84
 
67
- option :tracer do |o|
68
- o.delegate_to { Datadog.tracer }
69
- o.on_set do |value|
70
- Datadog.configuration[:active_record][:tracer] = value
71
- Datadog.configuration[:active_support][:tracer] = value
72
- Datadog.configuration[:action_pack][:tracer] = value
73
- Datadog.configuration[:action_view][:tracer] = value
74
- end
85
+ option :log_injection do |o|
86
+ o.default { env_to_bool(Ext::ENV_LOGS_INJECTION_ENABLED, false) }
87
+ o.lazy
75
88
  end
76
89
  end
77
90
  end
@@ -4,8 +4,13 @@ module Datadog
4
4
  # Rails integration constants
5
5
  module Ext
6
6
  APP = 'rails'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_RAILS_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_RAILS_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_RAILS_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_RAILS_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
12
+ ENV_DISABLE = 'DISABLE_DATADOG_RAILS'.freeze
13
+ ENV_LOGS_INJECTION_ENABLED = 'DD_LOGS_INJECTION'.freeze
9
14
  end
10
15
  end
11
16
  end
@@ -3,6 +3,7 @@ require 'ddtrace/ext/app_types'
3
3
 
4
4
  require 'ddtrace/contrib/active_record/integration'
5
5
  require 'ddtrace/contrib/active_support/integration'
6
+ require 'ddtrace/contrib/action_cable/integration'
6
7
  require 'ddtrace/contrib/action_pack/integration'
7
8
  require 'ddtrace/contrib/action_view/integration'
8
9
  require 'ddtrace/contrib/grape/endpoint'
@@ -18,80 +19,103 @@ module Datadog
18
19
  # - handle configuration entries which are specific to Datadog tracing
19
20
  # - instrument parts of the framework when needed
20
21
  module Framework
21
- # configure Datadog settings
22
+ # After the Rails application finishes initializing, we configure the Rails
23
+ # integration and all its sub-components with the application information
24
+ # available.
25
+ # We do this after the initialization because not all the information we
26
+ # require is available before then.
22
27
  def self.setup
23
- config = config_with_defaults
28
+ # NOTE: #configure has the side effect of rebuilding trace components.
29
+ # During a typical Rails application lifecycle, we will see trace
30
+ # components initialized twice because of this. This is necessary
31
+ # because key configuration is not available until after the Rails
32
+ # application has fully loaded, and some of this configuration is
33
+ # used to reconfigure tracer components with Rails-sourced defaults.
34
+ # This is a trade-off we take to get nice defaults.
35
+ Datadog.configure do |datadog_config|
36
+ rails_config = config_with_defaults(datadog_config)
24
37
 
25
- activate_rack!(config)
26
- activate_active_support!(config)
27
- activate_action_pack!(config)
28
- activate_action_view!(config)
29
- activate_active_record!(config)
38
+ # By default, default service would be guessed from the script
39
+ # being executed, but here we know better, get it from Rails config.
40
+ # Don't set this if service has been explicitly provided by the user.
41
+ datadog_config.service ||= rails_config[:service_name]
30
42
 
31
- # By default, default service would be guessed from the script
32
- # being executed, but here we know better, get it from Rails config.
33
- config[:tracer].default_service = config[:service_name]
43
+ activate_rack!(datadog_config, rails_config)
44
+ activate_action_cable!(datadog_config, rails_config)
45
+ activate_active_support!(datadog_config, rails_config)
46
+ activate_action_pack!(datadog_config, rails_config)
47
+ activate_action_view!(datadog_config, rails_config)
48
+ activate_active_record!(datadog_config, rails_config)
49
+ end
34
50
  end
35
51
 
36
- def self.config_with_defaults
52
+ def self.config_with_defaults(datadog_config)
37
53
  # We set defaults here instead of in the patcher because we need to wait
38
54
  # for the Rails application to be fully initialized.
39
- Datadog.configuration[:rails].tap do |config|
40
- config[:service_name] ||= Utils.app_name
55
+ datadog_config[:rails].tap do |config|
56
+ config[:service_name] ||= (Datadog.configuration.service || Utils.app_name)
41
57
  config[:database_service] ||= "#{config[:service_name]}-#{Contrib::ActiveRecord::Utils.adapter_name}"
42
58
  config[:controller_service] ||= config[:service_name]
43
59
  config[:cache_service] ||= "#{config[:service_name]}-cache"
44
60
  end
45
61
  end
46
62
 
47
- def self.activate_rack!(config)
48
- Datadog.configuration.use(
63
+ def self.activate_rack!(datadog_config, rails_config)
64
+ datadog_config.use(
49
65
  :rack,
50
- tracer: config[:tracer],
51
66
  application: ::Rails.application,
52
- service_name: config[:service_name],
53
- middleware_names: config[:middleware_names],
54
- distributed_tracing: config[:distributed_tracing]
67
+ service_name: rails_config[:service_name],
68
+ middleware_names: rails_config[:middleware_names],
69
+ distributed_tracing: rails_config[:distributed_tracing]
55
70
  )
56
71
  end
57
72
 
58
- def self.activate_active_support!(config)
73
+ def self.activate_active_support!(datadog_config, rails_config)
59
74
  return unless defined?(::ActiveSupport)
60
75
 
61
- Datadog.configuration.use(
76
+ datadog_config.use(
62
77
  :active_support,
63
- cache_service: config[:cache_service],
64
- tracer: config[:tracer]
78
+ cache_service: rails_config[:cache_service]
79
+ )
80
+ end
81
+
82
+ def self.activate_action_cable!(datadog_config, rails_config)
83
+ return unless defined?(::ActionCable)
84
+
85
+ datadog_config.use(
86
+ :action_cable,
87
+ service_name: "#{rails_config[:service_name]}-#{Contrib::ActionCable::Ext::SERVICE_NAME}"
65
88
  )
66
89
  end
67
90
 
68
- def self.activate_action_pack!(config)
91
+ def self.activate_action_pack!(datadog_config, rails_config)
69
92
  return unless defined?(::ActionPack)
70
93
 
71
- Datadog.configuration.use(
94
+ # TODO: This is configuring ActionPack but not patching. It will queue ActionPack
95
+ # for patching, but patching won't take place until Datadog.configure completes.
96
+ # Should we manually patch here?
97
+
98
+ datadog_config.use(
72
99
  :action_pack,
73
- service_name: config[:service_name],
74
- tracer: config[:tracer]
100
+ service_name: rails_config[:service_name]
75
101
  )
76
102
  end
77
103
 
78
- def self.activate_action_view!(config)
104
+ def self.activate_action_view!(datadog_config, rails_config)
79
105
  return unless defined?(::ActionView)
80
106
 
81
- Datadog.configuration.use(
107
+ datadog_config.use(
82
108
  :action_view,
83
- service_name: config[:service_name],
84
- tracer: config[:tracer]
109
+ service_name: rails_config[:service_name]
85
110
  )
86
111
  end
87
112
 
88
- def self.activate_active_record!(config)
113
+ def self.activate_active_record!(datadog_config, rails_config)
89
114
  return unless defined?(::ActiveRecord)
90
115
 
91
- Datadog.configuration.use(
116
+ datadog_config.use(
92
117
  :active_record,
93
- service_name: config[:database_service],
94
- tracer: config[:tracer]
118
+ service_name: rails_config[:database_service]
95
119
  )
96
120
  end
97
121
  end
@@ -1,4 +1,6 @@
1
1
  require 'ddtrace/contrib/integration'
2
+
3
+ require 'ddtrace/contrib/rails/ext'
2
4
  require 'ddtrace/contrib/rails/configuration/settings'
3
5
  require 'ddtrace/contrib/rails/patcher'
4
6
 
@@ -9,19 +11,24 @@ module Datadog
9
11
  class Integration
10
12
  include Contrib::Integration
11
13
 
14
+ MINIMUM_VERSION = Gem::Version.new('3.0')
15
+
12
16
  register_as :rails, auto_patch: false
13
17
 
14
18
  def self.version
15
- Gem.loaded_specs['rails'] && Gem.loaded_specs['rails'].version
19
+ Gem.loaded_specs['railties'] && Gem.loaded_specs['railties'].version
16
20
  end
17
21
 
18
- def self.present?
19
- defined?(::Rails)
22
+ def self.loaded?
23
+ !defined?(::Rails).nil?
20
24
  end
21
25
 
22
26
  def self.compatible?
23
- return false if ENV['DISABLE_DATADOG_RAILS']
24
- super && defined?(::Rails::VERSION) && ::Rails::VERSION::MAJOR.to_i >= 3
27
+ super && version >= MINIMUM_VERSION
28
+ end
29
+
30
+ def self.patchable?
31
+ super && !ENV.key?(Ext::ENV_DISABLE)
25
32
  end
26
33
 
27
34
  def default_configuration
@@ -0,0 +1,81 @@
1
+ module Datadog
2
+ module Contrib
3
+ # Instrument Rails.
4
+ module Rails
5
+ # Rails log injection helper methods
6
+ module LogInjection
7
+ module_function
8
+
9
+ def add_lograge_logger(app)
10
+ # custom_options defaults to nil and can be either a hash or a lambda which returns a hash
11
+ # https://github.com/roidrage/lograge/blob/1729eab7956bb95c5992e4adab251e4f93ff9280/lib/lograge.rb#L28
12
+ if (custom_options = app.config.lograge.custom_options).nil?
13
+ # if it's not set, we set to a lambda that returns DD tracing context
14
+ app.config.lograge.custom_options = lambda do |_event|
15
+ # Retrieves trace information for current thread
16
+ correlation = Datadog.tracer.active_correlation
17
+
18
+ datadog_trace_log_hash(correlation)
19
+ end
20
+ # check if lambda, if so then define a new lambda which invokes the original lambda and
21
+ # merges the returned hash with the the DD tracing context hash.
22
+ elsif custom_options.respond_to?(:call)
23
+ app.config.lograge.custom_options = lambda do |event|
24
+ # invoke original lambda
25
+ result = custom_options.call(event)
26
+ # Retrieves trace information for current thread
27
+ correlation = Datadog.tracer.active_correlation
28
+ # merge original lambda with datadog context
29
+ result.merge(datadog_trace_log_hash(correlation))
30
+ end
31
+ # otherwise if it's just a static hash, we have to wrap that hash in a lambda to retrieve
32
+ # the DD tracing context, then merge the tracing context with the original static hash.
33
+ # don't modify if custom_options is not an accepted format.
34
+ elsif custom_options.is_a?(Hash)
35
+ app.config.lograge.custom_options = lambda do |_event|
36
+ # Retrieves trace information for current thread
37
+ correlation = Datadog.tracer.active_correlation
38
+
39
+ # merge original lambda with datadog context
40
+ custom_options.merge(datadog_trace_log_hash(correlation))
41
+ end
42
+ end
43
+ rescue StandardError => e
44
+ # TODO: can we use Datadog.logger at this point?
45
+ Datadog.logger.warn("Unable to add Datadog Trace context to Lograge: #{e.message}")
46
+ false
47
+ end
48
+
49
+ def add_as_tagged_logging_logger(app)
50
+ # we want to check if the current logger is a tagger logger instance
51
+ # log_tags defaults to nil so we have to set as an array if nothing exists yet
52
+ if (log_tags = app.config.log_tags).nil?
53
+ app.config.log_tags = [proc { Datadog.tracer.active_correlation.to_s }]
54
+ # if existing log_tags configuration exists, append to the end of the array
55
+ elsif log_tags.is_a?(Array)
56
+ app.config.log_tags << proc { Datadog.tracer.active_correlation.to_s }
57
+ end
58
+ rescue StandardError => e
59
+ # TODO: can we use Datadog.logger at this point?
60
+ Datadog.logger.warn("Unable to add Datadog Trace context to ActiveSupport::TaggedLogging: #{e.message}")
61
+ false
62
+ end
63
+
64
+ def datadog_trace_log_hash(correlation)
65
+ {
66
+ # Adds IDs as tags to log output
67
+ dd: {
68
+ # To preserve precision during JSON serialization, use strings for large numbers
69
+ trace_id: correlation.trace_id.to_s,
70
+ span_id: correlation.span_id.to_s,
71
+ env: correlation.env.to_s,
72
+ service: correlation.service.to_s,
73
+ version: correlation.version.to_s
74
+ },
75
+ ddsource: ['ruby']
76
+ }
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -24,11 +24,16 @@ module Datadog
24
24
  rescue Exception => e
25
25
  tracer = Datadog.configuration[:rails][:tracer]
26
26
  span = tracer.active_span
27
- unless span.nil?
27
+ if !span.nil? && ActionPack::Utils.exception_is_error?(e)
28
28
  # Only set error if it's supposed to be flagged as such
29
29
  # e.g. we don't want to flag 404s.
30
30
  # You can add custom errors via `config.action_dispatch.rescue_responses`
31
- span.set_error(e) if ActionPack::Utils.exception_is_error?(e)
31
+ span.set_error(e)
32
+
33
+ # Some exception gets handled by Rails middleware before it can be set on Rack middleware
34
+ # The rack span is the root span of the request and should make sure it has the full exception
35
+ # set on it.
36
+ env[:datadog_rack_request_span].set_error(e) if env[:datadog_rack_request_span]
32
37
  end
33
38
  raise e
34
39
  end
@@ -1,6 +1,7 @@
1
1
  require 'ddtrace/contrib/rails/utils'
2
2
  require 'ddtrace/contrib/rails/framework'
3
3
  require 'ddtrace/contrib/rails/middlewares'
4
+ require 'ddtrace/contrib/rails/log_injection'
4
5
  require 'ddtrace/contrib/rack/middlewares'
5
6
 
6
7
  module Datadog
@@ -12,17 +13,13 @@ module Datadog
12
13
 
13
14
  module_function
14
15
 
15
- def patched?
16
- done?(:rails)
16
+ def target_version
17
+ Integration.version
17
18
  end
18
19
 
19
20
  def patch
20
- do_once(:rails) do
21
- patch_before_intialize
22
- patch_after_intialize
23
- end
24
- rescue => e
25
- Datadog::Tracer.log.error("Unable to apply Rails integration: #{e}")
21
+ patch_before_intialize
22
+ patch_after_intialize
26
23
  end
27
24
 
28
25
  def patch_before_intialize
@@ -37,6 +34,7 @@ module Datadog
37
34
  # Otherwise the middleware stack will be frozen.
38
35
  # Sometimes we don't want to activate middleware e.g. OpenTracing, etc.
39
36
  add_middleware(app) if Datadog.configuration[:rails][:middleware]
37
+ add_logger(app) if Datadog.configuration[:rails][:log_injection]
40
38
  end
41
39
  end
42
40
 
@@ -54,6 +52,19 @@ module Datadog
54
52
  )
55
53
  end
56
54
 
55
+ def add_logger(app)
56
+ # check if lograge key exists
57
+ if app.config.respond_to?(:lograge) && app.config.lograge.enabled
58
+ Datadog::Contrib::Rails::LogInjection.add_lograge_logger(app)
59
+ # if lograge isn't set, check if tagged logged is enabed.
60
+ # if so, add proc that injects trace identifiers for tagged logging.
61
+ elsif (logger = app.config.logger) && logger.is_a?(::ActiveSupport::TaggedLogging)
62
+ Datadog::Contrib::Rails::LogInjection.add_as_tagged_logging_logger(app)
63
+ else
64
+ Datadog.logger.warn("Unabe to enable Datadog Trace context, Logger #{logger} is not supported")
65
+ end
66
+ end
67
+
57
68
  def patch_after_intialize
58
69
  ::ActiveSupport.on_load(:after_initialize) do
59
70
  Datadog::Contrib::Rails::Patcher.after_intialize(self)
@@ -7,17 +7,21 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Rake integration
9
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
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
20
- option :enabled, default: true
21
25
  option :quantize, default: {}
22
26
  option :service_name, default: Ext::SERVICE_NAME
23
27
  end