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
@@ -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)