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,46 @@
1
+ module Datadog
2
+ # Pipeline
3
+ module Pipeline
4
+ require_relative 'pipeline/span_filter'
5
+ require_relative 'pipeline/span_processor'
6
+
7
+ @mutex = Mutex.new
8
+ @processors = []
9
+
10
+ def self.before_flush(*processors, &processor_block)
11
+ processors = [processor_block] if processors.empty?
12
+
13
+ @mutex.synchronize do
14
+ @processors.concat(processors)
15
+ end
16
+ end
17
+
18
+ def self.process!(traces)
19
+ @mutex.synchronize do
20
+ traces
21
+ .map(&method(:apply_processors!))
22
+ .select(&:any?)
23
+ end
24
+ end
25
+
26
+ def self.processors=(value)
27
+ @processors = value
28
+ end
29
+
30
+ def self.apply_processors!(trace)
31
+ result = @processors.inject(trace) do |current_trace, processor|
32
+ processor.call(current_trace)
33
+ end
34
+
35
+ result || []
36
+ rescue => e
37
+ Datadog::Tracer.log.debug(
38
+ "trace dropped entirely due to `Pipeline.before_flush` error: #{e}"
39
+ )
40
+
41
+ []
42
+ end
43
+
44
+ private_class_method :apply_processors!
45
+ end
46
+ end
@@ -0,0 +1,38 @@
1
+ module Datadog
2
+ module Pipeline
3
+ # SpanFilter implements a processor that filters entire span subtrees
4
+ class SpanFilter
5
+ def initialize(filter = nil, &block)
6
+ callable = filter || block
7
+
8
+ raise(ArgumentError) unless callable.respond_to?(:call)
9
+
10
+ @criteria = filter || block
11
+ end
12
+
13
+ def call(trace)
14
+ black_list = trace.select(&method(:drop_it?))
15
+
16
+ clean_trace(black_list, trace) while black_list.any?
17
+
18
+ trace
19
+ end
20
+
21
+ private
22
+
23
+ def drop_it?(span)
24
+ @criteria.call(span) rescue false
25
+ end
26
+
27
+ def clean_trace(black_list, trace)
28
+ current = black_list.shift
29
+
30
+ trace.delete(current)
31
+
32
+ trace.each do |span|
33
+ black_list << span if span.parent == current
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module Pipeline
3
+ # SpanProcessor
4
+ class SpanProcessor
5
+ def initialize(operation = nil, &block)
6
+ callable = operation || block
7
+
8
+ raise(ArgumentError) unless callable.respond_to?(:call)
9
+
10
+ @operation = operation || block
11
+ end
12
+
13
+ def call(trace)
14
+ trace.each do |span|
15
+ @operation.call(span) rescue next
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,61 @@
1
+ require 'ddtrace/context'
2
+ require 'ddtrace/ext/distributed'
3
+
4
+ module Datadog
5
+ # opentracing.io compliant methods for distributing trace context
6
+ # between two or more distributed services. Note this is very close
7
+ # to the HTTPPropagator; the key difference is the way gRPC handles
8
+ # header information (called "metadata") as it operates over HTTP2
9
+ module GRPCPropagator
10
+ include Ext::DistributedTracing
11
+
12
+ def self.inject!(context, metadata)
13
+ metadata[GRPC_METADATA_TRACE_ID] = context.trace_id.to_s
14
+ metadata[GRPC_METADATA_PARENT_ID] = context.span_id.to_s
15
+ metadata[GRPC_METADATA_SAMPLING_PRIORITY] = context.sampling_priority.to_s if context.sampling_priority
16
+ metadata[GRPC_METADATA_ORIGIN] = context.origin.to_s if context.origin
17
+ end
18
+
19
+ def self.extract(metadata)
20
+ metadata = Carrier.new(metadata)
21
+ return Datadog::Context.new unless metadata.valid?
22
+ Datadog::Context.new(trace_id: metadata.trace_id,
23
+ span_id: metadata.parent_id,
24
+ sampling_priority: metadata.sampling_priority,
25
+ origin: metadata.origin)
26
+ end
27
+
28
+ # opentracing.io compliant carrier object
29
+ class Carrier
30
+ include Ext::DistributedTracing
31
+
32
+ def initialize(metadata = {})
33
+ @metadata = metadata || {}
34
+ end
35
+
36
+ def valid?
37
+ trace_id && parent_id
38
+ end
39
+
40
+ def trace_id
41
+ value = @metadata[GRPC_METADATA_TRACE_ID].to_i
42
+ value if (1..Span::MAX_ID).cover? value
43
+ end
44
+
45
+ def parent_id
46
+ value = @metadata[GRPC_METADATA_PARENT_ID].to_i
47
+ value if (1..Span::MAX_ID).cover? value
48
+ end
49
+
50
+ def sampling_priority
51
+ value = @metadata[GRPC_METADATA_SAMPLING_PRIORITY]
52
+ value && value.to_i
53
+ end
54
+
55
+ def origin
56
+ value = @metadata[GRPC_METADATA_ORIGIN]
57
+ value if value != ''
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,75 @@
1
+ require 'ddtrace/configuration'
2
+ require 'ddtrace/context'
3
+ require 'ddtrace/ext/distributed'
4
+ require 'ddtrace/ext/priority'
5
+ require 'ddtrace/distributed_tracing/headers/b3'
6
+ require 'ddtrace/distributed_tracing/headers/b3_single'
7
+ require 'ddtrace/distributed_tracing/headers/datadog'
8
+
9
+ module Datadog
10
+ # HTTPPropagator helps extracting and injecting HTTP headers.
11
+ module HTTPPropagator
12
+ include Ext::DistributedTracing
13
+
14
+ PROPAGATION_STYLES = { PROPAGATION_STYLE_B3 => DistributedTracing::Headers::B3,
15
+ PROPAGATION_STYLE_B3_SINGLE_HEADER => DistributedTracing::Headers::B3Single,
16
+ PROPAGATION_STYLE_DATADOG => DistributedTracing::Headers::Datadog }.freeze
17
+
18
+ # inject! popolates the env with span ID, trace ID and sampling priority
19
+ def self.inject!(context, env)
20
+ # Prevent propagation from being attempted if context provided is nil.
21
+ if context.nil?
22
+ ::Datadog::Tracer.log.debug('Cannot inject context into env to propagate over HTTP: context is nil.'.freeze)
23
+ return
24
+ end
25
+
26
+ # Inject all configured propagation styles
27
+ ::Datadog.configuration.distributed_tracing.propagation_inject_style.each do |style|
28
+ propagator = PROPAGATION_STYLES[style]
29
+ propagator.inject!(context, env) unless propagator.nil?
30
+ end
31
+ end
32
+
33
+ # extract returns a context containing the span ID, trace ID and
34
+ # sampling priority defined in env.
35
+ def self.extract(env)
36
+ context = nil
37
+ dd_context = nil
38
+
39
+ ::Datadog.configuration.distributed_tracing.propagation_extract_style.each do |style|
40
+ propagator = PROPAGATION_STYLES[style]
41
+ next if propagator.nil?
42
+
43
+ # Extract context
44
+ # DEV: `propagator.extract` will return `nil`, where `HTTPPropagator#extract` will not
45
+ extracted_context = propagator.extract(env)
46
+ # Skip this style if no valid headers were found
47
+ next if extracted_context.nil?
48
+
49
+ # Keep track of the Datadog extract context, we want to return
50
+ # this one if we have one
51
+ dd_context = extracted_context if extracted_context && style == PROPAGATION_STYLE_DATADOG
52
+
53
+ # No previously extracted context, use the one we just extracted
54
+ if context.nil?
55
+ context = extracted_context
56
+ else
57
+ unless context.trace_id == extracted_context.trace_id && context.span_id == extracted_context.span_id
58
+ # Return an empty/new context if we have a mismatch in values extracted
59
+ msg = "#{context.trace_id} != #{extracted_context.trace_id} && " \
60
+ "#{context.span_id} != #{extracted_context.span_id}"
61
+ ::Datadog::Tracer.log.debug("Cannot extract context from HTTP: extracted contexts differ, #{msg}".freeze)
62
+ # DEV: This will return from `self.extract` not this `each` block
63
+ return ::Datadog::Context.new
64
+ end
65
+ end
66
+ end
67
+
68
+ # Return the extracted context if we found one or else a new empty context
69
+ # Always return the Datadog context if one exists since it has more
70
+ # information than the B3 headers e.g. origin, expanded priority
71
+ # sampling values, etc
72
+ dd_context || context || ::Datadog::Context.new
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,21 @@
1
+ module Datadog
2
+ # DefaultContextProvider is a default context provider that retrieves
3
+ # all contexts from the current thread-local storage. It is suitable for
4
+ # synchronous programming.
5
+ class DefaultContextProvider
6
+ # Initializes the default context provider with a thread-bound context.
7
+ def initialize
8
+ @context = Datadog::ThreadLocalContext.new
9
+ end
10
+
11
+ # Sets the current context.
12
+ def context=(ctx)
13
+ @context.local = ctx
14
+ end
15
+
16
+ # Return the current context.
17
+ def context
18
+ @context.local
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,103 @@
1
+ module Datadog
2
+ module Quantization
3
+ # Quantization for HTTP resources
4
+ module Hash
5
+ PLACEHOLDER = '?'.freeze
6
+ EXCLUDE_KEYS = [].freeze
7
+ SHOW_KEYS = [].freeze
8
+ DEFAULT_OPTIONS = {
9
+ exclude: EXCLUDE_KEYS,
10
+ show: SHOW_KEYS,
11
+ placeholder: PLACEHOLDER
12
+ }.freeze
13
+
14
+ module_function
15
+
16
+ def format(hash_obj, options = {})
17
+ options ||= {}
18
+ format!(hash_obj, options)
19
+ rescue StandardError
20
+ options[:placeholder] || PLACEHOLDER
21
+ end
22
+
23
+ def format!(hash_obj, options = {})
24
+ options ||= {}
25
+ options = merge_options(DEFAULT_OPTIONS, options)
26
+ format_hash(hash_obj, options)
27
+ end
28
+
29
+ def format_hash(hash_obj, options = {})
30
+ case hash_obj
31
+ when ::Hash
32
+ return {} if options[:exclude] == :all
33
+ return hash_obj if options[:show] == :all
34
+
35
+ hash_obj.each_with_object({}) do |(key, value), quantized|
36
+ if options[:show].any?(&indifferent_equals(key))
37
+ quantized[key] = value
38
+ elsif options[:exclude].none?(&indifferent_equals(key))
39
+ quantized[key] = format_value(value, options)
40
+ end
41
+ end
42
+ else
43
+ format_value(hash_obj, options)
44
+ end
45
+ end
46
+
47
+ def format_value(value, options = {})
48
+ return value if options[:show] == :all
49
+
50
+ case value
51
+ when ::Hash
52
+ format_hash(value, options)
53
+ when Array
54
+ # If any are objects, format them.
55
+ format_array(value, options)
56
+ else
57
+ options[:placeholder]
58
+ end
59
+ end
60
+
61
+ def format_array(value, options)
62
+ if value.any? { |v| v.class <= ::Hash || v.class <= Array }
63
+ first_entry = format_value(value.first, options)
64
+ value.size > 1 ? [first_entry, options[:placeholder]] : [first_entry]
65
+ # Otherwise short-circuit and return single placeholder
66
+ else
67
+ [options[:placeholder]]
68
+ end
69
+ end
70
+
71
+ def merge_options(original, additional)
72
+ {}.tap do |options|
73
+ # Show
74
+ # If either is :all, value becomes :all
75
+ options[:show] = if original[:show] == :all || additional[:show] == :all
76
+ :all
77
+ else
78
+ (original[:show] || []).dup.concat(additional[:show] || []).uniq
79
+ end
80
+
81
+ # Exclude
82
+ # If either is :all, value becomes :all
83
+ options[:exclude] = if original[:exclude] == :all || additional[:exclude] == :all
84
+ :all
85
+ else
86
+ (original[:exclude] || []).dup.concat(additional[:exclude] || []).uniq
87
+ end
88
+
89
+ options[:placeholder] = additional[:placeholder] || original[:placeholder]
90
+ end
91
+ end
92
+
93
+ def indifferent_equals(value)
94
+ value = convert_value(value)
95
+ ->(compared_value) { value == convert_value(compared_value) }
96
+ end
97
+
98
+ def convert_value(value)
99
+ value.is_a?(Symbol) ? value.to_s : value
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,86 @@
1
+ require 'uri'
2
+ require 'set'
3
+
4
+ module Datadog
5
+ module Quantization
6
+ # Quantization for HTTP resources
7
+ module HTTP
8
+ PLACEHOLDER = '?'.freeze
9
+
10
+ module_function
11
+
12
+ def url(url, options = {})
13
+ url!(url, options)
14
+ rescue StandardError
15
+ options[:placeholder] || PLACEHOLDER
16
+ end
17
+
18
+ def url!(url, options = {})
19
+ options ||= {}
20
+
21
+ URI.parse(url).tap do |uri|
22
+ # Format the query string
23
+ if uri.query
24
+ query = query(uri.query, options[:query])
25
+ uri.query = (!query.nil? && query.empty? ? nil : query)
26
+ end
27
+
28
+ # Remove any URI framents
29
+ uri.fragment = nil unless options[:fragment] == :show
30
+ end.to_s
31
+ end
32
+
33
+ def query(query, options = {})
34
+ query!(query, options)
35
+ rescue StandardError
36
+ options[:placeholder] || PLACEHOLDER
37
+ end
38
+
39
+ def query!(query, options = {})
40
+ options ||= {}
41
+ options[:show] = options[:show] || []
42
+ options[:exclude] = options[:exclude] || []
43
+
44
+ # Short circuit if query string is meant to exclude everything
45
+ # or if the query string is meant to include everything
46
+ return '' if options[:exclude] == :all
47
+ return query if options[:show] == :all
48
+
49
+ collect_query(query, uniq: true) do |key, value|
50
+ if options[:exclude].include?(key)
51
+ [nil, nil]
52
+ else
53
+ value = options[:show].include?(key) ? value : nil
54
+ [key, value]
55
+ end
56
+ end
57
+ end
58
+
59
+ # Iterate over each key value pair, yielding to the block given.
60
+ # Accepts :uniq option, which keeps uniq copies of keys without values.
61
+ # e.g. Reduces "foo&bar=bar&bar=bar&foo" to "foo&bar=bar&bar=bar"
62
+ def collect_query(query, options = {})
63
+ return query unless block_given?
64
+ uniq = options[:uniq].nil? ? false : options[:uniq]
65
+ keys = Set.new
66
+
67
+ delims = query.scan(/(^|&|;)/).flatten
68
+ query.split(/[&;]/).collect.with_index do |pairs, i|
69
+ key, value = pairs.split('=', 2)
70
+ key, value = yield(key, value, delims[i])
71
+ if uniq && keys.include?(key)
72
+ ''
73
+ elsif key && value
74
+ "#{delims[i]}#{key}=#{value}"
75
+ elsif key
76
+ "#{delims[i]}#{key}".tap { keys << key }
77
+ else
78
+ ''
79
+ end
80
+ end.join.sub(/^[&;]/, '')
81
+ end
82
+
83
+ private_class_method :collect_query
84
+ end
85
+ end
86
+ end