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
@@ -34,7 +34,7 @@ module Datadog
34
34
 
35
35
  result || []
36
36
  rescue => e
37
- Datadog::Tracer.log.debug(
37
+ Datadog.logger.debug(
38
38
  "trace dropped entirely due to `Pipeline.before_flush` error: #{e}"
39
39
  )
40
40
 
@@ -10,12 +10,22 @@ module Datadog
10
10
  @criteria = filter || block
11
11
  end
12
12
 
13
+ # Note: this SpanFilter implementation only handles traces in which child spans appear
14
+ # after parent spans in the trace array. If in the future child spans can be before
15
+ # parent spans, then the code below will need to be updated.
13
16
  def call(trace)
14
- black_list = trace.select(&method(:drop_it?))
15
-
16
- clean_trace(black_list, trace) while black_list.any?
17
-
18
- trace
17
+ deleted = Set.new
18
+
19
+ trace.delete_if do |span|
20
+ if deleted.include?(span.parent)
21
+ deleted << span
22
+ true
23
+ else
24
+ drop = drop_it?(span)
25
+ deleted << span if drop
26
+ drop
27
+ end
28
+ end
19
29
  end
20
30
 
21
31
  private
@@ -23,16 +33,6 @@ module Datadog
23
33
  def drop_it?(span)
24
34
  @criteria.call(span) rescue false
25
35
  end
26
-
27
- def clean_trace(black_list, trace)
28
- current = black_list.shift
29
-
30
- trace.delete(current)
31
-
32
- trace.each do |span|
33
- black_list << span if span.parent == current
34
- end
35
- end
36
36
  end
37
37
  end
38
38
  end
@@ -19,7 +19,7 @@ module Datadog
19
19
  def self.inject!(context, env)
20
20
  # Prevent propagation from being attempted if context provided is nil.
21
21
  if context.nil?
22
- ::Datadog::Tracer.log.debug('Cannot inject context into env to propagate over HTTP: context is nil.'.freeze)
22
+ ::Datadog.logger.debug('Cannot inject context into env to propagate over HTTP: context is nil.'.freeze)
23
23
  return
24
24
  end
25
25
 
@@ -58,7 +58,7 @@ module Datadog
58
58
  # Return an empty/new context if we have a mismatch in values extracted
59
59
  msg = "#{context.trace_id} != #{extracted_context.trace_id} && " \
60
60
  "#{context.span_id} != #{extracted_context.span_id}"
61
- ::Datadog::Tracer.log.debug("Cannot extract context from HTTP: extracted contexts differ, #{msg}".freeze)
61
+ ::Datadog.logger.debug("Cannot extract context from HTTP: extracted contexts differ, #{msg}".freeze)
62
62
  # DEV: This will return from `self.extract` not this `each` block
63
63
  return ::Datadog::Context.new
64
64
  end
@@ -27,7 +27,7 @@ module Datadog
27
27
  end
28
28
  end
29
29
  rescue StandardError => e
30
- Datadog::Tracer.log.error("Error while parsing cgroup. Cause: #{e.message} Location: #{e.backtrace.first}")
30
+ Datadog.logger.error("Error while parsing cgroup. Cause: #{e.message} Location: #{e.backtrace.first}")
31
31
  end
32
32
  end
33
33
  end
@@ -61,7 +61,7 @@ module Datadog
61
61
  break
62
62
  end
63
63
  rescue StandardError => e
64
- Datadog::Tracer.log.error(
64
+ Datadog.logger.error(
65
65
  "Error while parsing container info. Cause: #{e.message} Location: #{e.backtrace.first}"
66
66
  )
67
67
  end
@@ -14,12 +14,13 @@ module Datadog
14
14
  super
15
15
 
16
16
  # Initialize service list
17
- @services = Set.new
17
+ @services = Set.new(options.fetch(:services, []))
18
18
  @service_tags = nil
19
+ compile_service_tags!
19
20
  end
20
21
 
21
22
  def associate_with_span(span)
22
- return if span.nil?
23
+ return if !enabled? || span.nil?
23
24
 
24
25
  # Register service as associated with metrics
25
26
  register_service(span.service) unless span.service.nil?
@@ -30,7 +31,7 @@ module Datadog
30
31
 
31
32
  # Associate service with runtime metrics
32
33
  def register_service(service)
33
- return if service.nil?
34
+ return if !enabled? || service.nil?
34
35
 
35
36
  service = service.to_s
36
37
 
@@ -54,8 +55,8 @@ module Datadog
54
55
 
55
56
  def gc_metrics
56
57
  Hash[
57
- GC.stat.map do |k, v|
58
- ["#{Ext::Runtime::Metrics::METRIC_GC_PREFIX}.#{k}", v]
58
+ GC.stat.flat_map do |k, v|
59
+ nested_gc_metric(Ext::Runtime::Metrics::METRIC_GC_PREFIX, k, v)
59
60
  end
60
61
  ]
61
62
  end
@@ -63,7 +64,7 @@ module Datadog
63
64
  def try_flush
64
65
  yield
65
66
  rescue StandardError => e
66
- Datadog::Tracer.log.error("Error while sending runtime metric. Cause: #{e.message}")
67
+ Datadog.logger.error("Error while sending runtime metric. Cause: #{e.message}")
67
68
  end
68
69
 
69
70
  def default_metric_options
@@ -88,6 +89,22 @@ module Datadog
88
89
  "#{Ext::Runtime::Metrics::TAG_SERVICE}:#{service}".freeze
89
90
  end
90
91
  end
92
+
93
+ def nested_gc_metric(prefix, k, v)
94
+ path = "#{prefix}.#{k}"
95
+
96
+ if v.is_a?(Hash)
97
+ v.flat_map do |key, value|
98
+ nested_gc_metric(path, key, value)
99
+ end
100
+ else
101
+ [[to_metric_name(path), v]]
102
+ end
103
+ end
104
+
105
+ def to_metric_name(str)
106
+ str.downcase.gsub(/[-\s]/, '_')
107
+ end
91
108
  end
92
109
  end
93
110
  end
@@ -1,6 +1,7 @@
1
1
  require 'forwardable'
2
2
 
3
3
  require 'ddtrace/ext/priority'
4
+ require 'ddtrace/diagnostics/health'
4
5
 
5
6
  module Datadog
6
7
  # \Sampler performs client-side trace sampling.
@@ -12,6 +13,10 @@ module Datadog
12
13
  def sample!(_span)
13
14
  raise NotImplementedError, 'Samplers must implement the #sample! method'
14
15
  end
16
+
17
+ def sample_rate(span)
18
+ raise NotImplementedError, 'Samplers must implement the #sample_rate method'
19
+ end
15
20
  end
16
21
 
17
22
  # \AllSampler samples all the traces.
@@ -23,6 +28,10 @@ module Datadog
23
28
  def sample!(span)
24
29
  span.sampled = true
25
30
  end
31
+
32
+ def sample_rate(*_)
33
+ 1.0
34
+ end
26
35
  end
27
36
 
28
37
  # \RateSampler is based on a sample rate.
@@ -30,8 +39,6 @@ module Datadog
30
39
  KNUTH_FACTOR = 1111111111111111111
31
40
  SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
32
41
 
33
- attr_reader :sample_rate
34
-
35
42
  # Initialize a \RateSampler.
36
43
  # This sampler keeps a random subset of the traces. Its main purpose is to
37
44
  # reduce the instrumentation footprint.
@@ -41,13 +48,17 @@ module Datadog
41
48
  # sampled.
42
49
  def initialize(sample_rate = 1.0)
43
50
  unless sample_rate > 0.0 && sample_rate <= 1.0
44
- Datadog::Tracer.log.error('sample rate is not between 0 and 1, disabling the sampler')
51
+ Datadog.logger.error('sample rate is not between 0 and 1, disabling the sampler')
45
52
  sample_rate = 1.0
46
53
  end
47
54
 
48
55
  self.sample_rate = sample_rate
49
56
  end
50
57
 
58
+ def sample_rate(*_)
59
+ @sample_rate
60
+ end
61
+
51
62
  def sample_rate=(sample_rate)
52
63
  @sample_rate = sample_rate
53
64
  @sampling_id_threshold = sample_rate * Span::MAX_ID
@@ -64,56 +75,117 @@ module Datadog
64
75
  end
65
76
  end
66
77
 
67
- # \RateByServiceSampler samples different services at different rates
68
- class RateByServiceSampler < Sampler
69
- DEFAULT_KEY = 'service:,env:'.freeze
78
+ # Samples at different rates by key.
79
+ class RateByKeySampler < Sampler
80
+ attr_reader \
81
+ :default_key
82
+
83
+ def initialize(default_key, default_rate = 1.0, &block)
84
+ raise ArgumentError, 'No resolver given!' unless block_given?
70
85
 
71
- def initialize(rate = 1.0, opts = {})
72
- @env = opts.fetch(:env, Datadog.tracer.tags[:env])
86
+ @default_key = default_key
87
+ @resolver = block
73
88
  @mutex = Mutex.new
74
- @fallback = RateSampler.new(rate)
75
- @sampler = { DEFAULT_KEY => @fallback }
89
+ @samplers = {}
90
+
91
+ set_rate(default_key, default_rate)
92
+ end
93
+
94
+ def resolve(span)
95
+ @resolver.call(span)
96
+ end
97
+
98
+ def default_sampler
99
+ @samplers[default_key]
76
100
  end
77
101
 
78
102
  def sample?(span)
79
- key = key_for(span)
103
+ key = resolve(span)
80
104
 
81
105
  @mutex.synchronize do
82
- @sampler.fetch(key, @fallback).sample?(span)
106
+ @samplers.fetch(key, default_sampler).sample?(span)
83
107
  end
84
108
  end
85
109
 
86
110
  def sample!(span)
87
- key = key_for(span)
111
+ key = resolve(span)
88
112
 
89
113
  @mutex.synchronize do
90
- @sampler.fetch(key, @fallback).sample!(span)
114
+ @samplers.fetch(key, default_sampler).sample!(span)
91
115
  end
92
116
  end
93
117
 
94
118
  def sample_rate(span)
95
- key = key_for(span)
119
+ key = resolve(span)
96
120
 
97
121
  @mutex.synchronize do
98
- @sampler.fetch(key, @fallback).sample_rate
122
+ @samplers.fetch(key, default_sampler).sample_rate
99
123
  end
100
124
  end
101
125
 
102
- def update(rate_by_service)
126
+ def update(key, rate)
103
127
  @mutex.synchronize do
104
- @sampler.delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
128
+ set_rate(key, rate)
129
+ end
130
+ end
105
131
 
106
- rate_by_service.each do |key, rate|
107
- @sampler[key] ||= RateSampler.new(rate)
108
- @sampler[key].sample_rate = rate
109
- end
132
+ def update_all(rate_by_key)
133
+ @mutex.synchronize do
134
+ rate_by_key.each { |key, rate| set_rate(key, rate) }
135
+ end
136
+ end
137
+
138
+ def delete(key)
139
+ @mutex.synchronize do
140
+ @samplers.delete(key)
141
+ end
142
+ end
143
+
144
+ def delete_if(&block)
145
+ @mutex.synchronize do
146
+ @samplers.delete_if(&block)
110
147
  end
111
148
  end
112
149
 
150
+ def length
151
+ @samplers.length
152
+ end
153
+
154
+ private
155
+
156
+ def set_rate(key, rate)
157
+ @samplers[key] ||= RateSampler.new(rate)
158
+ @samplers[key].sample_rate = rate
159
+ end
160
+ end
161
+
162
+ # \RateByServiceSampler samples different services at different rates
163
+ class RateByServiceSampler < RateByKeySampler
164
+ DEFAULT_KEY = 'service:,env:'.freeze
165
+
166
+ def initialize(default_rate = 1.0, options = {})
167
+ super(DEFAULT_KEY, default_rate, &method(:key_for))
168
+ @env = options[:env]
169
+ end
170
+
171
+ def update(rate_by_service)
172
+ # Remove any old services
173
+ delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
174
+
175
+ # Update each service rate
176
+ update_all(rate_by_service)
177
+
178
+ # Emit metric for service cache size
179
+ Datadog.health_metrics.sampling_service_cache_length(length)
180
+ end
181
+
113
182
  private
114
183
 
115
184
  def key_for(span)
116
- "service:#{span.service},env:#{@env}"
185
+ # Resolve env dynamically, if Proc is given.
186
+ env = @env.is_a?(Proc) ? @env.call : @env
187
+
188
+ "service:#{span.service},env:#{env}"
117
189
  end
118
190
  end
119
191
 
@@ -121,6 +193,8 @@ module Datadog
121
193
  class PrioritySampler
122
194
  extend Forwardable
123
195
 
196
+ attr_reader :pre_sampler, :priority_sampler
197
+
124
198
  SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
125
199
 
126
200
  def initialize(opts = {})
@@ -141,10 +215,8 @@ module Datadog
141
215
  # If priority sampling has already been applied upstream, use that, otherwise...
142
216
  unless priority_assigned_upstream?(span)
143
217
  # Roll the dice and determine whether how we set the priority.
144
- # NOTE: We'll want to leave `span.sampled = true` here; all spans for priority sampling must
145
- # be sent to the agent. Otherwise metrics for traces will not be accurate, since the
146
- # agent will have an incomplete dataset.
147
- priority = priority_sample(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
218
+ priority = priority_sample!(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
219
+
148
220
  assign_priority!(span, priority)
149
221
  end
150
222
  else
@@ -175,8 +247,33 @@ module Datadog
175
247
  span.context && !span.context.sampling_priority.nil?
176
248
  end
177
249
 
178
- def priority_sample(span)
179
- @priority_sampler.sample?(span)
250
+ def priority_sample!(span)
251
+ preserving_sampling(span) do
252
+ @priority_sampler.sample!(span)
253
+ end
254
+ end
255
+
256
+ # Ensures the span is always propagated to the writer and that
257
+ # the sample rate metric represents the true client-side sampling.
258
+ def preserving_sampling(span)
259
+ pre_sample_rate_metric = span.get_metric(SAMPLE_RATE_METRIC_KEY)
260
+
261
+ yield.tap do
262
+ # NOTE: We'll want to leave `span.sampled = true` here; all spans for priority sampling must
263
+ # be sent to the agent. Otherwise metrics for traces will not be accurate, since the
264
+ # agent will have an incomplete dataset.
265
+ #
266
+ # We also ensure that the agent knows we that our `post_sampler` is not performing true sampling,
267
+ # to avoid erroneous metric upscaling.
268
+ span.sampled = true
269
+ if pre_sample_rate_metric
270
+ # Restore true sampling metric, as only the @pre_sampler can reject traces
271
+ span.set_metric(SAMPLE_RATE_METRIC_KEY, pre_sample_rate_metric)
272
+ else
273
+ # If @pre_sampler is not enable, sending this metric would be misleading
274
+ span.clear_metric(SAMPLE_RATE_METRIC_KEY)
275
+ end
276
+ end
180
277
  end
181
278
 
182
279
  def assign_priority!(span, priority)
@@ -0,0 +1,2 @@
1
+ require 'ddtrace/sampling/rule'
2
+ require 'ddtrace/sampling/rule_sampler'
@@ -0,0 +1,57 @@
1
+ module Datadog
2
+ module Sampling
3
+ # Checks if a span conforms to a matching criteria.
4
+ class Matcher
5
+ # Returns `true` if the span should conforms to this rule, `false` otherwise
6
+ #
7
+ # @abstract
8
+ # @param [Span] span
9
+ # @return [Boolean]
10
+ def match?(span)
11
+ raise NotImplementedError
12
+ end
13
+ end
14
+
15
+ # A \Matcher that supports matching a span by
16
+ # operation name and/or service name.
17
+ class SimpleMatcher < Matcher
18
+ # Returns `true` for case equality (===) with any object
19
+ MATCH_ALL = Class.new do
20
+ # DEV: A class that implements `#===` is ~20% faster than
21
+ # DEV: a `Proc` that always returns `true`.
22
+ def ===(other)
23
+ true
24
+ end
25
+ end.new
26
+
27
+ attr_reader :name, :service
28
+
29
+ # @param name [String,Regexp,Proc] Matcher for case equality (===) with the span name, defaults to always match
30
+ # @param service [String,Regexp,Proc] Matcher for case equality (===) with the service name, defaults to always match
31
+ def initialize(name: MATCH_ALL, service: MATCH_ALL)
32
+ @name = name
33
+ @service = service
34
+ end
35
+
36
+ def match?(span)
37
+ name === span.name && service === span.service
38
+ end
39
+ end
40
+
41
+ # A \Matcher that allows for arbitrary span matching
42
+ # based on the return value of a provided block.
43
+ class ProcMatcher < Matcher
44
+ attr_reader :block
45
+
46
+ # @yield [name, service] Provides span name and service to the block
47
+ # @yieldreturn [Boolean] Whether the span conforms to this matcher
48
+ def initialize(&block)
49
+ @block = block
50
+ end
51
+
52
+ def match?(span)
53
+ block.call(span.name, span.service)
54
+ end
55
+ end
56
+ end
57
+ end