ls-trace 0.1.1

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 (356) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +673 -0
  3. data/.circleci/images/primary/Dockerfile-2.0.0 +73 -0
  4. data/.circleci/images/primary/Dockerfile-2.1.10 +73 -0
  5. data/.circleci/images/primary/Dockerfile-2.2.10 +73 -0
  6. data/.circleci/images/primary/Dockerfile-2.3.8 +75 -0
  7. data/.circleci/images/primary/Dockerfile-2.4.6 +73 -0
  8. data/.circleci/images/primary/Dockerfile-2.5.6 +73 -0
  9. data/.circleci/images/primary/Dockerfile-2.6.4 +73 -0
  10. data/.dockerignore +1 -0
  11. data/.env +24 -0
  12. data/.github/CODEOWNERS +1 -0
  13. data/.gitignore +59 -0
  14. data/.rspec +1 -0
  15. data/.rubocop.yml +77 -0
  16. data/.yardopts +5 -0
  17. data/Appraisals +820 -0
  18. data/CHANGELOG.md +1051 -0
  19. data/CONTRIBUTING.md +85 -0
  20. data/Gemfile +7 -0
  21. data/LICENSE +24 -0
  22. data/README.md +108 -0
  23. data/Rakefile +635 -0
  24. data/benchmarks/postgres_database.yml +9 -0
  25. data/benchmarks/sidekiq_test.rb +154 -0
  26. data/ddtrace.gemspec +63 -0
  27. data/docker-compose.yml +276 -0
  28. data/docs/DevelopmentGuide.md +195 -0
  29. data/docs/GettingStarted.md +1981 -0
  30. data/lib/ddtrace.rb +63 -0
  31. data/lib/ddtrace/analytics.rb +29 -0
  32. data/lib/ddtrace/augmentation.rb +13 -0
  33. data/lib/ddtrace/augmentation/method_wrapper.rb +20 -0
  34. data/lib/ddtrace/augmentation/method_wrapping.rb +38 -0
  35. data/lib/ddtrace/augmentation/shim.rb +102 -0
  36. data/lib/ddtrace/buffer.rb +119 -0
  37. data/lib/ddtrace/configuration.rb +30 -0
  38. data/lib/ddtrace/configuration/base.rb +82 -0
  39. data/lib/ddtrace/configuration/dependency_resolver.rb +24 -0
  40. data/lib/ddtrace/configuration/option.rb +55 -0
  41. data/lib/ddtrace/configuration/option_definition.rb +127 -0
  42. data/lib/ddtrace/configuration/option_definition_set.rb +18 -0
  43. data/lib/ddtrace/configuration/option_set.rb +6 -0
  44. data/lib/ddtrace/configuration/options.rb +107 -0
  45. data/lib/ddtrace/configuration/pin_setup.rb +30 -0
  46. data/lib/ddtrace/configuration/settings.rb +105 -0
  47. data/lib/ddtrace/context.rb +284 -0
  48. data/lib/ddtrace/context_flush.rb +132 -0
  49. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +144 -0
  50. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +37 -0
  51. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +27 -0
  52. data/lib/ddtrace/contrib/action_pack/ext.rb +16 -0
  53. data/lib/ddtrace/contrib/action_pack/integration.rb +36 -0
  54. data/lib/ddtrace/contrib/action_pack/patcher.rb +29 -0
  55. data/lib/ddtrace/contrib/action_pack/utils.rb +36 -0
  56. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +26 -0
  57. data/lib/ddtrace/contrib/action_view/ext.rb +17 -0
  58. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +78 -0
  59. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
  60. data/lib/ddtrace/contrib/action_view/integration.rb +43 -0
  61. data/lib/ddtrace/contrib/action_view/patcher.rb +53 -0
  62. data/lib/ddtrace/contrib/action_view/utils.rb +32 -0
  63. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +25 -0
  64. data/lib/ddtrace/contrib/active_model_serializers/event.rb +65 -0
  65. data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
  66. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
  67. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
  68. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +17 -0
  69. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +39 -0
  70. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +36 -0
  71. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +46 -0
  72. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +30 -0
  73. data/lib/ddtrace/contrib/active_record/event.rb +30 -0
  74. data/lib/ddtrace/contrib/active_record/events.rb +30 -0
  75. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +57 -0
  76. data/lib/ddtrace/contrib/active_record/events/sql.rb +64 -0
  77. data/lib/ddtrace/contrib/active_record/ext.rb +21 -0
  78. data/lib/ddtrace/contrib/active_record/integration.rb +44 -0
  79. data/lib/ddtrace/contrib/active_record/patcher.rb +29 -0
  80. data/lib/ddtrace/contrib/active_record/utils.rb +76 -0
  81. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +157 -0
  82. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +62 -0
  83. data/lib/ddtrace/contrib/active_support/cache/redis.rb +47 -0
  84. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +25 -0
  85. data/lib/ddtrace/contrib/active_support/ext.rb +21 -0
  86. data/lib/ddtrace/contrib/active_support/integration.rb +38 -0
  87. data/lib/ddtrace/contrib/active_support/notifications/event.rb +62 -0
  88. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +66 -0
  89. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +159 -0
  90. data/lib/ddtrace/contrib/active_support/patcher.rb +29 -0
  91. data/lib/ddtrace/contrib/analytics.rb +20 -0
  92. data/lib/ddtrace/contrib/aws/configuration/settings.rb +25 -0
  93. data/lib/ddtrace/contrib/aws/ext.rb +20 -0
  94. data/lib/ddtrace/contrib/aws/instrumentation.rb +56 -0
  95. data/lib/ddtrace/contrib/aws/integration.rb +36 -0
  96. data/lib/ddtrace/contrib/aws/parsed_context.rb +56 -0
  97. data/lib/ddtrace/contrib/aws/patcher.rb +49 -0
  98. data/lib/ddtrace/contrib/aws/services.rb +115 -0
  99. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +15 -0
  100. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +35 -0
  101. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +11 -0
  102. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +23 -0
  103. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +32 -0
  104. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +35 -0
  105. data/lib/ddtrace/contrib/configurable.rb +59 -0
  106. data/lib/ddtrace/contrib/configuration/resolver.rb +12 -0
  107. data/lib/ddtrace/contrib/configuration/settings.rb +35 -0
  108. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +25 -0
  109. data/lib/ddtrace/contrib/dalli/ext.rb +17 -0
  110. data/lib/ddtrace/contrib/dalli/instrumentation.rb +50 -0
  111. data/lib/ddtrace/contrib/dalli/integration.rb +36 -0
  112. data/lib/ddtrace/contrib/dalli/patcher.rb +73 -0
  113. data/lib/ddtrace/contrib/dalli/quantize.rb +22 -0
  114. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +25 -0
  115. data/lib/ddtrace/contrib/delayed_job/ext.rb +18 -0
  116. data/lib/ddtrace/contrib/delayed_job/integration.rb +32 -0
  117. data/lib/ddtrace/contrib/delayed_job/patcher.rb +34 -0
  118. data/lib/ddtrace/contrib/delayed_job/plugin.rb +57 -0
  119. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +26 -0
  120. data/lib/ddtrace/contrib/elasticsearch/ext.rb +19 -0
  121. data/lib/ddtrace/contrib/elasticsearch/integration.rb +37 -0
  122. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +124 -0
  123. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +80 -0
  124. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +26 -0
  125. data/lib/ddtrace/contrib/ethon/easy_patch.rb +139 -0
  126. data/lib/ddtrace/contrib/ethon/ext.rb +15 -0
  127. data/lib/ddtrace/contrib/ethon/integration.rb +31 -0
  128. data/lib/ddtrace/contrib/ethon/multi_patch.rb +80 -0
  129. data/lib/ddtrace/contrib/ethon/patcher.rb +27 -0
  130. data/lib/ddtrace/contrib/excon/configuration/settings.rb +28 -0
  131. data/lib/ddtrace/contrib/excon/ext.rb +14 -0
  132. data/lib/ddtrace/contrib/excon/integration.rb +32 -0
  133. data/lib/ddtrace/contrib/excon/middleware.rb +154 -0
  134. data/lib/ddtrace/contrib/excon/patcher.rb +34 -0
  135. data/lib/ddtrace/contrib/extensions.rb +59 -0
  136. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +33 -0
  137. data/lib/ddtrace/contrib/faraday/ext.rb +14 -0
  138. data/lib/ddtrace/contrib/faraday/integration.rb +36 -0
  139. data/lib/ddtrace/contrib/faraday/middleware.rb +93 -0
  140. data/lib/ddtrace/contrib/faraday/patcher.rb +82 -0
  141. data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
  142. data/lib/ddtrace/contrib/grape/configuration/settings.rb +27 -0
  143. data/lib/ddtrace/contrib/grape/endpoint.rb +199 -0
  144. data/lib/ddtrace/contrib/grape/ext.rb +19 -0
  145. data/lib/ddtrace/contrib/grape/instrumentation.rb +33 -0
  146. data/lib/ddtrace/contrib/grape/integration.rb +36 -0
  147. data/lib/ddtrace/contrib/grape/patcher.rb +79 -0
  148. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +27 -0
  149. data/lib/ddtrace/contrib/graphql/ext.rb +13 -0
  150. data/lib/ddtrace/contrib/graphql/integration.rb +38 -0
  151. data/lib/ddtrace/contrib/graphql/patcher.rb +63 -0
  152. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +25 -0
  153. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +74 -0
  154. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +56 -0
  155. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +73 -0
  156. data/lib/ddtrace/contrib/grpc/ext.rb +15 -0
  157. data/lib/ddtrace/contrib/grpc/integration.rb +36 -0
  158. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
  159. data/lib/ddtrace/contrib/grpc/patcher.rb +78 -0
  160. data/lib/ddtrace/contrib/http/circuit_breaker.rb +63 -0
  161. data/lib/ddtrace/contrib/http/configuration/settings.rb +26 -0
  162. data/lib/ddtrace/contrib/http/ext.rb +14 -0
  163. data/lib/ddtrace/contrib/http/instrumentation.rb +114 -0
  164. data/lib/ddtrace/contrib/http/integration.rb +32 -0
  165. data/lib/ddtrace/contrib/http/patcher.rb +32 -0
  166. data/lib/ddtrace/contrib/integration.rb +16 -0
  167. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +28 -0
  168. data/lib/ddtrace/contrib/mongodb/ext.rb +20 -0
  169. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +68 -0
  170. data/lib/ddtrace/contrib/mongodb/integration.rb +36 -0
  171. data/lib/ddtrace/contrib/mongodb/parsers.rb +68 -0
  172. data/lib/ddtrace/contrib/mongodb/patcher.rb +37 -0
  173. data/lib/ddtrace/contrib/mongodb/subscribers.rb +108 -0
  174. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +25 -0
  175. data/lib/ddtrace/contrib/mysql2/ext.rb +15 -0
  176. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +60 -0
  177. data/lib/ddtrace/contrib/mysql2/integration.rb +32 -0
  178. data/lib/ddtrace/contrib/mysql2/patcher.rb +33 -0
  179. data/lib/ddtrace/contrib/patchable.rb +42 -0
  180. data/lib/ddtrace/contrib/patcher.rb +28 -0
  181. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +25 -0
  182. data/lib/ddtrace/contrib/racecar/event.rb +67 -0
  183. data/lib/ddtrace/contrib/racecar/events.rb +30 -0
  184. data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
  185. data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
  186. data/lib/ddtrace/contrib/racecar/ext.rb +21 -0
  187. data/lib/ddtrace/contrib/racecar/integration.rb +36 -0
  188. data/lib/ddtrace/contrib/racecar/patcher.rb +32 -0
  189. data/lib/ddtrace/contrib/rack/configuration/settings.rb +41 -0
  190. data/lib/ddtrace/contrib/rack/ext.rb +18 -0
  191. data/lib/ddtrace/contrib/rack/integration.rb +32 -0
  192. data/lib/ddtrace/contrib/rack/middlewares.rb +283 -0
  193. data/lib/ddtrace/contrib/rack/patcher.rb +72 -0
  194. data/lib/ddtrace/contrib/rack/request_queue.rb +39 -0
  195. data/lib/ddtrace/contrib/rails/configuration/settings.rb +80 -0
  196. data/lib/ddtrace/contrib/rails/ext.rb +12 -0
  197. data/lib/ddtrace/contrib/rails/framework.rb +100 -0
  198. data/lib/ddtrace/contrib/rails/integration.rb +37 -0
  199. data/lib/ddtrace/contrib/rails/middlewares.rb +38 -0
  200. data/lib/ddtrace/contrib/rails/patcher.rb +78 -0
  201. data/lib/ddtrace/contrib/rails/railtie.rb +17 -0
  202. data/lib/ddtrace/contrib/rails/utils.rb +20 -0
  203. data/lib/ddtrace/contrib/rake/configuration/settings.rb +27 -0
  204. data/lib/ddtrace/contrib/rake/ext.rb +18 -0
  205. data/lib/ddtrace/contrib/rake/instrumentation.rb +84 -0
  206. data/lib/ddtrace/contrib/rake/integration.rb +32 -0
  207. data/lib/ddtrace/contrib/rake/patcher.rb +36 -0
  208. data/lib/ddtrace/contrib/redis/configuration/settings.rb +25 -0
  209. data/lib/ddtrace/contrib/redis/ext.rb +18 -0
  210. data/lib/ddtrace/contrib/redis/integration.rb +36 -0
  211. data/lib/ddtrace/contrib/redis/patcher.rb +94 -0
  212. data/lib/ddtrace/contrib/redis/quantize.rb +47 -0
  213. data/lib/ddtrace/contrib/redis/tags.rb +38 -0
  214. data/lib/ddtrace/contrib/registerable.rb +33 -0
  215. data/lib/ddtrace/contrib/registry.rb +42 -0
  216. data/lib/ddtrace/contrib/resque/configuration/settings.rb +26 -0
  217. data/lib/ddtrace/contrib/resque/ext.rb +14 -0
  218. data/lib/ddtrace/contrib/resque/integration.rb +37 -0
  219. data/lib/ddtrace/contrib/resque/patcher.rb +35 -0
  220. data/lib/ddtrace/contrib/resque/resque_job.rb +76 -0
  221. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +26 -0
  222. data/lib/ddtrace/contrib/rest_client/ext.rb +14 -0
  223. data/lib/ddtrace/contrib/rest_client/integration.rb +31 -0
  224. data/lib/ddtrace/contrib/rest_client/patcher.rb +25 -0
  225. data/lib/ddtrace/contrib/rest_client/request_patch.rb +89 -0
  226. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +23 -0
  227. data/lib/ddtrace/contrib/sequel/database.rb +61 -0
  228. data/lib/ddtrace/contrib/sequel/dataset.rb +62 -0
  229. data/lib/ddtrace/contrib/sequel/ext.rb +15 -0
  230. data/lib/ddtrace/contrib/sequel/integration.rb +32 -0
  231. data/lib/ddtrace/contrib/sequel/patcher.rb +39 -0
  232. data/lib/ddtrace/contrib/sequel/utils.rb +46 -0
  233. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +24 -0
  234. data/lib/ddtrace/contrib/shoryuken/ext.rb +18 -0
  235. data/lib/ddtrace/contrib/shoryuken/integration.rb +35 -0
  236. data/lib/ddtrace/contrib/shoryuken/patcher.rb +30 -0
  237. data/lib/ddtrace/contrib/shoryuken/tracer.rb +45 -0
  238. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
  239. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +26 -0
  240. data/lib/ddtrace/contrib/sidekiq/ext.rb +21 -0
  241. data/lib/ddtrace/contrib/sidekiq/integration.rb +36 -0
  242. data/lib/ddtrace/contrib/sidekiq/patcher.rb +40 -0
  243. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +58 -0
  244. data/lib/ddtrace/contrib/sidekiq/tracing.rb +28 -0
  245. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +34 -0
  246. data/lib/ddtrace/contrib/sinatra/env.rb +38 -0
  247. data/lib/ddtrace/contrib/sinatra/ext.rb +18 -0
  248. data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
  249. data/lib/ddtrace/contrib/sinatra/integration.rb +36 -0
  250. data/lib/ddtrace/contrib/sinatra/patcher.rb +33 -0
  251. data/lib/ddtrace/contrib/sinatra/tracer.rb +84 -0
  252. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +72 -0
  253. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +25 -0
  254. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +26 -0
  255. data/lib/ddtrace/contrib/sucker_punch/ext.rb +18 -0
  256. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +70 -0
  257. data/lib/ddtrace/contrib/sucker_punch/integration.rb +36 -0
  258. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +48 -0
  259. data/lib/ddtrace/correlation.rb +28 -0
  260. data/lib/ddtrace/diagnostics/health.rb +30 -0
  261. data/lib/ddtrace/distributed_tracing/headers/b3.rb +44 -0
  262. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +56 -0
  263. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +42 -0
  264. data/lib/ddtrace/distributed_tracing/headers/headers.rb +70 -0
  265. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +45 -0
  266. data/lib/ddtrace/encoding.rb +65 -0
  267. data/lib/ddtrace/environment.rb +23 -0
  268. data/lib/ddtrace/error.rb +27 -0
  269. data/lib/ddtrace/ext/analytics.rb +11 -0
  270. data/lib/ddtrace/ext/app_types.rb +11 -0
  271. data/lib/ddtrace/ext/diagnostics.rb +25 -0
  272. data/lib/ddtrace/ext/distributed.rb +33 -0
  273. data/lib/ddtrace/ext/errors.rb +10 -0
  274. data/lib/ddtrace/ext/forced_tracing.rb +25 -0
  275. data/lib/ddtrace/ext/http.rb +46 -0
  276. data/lib/ddtrace/ext/manual_tracing.rb +9 -0
  277. data/lib/ddtrace/ext/metrics.rb +15 -0
  278. data/lib/ddtrace/ext/net.rb +10 -0
  279. data/lib/ddtrace/ext/priority.rb +16 -0
  280. data/lib/ddtrace/ext/runtime.rb +26 -0
  281. data/lib/ddtrace/ext/sql.rb +8 -0
  282. data/lib/ddtrace/ext/transport.rb +17 -0
  283. data/lib/ddtrace/forced_tracing.rb +36 -0
  284. data/lib/ddtrace/logger.rb +39 -0
  285. data/lib/ddtrace/metrics.rb +215 -0
  286. data/lib/ddtrace/monkey.rb +58 -0
  287. data/lib/ddtrace/opentracer.rb +40 -0
  288. data/lib/ddtrace/opentracer/binary_propagator.rb +24 -0
  289. data/lib/ddtrace/opentracer/carrier.rb +6 -0
  290. data/lib/ddtrace/opentracer/distributed_headers.rb +52 -0
  291. data/lib/ddtrace/opentracer/global_tracer.rb +15 -0
  292. data/lib/ddtrace/opentracer/propagator.rb +22 -0
  293. data/lib/ddtrace/opentracer/rack_propagator.rb +60 -0
  294. data/lib/ddtrace/opentracer/scope.rb +15 -0
  295. data/lib/ddtrace/opentracer/scope_manager.rb +6 -0
  296. data/lib/ddtrace/opentracer/span.rb +98 -0
  297. data/lib/ddtrace/opentracer/span_context.rb +14 -0
  298. data/lib/ddtrace/opentracer/span_context_factory.rb +23 -0
  299. data/lib/ddtrace/opentracer/text_map_propagator.rb +75 -0
  300. data/lib/ddtrace/opentracer/thread_local_scope.rb +30 -0
  301. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +40 -0
  302. data/lib/ddtrace/opentracer/tracer.rb +208 -0
  303. data/lib/ddtrace/patcher.rb +47 -0
  304. data/lib/ddtrace/pin.rb +114 -0
  305. data/lib/ddtrace/pipeline.rb +46 -0
  306. data/lib/ddtrace/pipeline/span_filter.rb +38 -0
  307. data/lib/ddtrace/pipeline/span_processor.rb +20 -0
  308. data/lib/ddtrace/propagation/grpc_propagator.rb +61 -0
  309. data/lib/ddtrace/propagation/http_propagator.rb +75 -0
  310. data/lib/ddtrace/provider.rb +21 -0
  311. data/lib/ddtrace/quantization/hash.rb +103 -0
  312. data/lib/ddtrace/quantization/http.rb +86 -0
  313. data/lib/ddtrace/runtime/cgroup.rb +44 -0
  314. data/lib/ddtrace/runtime/class_count.rb +17 -0
  315. data/lib/ddtrace/runtime/container.rb +73 -0
  316. data/lib/ddtrace/runtime/gc.rb +16 -0
  317. data/lib/ddtrace/runtime/identity.rb +41 -0
  318. data/lib/ddtrace/runtime/metrics.rb +93 -0
  319. data/lib/ddtrace/runtime/object_space.rb +19 -0
  320. data/lib/ddtrace/runtime/socket.rb +14 -0
  321. data/lib/ddtrace/runtime/thread_count.rb +16 -0
  322. data/lib/ddtrace/sampler.rb +195 -0
  323. data/lib/ddtrace/span.rb +260 -0
  324. data/lib/ddtrace/sync_writer.rb +62 -0
  325. data/lib/ddtrace/tracer.rb +459 -0
  326. data/lib/ddtrace/transport/http.rb +91 -0
  327. data/lib/ddtrace/transport/http/adapters/net.rb +112 -0
  328. data/lib/ddtrace/transport/http/adapters/registry.rb +24 -0
  329. data/lib/ddtrace/transport/http/adapters/test.rb +77 -0
  330. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +64 -0
  331. data/lib/ddtrace/transport/http/api.rb +46 -0
  332. data/lib/ddtrace/transport/http/api/endpoint.rb +27 -0
  333. data/lib/ddtrace/transport/http/api/fallbacks.rb +22 -0
  334. data/lib/ddtrace/transport/http/api/instance.rb +29 -0
  335. data/lib/ddtrace/transport/http/api/map.rb +14 -0
  336. data/lib/ddtrace/transport/http/api/spec.rb +15 -0
  337. data/lib/ddtrace/transport/http/builder.rb +165 -0
  338. data/lib/ddtrace/transport/http/client.rb +107 -0
  339. data/lib/ddtrace/transport/http/env.rb +48 -0
  340. data/lib/ddtrace/transport/http/response.rb +26 -0
  341. data/lib/ddtrace/transport/http/statistics.rb +30 -0
  342. data/lib/ddtrace/transport/http/traces.rb +140 -0
  343. data/lib/ddtrace/transport/parcel.rb +13 -0
  344. data/lib/ddtrace/transport/request.rb +13 -0
  345. data/lib/ddtrace/transport/response.rb +49 -0
  346. data/lib/ddtrace/transport/statistics.rb +72 -0
  347. data/lib/ddtrace/transport/traces.rb +33 -0
  348. data/lib/ddtrace/utils.rb +65 -0
  349. data/lib/ddtrace/utils/database.rb +25 -0
  350. data/lib/ddtrace/utils/time.rb +14 -0
  351. data/lib/ddtrace/vendor/active_record/connection_specification.rb +301 -0
  352. data/lib/ddtrace/version.rb +12 -0
  353. data/lib/ddtrace/workers.rb +125 -0
  354. data/lib/ddtrace/writer.rb +157 -0
  355. data/tasks/release_gem.rake +28 -0
  356. metadata +682 -0
@@ -0,0 +1,36 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/racecar/configuration/settings'
3
+ require 'ddtrace/contrib/racecar/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Racecar
8
+ # Description of Racecar integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :racecar, auto_patch: false
13
+
14
+ def self.version
15
+ Gem.loaded_specs['racecar'] && Gem.loaded_specs['racecar'].version
16
+ end
17
+
18
+ def self.present?
19
+ super && defined?(::Racecar)
20
+ end
21
+
22
+ def self.compatible?
23
+ super && defined?(::ActiveSupport::Notifications)
24
+ end
25
+
26
+ def default_configuration
27
+ Configuration::Settings.new
28
+ end
29
+
30
+ def patcher
31
+ Patcher
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/ext/app_types'
3
+ require 'ddtrace/contrib/racecar/ext'
4
+ require 'ddtrace/contrib/racecar/events'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module Racecar
9
+ # Patcher enables patching of 'racecar' module.
10
+ module Patcher
11
+ include Contrib::Patcher
12
+
13
+ module_function
14
+
15
+ def patched?
16
+ done?(:racecar)
17
+ end
18
+
19
+ def patch
20
+ do_once(:racecar) do
21
+ begin
22
+ # Subscribe to Racecar events
23
+ Events.subscribe!
24
+ rescue StandardError => e
25
+ Datadog::Tracer.log.error("Unable to apply Racecar integration: #{e}")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,41 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/rack/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Rack
7
+ module Configuration
8
+ # Custom settings for the Rack integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ DEFAULT_HEADERS = {
11
+ response: [
12
+ 'Content-Type',
13
+ 'X-Request-ID'
14
+ ]
15
+ }.freeze
16
+
17
+ option :analytics_enabled do |o|
18
+ o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
19
+ o.lazy
20
+ end
21
+
22
+ option :analytics_sample_rate do |o|
23
+ o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
24
+ o.lazy
25
+ end
26
+
27
+ option :application
28
+ option :distributed_tracing, default: true
29
+ option :headers, default: DEFAULT_HEADERS
30
+ option :middleware_names, default: false
31
+ option :quantize, default: {}
32
+ option :request_queuing, default: false
33
+
34
+ option :service_name, default: Ext::SERVICE_NAME
35
+
36
+ option :web_service_name, default: Ext::WEBSERVER_SERVICE_NAME
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Rack
4
+ # Rack integration constants
5
+ module Ext
6
+ APP = 'rack'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_RACK_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_RACK_ANALYTICS_SAMPLE_RATE'.freeze
9
+ RACK_ENV_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
10
+ SERVICE_NAME = 'rack'.freeze
11
+ SPAN_HTTP_SERVER_QUEUE = 'http_server.queue'.freeze
12
+ SPAN_REQUEST = 'rack.request'.freeze
13
+ WEBSERVER_APP = 'webserver'.freeze
14
+ WEBSERVER_SERVICE_NAME = 'web-server'.freeze
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/rack/configuration/settings'
3
+ require 'ddtrace/contrib/rack/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Rack
8
+ # Description of Rack integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :rack, auto_patch: false
13
+
14
+ def self.version
15
+ Gem.loaded_specs['rack'] && Gem.loaded_specs['rack'].version
16
+ end
17
+
18
+ def self.present?
19
+ super && defined?(::Rack)
20
+ end
21
+
22
+ def default_configuration
23
+ Configuration::Settings.new
24
+ end
25
+
26
+ def patcher
27
+ Patcher
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,283 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/ext/http'
3
+ require 'ddtrace/propagation/http_propagator'
4
+ require 'ddtrace/contrib/analytics'
5
+ require 'ddtrace/contrib/rack/ext'
6
+ require 'ddtrace/contrib/rack/request_queue'
7
+
8
+ module Datadog
9
+ module Contrib
10
+ # Rack module includes middlewares that are required to trace any framework
11
+ # and application built on top of Rack.
12
+ module Rack
13
+ # TraceMiddleware ensures that the Rack Request is properly traced
14
+ # from the beginning to the end. The middleware adds the request span
15
+ # in the Rack environment so that it can be retrieved by the underlying
16
+ # application. If request tags are not set by the app, they will be set using
17
+ # information available at the Rack level.
18
+ # rubocop:disable Metrics/ClassLength
19
+ class TraceMiddleware
20
+ # DEPRECATED: Remove in 1.0 in favor of Datadog::Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN
21
+ # This constant will remain here until then, for backwards compatibility.
22
+ RACK_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
23
+
24
+ def initialize(app)
25
+ @app = app
26
+ end
27
+
28
+ def compute_queue_time(env, tracer)
29
+ return unless configuration[:request_queuing]
30
+
31
+ # parse the request queue time
32
+ request_start = Datadog::Contrib::Rack::QueueTime.get_request_start(env)
33
+ return if request_start.nil?
34
+
35
+ tracer.trace(
36
+ Ext::SPAN_HTTP_SERVER_QUEUE,
37
+ span_type: Datadog::Ext::HTTP::TYPE_PROXY,
38
+ start_time: request_start,
39
+ service: configuration[:web_service_name]
40
+ )
41
+ end
42
+
43
+ def call(env)
44
+ # retrieve integration settings
45
+ tracer = configuration[:tracer]
46
+
47
+ # Extract distributed tracing context before creating any spans,
48
+ # so that all spans will be added to the distributed trace.
49
+ if configuration[:distributed_tracing]
50
+ context = HTTPPropagator.extract(env)
51
+ tracer.provider.context = context if context.trace_id
52
+ end
53
+
54
+ # [experimental] create a root Span to keep track of frontend web servers
55
+ # (i.e. Apache, nginx) if the header is properly set
56
+ frontend_span = compute_queue_time(env, tracer)
57
+
58
+ trace_options = {
59
+ service: configuration[:service_name],
60
+ resource: nil,
61
+ span_type: Datadog::Ext::HTTP::TYPE_INBOUND
62
+ }
63
+
64
+ # start a new request span and attach it to the current Rack environment;
65
+ # we must ensure that the span `resource` is set later
66
+ request_span = tracer.trace(Ext::SPAN_REQUEST, trace_options)
67
+ env[RACK_REQUEST_SPAN] = request_span
68
+
69
+ # TODO: Add deprecation warnings back in
70
+ # DEV: Some third party Gems will loop over the rack env causing our deprecation
71
+ # warnings to be shown even when the user is not accessing them directly
72
+ #
73
+ # add_deprecation_warnings(env)
74
+ # env.without_datadog_warnings do
75
+ # # TODO: For backwards compatibility; this attribute is deprecated.
76
+ # env[:datadog_rack_request_span] = env[RACK_REQUEST_SPAN]
77
+ # end
78
+ env[:datadog_rack_request_span] = env[RACK_REQUEST_SPAN]
79
+
80
+ # Copy the original env, before the rest of the stack executes.
81
+ # Values may change; we want values before that happens.
82
+ original_env = env.dup
83
+
84
+ # call the rest of the stack
85
+ status, headers, response = @app.call(env)
86
+ [status, headers, response]
87
+
88
+ # rubocop:disable Lint/RescueException
89
+ # Here we really want to catch *any* exception, not only StandardError,
90
+ # as we really have no clue of what is in the block,
91
+ # and it is user code which should be executed no matter what.
92
+ # It's not a problem since we re-raise it afterwards so for example a
93
+ # SignalException::Interrupt would still bubble up.
94
+ rescue Exception => e
95
+ # catch exceptions that may be raised in the middleware chain
96
+ # Note: if a middleware catches an Exception without re raising,
97
+ # the Exception cannot be recorded here.
98
+ request_span.set_error(e) unless request_span.nil?
99
+ raise e
100
+ ensure
101
+ # Rack is a really low level interface and it doesn't provide any
102
+ # advanced functionality like routers. Because of that, we assume that
103
+ # the underlying framework or application has more knowledge about
104
+ # the result for this request; `resource` and `tags` are expected to
105
+ # be set in another level but if they're missing, reasonable defaults
106
+ # are used.
107
+ set_request_tags!(request_span, env, status, headers, response, original_env)
108
+
109
+ # ensure the request_span is finished and the context reset;
110
+ # this assumes that the Rack middleware creates a root span
111
+ request_span.finish
112
+ frontend_span.finish unless frontend_span.nil?
113
+
114
+ # TODO: Remove this once we change how context propagation works. This
115
+ # ensures we clean thread-local variables on each HTTP request avoiding
116
+ # memory leaks.
117
+ tracer.provider.context = Datadog::Context.new
118
+ end
119
+
120
+ def resource_name_for(env, status)
121
+ if configuration[:middleware_names] && env['RESPONSE_MIDDLEWARE']
122
+ "#{env['RESPONSE_MIDDLEWARE']}##{env['REQUEST_METHOD']}"
123
+ else
124
+ "#{env['REQUEST_METHOD']} #{status}".strip
125
+ end
126
+ end
127
+
128
+ # rubocop:disable Metrics/AbcSize
129
+ def set_request_tags!(request_span, env, status, headers, response, original_env)
130
+ # http://www.rubydoc.info/github/rack/rack/file/SPEC
131
+ # The source of truth in Rack is the PATH_INFO key that holds the
132
+ # URL for the current request; but some frameworks may override that
133
+ # value, especially during exception handling.
134
+ #
135
+ # Because of this, we prefer to use REQUEST_URI, if available, which is the
136
+ # relative path + query string, and doesn't mutate.
137
+ #
138
+ # REQUEST_URI is only available depending on what web server is running though.
139
+ # So when its not available, we want the original, unmutated PATH_INFO, which
140
+ # is just the relative path without query strings.
141
+ url = env['REQUEST_URI'] || original_env['PATH_INFO']
142
+ request_headers = parse_request_headers(env)
143
+ response_headers = parse_response_headers(headers || {})
144
+
145
+ request_span.resource ||= resource_name_for(env, status)
146
+
147
+ # Associate with runtime metrics
148
+ Datadog.runtime_metrics.associate_with_span(request_span)
149
+
150
+ # Set analytics sample rate
151
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
152
+ Contrib::Analytics.set_sample_rate(request_span, configuration[:analytics_sample_rate])
153
+ end
154
+
155
+ if request_span.get_tag(Datadog::Ext::HTTP::METHOD).nil?
156
+ request_span.set_tag(Datadog::Ext::HTTP::METHOD, env['REQUEST_METHOD'])
157
+ end
158
+
159
+ if request_span.get_tag(Datadog::Ext::HTTP::URL).nil?
160
+ options = configuration[:quantize]
161
+ request_span.set_tag(Datadog::Ext::HTTP::URL, Datadog::Quantization::HTTP.url(url, options))
162
+ end
163
+
164
+ if request_span.get_tag(Datadog::Ext::HTTP::BASE_URL).nil?
165
+ request_obj = ::Rack::Request.new(env)
166
+
167
+ base_url = if request_obj.respond_to?(:base_url)
168
+ request_obj.base_url
169
+ else
170
+ # Compatibility for older Rack versions
171
+ request_obj.url.chomp(request_obj.fullpath)
172
+ end
173
+
174
+ request_span.set_tag(Datadog::Ext::HTTP::BASE_URL, base_url)
175
+ end
176
+
177
+ if request_span.get_tag(Datadog::Ext::HTTP::STATUS_CODE).nil? && status
178
+ request_span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, status)
179
+ end
180
+
181
+ # Request headers
182
+ request_headers.each do |name, value|
183
+ request_span.set_tag(name, value) if request_span.get_tag(name).nil?
184
+ end
185
+
186
+ # Response headers
187
+ response_headers.each do |name, value|
188
+ request_span.set_tag(name, value) if request_span.get_tag(name).nil?
189
+ end
190
+
191
+ # detect if the status code is a 5xx and flag the request span as an error
192
+ # unless it has been already set by the underlying framework
193
+ if status.to_s.start_with?('5') && request_span.status.zero?
194
+ request_span.status = 1
195
+ end
196
+ end
197
+
198
+ private
199
+
200
+ REQUEST_SPAN_DEPRECATION_WARNING = %(
201
+ :datadog_rack_request_span is considered an internal symbol in the Rack env,
202
+ and has been been DEPRECATED. Public support for its usage is discontinued.
203
+ If you need the Rack request span, try using `Datadog.tracer.active_span`.
204
+ This key will be removed in version 1.0).freeze
205
+
206
+ def configuration
207
+ Datadog.configuration[:rack]
208
+ end
209
+
210
+ def add_deprecation_warnings(env)
211
+ env.instance_eval do
212
+ unless instance_variable_defined?(:@patched_with_datadog_warnings)
213
+ @patched_with_datadog_warnings = true
214
+ @datadog_deprecation_warnings = true
215
+ @datadog_span_warning = true
216
+
217
+ def [](key)
218
+ if key == :datadog_rack_request_span \
219
+ && @datadog_span_warning \
220
+ && @datadog_deprecation_warnings
221
+ Datadog::Tracer.log.warn(REQUEST_SPAN_DEPRECATION_WARNING)
222
+ @datadog_span_warning = true
223
+ end
224
+ super
225
+ end
226
+
227
+ def []=(key, value)
228
+ if key == :datadog_rack_request_span \
229
+ && @datadog_span_warning \
230
+ && @datadog_deprecation_warnings
231
+ Datadog::Tracer.log.warn(REQUEST_SPAN_DEPRECATION_WARNING)
232
+ @datadog_span_warning = true
233
+ end
234
+ super
235
+ end
236
+
237
+ def without_datadog_warnings
238
+ @datadog_deprecation_warnings = false
239
+ yield
240
+ ensure
241
+ @datadog_deprecation_warnings = true
242
+ end
243
+ end
244
+ end
245
+ end
246
+
247
+ def parse_request_headers(env)
248
+ {}.tap do |result|
249
+ whitelist = configuration[:headers][:request] || []
250
+ whitelist.each do |header|
251
+ rack_header = header_to_rack_header(header)
252
+ if env.key?(rack_header)
253
+ result[Datadog::Ext::HTTP::RequestHeaders.to_tag(header)] = env[rack_header]
254
+ end
255
+ end
256
+ end
257
+ end
258
+
259
+ def parse_response_headers(headers)
260
+ {}.tap do |result|
261
+ whitelist = configuration[:headers][:response] || []
262
+ whitelist.each do |header|
263
+ if headers.key?(header)
264
+ result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[header]
265
+ else
266
+ # Try a case-insensitive lookup
267
+ uppercased_header = header.to_s.upcase
268
+ matching_header = headers.keys.find { |h| h.upcase == uppercased_header }
269
+ if matching_header
270
+ result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[matching_header]
271
+ end
272
+ end
273
+ end
274
+ end
275
+ end
276
+
277
+ def header_to_rack_header(name)
278
+ "HTTP_#{name.to_s.upcase.gsub(/[-\s]/, '_')}"
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end