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
@@ -9,18 +9,20 @@ module Datadog
9
9
  class Integration
10
10
  include Contrib::Integration
11
11
 
12
+ MINIMUM_VERSION = Gem::Version.new('3.5.4')
13
+
12
14
  register_as :sidekiq
13
15
 
14
16
  def self.version
15
17
  Gem.loaded_specs['sidekiq'] && Gem.loaded_specs['sidekiq'].version
16
18
  end
17
19
 
18
- def self.present?
19
- super && defined?(::Sidekiq)
20
+ def self.loaded?
21
+ !defined?(::Sidekiq).nil?
20
22
  end
21
23
 
22
24
  def self.compatible?
23
- super && version >= Gem::Version.new('3.5.4')
25
+ super && version >= MINIMUM_VERSION
24
26
  end
25
27
 
26
28
  def default_configuration
@@ -9,28 +9,29 @@ module Datadog
9
9
 
10
10
  module_function
11
11
 
12
- def patched?
13
- done?(:sidekiq)
12
+ def target_version
13
+ Integration.version
14
14
  end
15
15
 
16
16
  def patch
17
- do_once(:sidekiq) do
18
- begin
19
- require 'ddtrace/contrib/sidekiq/client_tracer'
20
- ::Sidekiq.configure_client do |config|
21
- config.client_middleware do |chain|
22
- chain.add(Sidekiq::ClientTracer)
23
- end
24
- end
17
+ require 'ddtrace/contrib/sidekiq/client_tracer'
18
+ require 'ddtrace/contrib/sidekiq/server_tracer'
25
19
 
26
- require 'ddtrace/contrib/sidekiq/server_tracer'
27
- ::Sidekiq.configure_server do |config|
28
- config.server_middleware do |chain|
29
- chain.add(Sidekiq::ServerTracer)
30
- end
31
- end
32
- rescue StandardError => e
33
- Datadog::Tracer.log.error("Unable to apply Sidekiq integration: #{e}")
20
+ ::Sidekiq.configure_client do |config|
21
+ config.client_middleware do |chain|
22
+ chain.add(Sidekiq::ClientTracer)
23
+ end
24
+ end
25
+
26
+ ::Sidekiq.configure_server do |config|
27
+ # If a job enqueues another job, make sure it has the same client
28
+ # middleware.
29
+ config.client_middleware do |chain|
30
+ chain.add(Sidekiq::ClientTracer)
31
+ end
32
+
33
+ config.server_middleware do |chain|
34
+ chain.add(Sidekiq::ServerTracer)
34
35
  end
35
36
  end
36
37
  end
@@ -16,7 +16,8 @@ module Datadog
16
16
  def call(worker, job, queue)
17
17
  resource = job_resource(job)
18
18
 
19
- service = service_from_worker_config(resource) || @sidekiq_service
19
+ service = worker_config(resource, :service_name) || @sidekiq_service
20
+ tag_args = worker_config(resource, :tag_args) || configuration[:tag_args]
20
21
 
21
22
  @tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
22
23
  span.resource = resource
@@ -24,11 +25,19 @@ module Datadog
24
25
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
25
26
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
26
27
  end
28
+
29
+ # Measure service stats
30
+ Contrib::Analytics.set_measured(span)
31
+
27
32
  span.set_tag(Ext::TAG_JOB_ID, job['jid'])
28
33
  span.set_tag(Ext::TAG_JOB_RETRY, job['retry'])
34
+ span.set_tag(Ext::TAG_JOB_RETRY_COUNT, job['retry_count'])
29
35
  span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
30
36
  span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
31
37
  span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
38
+ if tag_args && !job['args'].nil? && !job['args'].empty?
39
+ span.set_tag(Ext::TAG_JOB_ARGS, job['args'])
40
+ end
32
41
 
33
42
  yield
34
43
  end
@@ -40,7 +49,7 @@ module Datadog
40
49
  Datadog.configuration[:sidekiq]
41
50
  end
42
51
 
43
- def service_from_worker_config(resource)
52
+ def worker_config(resource, key)
44
53
  # Try to get the Ruby class from the resource name.
45
54
  worker_klass = begin
46
55
  Object.const_get(resource)
@@ -49,7 +58,7 @@ module Datadog
49
58
  end
50
59
 
51
60
  if worker_klass.respond_to?(:datadog_tracer_config)
52
- worker_klass.datadog_tracer_config[:service_name]
61
+ worker_klass.datadog_tracer_config[key]
53
62
  end
54
63
  end
55
64
  end
@@ -1,6 +1,8 @@
1
1
  require 'ddtrace/ext/app_types'
2
2
  require 'ddtrace/contrib/sidekiq/ext'
3
3
 
4
+ require 'yaml'
5
+
4
6
  module Datadog
5
7
  module Contrib
6
8
  module Sidekiq
@@ -17,10 +19,25 @@ module Datadog
17
19
  # primarily to support `ActiveJob`.
18
20
  def job_resource(job)
19
21
  if job['wrapped']
20
- job['wrapped']
22
+ job['wrapped'].to_s
23
+ elsif job['class'] == 'Sidekiq::Extensions::DelayedClass'
24
+ delay_extension_class(job).to_s
21
25
  else
22
- job['class']
26
+ job['class'].to_s
23
27
  end
28
+ rescue => e
29
+ Datadog.logger.debug { "Error retrieving Sidekiq job class name (jid:#{job['jid']}): #{e}" }
30
+
31
+ job['class'].to_s
32
+ end
33
+
34
+ #
35
+ def delay_extension_class(job)
36
+ clazz, method = YAML.parse(job['args'].first).children.first.children
37
+
38
+ method = method.value[1..-1] # Remove leading `:` from method symbol
39
+
40
+ "#{clazz.value}.#{method}"
24
41
  end
25
42
  end
26
43
  end
@@ -12,13 +12,18 @@ module Datadog
12
12
  response: %w[Content-Type X-Request-ID]
13
13
  }.freeze
14
14
 
15
+ option :enabled do |o|
16
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
17
+ o.lazy
18
+ end
19
+
15
20
  option :analytics_enabled do |o|
16
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
21
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
17
22
  o.lazy
18
23
  end
19
24
 
20
25
  option :analytics_sample_rate do |o|
21
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
26
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
22
27
  o.lazy
23
28
  end
24
29
 
@@ -8,12 +8,13 @@ module Datadog
8
8
  module Env
9
9
  module_function
10
10
 
11
- def datadog_span(env)
12
- env[Ext::RACK_ENV_REQUEST_SPAN]
11
+ def datadog_span(env, app)
12
+ env[Ext::RACK_ENV_REQUEST_SPAN][app]
13
13
  end
14
14
 
15
- def set_datadog_span(env, span)
16
- env[Ext::RACK_ENV_REQUEST_SPAN] = span
15
+ def set_datadog_span(env, app, span)
16
+ hash = (env[Ext::RACK_ENV_REQUEST_SPAN] ||= {})
17
+ hash[app] = span
17
18
  end
18
19
 
19
20
  def request_header_tags(env, headers)
@@ -32,6 +33,26 @@ module Datadog
32
33
  def header_to_rack_header(name)
33
34
  "HTTP_#{name.to_s.upcase.gsub(/[-\s]/, '_')}"
34
35
  end
36
+
37
+ # Was a Sinatra already traced in this request?
38
+ # We don't want to create spans for intermediate Sinatra
39
+ # middlewares that don't match the request at hand.
40
+ def middleware_traced?(env)
41
+ env[Ext::RACK_ENV_MIDDLEWARE_TRACED]
42
+ end
43
+
44
+ def set_middleware_traced(env, bool)
45
+ env[Ext::RACK_ENV_MIDDLEWARE_TRACED] = bool
46
+ end
47
+
48
+ # The start time of the top-most Sinatra middleware.
49
+ def middleware_start_time(env)
50
+ env[Ext::RACK_ENV_MIDDLEWARE_START_TIME]
51
+ end
52
+
53
+ def set_middleware_start_time(env, time = Time.now.utc)
54
+ env[Ext::RACK_ENV_MIDDLEWARE_START_TIME] = time
55
+ end
35
56
  end
36
57
  end
37
58
  end
@@ -4,13 +4,22 @@ module Datadog
4
4
  # Sinatra integration constants
5
5
  module Ext
6
6
  APP = 'sinatra'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_SINATRA_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_SINATRA_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_SINATRA_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_SINATRA_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_SINATRA_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SINATRA_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SINATRA_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  RACK_ENV_REQUEST_SPAN = 'datadog.sinatra_request_span'.freeze
13
+ RACK_ENV_MIDDLEWARE_START_TIME = 'datadog.sinatra_middleware_start_time'.freeze
14
+ RACK_ENV_MIDDLEWARE_TRACED = 'datadog.sinatra_middleware_traced'.freeze
10
15
  SERVICE_NAME = 'sinatra'.freeze
11
16
  SPAN_RENDER_TEMPLATE = 'sinatra.render_template'.freeze
12
17
  SPAN_REQUEST = 'sinatra.request'.freeze
18
+ SPAN_ROUTE = 'sinatra.route'.freeze
19
+ TAG_APP_NAME = 'sinatra.app.name'.freeze
13
20
  TAG_ROUTE_PATH = 'sinatra.route.path'.freeze
21
+ TAG_SCRIPT_NAME = 'sinatra.script_name'.freeze
22
+ TAG_TEMPLATE_ENGINE = 'sinatra.template_engine'.freeze
14
23
  TAG_TEMPLATE_NAME = 'sinatra.template_name'.freeze
15
24
  end
16
25
  end
@@ -9,18 +9,20 @@ module Datadog
9
9
  class Integration
10
10
  include Contrib::Integration
11
11
 
12
+ MINIMUM_VERSION = Gem::Version.new('1.4')
13
+
12
14
  register_as :sinatra
13
15
 
14
16
  def self.version
15
17
  Gem.loaded_specs['sinatra'] && Gem.loaded_specs['sinatra'].version
16
18
  end
17
19
 
18
- def self.present?
19
- super && defined?(::Sinatra)
20
+ def self.loaded?
21
+ !defined?(::Sinatra).nil?
20
22
  end
21
23
 
22
24
  def self.compatible?
23
- super && version >= Gem::Version.new('1.4.0')
25
+ super && version >= MINIMUM_VERSION
24
26
  end
25
27
 
26
28
  def default_configuration
@@ -9,23 +9,18 @@ module Datadog
9
9
 
10
10
  module_function
11
11
 
12
- def patched?
13
- done?(:sinatra)
12
+ def target_version
13
+ Integration.version
14
14
  end
15
15
 
16
16
  def patch
17
- do_once(:sinatra) do
18
- begin
19
- require 'ddtrace/contrib/sinatra/tracer'
20
- register_tracer
21
- rescue StandardError => e
22
- Datadog::Tracer.log.error("Unable to apply Sinatra integration: #{e}")
23
- end
24
- end
17
+ require 'ddtrace/contrib/sinatra/tracer'
18
+ register_tracer
25
19
  end
26
20
 
27
21
  def register_tracer
28
22
  ::Sinatra.send(:register, Datadog::Contrib::Sinatra::Tracer)
23
+ ::Sinatra::Base.send(:prepend, Sinatra::Tracer::Base)
29
24
  end
30
25
  end
31
26
  end
@@ -21,6 +21,10 @@ module Datadog
21
21
  condition do
22
22
  # If the option to prepend script names is enabled, then
23
23
  # prepend the script name from the request onto the action.
24
+ #
25
+ # DEV: env['sinatra.route'] already exists with very similar information,
26
+ # DEV: but doesn't account for our `resource_script_names` logic.
27
+ #
24
28
  @datadog_route = if Datadog.configuration[:sinatra][:resource_script_names]
25
29
  "#{request.script_name}#{action}"
26
30
  else
@@ -32,50 +36,91 @@ module Datadog
32
36
  end
33
37
 
34
38
  def self.registered(app)
35
- ::Sinatra::Base.module_eval do
36
- def render(engine, data, *)
37
- output = ''
38
- tracer = Datadog.configuration[:sinatra][:tracer]
39
- if tracer.enabled
40
- tracer.trace(Ext::SPAN_RENDER_TEMPLATE, span_type: Datadog::Ext::HTTP::TEMPLATE) do |span|
41
- # If data is a string, it is a literal template and we don't
42
- # want to record it.
43
- span.set_tag(Ext::TAG_TEMPLATE_NAME, data) if data.is_a? Symbol
44
-
45
- output = super
46
- end
47
- else
48
- output = super
49
- end
39
+ app.use TracerMiddleware, app_instance: app
50
40
 
51
- output
52
- end
53
- end
41
+ app.after do
42
+ configuration = Datadog.configuration[:sinatra]
43
+ next unless configuration[:tracer].enabled
54
44
 
55
- app.use TracerMiddleware
45
+ span = Sinatra::Env.datadog_span(env, app)
56
46
 
57
- app.before do
58
- return unless Datadog.configuration[:sinatra][:tracer].enabled
47
+ # TODO: `route` should *only* be populated if @datadog_route is defined.
48
+ # TODO: If @datadog_route is not defined, then this Sinatra app is not responsible
49
+ # TODO: for handling this request.
50
+ # TODO:
51
+ # TODO: This change would be BREAKING for any Sinatra app (classic or modular),
52
+ # TODO: as it affects the `resource` value for requests not handled by the Sinatra app.
53
+ # TODO: Currently we use "#{method} #{path}" in such aces, but `path` is the raw,
54
+ # TODO: high-cardinality HTTP path, and can contain PII.
55
+ # TODO:
56
+ # TODO: The value we should use as the `resource` when the Sinatra app is not
57
+ # TODO: responsible for the request is a tricky subject.
58
+ # TODO: The best option is a value that clearly communicates that this app did not
59
+ # TODO: handle this request. It's important to keep in mind that an unhandled request
60
+ # TODO: by this Sinatra app might still be handled by another Rack middleware (which can
61
+ # TODO: be a Sinatra app itself) or it might just 404 if not handled at all.
62
+ # TODO:
63
+ # TODO: A possible value for `resource` could set a high level description, e.g.
64
+ # TODO: `request.request_method`, given we don't have the response object available yet.
65
+ route = if defined?(@datadog_route)
66
+ @datadog_route
67
+ else
68
+ # Fallback in case no routes have matched
69
+ request.path
70
+ end
59
71
 
60
- span = Sinatra::Env.datadog_span(env)
61
- span.set_tag(Datadog::Ext::HTTP::URL, request.path)
62
- span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
72
+ span.resource = "#{request.request_method} #{route}"
73
+ span.set_tag(Ext::TAG_ROUTE_PATH, route)
63
74
  end
75
+ end
64
76
 
65
- app.after do
66
- return unless Datadog.configuration[:sinatra][:tracer].enabled
77
+ # Method overrides for Sinatra::Base
78
+ module Base
79
+ def render(engine, data, *)
80
+ tracer = Datadog.configuration[:sinatra][:tracer]
81
+ return super unless tracer.enabled
82
+
83
+ tracer.trace(Ext::SPAN_RENDER_TEMPLATE, span_type: Datadog::Ext::HTTP::TEMPLATE) do |span|
84
+ span.set_tag(Ext::TAG_TEMPLATE_ENGINE, engine)
85
+
86
+ # If data is a string, it is a literal template and we don't
87
+ # want to record it.
88
+ span.set_tag(Ext::TAG_TEMPLATE_NAME, data) if data.is_a? Symbol
67
89
 
68
- span = Sinatra::Env.datadog_span(env)
90
+ # Measure service stats
91
+ Contrib::Analytics.set_measured(span)
69
92
 
70
- unless span
71
- Datadog::Tracer.log.error('missing request span in :after hook')
72
- return
93
+ super
73
94
  end
95
+ end
96
+
97
+ # Invoked when a matching route is found.
98
+ # This method yields directly to user code.
99
+ def route_eval
100
+ configuration = Datadog.configuration[:sinatra]
101
+ tracer = configuration[:tracer]
102
+ return super unless tracer.enabled
103
+
104
+ tracer.trace(
105
+ Ext::SPAN_ROUTE,
106
+ service: configuration[:service_name],
107
+ span_type: Datadog::Ext::HTTP::TYPE_INBOUND
108
+ ) do |span|
109
+ span.resource = "#{request.request_method} #{@datadog_route}"
110
+
111
+ span.set_tag(Ext::TAG_APP_NAME, settings.name || settings.superclass.name)
112
+ span.set_tag(Ext::TAG_ROUTE_PATH, @datadog_route)
113
+ if request.script_name && !request.script_name.empty?
114
+ span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
115
+ end
116
+
117
+ rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
118
+ rack_request_span.resource = span.resource if rack_request_span
74
119
 
75
- span.resource = "#{request.request_method} #{@datadog_route}"
76
- span.set_tag(Ext::TAG_ROUTE_PATH, @datadog_route)
77
- span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.status)
78
- span.set_error(env['sinatra.error']) if response.server_error?
120
+ Contrib::Analytics.set_measured(span)
121
+
122
+ super
123
+ end
79
124
  end
80
125
  end
81
126
  end
@@ -8,10 +8,13 @@ module Datadog
8
8
  module Sinatra
9
9
  # Middleware used for automatically tagging configured headers and handle request span
10
10
  class TracerMiddleware
11
- def initialize(app)
11
+ def initialize(app, app_instance: nil)
12
12
  @app = app
13
+ @app_instance = app_instance
13
14
  end
14
15
 
16
+ # rubocop:disable Metrics/AbcSize
17
+ # rubocop:disable Metrics/MethodLength
15
18
  def call(env)
16
19
  # Set the trace context (e.g. distributed tracing)
17
20
  if configuration[:distributed_tracing] && tracer.provider.context.trace_id.nil?
@@ -19,29 +22,59 @@ module Datadog
19
22
  tracer.provider.context = context if context.trace_id
20
23
  end
21
24
 
22
- # Begin the trace
23
25
  tracer.trace(
24
26
  Ext::SPAN_REQUEST,
25
27
  service: configuration[:service_name],
26
- span_type: Datadog::Ext::HTTP::TYPE_INBOUND
28
+ span_type: Datadog::Ext::HTTP::TYPE_INBOUND,
29
+ resource: env['REQUEST_METHOD']
27
30
  ) do |span|
28
- Sinatra::Env.set_datadog_span(env, span)
31
+ begin
32
+ Sinatra::Env.set_datadog_span(env, @app_instance, span)
29
33
 
30
- Sinatra::Env.request_header_tags(env, configuration[:headers][:request]).each do |name, value|
31
- span.set_tag(name, value) if span.get_tag(name).nil?
32
- end
34
+ response = @app.call(env)
35
+ ensure
36
+ Sinatra::Env.request_header_tags(env, configuration[:headers][:request]).each do |name, value|
37
+ span.set_tag(name, value) if span.get_tag(name).nil?
38
+ end
33
39
 
34
- # Run application stack
35
- status, headers, response_body = @app.call(env)
40
+ request = ::Sinatra::Request.new(env)
41
+ span.set_tag(Datadog::Ext::HTTP::URL, request.path)
42
+ span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
43
+ if request.script_name && !request.script_name.empty?
44
+ span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
45
+ end
36
46
 
37
- Sinatra::Headers.response_header_tags(headers, configuration[:headers][:response]).each do |name, value|
38
- span.set_tag(name, value) if span.get_tag(name).nil?
39
- end
47
+ span.set_tag(Ext::TAG_APP_NAME, @app_instance.settings.name)
48
+
49
+ # TODO: This backfills the non-matching Sinatra app with a "#{method} #{path}"
50
+ # TODO: resource name. This shouldn't be the case, as that app has never handled
51
+ # TODO: the response with that resource.
52
+ # TODO: We should replace this backfill code with a clear `resource` that signals
53
+ # TODO: that this Sinatra span was *not* responsible for processing the current request.
54
+ rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
55
+ span.resource = rack_request_span.resource if rack_request_span && rack_request_span.resource
56
+
57
+ if response
58
+ if (status = response[0])
59
+ sinatra_response = ::Sinatra::Response.new([], status) # Build object to use status code helpers
40
60
 
41
- # Set analytics sample rate
42
- Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
61
+ span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, sinatra_response.status)
62
+ span.set_error(env['sinatra.error']) if sinatra_response.server_error?
63
+ end
43
64
 
44
- [status, headers, response_body]
65
+ if (headers = response[1])
66
+ Sinatra::Headers.response_header_tags(headers, configuration[:headers][:response]).each do |name, value|
67
+ span.set_tag(name, value) if span.get_tag(name).nil?
68
+ end
69
+ end
70
+ end
71
+
72
+ # Set analytics sample rate
73
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
74
+
75
+ # Measure service stats
76
+ Contrib::Analytics.set_measured(span)
77
+ end
45
78
  end
46
79
  end
47
80