ddtrace 0.44.0 → 0.48.0

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +183 -15
  3. data/.circleci/images/primary/Dockerfile-2.0.0 +11 -1
  4. data/.circleci/images/primary/Dockerfile-2.1.10 +11 -1
  5. data/.circleci/images/primary/Dockerfile-2.2.10 +11 -1
  6. data/.circleci/images/primary/Dockerfile-2.3.8 +10 -0
  7. data/.circleci/images/primary/Dockerfile-2.4.6 +10 -0
  8. data/.circleci/images/primary/Dockerfile-2.5.6 +10 -0
  9. data/.circleci/images/primary/Dockerfile-2.6.4 +10 -0
  10. data/.circleci/images/primary/Dockerfile-2.7.0 +10 -0
  11. data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +88 -0
  12. data/.circleci/images/primary/{Dockerfile-jruby-9.2 → Dockerfile-jruby-9.2.0.0} +1 -5
  13. data/.circleci/images/primary/Dockerfile-truffleruby-21.0.0 +73 -0
  14. data/.github/workflows/create-next-milestone.yml +2 -2
  15. data/.gitlab-ci.yml +18 -18
  16. data/.rubocop.yml +269 -7
  17. data/.rubocop_todo.yml +438 -0
  18. data/.simplecov +6 -0
  19. data/Appraisals +87 -9
  20. data/CHANGELOG.md +238 -1
  21. data/Gemfile +63 -3
  22. data/LICENSE-3rdparty.csv +2 -0
  23. data/README.md +1 -0
  24. data/Rakefile +65 -25
  25. data/bin/ddtracerb +15 -0
  26. data/ddtrace.gemspec +9 -36
  27. data/docker-compose.yml +75 -7
  28. data/docs/DevelopmentGuide.md +28 -0
  29. data/docs/GettingStarted.md +162 -68
  30. data/docs/ProfilingDevelopment.md +88 -0
  31. data/integration/README.md +67 -0
  32. data/integration/apps/rack/.dockerignore +1 -0
  33. data/integration/apps/rack/.envrc.sample +1 -0
  34. data/integration/apps/rack/.gitignore +4 -0
  35. data/integration/apps/rack/.rspec +1 -0
  36. data/integration/apps/rack/Dockerfile +28 -0
  37. data/integration/apps/rack/Dockerfile-ci +11 -0
  38. data/integration/apps/rack/Gemfile +24 -0
  39. data/integration/apps/rack/README.md +93 -0
  40. data/integration/apps/rack/app/acme.rb +80 -0
  41. data/integration/apps/rack/app/datadog.rb +17 -0
  42. data/integration/apps/rack/bin/run +22 -0
  43. data/integration/apps/rack/bin/setup +17 -0
  44. data/integration/apps/rack/bin/test +24 -0
  45. data/integration/apps/rack/config.ru +6 -0
  46. data/integration/apps/rack/config/puma.rb +14 -0
  47. data/integration/apps/rack/config/unicorn.rb +23 -0
  48. data/integration/apps/rack/docker-compose.ci.yml +62 -0
  49. data/integration/apps/rack/docker-compose.yml +78 -0
  50. data/integration/apps/rack/script/build-images +38 -0
  51. data/integration/apps/rack/script/ci +50 -0
  52. data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
  53. data/integration/apps/rack/spec/spec_helper.rb +16 -0
  54. data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
  55. data/integration/apps/rails-five/.dockerignore +1 -0
  56. data/integration/apps/rails-five/.env +3 -0
  57. data/integration/apps/rails-five/.envrc.sample +1 -0
  58. data/integration/apps/rails-five/.gitignore +30 -0
  59. data/integration/apps/rails-five/Dockerfile +25 -0
  60. data/integration/apps/rails-five/Dockerfile-ci +11 -0
  61. data/integration/apps/rails-five/Gemfile +104 -0
  62. data/integration/apps/rails-five/README.md +94 -0
  63. data/integration/apps/rails-five/Rakefile +6 -0
  64. data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
  65. data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
  66. data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
  67. data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
  68. data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
  69. data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
  70. data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
  71. data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
  72. data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
  73. data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
  74. data/integration/apps/rails-five/app/models/application_record.rb +3 -0
  75. data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
  76. data/integration/apps/rails-five/app/models/test.rb +2 -0
  77. data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
  78. data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
  79. data/integration/apps/rails-five/bin/bundle +3 -0
  80. data/integration/apps/rails-five/bin/rails +9 -0
  81. data/integration/apps/rails-five/bin/rake +9 -0
  82. data/integration/apps/rails-five/bin/run +24 -0
  83. data/integration/apps/rails-five/bin/setup +27 -0
  84. data/integration/apps/rails-five/bin/spring +17 -0
  85. data/integration/apps/rails-five/bin/test +21 -0
  86. data/integration/apps/rails-five/bin/update +28 -0
  87. data/integration/apps/rails-five/config.ru +5 -0
  88. data/integration/apps/rails-five/config/application.rb +97 -0
  89. data/integration/apps/rails-five/config/boot.rb +4 -0
  90. data/integration/apps/rails-five/config/cable.yml +10 -0
  91. data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
  92. data/integration/apps/rails-five/config/database.yml +28 -0
  93. data/integration/apps/rails-five/config/environment.rb +5 -0
  94. data/integration/apps/rails-five/config/environments/development.rb +51 -0
  95. data/integration/apps/rails-five/config/environments/production.rb +82 -0
  96. data/integration/apps/rails-five/config/environments/test.rb +43 -0
  97. data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
  98. data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
  99. data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
  100. data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
  101. data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
  102. data/integration/apps/rails-five/config/locales/en.yml +33 -0
  103. data/integration/apps/rails-five/config/puma.rb +24 -0
  104. data/integration/apps/rails-five/config/routes.rb +11 -0
  105. data/integration/apps/rails-five/config/spring.rb +6 -0
  106. data/integration/apps/rails-five/config/unicorn.rb +29 -0
  107. data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
  108. data/integration/apps/rails-five/db/schema.rb +23 -0
  109. data/integration/apps/rails-five/db/seeds.rb +7 -0
  110. data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
  111. data/integration/apps/rails-five/docker-compose.yml +100 -0
  112. data/integration/apps/rails-five/lib/tasks/.keep +0 -0
  113. data/integration/apps/rails-five/log/.keep +0 -0
  114. data/integration/apps/rails-five/public/robots.txt +1 -0
  115. data/integration/apps/rails-five/script/build-images +35 -0
  116. data/integration/apps/rails-five/script/ci +50 -0
  117. data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
  118. data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
  119. data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
  120. data/integration/apps/rails-five/storage/.keep +0 -0
  121. data/integration/apps/rails-five/tmp/.keep +0 -0
  122. data/integration/apps/rails-five/vendor/.keep +0 -0
  123. data/integration/apps/ruby/.dockerignore +1 -0
  124. data/integration/apps/ruby/.envrc.sample +1 -0
  125. data/integration/apps/ruby/.gitignore +2 -0
  126. data/integration/apps/ruby/Dockerfile +25 -0
  127. data/integration/apps/ruby/Dockerfile-ci +11 -0
  128. data/integration/apps/ruby/Gemfile +11 -0
  129. data/integration/apps/ruby/README.md +70 -0
  130. data/integration/apps/ruby/agent.yaml +3 -0
  131. data/integration/apps/ruby/app/datadog.rb +13 -0
  132. data/integration/apps/ruby/app/fibonacci.rb +58 -0
  133. data/integration/apps/ruby/bin/run +20 -0
  134. data/integration/apps/ruby/bin/setup +17 -0
  135. data/integration/apps/ruby/bin/test +21 -0
  136. data/integration/apps/ruby/docker-compose.ci.yml +51 -0
  137. data/integration/apps/ruby/docker-compose.yml +63 -0
  138. data/integration/apps/ruby/script/build-images +38 -0
  139. data/integration/apps/ruby/script/ci +50 -0
  140. data/integration/images/agent/Dockerfile +2 -0
  141. data/integration/images/agent/agent.yaml +3 -0
  142. data/integration/images/include/datadog/analyzer.rb +71 -0
  143. data/integration/images/include/datadog/demo_env.rb +101 -0
  144. data/integration/images/include/http-health-check +33 -0
  145. data/integration/images/ruby/2.0/Dockerfile +54 -0
  146. data/integration/images/ruby/2.1/Dockerfile +54 -0
  147. data/integration/images/ruby/2.2/Dockerfile +54 -0
  148. data/integration/images/ruby/2.3/Dockerfile +70 -0
  149. data/integration/images/ruby/2.4/Dockerfile +54 -0
  150. data/integration/images/ruby/2.5/Dockerfile +54 -0
  151. data/integration/images/ruby/2.6/Dockerfile +54 -0
  152. data/integration/images/ruby/2.7/Dockerfile +54 -0
  153. data/integration/images/ruby/3.0/Dockerfile +54 -0
  154. data/integration/images/wrk/Dockerfile +33 -0
  155. data/integration/images/wrk/scripts/entrypoint.sh +17 -0
  156. data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
  157. data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
  158. data/integration/script/build-images +43 -0
  159. data/lib/ddtrace.rb +8 -5
  160. data/lib/ddtrace/analytics.rb +2 -0
  161. data/lib/ddtrace/auto_instrument.rb +3 -0
  162. data/lib/ddtrace/auto_instrument_base.rb +6 -0
  163. data/lib/ddtrace/buffer.rb +4 -4
  164. data/lib/ddtrace/configuration.rb +121 -26
  165. data/lib/ddtrace/configuration/base.rb +1 -1
  166. data/lib/ddtrace/configuration/components.rb +87 -5
  167. data/lib/ddtrace/configuration/option_definition.rb +1 -3
  168. data/lib/ddtrace/configuration/options.rb +4 -7
  169. data/lib/ddtrace/configuration/settings.rb +48 -3
  170. data/lib/ddtrace/context.rb +5 -6
  171. data/lib/ddtrace/context_provider.rb +0 -1
  172. data/lib/ddtrace/contrib/action_cable/event.rb +1 -0
  173. data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
  174. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -3
  175. data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
  176. data/lib/ddtrace/contrib/action_view/event.rb +1 -1
  177. data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
  178. data/lib/ddtrace/contrib/action_view/utils.rb +1 -1
  179. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +30 -0
  180. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +107 -18
  181. data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
  182. data/lib/ddtrace/contrib/active_record/utils.rb +57 -20
  183. data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
  184. data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -1
  185. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -0
  186. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +9 -5
  187. data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
  188. data/lib/ddtrace/contrib/aws/patcher.rb +1 -0
  189. data/lib/ddtrace/contrib/aws/services.rb +2 -0
  190. data/lib/ddtrace/contrib/configurable.rb +63 -39
  191. data/lib/ddtrace/contrib/configuration/resolver.rb +70 -5
  192. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +19 -20
  193. data/lib/ddtrace/contrib/configuration/settings.rb +7 -6
  194. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -10
  195. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -2
  196. data/lib/ddtrace/contrib/cucumber/formatter.rb +5 -11
  197. data/lib/ddtrace/contrib/cucumber/integration.rb +5 -0
  198. data/lib/ddtrace/contrib/dalli/patcher.rb +0 -38
  199. data/lib/ddtrace/contrib/delayed_job/plugin.rb +0 -1
  200. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -0
  201. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +3 -2
  202. data/lib/ddtrace/contrib/ethon/easy_patch.rb +10 -9
  203. data/lib/ddtrace/contrib/excon/middleware.rb +2 -6
  204. data/lib/ddtrace/contrib/extensions.rb +53 -3
  205. data/lib/ddtrace/contrib/faraday/middleware.rb +1 -3
  206. data/lib/ddtrace/contrib/faraday/patcher.rb +0 -36
  207. data/lib/ddtrace/contrib/grape/endpoint.rb +8 -15
  208. data/lib/ddtrace/contrib/grape/patcher.rb +0 -42
  209. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +8 -8
  210. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +1 -0
  211. data/lib/ddtrace/contrib/grpc/patcher.rb +0 -36
  212. data/lib/ddtrace/contrib/http/circuit_breaker.rb +1 -3
  213. data/lib/ddtrace/contrib/http/instrumentation.rb +5 -5
  214. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
  215. data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
  216. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +147 -0
  217. data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
  218. data/lib/ddtrace/contrib/httpclient/patcher.rb +38 -0
  219. data/lib/ddtrace/contrib/httprb/instrumentation.rb +14 -20
  220. data/lib/ddtrace/contrib/httprb/patcher.rb +5 -2
  221. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -0
  222. data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -3
  223. data/lib/ddtrace/contrib/patchable.rb +18 -7
  224. data/lib/ddtrace/contrib/patcher.rb +9 -6
  225. data/lib/ddtrace/contrib/presto/patcher.rb +5 -2
  226. data/lib/ddtrace/contrib/qless/qless_job.rb +1 -0
  227. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +1 -0
  228. data/lib/ddtrace/contrib/que/ext.rb +19 -19
  229. data/lib/ddtrace/contrib/que/tracer.rb +1 -1
  230. data/lib/ddtrace/contrib/racecar/event.rb +1 -0
  231. data/lib/ddtrace/contrib/rack/configuration/settings.rb +3 -3
  232. data/lib/ddtrace/contrib/rack/integration.rb +7 -0
  233. data/lib/ddtrace/contrib/rack/middlewares.rb +6 -11
  234. data/lib/ddtrace/contrib/rack/patcher.rb +1 -3
  235. data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
  236. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  237. data/lib/ddtrace/contrib/rails/patcher.rb +6 -2
  238. data/lib/ddtrace/contrib/rails/utils.rb +4 -0
  239. data/lib/ddtrace/contrib/rake/instrumentation.rb +4 -2
  240. data/lib/ddtrace/contrib/rake/integration.rb +1 -1
  241. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +11 -4
  242. data/lib/ddtrace/contrib/redis/quantize.rb +1 -0
  243. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  244. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +6 -7
  245. data/lib/ddtrace/contrib/registry.rb +2 -2
  246. data/lib/ddtrace/contrib/resque/configuration/settings.rb +17 -1
  247. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  248. data/lib/ddtrace/contrib/resque/patcher.rb +4 -4
  249. data/lib/ddtrace/contrib/resque/resque_job.rb +24 -1
  250. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -3
  251. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -10
  252. data/lib/ddtrace/contrib/rspec/example.rb +24 -10
  253. data/lib/ddtrace/contrib/rspec/ext.rb +0 -3
  254. data/lib/ddtrace/contrib/rspec/integration.rb +6 -1
  255. data/lib/ddtrace/contrib/rspec/patcher.rb +0 -2
  256. data/lib/ddtrace/contrib/sequel/utils.rb +5 -6
  257. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
  258. data/lib/ddtrace/contrib/shoryuken/tracer.rb +7 -4
  259. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +2 -7
  260. data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -1
  261. data/lib/ddtrace/contrib/sinatra/env.rb +1 -3
  262. data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
  263. data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -3
  264. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +3 -3
  265. data/lib/ddtrace/contrib/sneakers/ext.rb +11 -11
  266. data/lib/ddtrace/contrib/sneakers/tracer.rb +2 -4
  267. data/lib/ddtrace/contrib/status_code_matcher.rb +5 -3
  268. data/lib/ddtrace/correlation.rb +1 -0
  269. data/lib/ddtrace/diagnostics/environment_logger.rb +3 -2
  270. data/lib/ddtrace/distributed_tracing/headers/headers.rb +1 -0
  271. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +1 -3
  272. data/lib/ddtrace/error.rb +2 -0
  273. data/lib/ddtrace/ext/ci.rb +43 -10
  274. data/lib/ddtrace/ext/distributed.rb +1 -1
  275. data/lib/ddtrace/ext/git.rb +0 -1
  276. data/lib/ddtrace/ext/http.rb +1 -1
  277. data/lib/ddtrace/ext/profiling.rb +52 -0
  278. data/lib/ddtrace/ext/runtime.rb +3 -1
  279. data/lib/ddtrace/ext/transport.rb +1 -0
  280. data/lib/ddtrace/forced_tracing.rb +2 -0
  281. data/lib/ddtrace/logger.rb +1 -1
  282. data/lib/ddtrace/metrics.rb +14 -6
  283. data/lib/ddtrace/opentracer/distributed_headers.rb +3 -0
  284. data/lib/ddtrace/opentracer/span.rb +2 -6
  285. data/lib/ddtrace/opentracer/thread_local_scope.rb +1 -0
  286. data/lib/ddtrace/patcher.rb +25 -4
  287. data/lib/ddtrace/pin.rb +8 -61
  288. data/lib/ddtrace/pipeline/span_filter.rb +1 -1
  289. data/lib/ddtrace/profiling.rb +54 -0
  290. data/lib/ddtrace/profiling/backtrace_location.rb +32 -0
  291. data/lib/ddtrace/profiling/buffer.rb +41 -0
  292. data/lib/ddtrace/profiling/collectors/stack.rb +253 -0
  293. data/lib/ddtrace/profiling/encoding/profile.rb +31 -0
  294. data/lib/ddtrace/profiling/event.rb +13 -0
  295. data/lib/ddtrace/profiling/events/stack.rb +102 -0
  296. data/lib/ddtrace/profiling/exporter.rb +23 -0
  297. data/lib/ddtrace/profiling/ext/cpu.rb +54 -0
  298. data/lib/ddtrace/profiling/ext/cthread.rb +134 -0
  299. data/lib/ddtrace/profiling/ext/forking.rb +97 -0
  300. data/lib/ddtrace/profiling/flush.rb +41 -0
  301. data/lib/ddtrace/profiling/pprof/builder.rb +121 -0
  302. data/lib/ddtrace/profiling/pprof/converter.rb +85 -0
  303. data/lib/ddtrace/profiling/pprof/message_set.rb +12 -0
  304. data/lib/ddtrace/profiling/pprof/payload.rb +18 -0
  305. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  306. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +81 -0
  307. data/lib/ddtrace/profiling/pprof/stack_sample.rb +90 -0
  308. data/lib/ddtrace/profiling/pprof/string_table.rb +10 -0
  309. data/lib/ddtrace/profiling/pprof/template.rb +114 -0
  310. data/lib/ddtrace/profiling/preload.rb +3 -0
  311. data/lib/ddtrace/profiling/profiler.rb +28 -0
  312. data/lib/ddtrace/profiling/recorder.rb +87 -0
  313. data/lib/ddtrace/profiling/scheduler.rb +84 -0
  314. data/lib/ddtrace/profiling/tasks/setup.rb +77 -0
  315. data/lib/ddtrace/profiling/transport/client.rb +12 -0
  316. data/lib/ddtrace/profiling/transport/http.rb +122 -0
  317. data/lib/ddtrace/profiling/transport/http/api.rb +43 -0
  318. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +90 -0
  319. data/lib/ddtrace/profiling/transport/http/api/instance.rb +36 -0
  320. data/lib/ddtrace/profiling/transport/http/api/spec.rb +40 -0
  321. data/lib/ddtrace/profiling/transport/http/builder.rb +28 -0
  322. data/lib/ddtrace/profiling/transport/http/client.rb +33 -0
  323. data/lib/ddtrace/profiling/transport/http/response.rb +21 -0
  324. data/lib/ddtrace/profiling/transport/io.rb +30 -0
  325. data/lib/ddtrace/profiling/transport/io/client.rb +27 -0
  326. data/lib/ddtrace/profiling/transport/io/response.rb +16 -0
  327. data/lib/ddtrace/profiling/transport/parcel.rb +17 -0
  328. data/lib/ddtrace/profiling/transport/request.rb +15 -0
  329. data/lib/ddtrace/profiling/transport/response.rb +8 -0
  330. data/lib/ddtrace/propagation/grpc_propagator.rb +1 -0
  331. data/lib/ddtrace/propagation/http_propagator.rb +17 -2
  332. data/lib/ddtrace/quantization/http.rb +1 -0
  333. data/lib/ddtrace/runtime/cgroup.rb +2 -2
  334. data/lib/ddtrace/runtime/container.rb +32 -26
  335. data/lib/ddtrace/runtime/identity.rb +8 -0
  336. data/lib/ddtrace/sampler.rb +1 -1
  337. data/lib/ddtrace/sampling/rule_sampler.rb +4 -9
  338. data/lib/ddtrace/span.rb +7 -7
  339. data/lib/ddtrace/sync_writer.rb +12 -12
  340. data/lib/ddtrace/tasks/exec.rb +48 -0
  341. data/lib/ddtrace/tasks/help.rb +14 -0
  342. data/lib/ddtrace/tracer.rb +28 -5
  343. data/lib/ddtrace/transport/http.rb +15 -8
  344. data/lib/ddtrace/transport/http/adapters/net.rb +27 -8
  345. data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
  346. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
  347. data/lib/ddtrace/transport/http/builder.rb +7 -1
  348. data/lib/ddtrace/transport/http/env.rb +8 -0
  349. data/lib/ddtrace/transport/http/traces.rb +2 -3
  350. data/lib/ddtrace/transport/io.rb +1 -1
  351. data/lib/ddtrace/transport/io/client.rb +15 -8
  352. data/lib/ddtrace/transport/io/response.rb +1 -3
  353. data/lib/ddtrace/transport/io/traces.rb +6 -0
  354. data/lib/ddtrace/transport/parcel.rb +4 -0
  355. data/lib/ddtrace/transport/traces.rb +18 -1
  356. data/lib/ddtrace/utils/compression.rb +27 -0
  357. data/lib/ddtrace/utils/object_set.rb +41 -0
  358. data/lib/ddtrace/utils/only_once.rb +40 -0
  359. data/lib/ddtrace/utils/sequence.rb +17 -0
  360. data/lib/ddtrace/utils/string_table.rb +45 -0
  361. data/lib/ddtrace/utils/time.rb +32 -1
  362. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  363. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  364. data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
  365. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
  366. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
  367. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
  368. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
  369. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
  370. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
  371. data/lib/ddtrace/version.rb +3 -1
  372. data/lib/ddtrace/workers.rb +5 -0
  373. data/lib/ddtrace/workers/async.rb +11 -3
  374. data/lib/ddtrace/workers/loop.rb +17 -3
  375. data/lib/ddtrace/workers/polling.rb +1 -0
  376. data/lib/ddtrace/workers/queue.rb +1 -0
  377. data/lib/ddtrace/workers/runtime_metrics.rb +14 -1
  378. data/lib/ddtrace/workers/trace_writer.rb +10 -10
  379. data/lib/ddtrace/writer.rb +7 -4
  380. metadata +213 -379
  381. data/lib/ddtrace/augmentation.rb +0 -13
  382. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  383. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  384. data/lib/ddtrace/augmentation/shim.rb +0 -102
  385. data/lib/ddtrace/contrib/rspec/example_group.rb +0 -61
  386. data/lib/ddtrace/monkey.rb +0 -58
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ APP_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
5
+ APP_DIR=${APP_SCRIPT_DIR%/script}
6
+ cd $APP_DIR
7
+
8
+ while getopts ":v:" opt; do
9
+ case $opt in
10
+ v)
11
+ APP_RUBY_VERSION=$OPTARG
12
+ ;;
13
+ \?)
14
+ echo "Invalid option: -$OPTARG" >&2
15
+ exit 1
16
+ ;;
17
+ :)
18
+ echo "Option -$OPTARG requires an argument." >&2
19
+ exit 1
20
+ ;;
21
+ esac
22
+ done
23
+
24
+ echo "== Building Ruby app images... =="
25
+ if [ -v APP_RUBY_VERSION ]; then
26
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-$APP_RUBY_VERSION -t datadog/dd-apm-demo:rb-$APP_RUBY_VERSION-ruby .
27
+ else
28
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.0 -t datadog/dd-apm-demo:rb-2.0-ruby .
29
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.1 -t datadog/dd-apm-demo:rb-2.1-ruby .
30
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.2 -t datadog/dd-apm-demo:rb-2.2-ruby .
31
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.3 -t datadog/dd-apm-demo:rb-2.3-ruby .
32
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.4 -t datadog/dd-apm-demo:rb-2.4-ruby .
33
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.5 -t datadog/dd-apm-demo:rb-2.5-ruby .
34
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.6 -t datadog/dd-apm-demo:rb-2.6-ruby .
35
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-2.7 -t datadog/dd-apm-demo:rb-2.7-ruby .
36
+ docker build --build-arg BASE_IMAGE=datadog/dd-apm-demo:rb-3.0 -t datadog/dd-apm-demo:rb-3.0-ruby .
37
+ fi
38
+ echo "== Done building Ruby app images. =="
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ APP_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
5
+ APP_DIR=${APP_SCRIPT_DIR%/script}
6
+ cd $APP_DIR
7
+
8
+ # Parse options
9
+ while getopts "v:" opt; do
10
+ case $opt in
11
+ v)
12
+ APP_RUBY_VERSION=$OPTARG
13
+ ;;
14
+ \?)
15
+ echo "Invalid option: -$OPTARG" >&2
16
+ exit 1
17
+ ;;
18
+ :)
19
+ echo "Option -$OPTARG requires an argument." >&2
20
+ exit 1
21
+ ;;
22
+ esac
23
+ done
24
+
25
+ # Validate options
26
+ if [ -z ${APP_RUBY_VERSION+x} ]; then
27
+ echo "You must specify a Ruby version with -v. (e.g. 2.7)" >&2
28
+ exit 1
29
+ fi
30
+
31
+ # Set configuration
32
+ APP_BASE_IMAGE=${APP_BASE_IMAGE:-datadog/dd-apm-demo:rb-$APP_RUBY_VERSION}
33
+ APP_IMAGE=${APP_IMAGE:-$APP_BASE_IMAGE-ruby}
34
+ APP_COMPOSE_FILES="-f docker-compose.ci.yml"
35
+
36
+ echo "== Running integration tests... =="
37
+ echo " - App: ruby"
38
+ echo " - Ruby version: $APP_RUBY_VERSION"
39
+ echo " - Base image: $APP_BASE_IMAGE"
40
+ echo " - App image: $APP_IMAGE"
41
+ echo ""
42
+
43
+ # Pull/build any missing images
44
+ APP_IMAGE=$APP_IMAGE docker-compose $APP_COMPOSE_FILES build
45
+
46
+ # Run the test suite
47
+ APP_IMAGE=$APP_IMAGE docker-compose $APP_COMPOSE_FILES run integration-tester
48
+
49
+ # Cleanup
50
+ APP_IMAGE=$APP_IMAGE docker-compose $APP_COMPOSE_FILES down -t 0 --remove-orphans
@@ -0,0 +1,2 @@
1
+ FROM datadog/agent
2
+ COPY agent.yaml /etc/datadog-agent/datadog.yaml
@@ -0,0 +1,3 @@
1
+ use_dogstatsd: true
2
+ dogstatsd_port: 8125
3
+ dogstatsd_non_local_traffic: true
@@ -0,0 +1,71 @@
1
+ require 'json'
2
+
3
+ class Analyzer
4
+ def initialize(filename)
5
+ @filename = filename
6
+ end
7
+
8
+ def analyze
9
+ data = []
10
+ File.open(@filename) do |f|
11
+ f.each_line do |line|
12
+ data << (parsed=JSON.parse(line))
13
+ end
14
+ end
15
+
16
+ data.group_by{ |row| row['generation'] }
17
+ .sort{|a,b| a[0].to_i <=> b[0].to_i }
18
+ .each do |k,v|
19
+ puts "location #{k} objects #{v.count}"
20
+ end
21
+ end
22
+
23
+ def analyze_objects(gen_range = nil)
24
+ data = []
25
+ File.open(@filename) do |f|
26
+ f.each_line do |line|
27
+ parsed = JSON.parse(line)
28
+ if gen_range && gen_range.include?(parsed['generation'].to_i)
29
+ data << parsed
30
+ end
31
+ end
32
+ end
33
+
34
+ data.group_by{ |row| "#{row['file']}:#{row['line']}" }
35
+ .sort{|a,b| b[1].length <=> a[1].length }
36
+ .each do |k,v|
37
+ puts "line #{k} objects #{v.count}"
38
+ end
39
+ end
40
+
41
+ def analyze_generation(gen)
42
+ data = []
43
+ File.open(@filename) do |f|
44
+ f.each_line do |line|
45
+ parsed=JSON.parse(line)
46
+ data << parsed if parsed["generation"] == gen
47
+ end
48
+ end
49
+ data.group_by{|row| "#{row["file"]}:#{row["line"]}"}
50
+ .sort{|a,b| b[1].count <=> a[1].count}
51
+ .each do |k,v|
52
+ puts "#{k} * #{v.count}"
53
+ end
54
+ end
55
+ end
56
+
57
+ if ARGV[1]
58
+ if ARGV[1] == 'objects'
59
+ range = nil
60
+ if ARGV[2]
61
+ range_end = ARGV[2].to_i
62
+ range_start = ARGV[3].to_i
63
+ range = Range.new(range_start, range_end)
64
+ end
65
+ Analyzer.new(ARGV[0]).analyze_objects(range)
66
+ else
67
+ Analyzer.new(ARGV[0]).analyze_generation(ARGV[1].to_i)
68
+ end
69
+ else
70
+ Analyzer.new(ARGV[0]).analyze
71
+ end
@@ -0,0 +1,101 @@
1
+ module Datadog
2
+ module DemoEnv
3
+ module_function
4
+
5
+ def gem_spec(gem_name, defaults = {})
6
+ args = if local_gem(gem_name)
7
+ [local_gem(gem_name)]
8
+ elsif git_gem(gem_name)
9
+ [git_gem(gem_name)]
10
+ else
11
+ []
12
+ end
13
+
14
+ yield(args) if block_given?
15
+
16
+ args
17
+ end
18
+
19
+ def gem_env_name(gem_name)
20
+ gem_name.upcase.gsub('-', '_')
21
+ end
22
+
23
+ def local_gem(gem_name)
24
+ local_env_name = "DD_DEMO_ENV_GEM_LOCAL_#{gem_env_name(gem_name)}"
25
+
26
+ return unless ENV.key?(local_env_name)
27
+
28
+ { path: ENV[local_env_name] }
29
+ end
30
+
31
+ def git_gem(gem_name)
32
+ git_env_name = "DD_DEMO_ENV_GEM_GIT_#{gem_env_name(gem_name)}"
33
+ ref_env_name = "DD_DEMO_ENV_GEM_REF_#{gem_env_name(gem_name)}"
34
+
35
+ return unless [git_env_name, ref_env_name].all? { |var| ENV.key?(var) && !ENV[var].empty? }
36
+
37
+ { git: ENV[git_env_name], ref: ENV[ref_env_name] }
38
+ end
39
+
40
+ def process
41
+ ENV['DD_DEMO_ENV_PROCESS']
42
+ end
43
+
44
+ def features
45
+ (ENV['DD_DEMO_ENV_FEATURES'] || '').split(',')
46
+ end
47
+
48
+ def feature?(feature)
49
+ features.include?(feature)
50
+ end
51
+
52
+ def print_env(header = 'Datadog test environment')
53
+ puts "\n==== #{header} ===="
54
+ puts "Process: #{process}"
55
+ puts "Features: #{features}"
56
+ puts "Rails env: #{ENV['RAILS_ENV']}" if ENV['RAILS_ENV']
57
+ puts "PID: #{Process.pid}"
58
+ if ddtrace = Gem.loaded_specs['ddtrace']
59
+ puts "Runtime ID: #{Datadog::Runtime::Identity.id}" if defined?(Datadog::Runtime::Identity)
60
+ puts "ddtrace version: #{ddtrace.version}"
61
+ puts "ddtrace path: #{ddtrace.full_gem_path}"
62
+ if git_spec = git_gem('ddtrace')
63
+ puts "ddtrace git: #{git_spec[:git]}"
64
+ puts "ddtrace ref: #{git_spec[:ref]}"
65
+ end
66
+ end
67
+ puts "\n"
68
+ end
69
+
70
+ def profiler_file_transport(dump_path = "/data/profile-pid-#{Process.pid}.pprof")
71
+ Datadog::Profiling::Transport::IO.default(
72
+ write: ->(out, data) do
73
+ result = nil
74
+ puts "Writing pprof #{dump_path}..."
75
+ File.open(dump_path, "w") { |f| result = f.write(data) }
76
+ puts "Pprof #{dump_path} written!"
77
+ result
78
+ end
79
+ )
80
+ end
81
+
82
+ def start_mem_dump!
83
+ require 'objspace'
84
+ ObjectSpace.trace_object_allocations_start
85
+ end
86
+
87
+ def finish_mem_dump!(dump_path = "/data/mem-pid-#{Process.pid}.dump")
88
+ File.delete(dump_path) if File.exist?(dump_path)
89
+ File.open(dump_path, "w") do |io|
90
+ ObjectSpace.dump_all(output: io)
91
+ end
92
+ end
93
+
94
+ def mem_dump!(dump_path = "/data/mem-pid-#{Process.pid}.dump")
95
+ start_mem_dump!
96
+ result = yield
97
+ finish_mem_dump!
98
+ result
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # If health check URL provided, wait till it passes.
5
+ if [ -n "$HEALTH_CHECK_URL" ]; then
6
+ STATUS=${HEALTH_CHECK_STATUS:-204}
7
+ INTERVAL=${HEALTH_CHECK_INTERVAL:-5}
8
+ MAX_ATTEMPTS=${HEALTH_CHECK_MAX_ATTEMPTS:-5}
9
+ ATTEMPTS=0
10
+
11
+ echo -e "\n== HTTP Health check =="
12
+ echo "Target: $HEALTH_CHECK_URL"
13
+ echo "Healthy status: $STATUS"
14
+ echo "Poll interval: $INTERVAL seconds"
15
+ echo "** Polling until healthy state... **"
16
+ printf "Attempt ($(($ATTEMPTS + 1))/$MAX_ATTEMPTS): "
17
+ while [[ "$(curl --max-time $INTERVAL -s -o /dev/null -w ''%{http_code}'' $HEALTH_CHECK_URL)" != $STATUS ]]; do
18
+ printf "FAIL"
19
+ ATTEMPTS=$[ATTEMPTS + 1]
20
+
21
+ if (( $ATTEMPTS >= $MAX_ATTEMPTS )); then
22
+ echo -e "\nERROR: Health check max attempts reached for $HEALTH_CHECK_URL" >&2
23
+ exit 1
24
+ else
25
+ printf " (Waiting $INTERVAL seconds...)\n"
26
+ sleep $INTERVAL
27
+ fi
28
+
29
+ printf "Attempt ($(($ATTEMPTS + 1))/$MAX_ATTEMPTS): "
30
+ done
31
+ echo "SUCCESS"
32
+ echo -e "== HTTP Health check complete. ==\n"
33
+ fi
@@ -0,0 +1,54 @@
1
+ FROM ruby:2.0
2
+
3
+ # Add Jessie repos
4
+ # Fixes https://superuser.com/questions/1423486/issue-with-fetching-http-deb-debian-org-debian-dists-jessie-updates-inrelease
5
+ RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list
6
+
7
+ ENV DEBIAN_FRONTEND=noninteractive
8
+
9
+ # Install prerequisites
10
+ RUN set -ex && \
11
+ echo "===> Installing dependencies" && \
12
+ apt-get -y update && \
13
+ apt-get install -y --force-yes --no-install-recommends \
14
+ curl wget tar gzip gnupg apt-transport-https ca-certificates tzdata locales && \
15
+ \
16
+ echo "===> Installing NodeJS" && \
17
+ apt-get install -y --force-yes --no-install-recommends nodejs && \
18
+ \
19
+ echo "===> Installing Yarn" && \
20
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
21
+ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
22
+ apt-get update && \
23
+ apt-get install -y --force-yes --no-install-recommends yarn && \
24
+ \
25
+ echo "===> Installing database libraries" && \
26
+ apt-get install -y --force-yes --no-install-recommends \
27
+ postgresql-client sqlite3 && \
28
+ \
29
+ echo "===> Installing dev tools" && \
30
+ mkdir -p /usr/share/man/man1 && \
31
+ apt-get install -y --force-yes --no-install-recommends \
32
+ sudo git openssh-client rsync vim \
33
+ net-tools netcat parallel unzip zip bzip2 && \
34
+ \
35
+ echo "===> Cleaning up" && \
36
+ rm -rf /var/lib/apt/lists/*;
37
+
38
+ # Set timezone to UTC by default
39
+ RUN ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime
40
+
41
+ # Set language
42
+ RUN locale-gen en_US.UTF-8
43
+ ENV LANG en_US.UTF-8
44
+ ENV LANGUAGE en_US:en
45
+
46
+ # Install RubyGems
47
+ RUN gem update --system 2.7.9
48
+ RUN gem install bundler -v '1.17.3'
49
+ ENV BUNDLE_SILENCE_ROOT_WARNING 1
50
+
51
+ # Setup demo environment includes
52
+ COPY ./include /vendor/dd-demo
53
+ ENV RUBYLIB /vendor/dd-demo
54
+ ENV RUBYOPT -rdatadog/demo_env
@@ -0,0 +1,54 @@
1
+ FROM ruby:2.1
2
+
3
+ # Add Jessie repos
4
+ # Fixes https://superuser.com/questions/1423486/issue-with-fetching-http-deb-debian-org-debian-dists-jessie-updates-inrelease
5
+ RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list
6
+
7
+ ENV DEBIAN_FRONTEND=noninteractive
8
+
9
+ # Install prerequisites
10
+ RUN set -ex && \
11
+ echo "===> Installing dependencies" && \
12
+ apt-get -y update && \
13
+ apt-get install -y --force-yes --no-install-recommends \
14
+ curl wget tar gzip gnupg apt-transport-https ca-certificates tzdata locales && \
15
+ \
16
+ echo "===> Installing NodeJS" && \
17
+ apt-get install -y --force-yes --no-install-recommends nodejs && \
18
+ \
19
+ echo "===> Installing Yarn" && \
20
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
21
+ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
22
+ apt-get update && \
23
+ apt-get install -y --force-yes --no-install-recommends yarn && \
24
+ \
25
+ echo "===> Installing database libraries" && \
26
+ apt-get install -y --force-yes --no-install-recommends \
27
+ postgresql-client sqlite3 && \
28
+ \
29
+ echo "===> Installing dev tools" && \
30
+ mkdir -p /usr/share/man/man1 && \
31
+ apt-get install -y --force-yes --no-install-recommends \
32
+ sudo git openssh-client rsync vim \
33
+ net-tools netcat parallel unzip zip bzip2 && \
34
+ \
35
+ echo "===> Cleaning up" && \
36
+ rm -rf /var/lib/apt/lists/*;
37
+
38
+ # Set timezone to UTC by default
39
+ RUN ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime
40
+
41
+ # Set language
42
+ RUN locale-gen en_US.UTF-8
43
+ ENV LANG en_US.UTF-8
44
+ ENV LANGUAGE en_US:en
45
+
46
+ # Install RubyGems
47
+ RUN gem update --system 2.7.9
48
+ RUN gem install bundler -v '1.17.3'
49
+ ENV BUNDLE_SILENCE_ROOT_WARNING 1
50
+
51
+ # Setup demo environment includes
52
+ COPY ./include /vendor/dd-demo
53
+ ENV RUBYLIB /vendor/dd-demo
54
+ ENV RUBYOPT -rdatadog/demo_env
@@ -0,0 +1,54 @@
1
+ FROM ruby:2.2
2
+
3
+ # Add Jessie repos
4
+ # Fixes https://superuser.com/questions/1423486/issue-with-fetching-http-deb-debian-org-debian-dists-jessie-updates-inrelease
5
+ RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list
6
+
7
+ ENV DEBIAN_FRONTEND=noninteractive
8
+
9
+ # Install prerequisites
10
+ RUN set -ex && \
11
+ echo "===> Installing dependencies" && \
12
+ apt-get -y update && \
13
+ apt-get install -y --force-yes --no-install-recommends \
14
+ curl wget tar gzip gnupg apt-transport-https ca-certificates tzdata locales && \
15
+ \
16
+ echo "===> Installing NodeJS" && \
17
+ apt-get install -y --force-yes --no-install-recommends nodejs && \
18
+ \
19
+ echo "===> Installing Yarn" && \
20
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
21
+ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
22
+ apt-get update && \
23
+ apt-get install -y --force-yes --no-install-recommends yarn && \
24
+ \
25
+ echo "===> Installing database libraries" && \
26
+ apt-get install -y --force-yes --no-install-recommends \
27
+ postgresql-client sqlite3 && \
28
+ \
29
+ echo "===> Installing dev tools" && \
30
+ mkdir -p /usr/share/man/man1 && \
31
+ apt-get install -y --force-yes --no-install-recommends \
32
+ sudo git openssh-client rsync vim \
33
+ net-tools netcat parallel unzip zip bzip2 && \
34
+ \
35
+ echo "===> Cleaning up" && \
36
+ rm -rf /var/lib/apt/lists/*;
37
+
38
+ # Set timezone to UTC by default
39
+ RUN ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime
40
+
41
+ # Set language
42
+ RUN locale-gen en_US.UTF-8
43
+ ENV LANG en_US.UTF-8
44
+ ENV LANGUAGE en_US:en
45
+
46
+ # Install RubyGems
47
+ RUN gem update --system 2.7.9
48
+ RUN gem install bundler -v '1.17.3'
49
+ ENV BUNDLE_SILENCE_ROOT_WARNING 1
50
+
51
+ # Setup demo environment includes
52
+ COPY ./include /vendor/dd-demo
53
+ ENV RUBYLIB /vendor/dd-demo
54
+ ENV RUBYOPT -rdatadog/demo_env