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,44 @@
1
+ require 'ddtrace/ext/runtime'
2
+
3
+ module Datadog
4
+ module Runtime
5
+ # For control groups
6
+ module Cgroup
7
+ LINE_REGEX = /^(\d+):([^:]*):(.+)$/
8
+
9
+ Descriptor = Struct.new(
10
+ :id,
11
+ :groups,
12
+ :path,
13
+ :controllers
14
+ )
15
+
16
+ module_function
17
+
18
+ def descriptors(process = 'self')
19
+ [].tap do |descriptors|
20
+ begin
21
+ filepath = "/proc/#{process}/cgroup"
22
+
23
+ if File.exist?(filepath)
24
+ File.open("/proc/#{process}/cgroup").each do |line|
25
+ line = line.strip
26
+ descriptors << parse(line) unless line.empty?
27
+ end
28
+ end
29
+ rescue StandardError => e
30
+ Datadog::Tracer.log.error("Error while parsing cgroup. Cause: #{e.message} Location: #{e.backtrace.first}")
31
+ end
32
+ end
33
+ end
34
+
35
+ def parse(line)
36
+ id, groups, path = line.scan(LINE_REGEX).first
37
+
38
+ Descriptor.new(id, groups, path).tap do |descriptor|
39
+ descriptor.controllers = groups.split(',') unless groups.nil?
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ module Datadog
2
+ module Runtime
3
+ # Retrieves number of classes from runtime
4
+ module ClassCount
5
+ module_function
6
+
7
+ def value
8
+ ::ObjectSpace.count_objects[:T_CLASS]
9
+ end
10
+
11
+ def available?
12
+ ::ObjectSpace.respond_to?(:count_objects) \
13
+ && ::ObjectSpace.count_objects.key?(:T_CLASS)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,73 @@
1
+ require 'ddtrace/ext/runtime'
2
+ require 'ddtrace/runtime/cgroup'
3
+
4
+ module Datadog
5
+ module Runtime
6
+ # For container environments
7
+ module Container
8
+ UUID_PATTERN = '[0-9a-f]{8}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{12}'.freeze
9
+ CONTAINER_PATTERN = '[0-9a-f]{64}'.freeze
10
+
11
+ POD_REGEX = /(pod)?(#{UUID_PATTERN})(?:.slice)?$/
12
+ CONTAINER_REGEX = /(#{UUID_PATTERN}|#{CONTAINER_PATTERN})(?:.scope)?$/
13
+
14
+ Descriptor = Struct.new(
15
+ :platform,
16
+ :container_id,
17
+ :task_uid
18
+ )
19
+
20
+ module_function
21
+
22
+ def platform
23
+ descriptor.platform
24
+ end
25
+
26
+ def container_id
27
+ descriptor.container_id
28
+ end
29
+
30
+ def task_uid
31
+ descriptor.task_uid
32
+ end
33
+
34
+ def descriptor
35
+ @descriptor ||= begin
36
+ Descriptor.new.tap do |descriptor|
37
+ begin
38
+ Cgroup.descriptors.each do |cgroup_descriptor|
39
+ # Parse container data from cgroup descriptor
40
+ path = cgroup_descriptor.path
41
+ next if path.nil?
42
+
43
+ # Split path into parts
44
+ parts = path.split('/')
45
+ parts.shift # Remove leading empty part
46
+ next if parts.length < 2
47
+
48
+ # Read info from path
49
+ platform = parts[0]
50
+ container_id = parts[-1][CONTAINER_REGEX]
51
+ task_uid = parts[-2][POD_REGEX]
52
+
53
+ # If container ID wasn't found, ignore.
54
+ # Path might describe a non-container environment.
55
+ next if container_id.nil?
56
+
57
+ descriptor.platform = platform
58
+ descriptor.container_id = container_id
59
+ descriptor.task_uid = task_uid
60
+
61
+ break
62
+ end
63
+ rescue StandardError => e
64
+ Datadog::Tracer.log.error(
65
+ "Error while parsing container info. Cause: #{e.message} Location: #{e.backtrace.first}"
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,16 @@
1
+ module Datadog
2
+ module Runtime
3
+ # Retrieves garbage collection statistics
4
+ module GC
5
+ module_function
6
+
7
+ def stat
8
+ ::GC.stat
9
+ end
10
+
11
+ def available?
12
+ defined?(::GC) && ::GC.respond_to?(:stat)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,41 @@
1
+ require 'securerandom'
2
+ require 'ddtrace/ext/runtime'
3
+
4
+ module Datadog
5
+ module Runtime
6
+ # For runtime identity
7
+ module Identity
8
+ module_function
9
+
10
+ # Retrieves number of classes from runtime
11
+ def id
12
+ @pid ||= Process.pid
13
+ @id ||= SecureRandom.uuid
14
+
15
+ # Check if runtime has changed, e.g. forked.
16
+ if Process.pid != @pid
17
+ @pid = Process.pid
18
+ @id = SecureRandom.uuid
19
+ end
20
+
21
+ @id
22
+ end
23
+
24
+ def lang
25
+ Ext::Runtime::LANG
26
+ end
27
+
28
+ def lang_interpreter
29
+ Ext::Runtime::LANG_INTERPRETER
30
+ end
31
+
32
+ def lang_version
33
+ Ext::Runtime::LANG_VERSION
34
+ end
35
+
36
+ def tracer_version
37
+ Ext::Runtime::TRACER_VERSION
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,93 @@
1
+ require 'ddtrace/ext/runtime'
2
+
3
+ require 'ddtrace/metrics'
4
+ require 'ddtrace/runtime/class_count'
5
+ require 'ddtrace/runtime/gc'
6
+ require 'ddtrace/runtime/identity'
7
+ require 'ddtrace/runtime/thread_count'
8
+
9
+ module Datadog
10
+ module Runtime
11
+ # For generating runtime metrics
12
+ class Metrics < Datadog::Metrics
13
+ def initialize(options = {})
14
+ super
15
+
16
+ # Initialize service list
17
+ @services = Set.new
18
+ @service_tags = nil
19
+ end
20
+
21
+ def associate_with_span(span)
22
+ return if span.nil?
23
+
24
+ # Register service as associated with metrics
25
+ register_service(span.service) unless span.service.nil?
26
+
27
+ # Tag span with language and runtime ID for association with metrics
28
+ span.set_tag(Ext::Runtime::TAG_LANG, Runtime::Identity.lang)
29
+ end
30
+
31
+ # Associate service with runtime metrics
32
+ def register_service(service)
33
+ return if service.nil?
34
+
35
+ service = service.to_s
36
+
37
+ unless @services.include?(service)
38
+ # Add service to list and update services tag
39
+ services << service
40
+
41
+ # Recompile the service tags
42
+ compile_service_tags!
43
+ end
44
+ end
45
+
46
+ # Flush all runtime metrics to Statsd client
47
+ def flush
48
+ return unless enabled?
49
+
50
+ try_flush { gauge(Ext::Runtime::Metrics::METRIC_CLASS_COUNT, ClassCount.value) if ClassCount.available? }
51
+ try_flush { gauge(Ext::Runtime::Metrics::METRIC_THREAD_COUNT, ThreadCount.value) if ThreadCount.available? }
52
+ try_flush { gc_metrics.each { |metric, value| gauge(metric, value) } if GC.available? }
53
+ end
54
+
55
+ def gc_metrics
56
+ Hash[
57
+ GC.stat.map do |k, v|
58
+ ["#{Ext::Runtime::Metrics::METRIC_GC_PREFIX}.#{k}", v]
59
+ end
60
+ ]
61
+ end
62
+
63
+ def try_flush
64
+ yield
65
+ rescue StandardError => e
66
+ Datadog::Tracer.log.error("Error while sending runtime metric. Cause: #{e.message}")
67
+ end
68
+
69
+ def default_metric_options
70
+ # Return dupes, so that the constant isn't modified,
71
+ # and defaults are unfrozen for mutation in Statsd.
72
+ super.tap do |options|
73
+ options[:tags] = options[:tags].dup
74
+
75
+ # Add services dynamically because they might change during runtime.
76
+ options[:tags].concat(service_tags) unless service_tags.nil?
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ attr_reader \
83
+ :service_tags,
84
+ :services
85
+
86
+ def compile_service_tags!
87
+ @service_tags = services.to_a.collect do |service|
88
+ "#{Ext::Runtime::Metrics::TAG_SERVICE}:#{service}".freeze
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,19 @@
1
+ require 'objspace'
2
+
3
+ module Datadog
4
+ module Runtime
5
+ # Retrieves garbage collection statistics
6
+ module ObjectSpace
7
+ module_function
8
+
9
+ def estimate_bytesize(object)
10
+ return 0 unless ::ObjectSpace.respond_to?(:memsize_of)
11
+
12
+ # Rough calculation of bytesize; not very accurate.
13
+ object.instance_variables.inject(::ObjectSpace.memsize_of(object)) do |sum, var|
14
+ sum + ::ObjectSpace.memsize_of(object.instance_variable_get(var))
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'socket'
2
+
3
+ module Datadog
4
+ module Runtime
5
+ # For runtime identity
6
+ module Socket
7
+ module_function
8
+
9
+ def hostname
10
+ ::Socket.gethostname
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module Datadog
2
+ module Runtime
3
+ # Retrieves number of threads from runtime
4
+ module ThreadCount
5
+ module_function
6
+
7
+ def value
8
+ Thread.list.count
9
+ end
10
+
11
+ def available?
12
+ Thread.respond_to?(:list)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,195 @@
1
+ require 'forwardable'
2
+
3
+ require 'ddtrace/ext/priority'
4
+
5
+ module Datadog
6
+ # \Sampler performs client-side trace sampling.
7
+ class Sampler
8
+ def sample?(_span)
9
+ raise NotImplementedError, 'Samplers must implement the #sample? method'
10
+ end
11
+
12
+ def sample!(_span)
13
+ raise NotImplementedError, 'Samplers must implement the #sample! method'
14
+ end
15
+ end
16
+
17
+ # \AllSampler samples all the traces.
18
+ class AllSampler < Sampler
19
+ def sample?(span)
20
+ true
21
+ end
22
+
23
+ def sample!(span)
24
+ span.sampled = true
25
+ end
26
+ end
27
+
28
+ # \RateSampler is based on a sample rate.
29
+ class RateSampler < Sampler
30
+ KNUTH_FACTOR = 1111111111111111111
31
+ SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
32
+
33
+ attr_reader :sample_rate
34
+
35
+ # Initialize a \RateSampler.
36
+ # This sampler keeps a random subset of the traces. Its main purpose is to
37
+ # reduce the instrumentation footprint.
38
+ #
39
+ # * +sample_rate+: the sample rate as a \Float between 0.0 and 1.0. 0.0
40
+ # means that no trace will be sampled; 1.0 means that all traces will be
41
+ # sampled.
42
+ def initialize(sample_rate = 1.0)
43
+ unless sample_rate > 0.0 && sample_rate <= 1.0
44
+ Datadog::Tracer.log.error('sample rate is not between 0 and 1, disabling the sampler')
45
+ sample_rate = 1.0
46
+ end
47
+
48
+ self.sample_rate = sample_rate
49
+ end
50
+
51
+ def sample_rate=(sample_rate)
52
+ @sample_rate = sample_rate
53
+ @sampling_id_threshold = sample_rate * Span::MAX_ID
54
+ end
55
+
56
+ def sample?(span)
57
+ ((span.trace_id * KNUTH_FACTOR) % Datadog::Span::MAX_ID) <= @sampling_id_threshold
58
+ end
59
+
60
+ def sample!(span)
61
+ (span.sampled = sample?(span)).tap do |sampled|
62
+ span.set_metric(SAMPLE_RATE_METRIC_KEY, @sample_rate) if sampled
63
+ end
64
+ end
65
+ end
66
+
67
+ # \RateByServiceSampler samples different services at different rates
68
+ class RateByServiceSampler < Sampler
69
+ DEFAULT_KEY = 'service:,env:'.freeze
70
+
71
+ def initialize(rate = 1.0, opts = {})
72
+ @env = opts.fetch(:env, Datadog.tracer.tags[:env])
73
+ @mutex = Mutex.new
74
+ @fallback = RateSampler.new(rate)
75
+ @sampler = { DEFAULT_KEY => @fallback }
76
+ end
77
+
78
+ def sample?(span)
79
+ key = key_for(span)
80
+
81
+ @mutex.synchronize do
82
+ @sampler.fetch(key, @fallback).sample?(span)
83
+ end
84
+ end
85
+
86
+ def sample!(span)
87
+ key = key_for(span)
88
+
89
+ @mutex.synchronize do
90
+ @sampler.fetch(key, @fallback).sample!(span)
91
+ end
92
+ end
93
+
94
+ def sample_rate(span)
95
+ key = key_for(span)
96
+
97
+ @mutex.synchronize do
98
+ @sampler.fetch(key, @fallback).sample_rate
99
+ end
100
+ end
101
+
102
+ def update(rate_by_service)
103
+ @mutex.synchronize do
104
+ @sampler.delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
105
+
106
+ rate_by_service.each do |key, rate|
107
+ @sampler[key] ||= RateSampler.new(rate)
108
+ @sampler[key].sample_rate = rate
109
+ end
110
+ end
111
+ end
112
+
113
+ private
114
+
115
+ def key_for(span)
116
+ "service:#{span.service},env:#{@env}"
117
+ end
118
+ end
119
+
120
+ # \PrioritySampler
121
+ class PrioritySampler
122
+ extend Forwardable
123
+
124
+ SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
125
+
126
+ def initialize(opts = {})
127
+ @pre_sampler = opts[:base_sampler] || AllSampler.new
128
+ @priority_sampler = opts[:post_sampler] || RateByServiceSampler.new
129
+ end
130
+
131
+ def sample?(span)
132
+ @pre_sampler.sample?(span)
133
+ end
134
+
135
+ def sample!(span)
136
+ # If pre-sampling is configured, do it first. (By default, this will sample at 100%.)
137
+ # NOTE: Pre-sampling at rates < 100% may result in partial traces; not recommended.
138
+ span.sampled = pre_sample?(span) ? @pre_sampler.sample!(span) : true
139
+
140
+ if span.sampled
141
+ # If priority sampling has already been applied upstream, use that, otherwise...
142
+ unless priority_assigned_upstream?(span)
143
+ # Roll the dice and determine whether how we set the priority.
144
+ # NOTE: We'll want to leave `span.sampled = true` here; all spans for priority sampling must
145
+ # be sent to the agent. Otherwise metrics for traces will not be accurate, since the
146
+ # agent will have an incomplete dataset.
147
+ priority = priority_sample(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
148
+ assign_priority!(span, priority)
149
+ end
150
+ else
151
+ # If discarded by pre-sampling, set "reject" priority, so other
152
+ # services for the same trace don't sample needlessly.
153
+ assign_priority!(span, Datadog::Ext::Priority::AUTO_REJECT)
154
+ end
155
+
156
+ span.sampled
157
+ end
158
+
159
+ def_delegators :@priority_sampler, :update
160
+
161
+ private
162
+
163
+ def pre_sample?(span)
164
+ case @pre_sampler
165
+ when RateSampler
166
+ @pre_sampler.sample_rate < 1.0
167
+ when RateByServiceSampler
168
+ @pre_sampler.sample_rate(span) < 1.0
169
+ else
170
+ true
171
+ end
172
+ end
173
+
174
+ def priority_assigned_upstream?(span)
175
+ span.context && !span.context.sampling_priority.nil?
176
+ end
177
+
178
+ def priority_sample(span)
179
+ @priority_sampler.sample?(span)
180
+ end
181
+
182
+ def assign_priority!(span, priority)
183
+ if span.context
184
+ span.context.sampling_priority = priority
185
+ else
186
+ # Set the priority directly on the span instead, since otherwise
187
+ # it won't receive the appropriate tag.
188
+ span.set_metric(
189
+ Ext::DistributedTracing::SAMPLING_PRIORITY_KEY,
190
+ priority
191
+ )
192
+ end
193
+ end
194
+ end
195
+ end