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
@@ -70,12 +70,17 @@ module Datadog
70
70
  options[name].get
71
71
  end
72
72
 
73
+ def reset_option(name)
74
+ assert_valid_option!(name)
75
+ options[name].reset if options.key?(name)
76
+ end
77
+
73
78
  def option_defined?(name)
74
79
  self.class.options.key?(name)
75
80
  end
76
81
 
77
82
  def options_hash
78
- options.each_with_object({}) do |(key, _), hash|
83
+ self.class.options.merge(options).each_with_object({}) do |(key, _), hash|
79
84
  hash[key] = get_option(key)
80
85
  end
81
86
  end
@@ -13,7 +13,7 @@ module Datadog
13
13
 
14
14
  ATTRS.each { |key| pin.public_send("#{key}=", opts[key]) if opts[key] }
15
15
 
16
- pin.config = opts.reject { |key, _| ATTRS.include?(key) }
16
+ pin.config = opts.reject { |key, _| ATTRS.include?(key) || DEPRECATED_ATTRS.include?(key) }
17
17
 
18
18
  true
19
19
  end
@@ -22,7 +22,8 @@ module Datadog
22
22
 
23
23
  attr_reader :pin, :opts
24
24
 
25
- ATTRS = [:app, :tags, :app_type, :name, :tracer, :service_name].freeze
25
+ ATTRS = [:app, :tags, :app_type, :name, :service_name].freeze
26
+ DEPRECATED_ATTRS = [:tracer].freeze
26
27
 
27
28
  private_constant :ATTRS
28
29
  end
@@ -1,35 +1,63 @@
1
+ require 'logger'
1
2
  require 'ddtrace/configuration/base'
2
3
 
3
4
  require 'ddtrace/ext/analytics'
4
5
  require 'ddtrace/ext/distributed'
5
6
  require 'ddtrace/ext/runtime'
6
-
7
- require 'ddtrace/tracer'
8
- require 'ddtrace/metrics'
9
- require 'ddtrace/diagnostics/health'
7
+ require 'ddtrace/ext/sampling'
10
8
 
11
9
  module Datadog
12
10
  module Configuration
13
11
  # Global configuration settings for the trace library.
12
+ # rubocop:disable Metrics/ClassLength
14
13
  class Settings
15
14
  include Base
16
15
 
17
16
  #
18
17
  # Configuration options
19
18
  #
19
+ settings :analytics do
20
+ option :enabled do |o|
21
+ o.default { env_to_bool(Ext::Analytics::ENV_TRACE_ANALYTICS_ENABLED, nil) }
22
+ o.lazy
23
+ end
24
+ end
25
+
20
26
  option :analytics_enabled do |o|
21
- o.default { env_to_bool(Ext::Analytics::ENV_TRACE_ANALYTICS_ENABLED, nil) }
22
- o.lazy
27
+ o.delegate_to { get_option(:analytics).enabled }
28
+ o.on_set do |value|
29
+ # TODO: Raise deprecation warning
30
+ get_option(:analytics).enabled = value
31
+ end
23
32
  end
24
33
 
25
- option :report_hostname do |o|
26
- o.default { env_to_bool(Ext::NET::ENV_REPORT_HOSTNAME, false) }
34
+ option :api_key do |o|
35
+ o.default { ENV.fetch(Ext::Environment::ENV_API_KEY, nil) }
27
36
  o.lazy
28
37
  end
29
38
 
30
- option :runtime_metrics_enabled do |o|
31
- o.default { env_to_bool(Ext::Runtime::Metrics::ENV_ENABLED, false) }
32
- o.lazy
39
+ settings :diagnostics do
40
+ option :debug do |o|
41
+ o.default { env_to_bool(Datadog::Ext::Diagnostics::DD_TRACE_DEBUG, false) }
42
+ o.lazy
43
+ end
44
+
45
+ settings :health_metrics do
46
+ option :enabled do |o|
47
+ o.default { env_to_bool(Datadog::Ext::Diagnostics::Health::Metrics::ENV_ENABLED, false) }
48
+ o.lazy
49
+ end
50
+
51
+ option :statsd
52
+ end
53
+
54
+ settings :startup_logs do
55
+ option :enabled do |o|
56
+ # Defaults to nil as we want to know when the default value is being used
57
+ o.default { env_to_bool(Datadog::Ext::Diagnostics::DD_TRACE_STARTUP_LOGS, nil) }
58
+ o.lazy
59
+ end
60
+ end
33
61
  end
34
62
 
35
63
  settings :distributed_tracing do
@@ -56,49 +84,195 @@ module Datadog
56
84
  end
57
85
  end
58
86
 
59
- settings :diagnostics do
60
- option :health_metrics do |o|
61
- o.default do
62
- Datadog::Diagnostics::Health::Metrics.new(
63
- enabled: env_to_bool(Datadog::Ext::Diagnostics::Health::Metrics::ENV_ENABLED, false)
64
- )
65
- end
87
+ option :env do |o|
88
+ o.default { ENV.fetch(Ext::Environment::ENV_ENVIRONMENT, nil) }
89
+ o.lazy
90
+ end
91
+
92
+ settings :logger do
93
+ option :instance do |o|
94
+ o.setter { |value, old_value| value.is_a?(::Logger) ? value : old_value }
95
+ o.on_set { |value| set_option(:level, value.level) unless value.nil? }
96
+ end
97
+
98
+ option :level, default: ::Logger::INFO
99
+ end
100
+
101
+ def logger=(logger)
102
+ get_option(:logger).instance = logger
103
+ end
104
+
105
+ option :report_hostname do |o|
106
+ o.default { env_to_bool(Ext::NET::ENV_REPORT_HOSTNAME, false) }
107
+ o.lazy
108
+ end
109
+
110
+ settings :runtime_metrics do
111
+ option :enabled do |o|
112
+ o.default { env_to_bool(Ext::Runtime::Metrics::ENV_ENABLED, false) }
113
+ o.lazy
114
+ end
115
+
116
+ option :opts, default: ->(_i) { {} }, lazy: true
117
+ option :statsd
118
+ end
119
+
120
+ # Backwards compatibility for configuring runtime metrics e.g. `c.runtime_metrics enabled: true`
121
+ def runtime_metrics(options = nil)
122
+ settings = get_option(:runtime_metrics)
123
+ return settings if options.nil?
124
+
125
+ # If options were provided (old style) then raise warnings and apply them:
126
+ # TODO: Raise deprecation warning
127
+ settings.enabled = options[:enabled] if options.key?(:enabled)
128
+ settings.statsd = options[:statsd] if options.key?(:statsd)
129
+ settings
130
+ end
131
+
132
+ option :runtime_metrics_enabled do |o|
133
+ o.delegate_to { get_option(:runtime_metrics).enabled }
134
+ o.on_set do |value|
135
+ # TODO: Raise deprecation warning
136
+ get_option(:runtime_metrics).enabled = value
137
+ end
138
+ end
139
+
140
+ settings :sampling do
141
+ option :default_rate do |o|
142
+ o.default { env_to_float(Ext::Sampling::ENV_SAMPLE_RATE, nil) }
143
+ o.lazy
144
+ end
66
145
 
146
+ option :rate_limit do |o|
147
+ o.default { env_to_float(Ext::Sampling::ENV_RATE_LIMIT, 100) }
67
148
  o.lazy
68
149
  end
69
150
  end
70
151
 
71
- option :tracer do |o|
72
- o.default Tracer.new
152
+ option :service do |o|
153
+ o.default { ENV.fetch(Ext::Environment::ENV_SERVICE, nil) }
154
+ o.lazy
155
+ end
156
+
157
+ option :site do |o|
158
+ o.default { ENV.fetch(Ext::Environment::ENV_SITE, nil) }
159
+ o.lazy
160
+ end
161
+
162
+ option :tags do |o|
163
+ o.default do
164
+ tags = {}
165
+
166
+ # Parse tags from environment
167
+ env_to_list(Ext::Environment::ENV_TAGS).each do |tag|
168
+ pair = tag.split(':')
169
+ tags[pair.first] = pair.last if pair.length == 2
170
+ end
171
+
172
+ # Override tags if defined
173
+ tags[Ext::Environment::TAG_ENV] = env unless env.nil?
174
+ tags[Ext::Environment::TAG_VERSION] = version unless version.nil?
73
175
 
74
- # On reset, shut down the old tracer,
75
- # then instantiate a new one.
76
- o.resetter do |tracer|
77
- tracer.shutdown!
78
- Tracer.new
176
+ tags
79
177
  end
80
178
 
81
- # Backwards compatibility for configuring tracer e.g. `c.tracer debug: true`
82
- o.helper :tracer do |options = nil|
83
- tracer = options && options.key?(:instance) ? set_option(:tracer, options[:instance]) : get_option(:tracer)
179
+ o.setter do |new_value, old_value|
180
+ # Coerce keys to strings
181
+ string_tags = Hash[new_value.collect { |k, v| [k.to_s, v] }]
182
+
183
+ # Cross-populate tag values with other settings
184
+ if env.nil? && string_tags.key?(Ext::Environment::TAG_ENV)
185
+ self.env = string_tags[Ext::Environment::TAG_ENV]
186
+ end
187
+
188
+ if version.nil? && string_tags.key?(Ext::Environment::TAG_VERSION)
189
+ self.version = string_tags[Ext::Environment::TAG_VERSION]
190
+ end
84
191
 
85
- tracer.tap do |t|
86
- unless options.nil?
87
- t.configure(options)
88
- t.class.log = options[:log] if options[:log]
89
- t.set_tags(options[:tags]) if options[:tags]
90
- t.set_tags(env: options[:env]) if options[:env]
91
- t.class.debug_logging = options.fetch(:debug, false)
92
- end
192
+ if service.nil? && string_tags.key?(Ext::Environment::TAG_SERVICE)
193
+ self.service = string_tags[Ext::Environment::TAG_SERVICE]
93
194
  end
195
+
196
+ # Merge with previous tags
197
+ (old_value || {}).merge(string_tags)
94
198
  end
199
+
200
+ o.lazy
95
201
  end
96
202
 
97
- def runtime_metrics(options = nil)
98
- runtime_metrics = get_option(:tracer).writer.runtime_metrics
99
- return runtime_metrics if options.nil?
203
+ settings :tracer do
204
+ option :enabled do |o|
205
+ o.default { env_to_bool(Datadog::Ext::Diagnostics::DD_TRACE_ENABLED, true) }
206
+ o.lazy
207
+ end
208
+ option :hostname # TODO: Deprecate
209
+ option :instance
100
210
 
101
- runtime_metrics.configure(options)
211
+ settings :partial_flush do
212
+ option :enabled, default: false
213
+ option :min_spans_threshold
214
+ end
215
+
216
+ option :port # TODO: Deprecate
217
+ option :priority_sampling # TODO: Deprecate
218
+ option :sampler
219
+ option :transport_options, default: ->(_i) { {} }, lazy: true # TODO: Deprecate
220
+ option :writer # TODO: Deprecate
221
+ option :writer_options, default: ->(_i) { {} }, lazy: true # TODO: Deprecate
222
+ end
223
+
224
+ # Backwards compatibility for configuring tracer e.g. `c.tracer debug: true`
225
+ def tracer(options = nil)
226
+ settings = get_option(:tracer)
227
+ return settings if options.nil?
228
+
229
+ # If options were provided (old style) then raise warnings and apply them:
230
+ options = options.dup
231
+
232
+ if options.key?(:log)
233
+ # TODO: Raise deprecation warning
234
+ get_option(:logger).instance = options.delete(:log)
235
+ end
236
+
237
+ if options.key?(:tags)
238
+ # TODO: Raise deprecation warning
239
+ set_option(:tags, options.delete(:tags))
240
+ end
241
+
242
+ if options.key?(:env)
243
+ # TODO: Raise deprecation warning
244
+ set_option(:env, options.delete(:env))
245
+ end
246
+
247
+ if options.key?(:debug)
248
+ # TODO: Raise deprecation warning
249
+ get_option(:diagnostics).debug = options.delete(:debug)
250
+ end
251
+
252
+ if options.key?(:partial_flush)
253
+ # TODO: Raise deprecation warning
254
+ settings.partial_flush.enabled = options.delete(:partial_flush)
255
+ end
256
+
257
+ if options.key?(:min_spans_before_partial_flush)
258
+ # TODO: Raise deprecation warning
259
+ settings.partial_flush.min_spans_threshold = options.delete(:min_spans_before_partial_flush)
260
+ end
261
+
262
+ # Forward remaining options to settings
263
+ options.each do |key, value|
264
+ setter = :"#{key}="
265
+ settings.send(setter, value) if settings.respond_to?(setter)
266
+ end
267
+ end
268
+
269
+ def tracer=(tracer)
270
+ get_option(:tracer).instance = tracer
271
+ end
272
+
273
+ option :version do |o|
274
+ o.default { ENV.fetch(Ext::Environment::ENV_VERSION, nil) }
275
+ o.lazy
102
276
  end
103
277
  end
104
278
  end
@@ -1,4 +1,8 @@
1
1
  require 'thread'
2
+ require 'ddtrace/diagnostics/health'
3
+
4
+ require 'ddtrace/context_flush'
5
+ require 'ddtrace/context_provider'
2
6
 
3
7
  module Datadog
4
8
  # \Context is used to keep track of a hierarchy of spans for the current
@@ -89,9 +93,17 @@ module Datadog
89
93
  # by default has 10000 spans, all of which belong to unfinished parts of a
90
94
  # larger trace. This is a catch-all to reduce global memory usage.
91
95
  if @max_length > 0 && @trace.length >= @max_length
92
- Datadog::Tracer.log.debug("context full, ignoring span #{span.name}")
93
96
  # Detach the span from any context, it's being dropped and ignored.
94
97
  span.context = nil
98
+ Datadog.logger.debug("context full, ignoring span #{span.name}")
99
+
100
+ # If overflow has already occurred, don't send this metric.
101
+ # Prevents metrics spam if buffer repeatedly overflows for the same trace.
102
+ unless @overflow
103
+ Datadog.health_metrics.error_context_overflow(1, tags: ["max_length:#{@max_length}"])
104
+ @overflow = true
105
+ end
106
+
95
107
  return
96
108
  end
97
109
  set_current_span(span)
@@ -111,12 +123,18 @@ module Datadog
111
123
  # on per-instrumentation code to retrieve handle parent/child relations.
112
124
  set_current_span(span.parent)
113
125
  return if span.tracer.nil?
114
- return unless Datadog::Tracer.debug_logging
115
- if span.parent.nil? && !check_finished_spans
116
- opened_spans = @trace.length - @finished_spans
117
- Datadog::Tracer.log.debug("root span #{span.name} closed but has #{opened_spans} unfinished spans:")
118
- @trace.each do |s|
119
- Datadog::Tracer.log.debug("unfinished span: #{s}") unless s.finished?
126
+ if span.parent.nil? && !all_spans_finished?
127
+ if Datadog.configuration.diagnostics.debug
128
+ opened_spans = @trace.length - @finished_spans
129
+ Datadog.logger.debug("root span #{span.name} closed but has #{opened_spans} unfinished spans:")
130
+ end
131
+
132
+ @trace.reject(&:finished?).group_by(&:name).each do |unfinished_span_name, unfinished_spans|
133
+ Datadog.logger.debug("unfinished span: #{unfinished_spans.first}") if Datadog.configuration.diagnostics.debug
134
+ Datadog.health_metrics.error_unfinished_spans(
135
+ unfinished_spans.length,
136
+ tags: ["name:#{unfinished_span_name}"]
137
+ )
120
138
  end
121
139
  end
122
140
  end
@@ -126,7 +144,14 @@ module Datadog
126
144
  # is considered finished if all spans in this context are finished.
127
145
  def finished?
128
146
  @mutex.synchronize do
129
- return check_finished_spans
147
+ return all_spans_finished?
148
+ end
149
+ end
150
+
151
+ # @@return [Numeric] numbers of finished spans
152
+ def finished_span_count
153
+ @mutex.synchronize do
154
+ @finished_spans
130
155
  end
131
156
  end
132
157
 
@@ -139,27 +164,66 @@ module Datadog
139
164
  end
140
165
 
141
166
  # Returns both the trace list generated in the current context and
142
- # if the context is sampled or not. It returns nil, nil if the ``Context`` is
143
- # not finished. If a trace is returned, the \Context will be reset so that it
167
+ # if the context is sampled or not.
168
+ #
169
+ # It returns +[nil,@sampled]+ if the \Context is
170
+ # not finished.
171
+ #
172
+ # If a trace is returned, the \Context will be reset so that it
144
173
  # can be re-used immediately.
145
174
  #
146
175
  # This operation is thread-safe.
176
+ #
177
+ # @return [Array<Array<Span>, Boolean>] finished trace and sampled flag
147
178
  def get
148
179
  @mutex.synchronize do
149
180
  trace = @trace
150
181
  sampled = @sampled
151
182
 
152
- attach_sampling_priority if sampled && @sampling_priority
153
- attach_origin if @origin
154
-
155
183
  # still return sampled attribute, even if context is not finished
156
- return nil, sampled unless check_finished_spans()
184
+ return nil, sampled unless all_spans_finished?
185
+
186
+ # Root span is finished at this point, we can configure it
187
+ annotate_for_flush!(@current_root_span)
157
188
 
158
189
  reset
159
190
  [trace, sampled]
160
191
  end
161
192
  end
162
193
 
194
+ # Delete any span matching the condition. This is thread safe.
195
+ #
196
+ # @return [Array<Span>] deleted spans
197
+ def delete_span_if
198
+ @mutex.synchronize do
199
+ [].tap do |deleted_spans|
200
+ @trace.delete_if do |span|
201
+ finished = span.finished?
202
+
203
+ next unless yield span
204
+
205
+ deleted_spans << span
206
+
207
+ # We need to detach the span from the context, else, some code
208
+ # finishing it afterwards would mess up with the number of
209
+ # finished_spans and possibly cause other side effects.
210
+ span.context = nil
211
+ # Acknowledge there's one span less to finish, if needed.
212
+ # It's very important to keep this balanced.
213
+ @finished_spans -= 1 if finished
214
+
215
+ true
216
+ end
217
+ end
218
+ end
219
+ end
220
+
221
+ # Set tags to root span required for flush
222
+ def annotate_for_flush!(span)
223
+ attach_sampling_priority(span) if @sampled && @sampling_priority
224
+ attach_origin(span) if @origin
225
+ end
226
+
163
227
  # Return a string representation of the context.
164
228
  def to_s
165
229
  @mutex.synchronize do
@@ -180,6 +244,7 @@ module Datadog
180
244
  @finished_spans = 0
181
245
  @current_span = nil
182
246
  @current_root_span = nil
247
+ @overflow = false
183
248
  end
184
249
 
185
250
  def set_current_span(span)
@@ -195,19 +260,19 @@ module Datadog
195
260
 
196
261
  # Returns if the trace for the current Context is finished or not.
197
262
  # Low-level internal function, not thread-safe.
198
- def check_finished_spans
263
+ def all_spans_finished?
199
264
  @finished_spans > 0 && @trace.length == @finished_spans
200
265
  end
201
266
 
202
- def attach_sampling_priority
203
- @current_root_span.set_metric(
267
+ def attach_sampling_priority(span)
268
+ span.set_metric(
204
269
  Ext::DistributedTracing::SAMPLING_PRIORITY_KEY,
205
270
  @sampling_priority
206
271
  )
207
272
  end
208
273
 
209
- def attach_origin
210
- @current_root_span.set_tag(
274
+ def attach_origin(span)
275
+ span.set_tag(
211
276
  Ext::DistributedTracing::ORIGIN_KEY,
212
277
  @origin
213
278
  )
@@ -236,49 +301,5 @@ module Datadog
236
301
  end
237
302
  end
238
303
  end
239
-
240
- # Delete any span matching the condition. This is thread safe.
241
- def delete_span_if
242
- @mutex.synchronize do
243
- @trace.delete_if do |span|
244
- finished = span.finished?
245
- delete_span = yield span
246
- if delete_span
247
- # We need to detach the span from the context, else, some code
248
- # finishing it afterwards would mess up with the number of
249
- # finished_spans and possibly cause other side effects.
250
- span.context = nil
251
- # Acknowledge there's one span less to finish, if needed.
252
- # It's very important to keep this balanced.
253
- @finished_spans -= 1 if finished
254
- end
255
- delete_span
256
- end
257
- end
258
- end
259
- end
260
-
261
- # ThreadLocalContext can be used as a tracer global reference to create
262
- # a different \Context for each thread. In synchronous tracer, this
263
- # is required to prevent multiple threads sharing the same \Context
264
- # in different executions.
265
- class ThreadLocalContext
266
- # ThreadLocalContext can be used as a tracer global reference to create
267
- # a different \Context for each thread. In synchronous tracer, this
268
- # is required to prevent multiple threads sharing the same \Context
269
- # in different executions.
270
- def initialize
271
- self.local = Datadog::Context.new
272
- end
273
-
274
- # Override the thread-local context with a new context.
275
- def local=(ctx)
276
- Thread.current[:datadog_context] = ctx
277
- end
278
-
279
- # Return the thread-local context.
280
- def local
281
- Thread.current[:datadog_context] ||= Datadog::Context.new
282
- end
283
304
  end
284
305
  end