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,32 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/http/configuration/settings'
3
+ require 'ddtrace/contrib/http/patcher'
4
+ require 'ddtrace/contrib/http/circuit_breaker'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ # HTTP integration
9
+ module HTTP
10
+ extend CircuitBreaker
11
+
12
+ # Description of HTTP integration
13
+ class Integration
14
+ include Contrib::Integration
15
+
16
+ register_as :http, auto_patch: true
17
+
18
+ def self.version
19
+ Gem::Version.new(RUBY_VERSION)
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,32 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/http/ext'
3
+ require 'ddtrace/contrib/http/instrumentation'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ # Datadog Net/HTTP integration.
8
+ module HTTP
9
+ # Patcher enables patching of 'net/http' module.
10
+ module Patcher
11
+ include Contrib::Patcher
12
+
13
+ module_function
14
+
15
+ def patched?
16
+ done?(:http)
17
+ end
18
+
19
+ # patch applies our patch if needed
20
+ def patch
21
+ do_once(:http) do
22
+ begin
23
+ ::Net::HTTP.send(:include, Instrumentation)
24
+ rescue StandardError => e
25
+ Datadog::Tracer.log.error("Unable to apply net/http integration: #{e}")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ require 'ddtrace/contrib/configurable'
2
+ require 'ddtrace/contrib/patchable'
3
+ require 'ddtrace/contrib/registerable'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ # Base provides features that are shared across all integrations
8
+ module Integration
9
+ def self.included(base)
10
+ base.send(:include, Configurable)
11
+ base.send(:include, Patchable)
12
+ base.send(:include, Registerable)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/mongodb/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module MongoDB
7
+ module Configuration
8
+ # Custom settings for the MongoDB integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ DEFAULT_QUANTIZE = { show: [:collection, :database, :operation] }.freeze
11
+
12
+ option :analytics_enabled do |o|
13
+ o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
14
+ o.lazy
15
+ end
16
+
17
+ option :analytics_sample_rate do |o|
18
+ o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
19
+ o.lazy
20
+ end
21
+
22
+ option :quantize, default: DEFAULT_QUANTIZE
23
+ option :service_name, default: Ext::SERVICE_NAME
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module Contrib
3
+ module MongoDB
4
+ # MongoDB integration constants
5
+ module Ext
6
+ APP = 'mongodb'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_MONGO_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_MONGO_ANALYTICS_SAMPLE_RATE'.freeze
9
+ SERVICE_NAME = 'mongodb'.freeze
10
+ SPAN_COMMAND = 'mongo.cmd'.freeze
11
+ SPAN_TYPE_COMMAND = 'mongodb'.freeze
12
+ TAG_COLLECTION = 'mongodb.collection'.freeze
13
+ TAG_DB = 'mongodb.db'.freeze
14
+ TAG_OPERATION = 'mongodb.operation'.freeze
15
+ TAG_QUERY = 'mongodb.query'.freeze
16
+ TAG_ROWS = 'mongodb.rows'.freeze
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,68 @@
1
+ require 'ddtrace/pin'
2
+ require 'ddtrace/ext/net'
3
+ require 'ddtrace/ext/app_types'
4
+ require 'ddtrace/contrib/mongodb/ext'
5
+ require 'ddtrace/contrib/mongodb/parsers'
6
+ require 'ddtrace/contrib/mongodb/subscribers'
7
+
8
+ module Datadog
9
+ module Contrib
10
+ module MongoDB
11
+ # Instrumentation for Mongo integration
12
+ module Instrumentation
13
+ # Instrumentation for Mongo::Client
14
+ module Client
15
+ def self.included(base)
16
+ base.send(:include, InstanceMethods)
17
+ end
18
+
19
+ # Instance methods for Mongo::Client
20
+ module InstanceMethods
21
+ def datadog_pin
22
+ # safe-navigation to avoid crashes during each query
23
+ return unless respond_to? :cluster
24
+ return unless cluster.respond_to? :addresses
25
+ return unless cluster.addresses.respond_to? :first
26
+ Datadog::Pin.get_from(cluster.addresses.first)
27
+ end
28
+
29
+ def datadog_pin=(pin)
30
+ # safe-navigation to avoid crashes during each query
31
+ return unless respond_to? :cluster
32
+ return unless cluster.respond_to? :addresses
33
+ return unless cluster.addresses.respond_to? :each
34
+ # attach the PIN to all cluster addresses. One of them is used
35
+ # when executing a Command and it is attached to the Monitoring
36
+ # Event instance.
37
+ cluster.addresses.each { |x| pin.onto(x) }
38
+ end
39
+ end
40
+ end
41
+
42
+ # Instrumentation for Mongo::Address
43
+ module Address
44
+ def self.included(base)
45
+ base.send(:include, InstanceMethods)
46
+ end
47
+
48
+ # Instance methods for Mongo::Address
49
+ module InstanceMethods
50
+ def datadog_pin
51
+ @datadog_pin ||= begin
52
+ tracer = Datadog.configuration[:mongo][:tracer]
53
+ service = Datadog.configuration[:mongo][:service_name]
54
+
55
+ Datadog::Pin.new(
56
+ service,
57
+ app: Datadog::Contrib::MongoDB::Ext::APP,
58
+ app_type: Datadog::Ext::AppTypes::DB,
59
+ tracer: tracer
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,36 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/mongodb/configuration/settings'
3
+ require 'ddtrace/contrib/mongodb/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module MongoDB
8
+ # Description of MongoDB integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :mongo, auto_patch: true
13
+
14
+ def self.version
15
+ Gem.loaded_specs['mongo'] && Gem.loaded_specs['mongo'].version
16
+ end
17
+
18
+ def self.present?
19
+ super && defined?(::Mongo::Monitoring::Global)
20
+ end
21
+
22
+ def self.compatible?
23
+ super && version >= Gem::Version.new('2.1.0')
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,68 @@
1
+ module Datadog
2
+ module Contrib
3
+ # MongoDB module includes classes and functions to instrument MongoDB clients
4
+ module MongoDB
5
+ EXCLUDE_KEYS = [:_id].freeze
6
+ SHOW_KEYS = [].freeze
7
+ DEFAULT_OPTIONS = { exclude: EXCLUDE_KEYS, show: SHOW_KEYS }.freeze
8
+
9
+ module_function
10
+
11
+ # skipped keys are related to command names, since they are already
12
+ # extracted by the query_builder
13
+ PLACEHOLDER = '?'.freeze
14
+
15
+ # returns a formatted and normalized query
16
+ def query_builder(command_name, database_name, command)
17
+ # always exclude the command name
18
+ options = Quantization::Hash.merge_options(quantization_options, exclude: [command_name.to_s])
19
+
20
+ # quantized statements keys are strings to avoid leaking Symbols in older Rubies
21
+ # as Symbols are not GC'ed in Rubies prior to 2.2
22
+ base_info = Quantization::Hash.format({
23
+ 'operation' => command_name,
24
+ 'database' => database_name,
25
+ 'collection' => command.values.first
26
+ }, options)
27
+
28
+ base_info.merge(Quantization::Hash.format(command, options))
29
+ end
30
+
31
+ # removes the values from the given query; this quantization recursively
32
+ # replace elements available in a given query, so that Arrays, Hashes and so
33
+ # on are compacted. It ensures a low cardinality so that it can be used
34
+ # as a Span resource.
35
+ # @deprecated
36
+ def quantize_statement(statement, skip = [])
37
+ case statement
38
+ when Hash
39
+ statement.each_with_object({}) do |(key, value), quantized|
40
+ quantized[key] = quantize_value(value, skip) unless skip.include?(key)
41
+ end
42
+ else
43
+ quantize_value(statement, skip)
44
+ end
45
+ end
46
+
47
+ # @deprecated
48
+ def quantize_value(value, skip = [])
49
+ case value
50
+ when Hash
51
+ quantize_statement(value, skip)
52
+ when Array
53
+ quantize_value(value.first, skip)
54
+ else
55
+ PLACEHOLDER
56
+ end
57
+ end
58
+
59
+ def quantization_options
60
+ Datadog::Quantization::Hash.merge_options(DEFAULT_OPTIONS, configuration[:quantize])
61
+ end
62
+
63
+ def configuration
64
+ Datadog.configuration[:mongo]
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,37 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/mongodb/ext'
3
+ require 'ddtrace/contrib/mongodb/instrumentation'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module MongoDB
8
+ # Patcher enables patching of 'mongo' module.
9
+ module Patcher
10
+ include Contrib::Patcher
11
+
12
+ module_function
13
+
14
+ def patched?
15
+ done?(:mongo)
16
+ end
17
+
18
+ def patch
19
+ do_once(:mongo) do
20
+ begin
21
+ ::Mongo::Address.send(:include, Instrumentation::Address)
22
+ ::Mongo::Client.send(:include, Instrumentation::Client)
23
+ add_mongo_monitoring
24
+ rescue StandardError => e
25
+ Datadog::Tracer.log.error("Unable to apply MongoDB integration: #{e}")
26
+ end
27
+ end
28
+ end
29
+
30
+ def add_mongo_monitoring
31
+ # Subscribe to all COMMAND queries with our subscriber class
32
+ ::Mongo::Monitoring::Global.subscribe(::Mongo::Monitoring::COMMAND, MongoCommandSubscriber.new)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,108 @@
1
+ require 'ddtrace/contrib/analytics'
2
+ require 'ddtrace/contrib/mongodb/ext'
3
+ require 'ddtrace/contrib/mongodb/parsers'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module MongoDB
8
+ # `MongoCommandSubscriber` listens to all events from the `Monitoring`
9
+ # system available in the Mongo driver.
10
+ class MongoCommandSubscriber
11
+ def started(event)
12
+ pin = Datadog::Pin.get_from(event.address)
13
+ return unless pin && pin.enabled?
14
+
15
+ # start a trace and store it in the current thread; using the `operation_id`
16
+ # is safe since it's a unique id used to link events together. Also only one
17
+ # thread is involved in this execution so thread-local storage should be safe. Reference:
18
+ # https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/monitoring.rb#L70
19
+ # https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/monitoring/publishable.rb#L38-L56
20
+ span = pin.tracer.trace(Ext::SPAN_COMMAND, service: pin.service, span_type: Ext::SPAN_TYPE_COMMAND)
21
+ set_span(event, span)
22
+
23
+ # build a quantized Query using the Parser module
24
+ query = MongoDB.query_builder(event.command_name, event.database_name, event.command)
25
+ serialized_query = query.to_s
26
+
27
+ # Set analytics sample rate
28
+ if analytics_enabled?
29
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
30
+ end
31
+
32
+ # add operation tags; the full query is stored and used as a resource,
33
+ # since it has been quantized and reduced
34
+ span.set_tag(Ext::TAG_DB, query['database'])
35
+ span.set_tag(Ext::TAG_COLLECTION, query['collection'])
36
+ span.set_tag(Ext::TAG_OPERATION, query['operation'])
37
+ span.set_tag(Ext::TAG_QUERY, serialized_query)
38
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, event.address.host)
39
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, event.address.port)
40
+
41
+ # set the resource with the quantized query
42
+ span.resource = serialized_query
43
+ end
44
+
45
+ def failed(event)
46
+ span = get_span(event)
47
+ return unless span
48
+
49
+ # the failure is not a real exception because it's handled by
50
+ # the framework itself, so we set only the error and the message
51
+ span.set_error(event)
52
+ rescue StandardError => e
53
+ Datadog::Tracer.log.debug("error when handling MongoDB 'failed' event: #{e}")
54
+ ensure
55
+ # whatever happens, the Span must be removed from the local storage and
56
+ # it must be finished to prevent any leak
57
+ span.finish unless span.nil?
58
+ clear_span(event)
59
+ end
60
+
61
+ def succeeded(event)
62
+ span = get_span(event)
63
+ return unless span
64
+
65
+ # add fields that are available only after executing the query
66
+ rows = event.reply.fetch('n', nil)
67
+ span.set_tag(Ext::TAG_ROWS, rows) unless rows.nil?
68
+ rescue StandardError => e
69
+ Datadog::Tracer.log.debug("error when handling MongoDB 'succeeded' event: #{e}")
70
+ ensure
71
+ # whatever happens, the Span must be removed from the local storage and
72
+ # it must be finished to prevent any leak
73
+ span.finish unless span.nil?
74
+ clear_span(event)
75
+ end
76
+
77
+ private
78
+
79
+ def get_span(event)
80
+ Thread.current[:datadog_mongo_span] \
81
+ && Thread.current[:datadog_mongo_span][event.request_id]
82
+ end
83
+
84
+ def set_span(event, span)
85
+ Thread.current[:datadog_mongo_span] ||= {}
86
+ Thread.current[:datadog_mongo_span][event.request_id] = span
87
+ end
88
+
89
+ def clear_span(event)
90
+ return if Thread.current[:datadog_mongo_span].nil?
91
+ Thread.current[:datadog_mongo_span].delete(event.request_id)
92
+ end
93
+
94
+ def analytics_enabled?
95
+ Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
96
+ end
97
+
98
+ def analytics_sample_rate
99
+ datadog_configuration[:analytics_sample_rate]
100
+ end
101
+
102
+ def datadog_configuration
103
+ Datadog.configuration[:mongo]
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end