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