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
@@ -4,8 +4,11 @@ module Datadog
4
4
  # HTTP integration constants
5
5
  module Ext
6
6
  APP = 'net/http'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_HTTP_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_HTTP_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTP_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTP_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'net/http'.freeze
10
13
  SPAN_REQUEST = 'http.request'.freeze
11
14
  end
@@ -5,6 +5,7 @@ require 'ddtrace/ext/http'
5
5
  require 'ddtrace/ext/net'
6
6
  require 'ddtrace/ext/distributed'
7
7
  require 'ddtrace/contrib/analytics'
8
+ require 'ddtrace/contrib/http_annotation_helper'
8
9
 
9
10
  module Datadog
10
11
  module Contrib
@@ -28,31 +29,42 @@ module Datadog
28
29
 
29
30
  # InstanceMethods - implementing instrumentation
30
31
  module InstanceMethods
32
+ include Datadog::Contrib::HttpAnnotationHelper
33
+
31
34
  def request(req, body = nil, &block) # :yield: +response+
32
- pin = datadog_pin
35
+ host, = host_and_port(req)
36
+ request_options = datadog_configuration(host)
37
+ pin = datadog_pin(request_options)
33
38
  return super(req, body, &block) unless pin && pin.tracer
34
39
 
35
- if Datadog::Contrib::HTTP.should_skip_tracing?(req, @address, @port, pin.tracer)
40
+ if Datadog::Contrib::HTTP.should_skip_tracing?(req, pin.tracer)
36
41
  return super(req, body, &block)
37
42
  end
38
43
 
39
- pin.tracer.trace(Ext::SPAN_REQUEST) do |span|
44
+ pin.tracer.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span|
40
45
  begin
41
- span.service = pin.service
46
+ # even though service_name might already be in request_options,
47
+ # we need to capture the name from the pin since it could be
48
+ # overridden
49
+ request_options[:service_name] = pin.service_name
50
+ span.service = service_name(host, request_options)
42
51
  span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
43
52
  span.resource = req.method
44
53
 
45
54
  if pin.tracer.enabled && !Datadog::Contrib::HTTP.should_skip_distributed_tracing?(pin)
46
55
  Datadog::HTTPPropagator.inject!(span.context, req)
47
56
  end
57
+
58
+ # Add additional request specific tags to the span.
59
+ annotate_span_with_request!(span, req, request_options)
48
60
  rescue StandardError => e
49
- Datadog::Tracer.log.error("error preparing span for http request: #{e}")
61
+ Datadog.logger.error("error preparing span for http request: #{e}")
50
62
  ensure
51
63
  response = super(req, body, &block)
52
64
  end
53
65
 
54
- # Add additional tags to the span.
55
- annotate_span!(span, req, response)
66
+ # Add additional response specific tags to the span.
67
+ annotate_span_with_response!(span, response)
56
68
 
57
69
  # Invoke hook, if set.
58
70
  unless Contrib::HTTP::Instrumentation.after_request.nil?
@@ -63,21 +75,22 @@ module Datadog
63
75
  end
64
76
  end
65
77
 
66
- def annotate_span!(span, request, response)
78
+ def annotate_span_with_request!(span, request, request_options)
67
79
  span.set_tag(Datadog::Ext::HTTP::URL, request.path)
68
80
  span.set_tag(Datadog::Ext::HTTP::METHOD, request.method)
69
- span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)
70
81
 
71
- if request.respond_to?(:uri) && request.uri
72
- span.set_tag(Datadog::Ext::NET::TARGET_HOST, request.uri.host)
73
- span.set_tag(Datadog::Ext::NET::TARGET_PORT, request.uri.port.to_s)
74
- else
75
- span.set_tag(Datadog::Ext::NET::TARGET_HOST, @address)
76
- span.set_tag(Datadog::Ext::NET::TARGET_PORT, @port.to_s)
77
- end
82
+ host, port = host_and_port(request)
83
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, host)
84
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, port.to_s)
78
85
 
79
86
  # Set analytics sample rate
80
- Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
87
+ set_analytics_sample_rate(span, request_options)
88
+ end
89
+
90
+ def annotate_span_with_response!(span, response)
91
+ return unless response && response.code
92
+
93
+ span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)
81
94
 
82
95
  case response.code.to_i
83
96
  when 400...599
@@ -85,27 +98,75 @@ module Datadog
85
98
  end
86
99
  end
87
100
 
88
- def datadog_pin
89
- @datadog_pin ||= begin
90
- service = Datadog.configuration[:http][:service_name]
91
- tracer = Datadog.configuration[:http][:tracer]
101
+ def annotate_span_with_error!(span, error)
102
+ span.set_error(error)
103
+ end
104
+
105
+ def set_analytics_sample_rate(span, request_options)
106
+ return unless analytics_enabled?(request_options)
107
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate(request_options))
108
+ end
92
109
 
93
- Datadog::Pin.new(service, app: Ext::APP, app_type: Datadog::Ext::AppTypes::WEB, tracer: tracer)
110
+ def datadog_pin(config = Datadog.configuration[:http])
111
+ service = config[:service_name]
112
+ tracer = config[:tracer]
113
+
114
+ @datadog_pin ||= Datadog::Pin.new(
115
+ service,
116
+ app: Ext::APP,
117
+ app_type: Datadog::Ext::AppTypes::WEB,
118
+ tracer: -> { config[:tracer] }
119
+ )
120
+
121
+ # this shockingly poor code exists to solve the case where someone
122
+ # calls datadog_pin on this object before running a request, which
123
+ # would cause the :default config to be used. If a request is then
124
+ # run for a hostname that matches a different configuration, we
125
+ # would use the wrong configs since the pin is memoized.
126
+ # The solution is to detect if we are using the default config and
127
+ # apply the new config if necessary, while still allowing custom
128
+ # values to be supplied
129
+ if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
130
+ @datadog_pin.service = service
131
+ end
132
+ if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
133
+ @datadog_pin.tracer = tracer
94
134
  end
135
+
136
+ @datadog_pin
137
+ end
138
+
139
+ def default_datadog_pin
140
+ config = Datadog.configuration[:http]
141
+ service = config[:service_name]
142
+ @default_datadog_pin ||= Datadog::Pin.new(
143
+ service,
144
+ app: Ext::APP,
145
+ app_type: Datadog::Ext::AppTypes::WEB,
146
+ tracer: -> { config[:tracer] }
147
+ )
95
148
  end
96
149
 
97
150
  private
98
151
 
99
- def datadog_configuration
100
- Datadog.configuration[:http]
152
+ def host_and_port(request)
153
+ if request.respond_to?(:uri) && request.uri
154
+ [request.uri.host, request.uri.port]
155
+ else
156
+ [@address, @port]
157
+ end
158
+ end
159
+
160
+ def datadog_configuration(host = :default)
161
+ Datadog.configuration[:http, host]
101
162
  end
102
163
 
103
- def analytics_enabled?
104
- Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
164
+ def analytics_enabled?(request_options)
165
+ Contrib::Analytics.enabled?(request_options[:analytics_enabled])
105
166
  end
106
167
 
107
- def analytics_sample_rate
108
- datadog_configuration[:analytics_sample_rate]
168
+ def analytics_sample_rate(request_options)
169
+ request_options[:analytics_sample_rate]
109
170
  end
110
171
  end
111
172
  end
@@ -1,5 +1,8 @@
1
+ require 'ddtrace/version'
2
+
1
3
  require 'ddtrace/contrib/integration'
2
4
  require 'ddtrace/contrib/http/configuration/settings'
5
+ require 'ddtrace/contrib/configuration/resolvers/pattern_resolver'
3
6
  require 'ddtrace/contrib/http/patcher'
4
7
  require 'ddtrace/contrib/http/circuit_breaker'
5
8
 
@@ -13,12 +16,18 @@ module Datadog
13
16
  class Integration
14
17
  include Contrib::Integration
15
18
 
19
+ MINIMUM_VERSION = Datadog::VERSION::MINIMUM_RUBY_VERSION
20
+
16
21
  register_as :http, auto_patch: true
17
22
 
18
23
  def self.version
19
24
  Gem::Version.new(RUBY_VERSION)
20
25
  end
21
26
 
27
+ def self.loaded?
28
+ !defined?(::Net::HTTP).nil?
29
+ end
30
+
22
31
  def default_configuration
23
32
  Configuration::Settings.new
24
33
  end
@@ -26,6 +35,10 @@ module Datadog
26
35
  def patcher
27
36
  Patcher
28
37
  end
38
+
39
+ def resolver
40
+ @resolver ||= Contrib::Configuration::Resolvers::PatternResolver.new
41
+ end
29
42
  end
30
43
  end
31
44
  end
@@ -12,19 +12,13 @@ module Datadog
12
12
 
13
13
  module_function
14
14
 
15
- def patched?
16
- done?(:http)
15
+ def target_version
16
+ Integration.version
17
17
  end
18
18
 
19
19
  # patch applies our patch if needed
20
20
  def patch
21
- do_once(:http) do
22
- begin
23
- ::Net::HTTP.send(:include, Instrumentation)
24
- rescue StandardError => e
25
- Datadog::Tracer.log.error("Unable to apply net/http integration: #{e}")
26
- end
27
- end
21
+ ::Net::HTTP.send(:include, Instrumentation)
28
22
  end
29
23
  end
30
24
  end
@@ -0,0 +1,10 @@
1
+ module Datadog
2
+ module Contrib
3
+ # Contains methods helpful for tracing/annotating HTTP request libraries
4
+ module HttpAnnotationHelper
5
+ def service_name(hostname, configuration_options)
6
+ configuration_options[:split_by_domain] ? hostname : configuration_options[:service_name]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,32 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/httprb/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Httprb
7
+ module Configuration
8
+ # Custom settings for the Httprb 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 :distributed_tracing, default: true
26
+ option :service_name, default: Ext::SERVICE_NAME
27
+ option :split_by_domain, default: false
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Httprb
4
+ # Httprb integration constants
5
+ module Ext
6
+ APP = 'httprb'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_HTTPRB_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTPRB_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTPRB_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_EHTTPRB_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTPRB_ANALYTICS_SAMPLE_RATE'.freeze
12
+ SERVICE_NAME = 'httprb'.freeze
13
+ SPAN_REQUEST = 'httprb.request'.freeze
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,160 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/ext/http'
3
+ require 'ddtrace/ext/net'
4
+ require 'ddtrace/ext/distributed'
5
+ require 'ddtrace/contrib/analytics'
6
+ require 'ddtrace/propagation/http_propagator'
7
+ require 'ddtrace/contrib/http_annotation_helper'
8
+
9
+ module Datadog
10
+ module Contrib
11
+ module Httprb
12
+ # Instrumentation for Httprb
13
+ module Instrumentation
14
+ def self.included(base)
15
+ base.send(:prepend, InstanceMethods)
16
+ end
17
+
18
+ # Instance methods for configuration
19
+ # rubocop:disable Metrics/ModuleLength
20
+ module InstanceMethods
21
+ include Datadog::Contrib::HttpAnnotationHelper
22
+
23
+ def perform(req, options)
24
+ host = req.uri.host if req.respond_to?(:uri) && req.uri
25
+ request_options = datadog_configuration(host)
26
+ pin = datadog_pin(request_options)
27
+
28
+ return super(req, options) unless pin && pin.tracer
29
+
30
+ pin.tracer.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span|
31
+ begin
32
+ request_options[:service_name] = pin.service_name
33
+ span.service = service_name(host, request_options)
34
+ span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
35
+
36
+ if pin.tracer.enabled && !should_skip_distributed_tracing?(pin)
37
+ Datadog::HTTPPropagator.inject!(span.context, req)
38
+ end
39
+
40
+ # Add additional request specific tags to the span.
41
+ annotate_span_with_request!(span, req, request_options)
42
+ rescue StandardError => e
43
+ logger.error("error preparing span for http.rb request: #{e}, Soure: #{e.backtrace}")
44
+ ensure
45
+ res = super(req, options)
46
+ end
47
+
48
+ # Add additional response specific tags to the span.
49
+ annotate_span_with_response!(span, res)
50
+
51
+ res
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def annotate_span_with_request!(span, req, req_options)
58
+ if req.verb && req.verb.is_a?(String) || req.verb.is_a?(Symbol)
59
+ http_method = req.verb.to_s.upcase
60
+ span.resource = http_method
61
+ span.set_tag(Datadog::Ext::HTTP::METHOD, http_method)
62
+ else
63
+ logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing request verb")
64
+ end
65
+
66
+ if req.uri
67
+ uri = req.uri
68
+ span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
69
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
70
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
71
+ else
72
+ logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing uri")
73
+ end
74
+
75
+ set_analytics_sample_rate(span, req_options)
76
+ end
77
+
78
+ def annotate_span_with_response!(span, response)
79
+ return unless response && response.code
80
+
81
+ span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)
82
+
83
+ case response.code.to_i
84
+ when 400...599
85
+ # https://github.com/DataDog/dd-trace-rb/issues/1116
86
+ # parsing the response body message will alter downstream application behavior
87
+ span.set_error(["Error #{response.code}", 'Error'])
88
+ end
89
+ end
90
+
91
+ def annotate_span_with_error!(span, error)
92
+ span.set_error(error)
93
+ end
94
+
95
+ def datadog_pin(config = Datadog.configuration[:httprb])
96
+ service = config[:service_name]
97
+ tracer = config[:tracer]
98
+
99
+ @datadog_pin ||= begin
100
+ Datadog::Pin.new(
101
+ service,
102
+ app: Ext::APP,
103
+ app_type: Datadog::Ext::AppTypes::WEB,
104
+ tracer: -> { config[:tracer] }
105
+ )
106
+ end
107
+
108
+ if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
109
+ @datadog_pin.service = service
110
+ end
111
+ if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
112
+ @datadog_pin.tracer = tracer
113
+ end
114
+
115
+ @datadog_pin
116
+ end
117
+
118
+ def default_datadog_pin
119
+ config = Datadog.configuration[:httprb]
120
+ service = config[:service_name]
121
+
122
+ @default_datadog_pin ||= begin
123
+ Datadog::Pin.new(
124
+ service,
125
+ app: Ext::APP,
126
+ app_type: Datadog::Ext::AppTypes::WEB,
127
+ tracer: -> { config[:tracer] }
128
+ )
129
+ end
130
+ end
131
+
132
+ def datadog_configuration(host = :default)
133
+ Datadog.configuration[:httprb, host]
134
+ end
135
+
136
+ def analytics_enabled?(request_options)
137
+ Contrib::Analytics.enabled?(request_options[:analytics_enabled])
138
+ end
139
+
140
+ def logger
141
+ Datadog.logger
142
+ end
143
+
144
+ def should_skip_distributed_tracing?(pin)
145
+ if pin.config && pin.config.key?(:distributed_tracing)
146
+ return !pin.config[:distributed_tracing]
147
+ end
148
+
149
+ !Datadog.configuration[:httprb][:distributed_tracing]
150
+ end
151
+
152
+ def set_analytics_sample_rate(span, request_options)
153
+ return unless analytics_enabled?(request_options)
154
+ Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end