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,26 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/ethon/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Ethon
7
+ module Configuration
8
+ # Custom settings for the Ethon integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :analytics_enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
12
+ o.lazy
13
+ end
14
+
15
+ option :analytics_sample_rate do |o|
16
+ o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
17
+ o.lazy
18
+ end
19
+
20
+ option :distributed_tracing, default: true
21
+ option :service_name, default: Ext::SERVICE_NAME
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,139 @@
1
+ require 'ddtrace/ext/net'
2
+ require 'ddtrace/ext/distributed'
3
+ require 'ddtrace/propagation/http_propagator'
4
+ require 'ddtrace/contrib/ethon/ext'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module Ethon
9
+ # Ethon EasyPatch
10
+ module EasyPatch
11
+ def self.included(base)
12
+ base.send(:prepend, InstanceMethods)
13
+ end
14
+
15
+ # InstanceMethods - implementing instrumentation
16
+ module InstanceMethods
17
+ def http_request(url, action_name, options = {})
18
+ return super unless tracer_enabled?
19
+
20
+ # It's tricky to get HTTP method from libcurl
21
+ @datadog_method = action_name.to_s.upcase
22
+ super
23
+ end
24
+
25
+ def headers=(headers)
26
+ return super unless tracer_enabled?
27
+
28
+ # Store headers to call this method again when span is ready
29
+ @datadog_original_headers = headers
30
+ super
31
+ end
32
+
33
+ def perform
34
+ return super unless tracer_enabled?
35
+ datadog_before_request
36
+ super
37
+ end
38
+
39
+ def complete
40
+ return super unless tracer_enabled?
41
+ begin
42
+ response_options = mirror.options
43
+ response_code = (response_options[:response_code] || response_options[:code]).to_i
44
+ if response_code.zero?
45
+ return_code = response_options[:return_code]
46
+ message = return_code ? ::Ethon::Curl.easy_strerror(return_code) : 'unknown reason'
47
+ set_span_error_message("Request has failed: #{message}")
48
+ else
49
+ @datadog_span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response_code)
50
+ if Datadog::Ext::HTTP::ERROR_RANGE.cover?(response_code)
51
+ set_span_error_message("Request has failed with HTTP error: #{response_code}")
52
+ end
53
+ end
54
+ ensure
55
+ @datadog_span.finish
56
+ @datadog_span = nil
57
+ end
58
+ super
59
+ end
60
+
61
+ def reset
62
+ super
63
+ ensure
64
+ if tracer_enabled?
65
+ @datadog_span = nil
66
+ @datadog_method = nil
67
+ @datadog_original_headers = nil
68
+ end
69
+ end
70
+
71
+ def datadog_before_request(parent_span: nil)
72
+ @datadog_span = datadog_configuration[:tracer].trace(
73
+ Ext::SPAN_REQUEST,
74
+ service: datadog_configuration[:service_name],
75
+ span_type: Datadog::Ext::HTTP::TYPE_OUTBOUND
76
+ )
77
+ @datadog_span.parent = parent_span unless parent_span.nil?
78
+
79
+ datadog_tag_request
80
+
81
+ if datadog_configuration[:distributed_tracing]
82
+ @datadog_original_headers ||= {}
83
+ Datadog::HTTPPropagator.inject!(@datadog_span.context, @datadog_original_headers)
84
+ self.headers = @datadog_original_headers
85
+ end
86
+ end
87
+
88
+ def datadog_span_started?
89
+ instance_variable_defined?(:@datadog_span) && !@datadog_span.nil?
90
+ end
91
+
92
+ private
93
+
94
+ def datadog_tag_request
95
+ span = @datadog_span
96
+ uri = URI.parse(url)
97
+ method = 'N/A'
98
+ if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
99
+ method = @datadog_method.to_s
100
+ end
101
+ span.resource = method
102
+
103
+ # Set analytics sample rate
104
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
105
+
106
+ span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
107
+ span.set_tag(Datadog::Ext::HTTP::METHOD, method)
108
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
109
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
110
+ rescue URI::InvalidURIError
111
+ return
112
+ end
113
+
114
+ def set_span_error_message(message)
115
+ # Sets span error from message, in case there is no exception available
116
+ @datadog_span.status = Datadog::Ext::Errors::STATUS
117
+ @datadog_span.set_tag(Datadog::Ext::Errors::MSG, message)
118
+ end
119
+
120
+ def datadog_configuration
121
+ Datadog.configuration[:ethon]
122
+ end
123
+
124
+ def tracer_enabled?
125
+ datadog_configuration[:tracer].enabled
126
+ end
127
+
128
+ def analytics_enabled?
129
+ Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
130
+ end
131
+
132
+ def analytics_sample_rate
133
+ datadog_configuration[:analytics_sample_rate]
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,15 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Ethon
4
+ # Ethon integration constants
5
+ module Ext
6
+ APP = 'ethon'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_ETHON_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_ETHON_ANALYTICS_SAMPLE_RATE'.freeze
9
+ SERVICE_NAME = 'ethon'.freeze
10
+ SPAN_REQUEST = 'ethon.request'.freeze
11
+ SPAN_MULTI_REQUEST = 'ethon.multi.request'.freeze
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/ethon/configuration/settings'
3
+ require 'ddtrace/contrib/ethon/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Ethon
8
+ # Description of Ethon integration
9
+ class Integration
10
+ include Contrib::Integration
11
+ register_as :ethon
12
+
13
+ def self.version
14
+ Gem.loaded_specs['ethon'] && Gem.loaded_specs['ethon'].version
15
+ end
16
+
17
+ def self.present?
18
+ super && defined?(::Ethon::Easy)
19
+ end
20
+
21
+ def default_configuration
22
+ Configuration::Settings.new
23
+ end
24
+
25
+ def patcher
26
+ Patcher
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,80 @@
1
+ require 'ddtrace/ext/net'
2
+ require 'ddtrace/ext/distributed'
3
+ require 'ddtrace/propagation/http_propagator'
4
+ require 'ddtrace/contrib/ethon/ext'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module Ethon
9
+ # Ethon MultiPatch
10
+ module MultiPatch
11
+ def self.included(base)
12
+ # No need to prepend here since add method is included into Multi class
13
+ base.send(:include, InstanceMethods)
14
+ end
15
+
16
+ # InstanceMethods - implementing instrumentation
17
+ module InstanceMethods
18
+ def add(easy)
19
+ handles = super
20
+ return handles if handles.nil? || !tracer_enabled?
21
+
22
+ if datadog_multi_performing?
23
+ # Start Easy span in case Multi is already performing
24
+ easy.datadog_before_request(parent_span: datadog_multi_span)
25
+ end
26
+ handles
27
+ end
28
+
29
+ def perform
30
+ if tracer_enabled?
31
+ easy_handles.each do |easy|
32
+ easy.datadog_before_request(parent_span: datadog_multi_span) unless easy.datadog_span_started?
33
+ end
34
+ end
35
+ super
36
+ ensure
37
+ if tracer_enabled? && datadog_multi_performing?
38
+ @datadog_multi_span.finish
39
+ @datadog_multi_span = nil
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def datadog_multi_performing?
46
+ instance_variable_defined?(:@datadog_multi_span) && !@datadog_multi_span.nil?
47
+ end
48
+
49
+ def datadog_multi_span
50
+ @datadog_multi_span ||= datadog_configuration[:tracer].trace(
51
+ Ext::SPAN_MULTI_REQUEST,
52
+ service: datadog_configuration[:service_name]
53
+ )
54
+
55
+ # Set analytics sample rate
56
+ Contrib::Analytics.set_sample_rate(@datadog_multi_span, analytics_sample_rate) if analytics_enabled?
57
+
58
+ @datadog_multi_span
59
+ end
60
+
61
+ def datadog_configuration
62
+ Datadog.configuration[:ethon]
63
+ end
64
+
65
+ def tracer_enabled?
66
+ datadog_configuration[:tracer].enabled
67
+ end
68
+
69
+ def analytics_enabled?
70
+ Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
71
+ end
72
+
73
+ def analytics_sample_rate
74
+ datadog_configuration[:analytics_sample_rate]
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,27 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Ethon
4
+ # Patcher enables patching of 'ethon' module.
5
+ module Patcher
6
+ include Contrib::Patcher
7
+
8
+ module_function
9
+
10
+ def patched?
11
+ done?(:ethon)
12
+ end
13
+
14
+ def patch
15
+ do_once(:ethon) do
16
+ require 'ddtrace/ext/app_types'
17
+ require 'ddtrace/contrib/ethon/easy_patch'
18
+ require 'ddtrace/contrib/ethon/multi_patch'
19
+
20
+ ::Ethon::Easy.send(:include, EasyPatch)
21
+ ::Ethon::Multi.send(:include, MultiPatch)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/excon/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Excon
7
+ module Configuration
8
+ # Custom settings for the Excon integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :analytics_enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
12
+ o.lazy
13
+ end
14
+
15
+ option :analytics_sample_rate do |o|
16
+ o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
17
+ o.lazy
18
+ end
19
+
20
+ option :distributed_tracing, default: true
21
+ option :error_handler
22
+ option :service_name, default: Ext::SERVICE_NAME
23
+ option :split_by_domain, default: false
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Excon
4
+ # Excon integration constants
5
+ module Ext
6
+ APP = 'excon'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_EXCON_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_EXCON_ANALYTICS_SAMPLE_RATE'.freeze
9
+ SERVICE_NAME = 'excon'.freeze
10
+ SPAN_REQUEST = 'excon.request'.freeze
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/excon/configuration/settings'
3
+ require 'ddtrace/contrib/excon/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Excon
8
+ # Description of Excon integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :excon
13
+
14
+ def self.version
15
+ Gem.loaded_specs['excon'] && Gem.loaded_specs['excon'].version
16
+ end
17
+
18
+ def self.present?
19
+ super && defined?(::Excon)
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,154 @@
1
+ require 'excon'
2
+ require 'ddtrace/ext/http'
3
+ require 'ddtrace/ext/net'
4
+ require 'ddtrace/ext/distributed'
5
+ require 'ddtrace/propagation/http_propagator'
6
+ require 'ddtrace/contrib/analytics'
7
+ require 'ddtrace/contrib/excon/ext'
8
+
9
+ module Datadog
10
+ module Contrib
11
+ module Excon
12
+ # Middleware implements an excon-middleware for ddtrace instrumentation
13
+ class Middleware < ::Excon::Middleware::Base
14
+ DEFAULT_ERROR_HANDLER = lambda do |response|
15
+ Datadog::Ext::HTTP::ERROR_RANGE.cover?(response[:status])
16
+ end
17
+
18
+ def initialize(stack, options = {})
19
+ super(stack)
20
+ @options = Datadog.configuration[:excon].options_hash.merge(options)
21
+ end
22
+
23
+ def request_call(datum)
24
+ begin
25
+ unless datum.key?(:datadog_span)
26
+ tracer.trace(Ext::SPAN_REQUEST).tap do |span|
27
+ datum[:datadog_span] = span
28
+ annotate!(span, datum)
29
+ propagate!(span, datum) if distributed_tracing?
30
+ end
31
+ end
32
+ rescue StandardError => e
33
+ Datadog::Tracer.log.debug(e.message)
34
+ end
35
+
36
+ @stack.request_call(datum)
37
+ end
38
+
39
+ def response_call(datum)
40
+ @stack.response_call(datum).tap do |d|
41
+ handle_response(d)
42
+ end
43
+ end
44
+
45
+ def error_call(datum)
46
+ handle_response(datum)
47
+ @stack.error_call(datum)
48
+ end
49
+
50
+ # Returns a child class of this trace middleware
51
+ # With options given as defaults.
52
+ def self.with(options = {})
53
+ Class.new(self) do
54
+ @options = options
55
+
56
+ # rubocop:disable Style/TrivialAccessors
57
+ def self.options
58
+ @options
59
+ end
60
+
61
+ def initialize(stack)
62
+ super(stack, self.class.options)
63
+ end
64
+ end
65
+ end
66
+
67
+ # Returns a copy of the default stack with the trace middleware injected
68
+ def self.around_default_stack
69
+ ::Excon.defaults[:middlewares].dup.tap do |default_stack|
70
+ # If the default stack contains a version of the trace middleware already...
71
+ existing_trace_middleware = default_stack.find { |m| m <= Middleware }
72
+ default_stack.delete(existing_trace_middleware) if existing_trace_middleware
73
+
74
+ # Inject after the ResponseParser middleware
75
+ response_middleware_index = default_stack.index(::Excon::Middleware::ResponseParser).to_i
76
+ default_stack.insert(response_middleware_index + 1, self)
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def tracer
83
+ @options[:tracer]
84
+ end
85
+
86
+ def analytics_enabled?
87
+ Contrib::Analytics.enabled?(@options[:analytics_enabled])
88
+ end
89
+
90
+ def analytics_sample_rate
91
+ @options[:analytics_sample_rate]
92
+ end
93
+
94
+ def distributed_tracing?
95
+ @options[:distributed_tracing] == true && tracer.enabled
96
+ end
97
+
98
+ def error_handler
99
+ @options[:error_handler] || DEFAULT_ERROR_HANDLER
100
+ end
101
+
102
+ def split_by_domain?
103
+ @options[:split_by_domain] == true
104
+ end
105
+
106
+ def annotate!(span, datum)
107
+ span.resource = datum[:method].to_s.upcase
108
+ span.service = service_name(datum)
109
+ span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
110
+
111
+ # Set analytics sample rate
112
+ if analytics_enabled?
113
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
114
+ end
115
+
116
+ span.set_tag(Datadog::Ext::HTTP::URL, datum[:path])
117
+ span.set_tag(Datadog::Ext::HTTP::METHOD, datum[:method].to_s.upcase)
118
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, datum[:host])
119
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, datum[:port].to_s)
120
+ end
121
+
122
+ def handle_response(datum)
123
+ if datum.key?(:datadog_span)
124
+ datum[:datadog_span].tap do |span|
125
+ return span if span.finished?
126
+
127
+ if datum.key?(:response)
128
+ response = datum[:response]
129
+ if error_handler.call(response)
130
+ span.set_error(["Error #{response[:status]}", response[:body]])
131
+ end
132
+ span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response[:status])
133
+ end
134
+ span.set_error(datum[:error]) if datum.key?(:error)
135
+ span.finish
136
+ datum.delete(:datadog_span)
137
+ end
138
+ end
139
+ rescue StandardError => e
140
+ Datadog::Tracer.log.debug(e.message)
141
+ end
142
+
143
+ def propagate!(span, datum)
144
+ Datadog::HTTPPropagator.inject!(span.context, datum[:headers])
145
+ end
146
+
147
+ def service_name(datum)
148
+ # TODO: Change this to implement more sensible multiplexing
149
+ split_by_domain? ? datum[:host] : @options[:service_name]
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end