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,75 @@
1
+ require 'ddtrace/ext/distributed'
2
+
3
+ module Datadog
4
+ module OpenTracer
5
+ # OpenTracing propagator for Datadog::OpenTracer::Tracer
6
+ module TextMapPropagator
7
+ extend Propagator
8
+ extend Datadog::Ext::DistributedTracing
9
+ include Datadog::Ext::DistributedTracing
10
+
11
+ BAGGAGE_PREFIX = 'ot-baggage-'.freeze
12
+
13
+ class << self
14
+ # Inject a SpanContext into the given carrier
15
+ #
16
+ # @param span_context [SpanContext]
17
+ # @param carrier [Carrier] A carrier object of Rack type
18
+ def inject(span_context, carrier)
19
+ # Inject Datadog trace properties
20
+ span_context.datadog_context.tap do |datadog_context|
21
+ carrier[HTTP_HEADER_TRACE_ID] = datadog_context.trace_id
22
+ carrier[HTTP_HEADER_PARENT_ID] = datadog_context.span_id
23
+ carrier[HTTP_HEADER_SAMPLING_PRIORITY] = datadog_context.sampling_priority
24
+ carrier[HTTP_HEADER_ORIGIN] = datadog_context.origin
25
+ end
26
+
27
+ # Inject baggage
28
+ span_context.baggage.each do |key, value|
29
+ carrier[BAGGAGE_PREFIX + key] = value
30
+ end
31
+
32
+ nil
33
+ end
34
+
35
+ # Extract a SpanContext in TextMap format from the given carrier.
36
+ #
37
+ # @param carrier [Carrier] A carrier object of TextMap type
38
+ # @return [SpanContext, nil] the extracted SpanContext or nil if none could be found
39
+ def extract(carrier)
40
+ # First extract & build a Datadog context
41
+ headers = DistributedHeaders.new(carrier)
42
+
43
+ datadog_context = if headers.valid?
44
+ Datadog::Context.new(
45
+ trace_id: headers.trace_id,
46
+ span_id: headers.parent_id,
47
+ sampling_priority: headers.sampling_priority,
48
+ origin: headers.origin
49
+ )
50
+ else
51
+ Datadog::Context.new
52
+ end
53
+
54
+ # Then extract any other baggage
55
+ baggage = {}
56
+ carrier.each do |key, value|
57
+ baggage[item_to_baggage(key)] = value if baggage_item?(key)
58
+ end
59
+
60
+ SpanContextFactory.build(datadog_context: datadog_context, baggage: baggage)
61
+ end
62
+
63
+ private
64
+
65
+ def baggage_item?(item)
66
+ item.to_s.start_with?(BAGGAGE_PREFIX)
67
+ end
68
+
69
+ def item_to_baggage(key)
70
+ key[BAGGAGE_PREFIX.length, key.length]
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,30 @@
1
+ module Datadog
2
+ module OpenTracer
3
+ # OpenTracing adapter for thread local scopes
4
+ class ThreadLocalScope < Scope
5
+ attr_reader \
6
+ :finish_on_close
7
+
8
+ def initialize(
9
+ manager:,
10
+ span:,
11
+ finish_on_close: true
12
+ )
13
+ super(manager: manager, span: span)
14
+ @finish_on_close = finish_on_close
15
+ @previous_scope = manager.active
16
+ end
17
+
18
+ # Mark the end of the active period for the current thread and Scope,
19
+ # updating the ScopeManager#active in the process.
20
+ #
21
+ # NOTE: Calling close more than once on a single Scope instance leads to
22
+ # undefined behavior.
23
+ def close
24
+ return unless equal?(manager.active)
25
+ span.finish if finish_on_close
26
+ manager.send(:set_scope, @previous_scope)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,40 @@
1
+ module Datadog
2
+ module OpenTracer
3
+ # OpenTracing adapter for thread local scope management
4
+ class ThreadLocalScopeManager < ScopeManager
5
+ # Make a span instance active.
6
+ #
7
+ # @param span [Span] the Span that should become active
8
+ # @param finish_on_close [Boolean] whether the Span should automatically be
9
+ # finished when Scope#close is called
10
+ # @return [Scope] instance to control the end of the active period for the
11
+ # Span. It is a programming error to neglect to call Scope#close on the
12
+ # returned instance.
13
+ def activate(span, finish_on_close: true)
14
+ ThreadLocalScope.new(
15
+ manager: self,
16
+ span: span,
17
+ finish_on_close: finish_on_close
18
+ ).tap do |scope|
19
+ set_scope(scope)
20
+ end
21
+ end
22
+
23
+ # @return [Scope] the currently active Scope which can be used to access the
24
+ # currently active Span.
25
+ #
26
+ # If there is a non-null Scope, its wrapped Span becomes an implicit parent
27
+ # (as Reference#CHILD_OF) of any newly-created Span at Tracer#start_active_span
28
+ # or Tracer#start_span time.
29
+ def active
30
+ Thread.current[object_id.to_s]
31
+ end
32
+
33
+ private
34
+
35
+ def set_scope(scope)
36
+ Thread.current[object_id.to_s] = scope
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,208 @@
1
+ require 'ddtrace/tracer'
2
+
3
+ module Datadog
4
+ module OpenTracer
5
+ # OpenTracing adapter for Datadog::Tracer
6
+ class Tracer < ::OpenTracing::Tracer
7
+ extend Forwardable
8
+
9
+ attr_reader \
10
+ :datadog_tracer
11
+
12
+ def_delegators \
13
+ :datadog_tracer,
14
+ :configure
15
+
16
+ def initialize(options = {})
17
+ super()
18
+ @datadog_tracer = Datadog::Tracer.new(options)
19
+ end
20
+
21
+ # @return [ScopeManager] the current ScopeManager.
22
+ def scope_manager
23
+ @scope_manager ||= ThreadLocalScopeManager.new
24
+ end
25
+
26
+ # Returns a newly started and activated Scope.
27
+ #
28
+ # If the Tracer's ScopeManager#active is not nil, no explicit references
29
+ # are provided, and `ignore_active_scope` is false, then an inferred
30
+ # References#CHILD_OF reference is created to the ScopeManager#active's
31
+ # SpanContext when start_active is invoked.
32
+ #
33
+ # @param operation_name [String] The operation name for the Span
34
+ # @param child_of [SpanContext, Span] SpanContext that acts as a parent to
35
+ # the newly-started Span. If a Span instance is provided, its
36
+ # context is automatically substituted. See [Reference] for more
37
+ # information.
38
+ #
39
+ # If specified, the `references` parameter must be omitted.
40
+ # @param references [Array<Reference>] An array of reference
41
+ # objects that identify one or more parent SpanContexts.
42
+ # @param start_time [Time] When the Span started, if not now
43
+ # @param tags [Hash] Tags to assign to the Span at start time
44
+ # @param ignore_active_scope [Boolean] whether to create an implicit
45
+ # References#CHILD_OF reference to the ScopeManager#active.
46
+ # @param finish_on_close [Boolean] whether span should automatically be
47
+ # finished when Scope#close is called
48
+ # @yield [Scope] If an optional block is passed to start_active it will
49
+ # yield the newly-started Scope. If `finish_on_close` is true then the
50
+ # Span will be finished automatically after the block is executed.
51
+ # @return [Scope] The newly-started and activated Scope
52
+ def start_active_span(operation_name,
53
+ child_of: nil,
54
+ references: nil,
55
+ start_time: Time.now,
56
+ tags: nil,
57
+ ignore_active_scope: false,
58
+ finish_on_close: true)
59
+
60
+ # When meant to automatically determine the parent,
61
+ # Use the active scope first, otherwise fall back to any
62
+ # context generated by Datadog, so as to append to it and gain
63
+ # the benefit of any out-of-the-box tracing from Datadog preceding
64
+ # the OpenTracer::Tracer.
65
+ #
66
+ # We do this here instead of in #start_span because #start_span generates
67
+ # spans that are not assigned to a scope, a.k.a not supposed to be used by
68
+ # subsequent spans implicitly. By using the existing Datadog context, the span
69
+ # effectively ends up "assigned to a scope", by virtue of being added to the
70
+ # Context. Hence, it would behave more like an active span, which is why it
71
+ # should only be here.
72
+ unless child_of || ignore_active_scope
73
+ child_of = if scope_manager.active
74
+ scope_manager.active.span.context
75
+ else
76
+ SpanContextFactory.build(datadog_context: datadog_tracer.call_context)
77
+ end
78
+ end
79
+
80
+ # Create the span, and auto-add it to the Datadog context.
81
+ span = start_span(
82
+ operation_name,
83
+ child_of: child_of,
84
+ references: references,
85
+ start_time: start_time,
86
+ tags: tags,
87
+ ignore_active_scope: ignore_active_scope
88
+ )
89
+
90
+ # Overwrite the tracer context with the OpenTracing managed context.
91
+ # This is mostly for the benefit of any out-of-the-box tracing from Datadog,
92
+ # such that spans generated by that tracing will be attached to the OpenTracer
93
+ # parent span.
94
+ datadog_tracer.provider.context = span.datadog_span.context
95
+
96
+ scope_manager.activate(span, finish_on_close: finish_on_close).tap do |scope|
97
+ if block_given?
98
+ begin
99
+ yield(scope)
100
+ ensure
101
+ scope.close
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ # Like #start_active_span, but the returned Span has not been registered via the
108
+ # ScopeManager.
109
+ #
110
+ # @param operation_name [String] The operation name for the Span
111
+ # @param child_of [SpanContext, Span] SpanContext that acts as a parent to
112
+ # the newly-started Span. If a Span instance is provided, its
113
+ # context is automatically substituted. See [Reference] for more
114
+ # information.
115
+ #
116
+ # If specified, the `references` parameter must be omitted.
117
+ # @param references [Array<Reference>] An array of reference
118
+ # objects that identify one or more parent SpanContexts.
119
+ # @param start_time [Time] When the Span started, if not now
120
+ # @param tags [Hash] Tags to assign to the Span at start time
121
+ # @param ignore_active_scope [Boolean] whether to create an implicit
122
+ # References#CHILD_OF reference to the ScopeManager#active.
123
+ # @return [Span] the newly-started Span instance, which has not been
124
+ # automatically registered via the ScopeManager
125
+ def start_span(operation_name,
126
+ child_of: nil,
127
+ references: nil,
128
+ start_time: Time.now,
129
+ tags: nil,
130
+ ignore_active_scope: false)
131
+
132
+ # Derive the OpenTracer::SpanContext to inherit from.
133
+ parent_span_context = inherited_span_context(child_of, ignore_active_scope: ignore_active_scope)
134
+
135
+ # Retrieve Datadog::Context from parent SpanContext.
136
+ datadog_context = parent_span_context.nil? ? nil : parent_span_context.datadog_context
137
+
138
+ # Build the new Datadog span
139
+ datadog_span = datadog_tracer.start_span(
140
+ operation_name,
141
+ child_of: datadog_context,
142
+ start_time: start_time,
143
+ tags: tags || {}
144
+ )
145
+
146
+ # Build or extend the OpenTracer::SpanContext
147
+ span_context = if parent_span_context
148
+ SpanContextFactory.clone(span_context: parent_span_context)
149
+ else
150
+ SpanContextFactory.build(datadog_context: datadog_span.context)
151
+ end
152
+
153
+ # Wrap the Datadog span and OpenTracer::Span context in a OpenTracer::Span
154
+ Span.new(datadog_span: datadog_span, span_context: span_context)
155
+ end
156
+
157
+ # Inject a SpanContext into the given carrier
158
+ #
159
+ # @param span_context [SpanContext]
160
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
161
+ # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
162
+ def inject(span_context, format, carrier)
163
+ case format
164
+ when OpenTracing::FORMAT_TEXT_MAP
165
+ TextMapPropagator.inject(span_context, carrier)
166
+ when OpenTracing::FORMAT_BINARY
167
+ BinaryPropagator.inject(span_context, carrier)
168
+ when OpenTracing::FORMAT_RACK
169
+ RackPropagator.inject(span_context, carrier)
170
+ else
171
+ warn 'Unknown inject format'
172
+ end
173
+ end
174
+
175
+ # Extract a SpanContext in the given format from the given carrier.
176
+ #
177
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
178
+ # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
179
+ # @return [SpanContext, nil] the extracted SpanContext or nil if none could be found
180
+ def extract(format, carrier)
181
+ case format
182
+ when OpenTracing::FORMAT_TEXT_MAP
183
+ TextMapPropagator.extract(carrier)
184
+ when OpenTracing::FORMAT_BINARY
185
+ BinaryPropagator.extract(carrier)
186
+ when OpenTracing::FORMAT_RACK
187
+ RackPropagator.extract(carrier)
188
+ else
189
+ warn 'Unknown extract format'
190
+ nil
191
+ end
192
+ end
193
+
194
+ private
195
+
196
+ def inherited_span_context(parent, ignore_active_scope: false)
197
+ case parent
198
+ when Span
199
+ parent.context
200
+ when SpanContext
201
+ parent
202
+ else
203
+ ignore_active_scope ? nil : scope_manager.active && scope_manager.active.span.context
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,47 @@
1
+ module Datadog
2
+ # Defines some useful patching methods for integrations
3
+ module Patcher
4
+ def self.included(base)
5
+ base.send(:extend, CommonMethods)
6
+ base.send(:include, CommonMethods)
7
+ end
8
+
9
+ # Defines some common methods for patching, that can be used
10
+ # at the instance, class, or module level.
11
+ module CommonMethods
12
+ def without_warnings
13
+ # This is typically used when monkey patching functions such as
14
+ # intialize, which Ruby advices you not to. Use cautiously.
15
+ v = $VERBOSE
16
+ $VERBOSE = nil
17
+ begin
18
+ yield
19
+ ensure
20
+ $VERBOSE = v
21
+ end
22
+ end
23
+
24
+ def do_once(key = nil, options = {})
25
+ # If already done, don't do again
26
+ @done_once ||= Hash.new { |h, k| h[k] = {} }
27
+ if @done_once.key?(key) && @done_once[key].key?(options[:for])
28
+ return @done_once[key][options[:for]]
29
+ end
30
+
31
+ # Otherwise 'do'
32
+ yield.tap do
33
+ # Then add the key so we don't do again.
34
+ @done_once[key][options[:for]] = true
35
+ end
36
+ end
37
+
38
+ def done?(key, options = {})
39
+ return false unless instance_variable_defined?(:@done_once)
40
+ !@done_once.nil? && @done_once.key?(key) && @done_once[key].key?(options[:for])
41
+ end
42
+ end
43
+
44
+ # Extend the common methods so they're available as a module function.
45
+ extend(CommonMethods)
46
+ end
47
+ end
@@ -0,0 +1,114 @@
1
+ require 'ddtrace/patcher'
2
+
3
+ # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
4
+ module Datadog
5
+ # A \Pin (a.k.a Patch INfo) is a small class which is used to
6
+ # set tracing metadata on a particular traced object.
7
+ # This is useful if you wanted to, say, trace two different
8
+ # database clusters.
9
+ class Pin
10
+ def self.get_from(obj)
11
+ return nil unless obj.respond_to? :datadog_pin
12
+ obj.datadog_pin
13
+ end
14
+
15
+ attr_reader :service_name
16
+ attr_accessor :app
17
+ attr_accessor :tags
18
+ attr_accessor :app_type
19
+ attr_accessor :name
20
+ attr_accessor :tracer
21
+ attr_accessor :config
22
+
23
+ def initialize(service_name, options = {})
24
+ @app = options[:app]
25
+ @tags = options[:tags]
26
+ @app_type = options[:app_type]
27
+ @name = nil # this would rarely be overriden as it's really span-specific
28
+ @tracer = options[:tracer] || Datadog.tracer
29
+ @config = options[:config]
30
+ self.service_name = service_name
31
+ end
32
+
33
+ def enabled?
34
+ return @tracer.enabled if @tracer
35
+ false
36
+ end
37
+
38
+ # rubocop:disable Style/TrivialAccessors
39
+ def onto(obj)
40
+ unless obj.respond_to? :datadog_pin=
41
+ obj.instance_exec do
42
+ def datadog_pin=(pin)
43
+ @datadog_pin = pin
44
+ end
45
+ end
46
+ end
47
+
48
+ unless obj.respond_to? :datadog_pin
49
+ obj.instance_exec do
50
+ def datadog_pin
51
+ @datadog_pin
52
+ end
53
+ end
54
+ end
55
+
56
+ obj.datadog_pin = self
57
+ end
58
+
59
+ def service_name=(name)
60
+ @service_name = name
61
+ end
62
+
63
+ alias service= service_name=
64
+ alias service service_name
65
+
66
+ def to_s
67
+ "Pin(service:#{service},app:#{app},app_type:#{app_type},name:#{name})"
68
+ end
69
+ end
70
+
71
+ # Modification to Pin which logs deprecation warnings if accessed.
72
+ # Will be used by integrations which are phasing out the direct use of #datadog_pin.
73
+ module DeprecatedPin
74
+ include Datadog::Patcher
75
+
76
+ DEPRECATION_WARNING = %(
77
+ Use of Datadog::Pin is DEPRECATED.
78
+ Upgrade to the configuration API using the migration guide here:
79
+ https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
80
+
81
+ # Raise a deprecation warning when #datadog_pin or #datadog_pin= is accessed.
82
+ def onto(obj)
83
+ obj.instance_exec(self) do |pin|
84
+ @datadog_deprecated_pin = pin
85
+
86
+ unless respond_to? :datadog_pin=
87
+ def datadog_pin=(pin)
88
+ @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin=')
89
+ @datadog_pin = pin
90
+ end
91
+ end
92
+
93
+ unless respond_to? :datadog_pin
94
+ def datadog_pin
95
+ @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin')
96
+ @datadog_pin
97
+ end
98
+ end
99
+
100
+ # Set instance variable to avoid deprecation warnings
101
+ @datadog_pin = @datadog_deprecated_pin
102
+ end
103
+
104
+ self
105
+ end
106
+
107
+ def log_deprecation_warning(method_name)
108
+ # Only log each deprecation warning once (safeguard against log spam)
109
+ do_once(method_name) do
110
+ Datadog::Tracer.log.warn("#{method_name}:#{DEPRECATION_WARNING}")
111
+ end
112
+ end
113
+ end
114
+ end