ls-trace 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +419 -544
  3. data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
  4. data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
  5. data/.env +2 -0
  6. data/.gitignore +2 -0
  7. data/.gitlab-ci.yml +27 -0
  8. data/.rubocop.yml +8 -0
  9. data/.simplecov +38 -0
  10. data/Appraisals +299 -48
  11. data/CHANGELOG.md +3 -4
  12. data/LICENSE +4 -22
  13. data/LICENSE.Apache +200 -0
  14. data/LICENSE.BSD3 +24 -0
  15. data/NOTICE +4 -0
  16. data/README.md +4 -3
  17. data/Rakefile +561 -405
  18. data/ddtrace.gemspec +13 -4
  19. data/docker-compose.yml +96 -2
  20. data/docs/DevelopmentGuide.md +17 -1
  21. data/docs/GettingStarted.md +433 -138
  22. data/lib/ddtrace.rb +15 -0
  23. data/lib/ddtrace/analytics.rb +7 -0
  24. data/lib/ddtrace/buffer.rb +9 -9
  25. data/lib/ddtrace/chunker.rb +34 -0
  26. data/lib/ddtrace/configuration.rb +59 -5
  27. data/lib/ddtrace/configuration/base.rb +4 -2
  28. data/lib/ddtrace/configuration/components.rb +151 -0
  29. data/lib/ddtrace/configuration/option.rb +12 -3
  30. data/lib/ddtrace/configuration/option_definition.rb +1 -5
  31. data/lib/ddtrace/configuration/options.rb +6 -1
  32. data/lib/ddtrace/configuration/pin_setup.rb +3 -2
  33. data/lib/ddtrace/configuration/settings.rb +214 -40
  34. data/lib/ddtrace/context.rb +84 -63
  35. data/lib/ddtrace/context_flush.rb +51 -114
  36. data/lib/ddtrace/context_provider.rb +50 -0
  37. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +30 -0
  38. data/lib/ddtrace/contrib/action_cable/event.rb +65 -0
  39. data/lib/ddtrace/contrib/action_cable/events.rb +33 -0
  40. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +49 -0
  41. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +55 -0
  42. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +50 -0
  43. data/lib/ddtrace/contrib/action_cable/ext.rb +26 -0
  44. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
  45. data/lib/ddtrace/contrib/action_cable/integration.rb +38 -0
  46. data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
  47. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +6 -2
  48. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +3 -15
  49. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  50. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  51. data/lib/ddtrace/contrib/action_pack/integration.rb +5 -3
  52. data/lib/ddtrace/contrib/action_pack/patcher.rb +3 -9
  53. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  54. data/lib/ddtrace/contrib/action_view/event.rb +39 -0
  55. data/lib/ddtrace/contrib/action_view/events.rb +30 -0
  56. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +45 -0
  57. data/lib/ddtrace/contrib/action_view/events/render_template.rb +48 -0
  58. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  59. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +9 -13
  60. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +16 -16
  61. data/lib/ddtrace/contrib/action_view/integration.rb +5 -3
  62. data/lib/ddtrace/contrib/action_view/patcher.rb +19 -25
  63. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  64. data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -0
  65. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  66. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +6 -5
  67. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +3 -10
  68. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +4 -5
  69. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  70. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +4 -1
  71. data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -1
  72. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  73. data/lib/ddtrace/contrib/active_record/integration.rb +5 -3
  74. data/lib/ddtrace/contrib/active_record/patcher.rb +3 -9
  75. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +2 -2
  76. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +10 -24
  77. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
  78. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  79. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  80. data/lib/ddtrace/contrib/active_support/integration.rb +5 -3
  81. data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
  82. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +3 -3
  83. data/lib/ddtrace/contrib/active_support/patcher.rb +3 -9
  84. data/lib/ddtrace/contrib/analytics.rb +5 -1
  85. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  86. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  87. data/lib/ddtrace/contrib/aws/integration.rb +8 -2
  88. data/lib/ddtrace/contrib/aws/patcher.rb +15 -15
  89. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  90. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
  91. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  92. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +8 -2
  93. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +4 -11
  94. data/lib/ddtrace/contrib/configurable.rb +30 -13
  95. data/lib/ddtrace/contrib/configuration/resolver.rb +7 -3
  96. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
  97. data/lib/ddtrace/contrib/configuration/settings.rb +20 -1
  98. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  99. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  100. data/lib/ddtrace/contrib/dalli/integration.rb +5 -3
  101. data/lib/ddtrace/contrib/dalli/patcher.rb +6 -16
  102. data/lib/ddtrace/contrib/dalli/quantize.rb +1 -1
  103. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
  104. data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
  105. data/lib/ddtrace/contrib/delayed_job/integration.rb +8 -2
  106. data/lib/ddtrace/contrib/delayed_job/patcher.rb +4 -10
  107. data/lib/ddtrace/contrib/delayed_job/plugin.rb +4 -0
  108. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  109. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  110. data/lib/ddtrace/contrib/elasticsearch/integration.rb +5 -3
  111. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +10 -17
  112. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +8 -2
  113. data/lib/ddtrace/contrib/ethon/easy_patch.rb +22 -13
  114. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  115. data/lib/ddtrace/contrib/ethon/integration.rb +14 -2
  116. data/lib/ddtrace/contrib/ethon/patcher.rb +7 -9
  117. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  118. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  119. data/lib/ddtrace/contrib/excon/integration.rb +13 -2
  120. data/lib/ddtrace/contrib/excon/middleware.rb +15 -12
  121. data/lib/ddtrace/contrib/excon/patcher.rb +4 -11
  122. data/lib/ddtrace/contrib/extensions.rb +39 -5
  123. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  124. data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
  125. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  126. data/lib/ddtrace/contrib/faraday/integration.rb +10 -3
  127. data/lib/ddtrace/contrib/faraday/middleware.rb +24 -34
  128. data/lib/ddtrace/contrib/faraday/patcher.rb +26 -19
  129. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  130. data/lib/ddtrace/contrib/grape/endpoint.rb +14 -5
  131. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  132. data/lib/ddtrace/contrib/grape/integration.rb +6 -3
  133. data/lib/ddtrace/contrib/grape/patcher.rb +9 -15
  134. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  135. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  136. data/lib/ddtrace/contrib/graphql/integration.rb +6 -5
  137. data/lib/ddtrace/contrib/graphql/patcher.rb +11 -14
  138. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  139. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
  140. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +2 -4
  141. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -2
  142. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  143. data/lib/ddtrace/contrib/grpc/integration.rb +5 -3
  144. data/lib/ddtrace/contrib/grpc/patcher.rb +9 -19
  145. data/lib/ddtrace/contrib/http/circuit_breaker.rb +8 -32
  146. data/lib/ddtrace/contrib/http/configuration/settings.rb +8 -2
  147. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  148. data/lib/ddtrace/contrib/http/instrumentation.rb +89 -28
  149. data/lib/ddtrace/contrib/http/integration.rb +13 -0
  150. data/lib/ddtrace/contrib/http/patcher.rb +3 -9
  151. data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
  152. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  153. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  154. data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
  155. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  156. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  157. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  158. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  159. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  160. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  161. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  162. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  163. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  164. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  165. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  166. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  167. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  168. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  169. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  170. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  171. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  172. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  173. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  174. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  175. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  176. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
  177. data/lib/ddtrace/contrib/mongodb/integration.rb +5 -3
  178. data/lib/ddtrace/contrib/mongodb/patcher.rb +5 -11
  179. data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -2
  180. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  181. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  182. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  183. data/lib/ddtrace/contrib/mysql2/integration.rb +8 -2
  184. data/lib/ddtrace/contrib/mysql2/patcher.rb +3 -9
  185. data/lib/ddtrace/contrib/patchable.rb +21 -4
  186. data/lib/ddtrace/contrib/patcher.rb +44 -10
  187. data/lib/ddtrace/contrib/presto/configuration/settings.rb +30 -0
  188. data/lib/ddtrace/contrib/presto/ext.rb +28 -0
  189. data/lib/ddtrace/contrib/presto/instrumentation.rb +107 -0
  190. data/lib/ddtrace/contrib/presto/integration.rb +38 -0
  191. data/lib/ddtrace/contrib/presto/patcher.rb +30 -0
  192. data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
  193. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  194. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  195. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  196. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  197. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  198. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  199. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  200. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  201. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  202. data/lib/ddtrace/contrib/racecar/integration.rb +6 -3
  203. data/lib/ddtrace/contrib/racecar/patcher.rb +4 -10
  204. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  205. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  206. data/lib/ddtrace/contrib/rack/integration.rb +8 -2
  207. data/lib/ddtrace/contrib/rack/middlewares.rb +23 -14
  208. data/lib/ddtrace/contrib/rack/patcher.rb +57 -22
  209. data/lib/ddtrace/contrib/rack/request_queue.rb +1 -1
  210. data/lib/ddtrace/contrib/rails/configuration/settings.rb +23 -10
  211. data/lib/ddtrace/contrib/rails/ext.rb +7 -2
  212. data/lib/ddtrace/contrib/rails/framework.rb +59 -35
  213. data/lib/ddtrace/contrib/rails/integration.rb +12 -5
  214. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  215. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  216. data/lib/ddtrace/contrib/rails/patcher.rb +19 -8
  217. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  218. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  219. data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -2
  220. data/lib/ddtrace/contrib/rake/integration.rb +8 -2
  221. data/lib/ddtrace/contrib/rake/patcher.rb +4 -10
  222. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
  223. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  224. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  225. data/lib/ddtrace/contrib/redis/integration.rb +9 -3
  226. data/lib/ddtrace/contrib/redis/patcher.rb +20 -17
  227. data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
  228. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
  229. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  230. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  231. data/lib/ddtrace/contrib/resque/integration.rb +12 -2
  232. data/lib/ddtrace/contrib/resque/patcher.rb +4 -10
  233. data/lib/ddtrace/contrib/resque/resque_job.rb +6 -2
  234. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  235. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  236. data/lib/ddtrace/contrib/rest_client/integration.rb +9 -2
  237. data/lib/ddtrace/contrib/rest_client/patcher.rb +5 -7
  238. data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
  239. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  240. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  241. data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
  242. data/lib/ddtrace/contrib/sequel/integration.rb +8 -2
  243. data/lib/ddtrace/contrib/sequel/patcher.rb +4 -10
  244. data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
  245. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  246. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  247. data/lib/ddtrace/contrib/shoryuken/integration.rb +11 -7
  248. data/lib/ddtrace/contrib/shoryuken/patcher.rb +4 -10
  249. data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -0
  250. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +12 -2
  251. data/lib/ddtrace/contrib/sidekiq/ext.rb +8 -2
  252. data/lib/ddtrace/contrib/sidekiq/integration.rb +5 -3
  253. data/lib/ddtrace/contrib/sidekiq/patcher.rb +19 -18
  254. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +12 -3
  255. data/lib/ddtrace/contrib/sidekiq/tracing.rb +19 -2
  256. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  257. data/lib/ddtrace/contrib/sinatra/env.rb +25 -4
  258. data/lib/ddtrace/contrib/sinatra/ext.rb +11 -2
  259. data/lib/ddtrace/contrib/sinatra/integration.rb +5 -3
  260. data/lib/ddtrace/contrib/sinatra/patcher.rb +5 -10
  261. data/lib/ddtrace/contrib/sinatra/tracer.rb +79 -34
  262. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +48 -15
  263. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  264. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  265. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  266. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  267. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  268. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  269. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  270. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +14 -0
  271. data/lib/ddtrace/contrib/sucker_punch/integration.rb +5 -3
  272. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +8 -14
  273. data/lib/ddtrace/correlation.rb +15 -5
  274. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  275. data/lib/ddtrace/diagnostics/health.rb +11 -8
  276. data/lib/ddtrace/encoding.rb +15 -11
  277. data/lib/ddtrace/environment.rb +21 -3
  278. data/lib/ddtrace/event.rb +52 -0
  279. data/lib/ddtrace/ext/analytics.rb +1 -0
  280. data/lib/ddtrace/ext/correlation.rb +11 -0
  281. data/lib/ddtrace/ext/diagnostics.rb +11 -0
  282. data/lib/ddtrace/ext/environment.rb +16 -0
  283. data/lib/ddtrace/ext/forced_tracing.rb +1 -1
  284. data/lib/ddtrace/ext/sampling.rb +16 -0
  285. data/lib/ddtrace/ext/transport.rb +1 -0
  286. data/lib/ddtrace/logger.rb +4 -3
  287. data/lib/ddtrace/metrics.rb +12 -5
  288. data/lib/ddtrace/monkey.rb +1 -1
  289. data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
  290. data/lib/ddtrace/opentelemetry/span.rb +33 -0
  291. data/lib/ddtrace/opentracer/global_tracer.rb +1 -1
  292. data/lib/ddtrace/pin.rb +40 -16
  293. data/lib/ddtrace/pipeline.rb +1 -1
  294. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  295. data/lib/ddtrace/propagation/http_propagator.rb +2 -2
  296. data/lib/ddtrace/runtime/cgroup.rb +1 -1
  297. data/lib/ddtrace/runtime/container.rb +1 -1
  298. data/lib/ddtrace/runtime/metrics.rb +23 -6
  299. data/lib/ddtrace/sampler.rb +126 -29
  300. data/lib/ddtrace/sampling.rb +2 -0
  301. data/lib/ddtrace/sampling/matcher.rb +57 -0
  302. data/lib/ddtrace/sampling/rate_limiter.rb +127 -0
  303. data/lib/ddtrace/sampling/rule.rb +61 -0
  304. data/lib/ddtrace/sampling/rule_sampler.rb +125 -0
  305. data/lib/ddtrace/span.rb +54 -7
  306. data/lib/ddtrace/sync_writer.rb +13 -8
  307. data/lib/ddtrace/tracer.rb +72 -92
  308. data/lib/ddtrace/transport/http.rb +16 -1
  309. data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
  310. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  311. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  312. data/lib/ddtrace/transport/http/api/instance.rb +4 -0
  313. data/lib/ddtrace/transport/http/builder.rb +3 -5
  314. data/lib/ddtrace/transport/http/client.rb +7 -64
  315. data/lib/ddtrace/transport/http/response.rb +1 -1
  316. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  317. data/lib/ddtrace/transport/http/traces.rb +10 -7
  318. data/lib/ddtrace/transport/io.rb +26 -0
  319. data/lib/ddtrace/transport/io/client.rb +76 -0
  320. data/lib/ddtrace/transport/io/response.rb +25 -0
  321. data/lib/ddtrace/transport/io/traces.rb +91 -0
  322. data/lib/ddtrace/transport/response.rb +11 -0
  323. data/lib/ddtrace/transport/statistics.rb +2 -2
  324. data/lib/ddtrace/transport/traces.rb +160 -10
  325. data/lib/ddtrace/utils.rb +1 -1
  326. data/lib/ddtrace/version.rb +2 -2
  327. data/lib/ddtrace/worker.rb +20 -0
  328. data/lib/ddtrace/workers.rb +5 -13
  329. data/lib/ddtrace/workers/async.rb +165 -0
  330. data/lib/ddtrace/workers/loop.rb +105 -0
  331. data/lib/ddtrace/workers/polling.rb +48 -0
  332. data/lib/ddtrace/workers/queue.rb +39 -0
  333. data/lib/ddtrace/workers/runtime_metrics.rb +47 -0
  334. data/lib/ddtrace/workers/trace_writer.rb +202 -0
  335. data/lib/ddtrace/writer.rb +56 -38
  336. metadata +185 -25
  337. data/lib/ddtrace/provider.rb +0 -21
@@ -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