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
@@ -26,8 +26,18 @@ module Datadog
26
26
  # Load and extend Contrib by default
27
27
  require 'ddtrace/contrib/extensions'
28
28
  extend Contrib::Extensions
29
+
30
+ # Load and extend OpenTelemetry compatibility by default
31
+ require 'ddtrace/opentelemetry/extensions'
32
+ extend OpenTelemetry::Extensions
33
+
34
+ # Add shutdown hook:
35
+ # Ensures the tracer has an opportunity to flush traces
36
+ # and cleanup before terminating the process.
37
+ at_exit { Datadog.shutdown! }
29
38
  end
30
39
 
40
+ require 'ddtrace/contrib/action_cable/integration'
31
41
  require 'ddtrace/contrib/action_pack/integration'
32
42
  require 'ddtrace/contrib/action_view/integration'
33
43
  require 'ddtrace/contrib/active_model_serializers/integration'
@@ -45,7 +55,11 @@ require 'ddtrace/contrib/grape/integration'
45
55
  require 'ddtrace/contrib/graphql/integration'
46
56
  require 'ddtrace/contrib/grpc/integration'
47
57
  require 'ddtrace/contrib/http/integration'
58
+ require 'ddtrace/contrib/httprb/integration'
48
59
  require 'ddtrace/contrib/integration'
60
+ require 'ddtrace/contrib/kafka/integration'
61
+ require 'ddtrace/contrib/presto/integration'
62
+ require 'ddtrace/contrib/que/integration'
49
63
  require 'ddtrace/contrib/mysql2/integration'
50
64
  require 'ddtrace/contrib/mongodb/integration'
51
65
  require 'ddtrace/contrib/racecar/integration'
@@ -59,5 +73,6 @@ require 'ddtrace/contrib/sequel/integration'
59
73
  require 'ddtrace/contrib/shoryuken/integration'
60
74
  require 'ddtrace/contrib/sidekiq/integration'
61
75
  require 'ddtrace/contrib/sinatra/integration'
76
+ require 'ddtrace/contrib/sneakers/integration'
62
77
  require 'ddtrace/contrib/sucker_punch/integration'
63
78
  require 'ddtrace/monkey'
@@ -8,6 +8,13 @@ module Datadog
8
8
  return if span.nil? || !sample_rate.is_a?(Numeric)
9
9
  span.set_metric(Datadog::Ext::Analytics::TAG_SAMPLE_RATE, sample_rate)
10
10
  end
11
+
12
+ def set_measured(span, value = true)
13
+ return if span.nil?
14
+ # rubocop:disable Style/MultipleComparison
15
+ value = value == true || value == 1 ? 1 : 0
16
+ span.set_metric(Datadog::Ext::Analytics::TAG_MEASURED, value)
17
+ end
11
18
  end
12
19
 
13
20
  # Extension for Datadog::Span
@@ -83,7 +83,7 @@ module Datadog
83
83
  @buffer_accepted += 1
84
84
  @buffer_accepted_lengths += trace.length
85
85
  rescue StandardError => e
86
- Datadog::Tracer.log.debug("Failed to measure queue accept. Cause: #{e.message} Source: #{e.backtrace.first}")
86
+ Datadog.logger.debug("Failed to measure queue accept. Cause: #{e.message} Source: #{e.backtrace.first}")
87
87
  end
88
88
 
89
89
  def measure_drop(trace)
@@ -91,21 +91,21 @@ module Datadog
91
91
  @buffer_spans -= trace.length
92
92
  @buffer_accepted_lengths -= trace.length
93
93
  rescue StandardError => e
94
- Datadog::Tracer.log.debug("Failed to measure queue drop. Cause: #{e.message} Source: #{e.backtrace.first}")
94
+ Datadog.logger.debug("Failed to measure queue drop. Cause: #{e.message} Source: #{e.backtrace.first}")
95
95
  end
96
96
 
97
97
  def measure_pop(traces)
98
98
  # Accepted
99
- Diagnostics::Health.metrics.queue_accepted(@buffer_accepted)
100
- Diagnostics::Health.metrics.queue_accepted_lengths(@buffer_accepted_lengths)
99
+ Datadog.health_metrics.queue_accepted(@buffer_accepted)
100
+ Datadog.health_metrics.queue_accepted_lengths(@buffer_accepted_lengths)
101
101
 
102
102
  # Dropped
103
- Diagnostics::Health.metrics.queue_dropped(@buffer_dropped)
103
+ Datadog.health_metrics.queue_dropped(@buffer_dropped)
104
104
 
105
105
  # Queue gauges
106
- Diagnostics::Health.metrics.queue_max_length(@max_size)
107
- Diagnostics::Health.metrics.queue_spans(@buffer_spans)
108
- Diagnostics::Health.metrics.queue_length(traces.length)
106
+ Datadog.health_metrics.queue_max_length(@max_size)
107
+ Datadog.health_metrics.queue_spans(@buffer_spans)
108
+ Datadog.health_metrics.queue_length(traces.length)
109
109
 
110
110
  # Reset aggregated metrics
111
111
  @buffer_accepted = 0
@@ -113,7 +113,7 @@ module Datadog
113
113
  @buffer_dropped = 0
114
114
  @buffer_spans = 0
115
115
  rescue StandardError => e
116
- Datadog::Tracer.log.debug("Failed to measure queue. Cause: #{e.message} Source: #{e.backtrace.first}")
116
+ Datadog.logger.debug("Failed to measure queue. Cause: #{e.message} Source: #{e.backtrace.first}")
117
117
  end
118
118
  end
119
119
  end
@@ -0,0 +1,34 @@
1
+ require 'json'
2
+ require 'msgpack'
3
+
4
+ module Datadog
5
+ # Chunks list of elements into batches
6
+ module Chunker
7
+ module_function
8
+
9
+ # Chunks a list into batches of at most +max_chunk_size+ elements each.
10
+ #
11
+ # An exception can occur if a single element is too large. That single
12
+ # element will be returned in its own chunk. You have to verify by yourself
13
+ # when such elements are returned.
14
+ #
15
+ # @param list [Enumerable] list of elements
16
+ # @param max_chunk_size [Numeric] maximum acceptable chunk size
17
+ # @return [Enumerable] lazy list of chunks
18
+ def chunk_by_size(list, max_chunk_size)
19
+ chunk_agg = 0
20
+ list.slice_before do |elem|
21
+ size = elem.size
22
+ chunk_agg += size
23
+ if chunk_agg > max_chunk_size
24
+ # Can't fit element in current chunk, start a new one.
25
+ chunk_agg = size
26
+ true
27
+ else
28
+ # Add to current chunk
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,9 +1,14 @@
1
+ require 'forwardable'
2
+
1
3
  require 'ddtrace/configuration/pin_setup'
2
4
  require 'ddtrace/configuration/settings'
5
+ require 'ddtrace/configuration/components'
3
6
 
4
7
  module Datadog
5
8
  # Configuration provides a unique access point for configurations
6
9
  module Configuration
10
+ extend Forwardable
11
+
7
12
  attr_writer :configuration
8
13
 
9
14
  def configuration
@@ -13,18 +18,67 @@ module Datadog
13
18
  def configure(target = configuration, opts = {})
14
19
  if target.is_a?(Settings)
15
20
  yield(target) if block_given?
21
+
22
+ # Build immutable components from settings
23
+ @components ||= nil
24
+ @components = if @components
25
+ replace_components!(target, @components)
26
+ else
27
+ build_components(target)
28
+ end
29
+
30
+ target
16
31
  else
17
32
  PinSetup.new(target, opts).call
18
33
  end
19
34
  end
20
35
 
21
- # Helper methods
22
- def tracer
23
- configuration.tracer
36
+ def_delegators \
37
+ :components,
38
+ :health_metrics,
39
+ :runtime_metrics,
40
+ :tracer
41
+
42
+ def logger
43
+ if instance_variable_defined?(:@components) && @components
44
+ @temp_logger = nil
45
+ components.logger
46
+ else
47
+ # Use default logger without initializing components.
48
+ # This prevents recursive loops while initializing.
49
+ # e.g. Get logger --> Build components --> Log message --> Repeat...
50
+ @temp_logger ||= begin
51
+ logger = configuration.logger.instance || Datadog::Logger.new(STDOUT)
52
+ logger.level = configuration.diagnostics.debug ? ::Logger::DEBUG : configuration.logger.level
53
+ logger
54
+ end
55
+ end
56
+ end
57
+
58
+ def shutdown!
59
+ components.shutdown! if instance_variable_defined?(:@components) && @components
60
+ end
61
+
62
+ protected
63
+
64
+ def components
65
+ @components ||= build_components(configuration)
66
+ end
67
+
68
+ private
69
+
70
+ def build_components(settings)
71
+ components = Components.new(settings)
72
+ components.startup!(settings)
73
+ components
24
74
  end
25
75
 
26
- def runtime_metrics
27
- tracer.writer.runtime_metrics
76
+ def replace_components!(settings, old)
77
+ components = Components.new(settings)
78
+
79
+ old.shutdown!(components)
80
+ components.startup!(settings)
81
+ components
28
82
  end
29
83
  end
30
84
  end
@@ -7,6 +7,7 @@ module Datadog
7
7
  module Base
8
8
  def self.included(base)
9
9
  base.send(:extend, Datadog::Environment::Helpers)
10
+ base.send(:include, Datadog::Environment::Helpers)
10
11
  base.send(:include, Options)
11
12
 
12
13
  base.send(:extend, ClassMethods)
@@ -23,7 +24,8 @@ module Datadog
23
24
  settings_class = new_settings_class(&block)
24
25
 
25
26
  option(name) do |o|
26
- o.default settings_class.new
27
+ o.default { settings_class.new }
28
+ o.lazy
27
29
  o.resetter do |value|
28
30
  value.reset! if value.respond_to?(:reset!)
29
31
  value
@@ -43,7 +45,7 @@ module Datadog
43
45
  # Instance methods for configuration
44
46
  module InstanceMethods
45
47
  def initialize(options = {})
46
- configure(options)
48
+ configure(options) unless options.empty?
47
49
  end
48
50
 
49
51
  def configure(opts = {})
@@ -0,0 +1,151 @@
1
+ require 'ddtrace/diagnostics/health'
2
+ require 'ddtrace/logger'
3
+ require 'ddtrace/runtime/metrics'
4
+ require 'ddtrace/tracer'
5
+ require 'ddtrace/workers/runtime_metrics'
6
+
7
+ module Datadog
8
+ module Configuration
9
+ # Global components for the trace library.
10
+ # rubocop:disable Metrics/LineLength
11
+ class Components
12
+ class << self
13
+ def build_health_metrics(settings)
14
+ settings = settings.diagnostics.health_metrics
15
+ options = { enabled: settings.enabled }
16
+ options[:statsd] = settings.statsd unless settings.statsd.nil?
17
+
18
+ Datadog::Diagnostics::Health::Metrics.new(options)
19
+ end
20
+
21
+ def build_logger(settings)
22
+ logger = settings.logger.instance || Datadog::Logger.new(STDOUT)
23
+ logger.level = settings.diagnostics.debug ? ::Logger::DEBUG : settings.logger.level
24
+
25
+ logger
26
+ end
27
+
28
+ def build_runtime_metrics(settings)
29
+ options = { enabled: settings.runtime_metrics.enabled }
30
+ options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil?
31
+ options[:services] = [settings.service] unless settings.service.nil?
32
+
33
+ Datadog::Runtime::Metrics.new(options)
34
+ end
35
+
36
+ def build_runtime_metrics_worker(settings)
37
+ # NOTE: Should we just ignore building the worker if its not enabled?
38
+ options = settings.runtime_metrics.opts.merge(
39
+ enabled: settings.runtime_metrics.enabled,
40
+ metrics: build_runtime_metrics(settings)
41
+ )
42
+
43
+ Datadog::Workers::RuntimeMetrics.new(options)
44
+ end
45
+
46
+ def build_tracer(settings)
47
+ # If a custom tracer has been provided, use it instead.
48
+ # Ignore all other options (they should already be configured.)
49
+ tracer = settings.tracer.instance
50
+ return tracer unless tracer.nil?
51
+
52
+ tracer = Tracer.new(
53
+ default_service: settings.service,
54
+ enabled: settings.tracer.enabled,
55
+ partial_flush: settings.tracer.partial_flush.enabled,
56
+ tags: build_tracer_tags(settings)
57
+ )
58
+
59
+ # TODO: We reconfigure the tracer here because it has way too many
60
+ # options it allows to mutate, and it's overwhelming to rewrite
61
+ # tracer initialization for now. Just reconfigure using the
62
+ # existing mutable #configure function. Remove when these components
63
+ # are extracted.
64
+ tracer.configure(build_tracer_options(settings))
65
+
66
+ tracer
67
+ end
68
+
69
+ private
70
+
71
+ def build_tracer_tags(settings)
72
+ settings.tags.dup.tap do |tags|
73
+ tags['env'] = settings.env unless settings.env.nil?
74
+ tags['version'] = settings.version unless settings.version.nil?
75
+ end
76
+ end
77
+
78
+ def build_tracer_options(settings)
79
+ settings = settings.tracer
80
+
81
+ {}.tap do |opts|
82
+ opts[:hostname] = settings.hostname unless settings.hostname.nil?
83
+ opts[:min_spans_before_partial_flush] = settings.partial_flush.min_spans_threshold unless settings.partial_flush.min_spans_threshold.nil?
84
+ opts[:partial_flush] = settings.partial_flush.enabled unless settings.partial_flush.enabled.nil?
85
+ opts[:port] = settings.port unless settings.port.nil?
86
+ opts[:priority_sampling] = settings.priority_sampling unless settings.priority_sampling.nil?
87
+ opts[:sampler] = settings.sampler unless settings.sampler.nil?
88
+ opts[:transport_options] = settings.transport_options
89
+ opts[:writer] = settings.writer unless settings.writer.nil?
90
+ opts[:writer_options] = settings.writer_options if settings.writer.nil?
91
+ end
92
+ end
93
+ end
94
+
95
+ attr_reader \
96
+ :health_metrics,
97
+ :logger,
98
+ :runtime_metrics,
99
+ :tracer
100
+
101
+ def initialize(settings)
102
+ # Logger
103
+ @logger = self.class.build_logger(settings)
104
+
105
+ # Tracer
106
+ @tracer = self.class.build_tracer(settings)
107
+
108
+ # Runtime metrics
109
+ @runtime_metrics = self.class.build_runtime_metrics_worker(settings)
110
+
111
+ # Health metrics
112
+ @health_metrics = self.class.build_health_metrics(settings)
113
+ end
114
+
115
+ # Starts up components
116
+ def startup!(settings); end
117
+
118
+ # Shuts down all the components in use.
119
+ # If it has another instance to compare to, it will compare
120
+ # and avoid tearing down parts still in use.
121
+ def shutdown!(replacement = nil)
122
+ # Shutdown the old tracer, unless it's still being used.
123
+ # (e.g. a custom tracer instance passed in.)
124
+ tracer.shutdown! unless replacement && tracer == replacement.tracer
125
+
126
+ # Shutdown workers
127
+ runtime_metrics.enabled = false
128
+ runtime_metrics.stop(true)
129
+
130
+ # Shutdown the old metrics, unless they are still being used.
131
+ # (e.g. custom Statsd instances.)
132
+ old_statsd = [
133
+ runtime_metrics.metrics.statsd,
134
+ health_metrics.statsd
135
+ ].compact.uniq
136
+
137
+ new_statsd = if replacement
138
+ [
139
+ replacement.runtime_metrics.metrics.statsd,
140
+ replacement.health_metrics.statsd
141
+ ].compact.uniq
142
+ else
143
+ []
144
+ end
145
+
146
+ unused_statsd = (old_statsd - (old_statsd & new_statsd))
147
+ unused_statsd.each(&:close)
148
+ end
149
+ end
150
+ end
151
+ end
@@ -13,9 +13,10 @@ module Datadog
13
13
  end
14
14
 
15
15
  def set(value)
16
- (@value = context_exec(value, &definition.setter)).tap do |v|
16
+ old_value = @value
17
+ (@value = context_exec(value, old_value, &definition.setter)).tap do |v|
17
18
  @is_set = true
18
- context_exec(v, &definition.on_set) if definition.on_set
19
+ context_exec(v, old_value, &definition.on_set) if definition.on_set
19
20
  end
20
21
  end
21
22
 
@@ -25,7 +26,7 @@ module Datadog
25
26
  elsif definition.delegate_to
26
27
  context_eval(&definition.delegate_to)
27
28
  else
28
- set(definition.default_value)
29
+ set(default_value)
29
30
  end
30
31
  end
31
32
 
@@ -41,6 +42,14 @@ module Datadog
41
42
  end
42
43
  end
43
44
 
45
+ def default_value
46
+ if definition.lazy
47
+ context_eval(&definition.default)
48
+ else
49
+ definition.default
50
+ end
51
+ end
52
+
44
53
  private
45
54
 
46
55
  def context_exec(*args, &block)
@@ -4,7 +4,7 @@ module Datadog
4
4
  module Configuration
5
5
  # Represents a definition for an integration configuration option
6
6
  class OptionDefinition
7
- IDENTITY = ->(x) { x }
7
+ IDENTITY = ->(new_value, _old_value) { new_value }
8
8
 
9
9
  attr_reader \
10
10
  :default,
@@ -27,10 +27,6 @@ module Datadog
27
27
  @setter = meta[:setter] || block || IDENTITY
28
28
  end
29
29
 
30
- def default_value
31
- lazy ? @default.call : @default
32
- end
33
-
34
30
  # Creates a new Option, bound to the context provided.
35
31
  def build(context)
36
32
  Option.new(self, context)