ddtrace 0.48.0 → 0.51.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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +250 -68
- data/.circleci/images/primary/Dockerfile-2.1.10 +1 -1
- data/.circleci/images/primary/Dockerfile-2.2.10 +1 -1
- data/.circleci/images/primary/Dockerfile-2.3.8 +4 -2
- data/.circleci/images/primary/{Dockerfile-2.6.4 → Dockerfile-2.4.10} +5 -3
- data/.circleci/images/primary/{Dockerfile-2.4.6 → Dockerfile-2.5.9} +3 -3
- data/.circleci/images/primary/{Dockerfile-2.5.6 → Dockerfile-2.6.7} +3 -3
- data/.circleci/images/primary/{Dockerfile-2.7.0 → Dockerfile-2.7.3} +3 -3
- data/.circleci/images/primary/{Dockerfile-3.0.0 → Dockerfile-3.0.1} +3 -3
- data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +3 -3
- data/.circleci/images/primary/Dockerfile-jruby-9.2.0.0 +1 -1
- data/.circleci/images/primary/{Dockerfile-truffleruby-21.0.0 → Dockerfile-truffleruby-21.1.0} +2 -2
- data/.dd-ci/ci-app-spec.json +31 -0
- data/.dockerignore +0 -1
- data/.gitattributes +1 -0
- data/.github/workflows/test-head.yaml +34 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +13 -9
- data/.rubocop_todo.yml +7 -8
- data/Appraisals +206 -182
- data/CHANGELOG.md +154 -0
- data/Gemfile +6 -3
- data/Rakefile +331 -333
- data/benchmarks/data/profiler-submission-marshal.gz +0 -0
- data/benchmarks/profiler_sample_loop.rb +69 -0
- data/benchmarks/profiler_submission.rb +93 -0
- data/ddtrace.gemspec +2 -2
- data/docker-compose.yml +14 -68
- data/docs/GettingStarted.md +59 -13
- data/gemfiles/jruby_9.2.0.0_contrib.gemfile +82 -0
- data/gemfiles/jruby_9.2.0.0_contrib.gemfile.lock +1571 -0
- data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile +36 -0
- data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile.lock +159 -0
- data/gemfiles/jruby_9.2.0.0_core_old.gemfile +35 -0
- data/gemfiles/jruby_9.2.0.0_core_old.gemfile.lock +155 -0
- data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile +36 -0
- data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile.lock +176 -0
- data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile +36 -0
- data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile.lock +208 -0
- data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile +36 -0
- data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile.lock +208 -0
- data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile.lock +273 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile.lock +273 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile +42 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile.lock +275 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile +42 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile.lock +275 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile +43 -0
- data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile.lock +281 -0
- data/gemfiles/jruby_9.2.0.0_rails5_semantic_logger.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails5_semantic_logger.gemfile.lock +272 -0
- data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile.lock +292 -0
- data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile.lock +292 -0
- data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile +42 -0
- data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile.lock +294 -0
- data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile +42 -0
- data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile.lock +299 -0
- data/gemfiles/jruby_9.2.0.0_rails61_semantic_logger.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails61_semantic_logger.gemfile.lock +291 -0
- data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile.lock +289 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile.lock +289 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile +42 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile.lock +291 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile +42 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile.lock +291 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile +43 -0
- data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile.lock +297 -0
- data/gemfiles/jruby_9.2.0.0_rails6_semantic_logger.gemfile +41 -0
- data/gemfiles/jruby_9.2.0.0_rails6_semantic_logger.gemfile.lock +288 -0
- data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile +37 -0
- data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile.lock +182 -0
- data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile +37 -0
- data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile.lock +182 -0
- data/gemfiles/jruby_9.2.18.0_contrib.gemfile +82 -0
- data/gemfiles/jruby_9.2.18.0_contrib.gemfile.lock +1571 -0
- data/gemfiles/jruby_9.2.18.0_contrib_old.gemfile +36 -0
- data/gemfiles/jruby_9.2.18.0_contrib_old.gemfile.lock +159 -0
- data/gemfiles/jruby_9.2.18.0_core_old.gemfile +35 -0
- data/gemfiles/jruby_9.2.18.0_core_old.gemfile.lock +155 -0
- data/gemfiles/jruby_9.2.18.0_cucumber3.gemfile +36 -0
- data/gemfiles/jruby_9.2.18.0_cucumber3.gemfile.lock +176 -0
- data/gemfiles/jruby_9.2.18.0_cucumber4.gemfile +36 -0
- data/gemfiles/jruby_9.2.18.0_cucumber4.gemfile.lock +208 -0
- data/gemfiles/jruby_9.2.18.0_cucumber5.gemfile +36 -0
- data/gemfiles/jruby_9.2.18.0_cucumber5.gemfile.lock +208 -0
- data/gemfiles/jruby_9.2.18.0_rails5_mysql2.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails5_mysql2.gemfile.lock +273 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres.gemfile.lock +273 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis.gemfile +42 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis.gemfile.lock +275 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis_activesupport.gemfile +42 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis_activesupport.gemfile.lock +275 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres_sidekiq.gemfile +43 -0
- data/gemfiles/jruby_9.2.18.0_rails5_postgres_sidekiq.gemfile.lock +281 -0
- data/gemfiles/jruby_9.2.18.0_rails5_semantic_logger.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails5_semantic_logger.gemfile.lock +272 -0
- data/gemfiles/jruby_9.2.18.0_rails61_mysql2.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails61_mysql2.gemfile.lock +292 -0
- data/gemfiles/jruby_9.2.18.0_rails61_postgres.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails61_postgres.gemfile.lock +292 -0
- data/gemfiles/jruby_9.2.18.0_rails61_postgres_redis.gemfile +42 -0
- data/gemfiles/jruby_9.2.18.0_rails61_postgres_redis.gemfile.lock +294 -0
- data/gemfiles/jruby_9.2.18.0_rails61_postgres_sidekiq.gemfile +42 -0
- data/gemfiles/jruby_9.2.18.0_rails61_postgres_sidekiq.gemfile.lock +299 -0
- data/gemfiles/jruby_9.2.18.0_rails61_semantic_logger.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails61_semantic_logger.gemfile.lock +291 -0
- data/gemfiles/jruby_9.2.18.0_rails6_mysql2.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails6_mysql2.gemfile.lock +289 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres.gemfile.lock +289 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis.gemfile +42 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis.gemfile.lock +291 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis_activesupport.gemfile +42 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis_activesupport.gemfile.lock +291 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres_sidekiq.gemfile +43 -0
- data/gemfiles/jruby_9.2.18.0_rails6_postgres_sidekiq.gemfile.lock +297 -0
- data/gemfiles/jruby_9.2.18.0_rails6_semantic_logger.gemfile +41 -0
- data/gemfiles/jruby_9.2.18.0_rails6_semantic_logger.gemfile.lock +288 -0
- data/gemfiles/jruby_9.2.18.0_resque2_redis3.gemfile +37 -0
- data/gemfiles/jruby_9.2.18.0_resque2_redis3.gemfile.lock +182 -0
- data/gemfiles/jruby_9.2.18.0_resque2_redis4.gemfile +37 -0
- data/gemfiles/jruby_9.2.18.0_resque2_redis4.gemfile.lock +182 -0
- data/gemfiles/ruby_2.1.10_contrib_old.gemfile +68 -0
- data/gemfiles/ruby_2.1.10_contrib_old.gemfile.lock +310 -0
- data/gemfiles/ruby_2.1.10_core_old.gemfile +34 -0
- data/gemfiles/ruby_2.1.10_core_old.gemfile.lock +120 -0
- data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile +39 -0
- data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile.lock +193 -0
- data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile +40 -0
- data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile.lock +202 -0
- data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile +42 -0
- data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock +212 -0
- data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile +39 -0
- data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock +201 -0
- data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile +41 -0
- data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock +220 -0
- data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile +40 -0
- data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock +210 -0
- data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile +39 -0
- data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock +220 -0
- data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile +39 -0
- data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock +220 -0
- data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile +41 -0
- data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock +239 -0
- data/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile +39 -0
- data/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock +218 -0
- data/gemfiles/ruby_2.2.10_contrib.gemfile +76 -0
- data/gemfiles/ruby_2.2.10_contrib.gemfile.lock +1499 -0
- data/gemfiles/ruby_2.2.10_core_old.gemfile +34 -0
- data/gemfiles/ruby_2.2.10_core_old.gemfile.lock +120 -0
- data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile.lock +193 -0
- data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile +40 -0
- data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile.lock +202 -0
- data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile +41 -0
- data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile.lock +209 -0
- data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile.lock +201 -0
- data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile +41 -0
- data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile.lock +220 -0
- data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile +40 -0
- data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile.lock +210 -0
- data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile.lock +220 -0
- data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile.lock +220 -0
- data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile +41 -0
- data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile.lock +239 -0
- data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile +41 -0
- data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile.lock +231 -0
- data/gemfiles/ruby_2.2.10_rails4_semantic_logger.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails4_semantic_logger.gemfile.lock +218 -0
- data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile.lock +236 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile.lock +236 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile +40 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile.lock +238 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile +40 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile.lock +238 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile +41 -0
- data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile.lock +247 -0
- data/gemfiles/ruby_2.2.10_rails5_semantic_logger.gemfile +39 -0
- data/gemfiles/ruby_2.2.10_rails5_semantic_logger.gemfile.lock +234 -0
- data/gemfiles/ruby_2.3.8_contrib.gemfile +75 -0
- data/gemfiles/ruby_2.3.8_contrib.gemfile.lock +1508 -0
- data/gemfiles/ruby_2.3.8_contrib_old.gemfile +34 -0
- data/gemfiles/ruby_2.3.8_contrib_old.gemfile.lock +123 -0
- data/gemfiles/ruby_2.3.8_core_old.gemfile +33 -0
- data/gemfiles/ruby_2.3.8_core_old.gemfile.lock +119 -0
- data/gemfiles/ruby_2.3.8_cucumber3.gemfile +34 -0
- data/gemfiles/ruby_2.3.8_cucumber3.gemfile.lock +140 -0
- data/gemfiles/ruby_2.3.8_cucumber4.gemfile +34 -0
- data/gemfiles/ruby_2.3.8_cucumber4.gemfile.lock +170 -0
- data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile +38 -0
- data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile.lock +192 -0
- data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile +39 -0
- data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile.lock +201 -0
- data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile +40 -0
- data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile.lock +208 -0
- data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile +38 -0
- data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile.lock +200 -0
- data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile +40 -0
- data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile.lock +219 -0
- data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile +39 -0
- data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile.lock +209 -0
- data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile +38 -0
- data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile.lock +219 -0
- data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile +38 -0
- data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile.lock +219 -0
- data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile +40 -0
- data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile.lock +238 -0
- data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile +40 -0
- data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile.lock +230 -0
- data/gemfiles/ruby_2.3.8_rails4_semantic_logger.gemfile +38 -0
- data/gemfiles/ruby_2.3.8_rails4_semantic_logger.gemfile.lock +218 -0
- data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile +37 -0
- data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile.lock +230 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile +37 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile.lock +230 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile +38 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile.lock +232 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile +38 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile.lock +232 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile +39 -0
- data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile.lock +241 -0
- data/gemfiles/ruby_2.3.8_rails5_semantic_logger.gemfile +37 -0
- data/gemfiles/ruby_2.3.8_rails5_semantic_logger.gemfile.lock +229 -0
- data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile +35 -0
- data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile.lock +146 -0
- data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile +35 -0
- data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile.lock +146 -0
- data/gemfiles/ruby_2.4.10_contrib.gemfile +81 -0
- data/gemfiles/ruby_2.4.10_contrib.gemfile.lock +1596 -0
- data/gemfiles/ruby_2.4.10_contrib_old.gemfile +39 -0
- data/gemfiles/ruby_2.4.10_contrib_old.gemfile.lock +157 -0
- data/gemfiles/ruby_2.4.10_core_old.gemfile +38 -0
- data/gemfiles/ruby_2.4.10_core_old.gemfile.lock +153 -0
- data/gemfiles/ruby_2.4.10_cucumber3.gemfile +39 -0
- data/gemfiles/ruby_2.4.10_cucumber3.gemfile.lock +174 -0
- data/gemfiles/ruby_2.4.10_cucumber4.gemfile +39 -0
- data/gemfiles/ruby_2.4.10_cucumber4.gemfile.lock +204 -0
- data/gemfiles/ruby_2.4.10_rails5_mysql2.gemfile +42 -0
- data/gemfiles/ruby_2.4.10_rails5_mysql2.gemfile.lock +264 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres.gemfile +42 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres.gemfile.lock +264 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres_redis.gemfile +43 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres_redis.gemfile.lock +266 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres_redis_activesupport.gemfile +43 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres_redis_activesupport.gemfile.lock +266 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres_sidekiq.gemfile +44 -0
- data/gemfiles/ruby_2.4.10_rails5_postgres_sidekiq.gemfile.lock +275 -0
- data/gemfiles/ruby_2.4.10_rails5_semantic_logger.gemfile +42 -0
- data/gemfiles/ruby_2.4.10_rails5_semantic_logger.gemfile.lock +263 -0
- data/gemfiles/ruby_2.4.10_resque2_redis3.gemfile +40 -0
- data/gemfiles/ruby_2.4.10_resque2_redis3.gemfile.lock +180 -0
- data/gemfiles/ruby_2.4.10_resque2_redis4.gemfile +40 -0
- data/gemfiles/ruby_2.4.10_resque2_redis4.gemfile.lock +180 -0
- data/gemfiles/ruby_2.5.9_contrib.gemfile +86 -0
- data/gemfiles/ruby_2.5.9_contrib.gemfile.lock +1608 -0
- data/gemfiles/ruby_2.5.9_contrib_old.gemfile +40 -0
- data/gemfiles/ruby_2.5.9_contrib_old.gemfile.lock +167 -0
- data/gemfiles/ruby_2.5.9_core_old.gemfile +39 -0
- data/gemfiles/ruby_2.5.9_core_old.gemfile.lock +163 -0
- data/gemfiles/ruby_2.5.9_cucumber3.gemfile +40 -0
- data/gemfiles/ruby_2.5.9_cucumber3.gemfile.lock +184 -0
- data/gemfiles/ruby_2.5.9_cucumber4.gemfile +40 -0
- data/gemfiles/ruby_2.5.9_cucumber4.gemfile.lock +216 -0
- data/gemfiles/ruby_2.5.9_cucumber5.gemfile +40 -0
- data/gemfiles/ruby_2.5.9_cucumber5.gemfile.lock +216 -0
- data/gemfiles/ruby_2.5.9_rails5_mysql2.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails5_mysql2.gemfile.lock +276 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres.gemfile.lock +276 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres_redis.gemfile +46 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres_redis.gemfile.lock +278 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres_redis_activesupport.gemfile +46 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres_redis_activesupport.gemfile.lock +278 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres_sidekiq.gemfile +47 -0
- data/gemfiles/ruby_2.5.9_rails5_postgres_sidekiq.gemfile.lock +284 -0
- data/gemfiles/ruby_2.5.9_rails5_semantic_logger.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails5_semantic_logger.gemfile.lock +275 -0
- data/gemfiles/ruby_2.5.9_rails61_mysql2.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails61_mysql2.gemfile.lock +295 -0
- data/gemfiles/ruby_2.5.9_rails61_postgres.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails61_postgres.gemfile.lock +295 -0
- data/gemfiles/ruby_2.5.9_rails61_postgres_redis.gemfile +46 -0
- data/gemfiles/ruby_2.5.9_rails61_postgres_redis.gemfile.lock +297 -0
- data/gemfiles/ruby_2.5.9_rails61_postgres_sidekiq.gemfile +46 -0
- data/gemfiles/ruby_2.5.9_rails61_postgres_sidekiq.gemfile.lock +302 -0
- data/gemfiles/ruby_2.5.9_rails61_semantic_logger.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails61_semantic_logger.gemfile.lock +294 -0
- data/gemfiles/ruby_2.5.9_rails6_mysql2.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails6_mysql2.gemfile.lock +292 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres.gemfile.lock +292 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres_redis.gemfile +46 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres_redis.gemfile.lock +294 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres_redis_activesupport.gemfile +46 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres_redis_activesupport.gemfile.lock +294 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres_sidekiq.gemfile +47 -0
- data/gemfiles/ruby_2.5.9_rails6_postgres_sidekiq.gemfile.lock +300 -0
- data/gemfiles/ruby_2.5.9_rails6_semantic_logger.gemfile +45 -0
- data/gemfiles/ruby_2.5.9_rails6_semantic_logger.gemfile.lock +291 -0
- data/gemfiles/ruby_2.5.9_resque2_redis3.gemfile +41 -0
- data/gemfiles/ruby_2.5.9_resque2_redis3.gemfile.lock +190 -0
- data/gemfiles/ruby_2.5.9_resque2_redis4.gemfile +41 -0
- data/gemfiles/ruby_2.5.9_resque2_redis4.gemfile.lock +190 -0
- data/gemfiles/ruby_2.6.7_contrib.gemfile +82 -0
- data/gemfiles/ruby_2.6.7_contrib.gemfile.lock +1606 -0
- data/gemfiles/ruby_2.6.7_contrib_old.gemfile +40 -0
- data/gemfiles/ruby_2.6.7_contrib_old.gemfile.lock +169 -0
- data/gemfiles/ruby_2.6.7_core_old.gemfile +39 -0
- data/gemfiles/ruby_2.6.7_core_old.gemfile.lock +165 -0
- data/gemfiles/ruby_2.6.7_cucumber3.gemfile +40 -0
- data/gemfiles/ruby_2.6.7_cucumber3.gemfile.lock +186 -0
- data/gemfiles/ruby_2.6.7_cucumber4.gemfile +40 -0
- data/gemfiles/ruby_2.6.7_cucumber4.gemfile.lock +218 -0
- data/gemfiles/ruby_2.6.7_cucumber5.gemfile +40 -0
- data/gemfiles/ruby_2.6.7_cucumber5.gemfile.lock +218 -0
- data/gemfiles/ruby_2.6.7_rails5_mysql2.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails5_mysql2.gemfile.lock +276 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres.gemfile.lock +276 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres_redis.gemfile +44 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres_redis.gemfile.lock +278 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres_redis_activesupport.gemfile +44 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres_redis_activesupport.gemfile.lock +278 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres_sidekiq.gemfile +45 -0
- data/gemfiles/ruby_2.6.7_rails5_postgres_sidekiq.gemfile.lock +284 -0
- data/gemfiles/ruby_2.6.7_rails5_semantic_logger.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails5_semantic_logger.gemfile.lock +275 -0
- data/gemfiles/ruby_2.6.7_rails61_mysql2.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails61_mysql2.gemfile.lock +295 -0
- data/gemfiles/ruby_2.6.7_rails61_postgres.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails61_postgres.gemfile.lock +295 -0
- data/gemfiles/ruby_2.6.7_rails61_postgres_redis.gemfile +44 -0
- data/gemfiles/ruby_2.6.7_rails61_postgres_redis.gemfile.lock +297 -0
- data/gemfiles/ruby_2.6.7_rails61_postgres_sidekiq.gemfile +44 -0
- data/gemfiles/ruby_2.6.7_rails61_postgres_sidekiq.gemfile.lock +302 -0
- data/gemfiles/ruby_2.6.7_rails61_semantic_logger.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails61_semantic_logger.gemfile.lock +294 -0
- data/gemfiles/ruby_2.6.7_rails6_mysql2.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails6_mysql2.gemfile.lock +292 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres.gemfile.lock +292 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres_redis.gemfile +44 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres_redis.gemfile.lock +294 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres_redis_activesupport.gemfile +44 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres_redis_activesupport.gemfile.lock +294 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres_sidekiq.gemfile +45 -0
- data/gemfiles/ruby_2.6.7_rails6_postgres_sidekiq.gemfile.lock +300 -0
- data/gemfiles/ruby_2.6.7_rails6_semantic_logger.gemfile +43 -0
- data/gemfiles/ruby_2.6.7_rails6_semantic_logger.gemfile.lock +291 -0
- data/gemfiles/ruby_2.6.7_resque2_redis3.gemfile +41 -0
- data/gemfiles/ruby_2.6.7_resque2_redis3.gemfile.lock +192 -0
- data/gemfiles/ruby_2.6.7_resque2_redis4.gemfile +41 -0
- data/gemfiles/ruby_2.6.7_resque2_redis4.gemfile.lock +192 -0
- data/gemfiles/ruby_2.7.3_contrib.gemfile +81 -0
- data/gemfiles/ruby_2.7.3_contrib.gemfile.lock +1580 -0
- data/gemfiles/ruby_2.7.3_contrib_old.gemfile +40 -0
- data/gemfiles/ruby_2.7.3_contrib_old.gemfile.lock +169 -0
- data/gemfiles/ruby_2.7.3_core_old.gemfile +39 -0
- data/gemfiles/ruby_2.7.3_core_old.gemfile.lock +165 -0
- data/gemfiles/ruby_2.7.3_cucumber3.gemfile +40 -0
- data/gemfiles/ruby_2.7.3_cucumber3.gemfile.lock +186 -0
- data/gemfiles/ruby_2.7.3_cucumber4.gemfile +40 -0
- data/gemfiles/ruby_2.7.3_cucumber4.gemfile.lock +218 -0
- data/gemfiles/ruby_2.7.3_cucumber5.gemfile +40 -0
- data/gemfiles/ruby_2.7.3_cucumber5.gemfile.lock +218 -0
- data/gemfiles/ruby_2.7.3_rails5_mysql2.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails5_mysql2.gemfile.lock +278 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres.gemfile.lock +278 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres_redis.gemfile +45 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres_redis.gemfile.lock +297 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres_redis_activesupport.gemfile +45 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres_redis_activesupport.gemfile.lock +297 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres_sidekiq.gemfile +45 -0
- data/gemfiles/ruby_2.7.3_rails5_postgres_sidekiq.gemfile.lock +286 -0
- data/gemfiles/ruby_2.7.3_rails5_semantic_logger.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails5_semantic_logger.gemfile.lock +277 -0
- data/gemfiles/ruby_2.7.3_rails61_mysql2.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails61_mysql2.gemfile.lock +297 -0
- data/gemfiles/ruby_2.7.3_rails61_postgres.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails61_postgres.gemfile.lock +297 -0
- data/gemfiles/ruby_2.7.3_rails61_postgres_redis.gemfile +44 -0
- data/gemfiles/ruby_2.7.3_rails61_postgres_redis.gemfile.lock +299 -0
- data/gemfiles/ruby_2.7.3_rails61_postgres_sidekiq.gemfile +44 -0
- data/gemfiles/ruby_2.7.3_rails61_postgres_sidekiq.gemfile.lock +304 -0
- data/gemfiles/ruby_2.7.3_rails61_semantic_logger.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails61_semantic_logger.gemfile.lock +296 -0
- data/gemfiles/ruby_2.7.3_rails6_mysql2.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails6_mysql2.gemfile.lock +294 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres.gemfile.lock +294 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres_redis.gemfile +45 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres_redis.gemfile.lock +313 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres_redis_activesupport.gemfile +45 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres_redis_activesupport.gemfile.lock +313 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres_sidekiq.gemfile +45 -0
- data/gemfiles/ruby_2.7.3_rails6_postgres_sidekiq.gemfile.lock +302 -0
- data/gemfiles/ruby_2.7.3_rails6_semantic_logger.gemfile +43 -0
- data/gemfiles/ruby_2.7.3_rails6_semantic_logger.gemfile.lock +293 -0
- data/gemfiles/ruby_2.7.3_resque2_redis3.gemfile +41 -0
- data/gemfiles/ruby_2.7.3_resque2_redis3.gemfile.lock +192 -0
- data/gemfiles/ruby_2.7.3_resque2_redis4.gemfile +41 -0
- data/gemfiles/ruby_2.7.3_resque2_redis4.gemfile.lock +192 -0
- data/gemfiles/ruby_3.0.1_contrib.gemfile +80 -0
- data/gemfiles/ruby_3.0.1_contrib.gemfile.lock +1583 -0
- data/gemfiles/ruby_3.0.1_core_old.gemfile +40 -0
- data/gemfiles/ruby_3.0.1_core_old.gemfile.lock +167 -0
- data/gemfiles/ruby_3.0.1_cucumber3.gemfile +41 -0
- data/gemfiles/ruby_3.0.1_cucumber3.gemfile.lock +188 -0
- data/gemfiles/ruby_3.0.1_cucumber4.gemfile +41 -0
- data/gemfiles/ruby_3.0.1_cucumber4.gemfile.lock +220 -0
- data/gemfiles/ruby_3.0.1_cucumber5.gemfile +41 -0
- data/gemfiles/ruby_3.0.1_cucumber5.gemfile.lock +220 -0
- data/gemfiles/ruby_3.0.1_rails61_mysql2.gemfile +44 -0
- data/gemfiles/ruby_3.0.1_rails61_mysql2.gemfile.lock +297 -0
- data/gemfiles/ruby_3.0.1_rails61_postgres.gemfile +44 -0
- data/gemfiles/ruby_3.0.1_rails61_postgres.gemfile.lock +297 -0
- data/gemfiles/ruby_3.0.1_rails61_postgres_redis.gemfile +45 -0
- data/gemfiles/ruby_3.0.1_rails61_postgres_redis.gemfile.lock +299 -0
- data/gemfiles/ruby_3.0.1_rails61_postgres_sidekiq.gemfile +46 -0
- data/gemfiles/ruby_3.0.1_rails61_postgres_sidekiq.gemfile.lock +311 -0
- data/gemfiles/ruby_3.0.1_rails61_semantic_logger.gemfile +44 -0
- data/gemfiles/ruby_3.0.1_rails61_semantic_logger.gemfile.lock +296 -0
- data/gemfiles/ruby_3.0.1_resque2_redis3.gemfile +42 -0
- data/gemfiles/ruby_3.0.1_resque2_redis3.gemfile.lock +194 -0
- data/gemfiles/ruby_3.0.1_resque2_redis4.gemfile +42 -0
- data/gemfiles/ruby_3.0.1_resque2_redis4.gemfile.lock +194 -0
- data/integration/apps/rack/README.md +2 -2
- data/integration/apps/rack/script/ci +2 -1
- data/integration/apps/rails-five/README.md +2 -2
- data/integration/apps/rails-five/script/ci +2 -1
- data/integration/apps/rspec/.dockerignore +1 -0
- data/integration/apps/rspec/.envrc.sample +1 -0
- data/integration/apps/rspec/.gitignore +2 -0
- data/integration/apps/rspec/.rspec +1 -0
- data/integration/apps/rspec/Dockerfile +25 -0
- data/integration/apps/rspec/Dockerfile-ci +11 -0
- data/integration/apps/rspec/Gemfile +14 -0
- data/integration/apps/rspec/README.md +70 -0
- data/integration/apps/rspec/agent.yaml +3 -0
- data/integration/apps/rspec/app/datadog.rb +13 -0
- data/integration/apps/rspec/app/fibonacci.rb +30 -0
- data/integration/apps/rspec/bin/run +20 -0
- data/integration/apps/rspec/bin/setup +23 -0
- data/integration/apps/rspec/bin/test +21 -0
- data/integration/apps/rspec/docker-compose.ci.yml +51 -0
- data/integration/apps/rspec/docker-compose.yml +64 -0
- data/integration/apps/rspec/script/build-images +37 -0
- data/integration/apps/rspec/script/ci +53 -0
- data/integration/apps/rspec/spec/fibonacci_spec.rb +16 -0
- data/integration/apps/rspec/spec/rspec_spec.rb +58 -0
- data/integration/apps/rspec/spec/spec_helper.rb +24 -0
- data/integration/apps/ruby/README.md +2 -2
- data/integration/apps/ruby/script/ci +2 -1
- data/integration/images/include/datadog/demo_env.rb +15 -14
- data/lib/datadog/ci.rb +16 -0
- data/lib/datadog/ci/configuration/components.rb +30 -0
- data/lib/datadog/ci/configuration/settings.rb +36 -0
- data/lib/datadog/ci/context_flush.rb +28 -0
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +30 -0
- data/lib/datadog/ci/contrib/cucumber/ext.rb +19 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +97 -0
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +26 -0
- data/lib/datadog/ci/contrib/cucumber/integration.rb +47 -0
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +25 -0
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +30 -0
- data/lib/datadog/ci/contrib/rspec/example.rb +73 -0
- data/lib/datadog/ci/contrib/rspec/ext.rb +18 -0
- data/lib/datadog/ci/contrib/rspec/integration.rb +48 -0
- data/lib/datadog/ci/contrib/rspec/patcher.rb +25 -0
- data/lib/datadog/ci/ext/app_types.rb +9 -0
- data/lib/datadog/ci/ext/environment.rb +438 -0
- data/lib/datadog/ci/ext/settings.rb +10 -0
- data/lib/datadog/ci/ext/test.rb +34 -0
- data/lib/datadog/ci/extensions.rb +17 -0
- data/lib/datadog/ci/test.rb +76 -0
- data/lib/datadog/core/environment/cgroup.rb +49 -0
- data/lib/datadog/core/environment/class_count.rb +19 -0
- data/lib/datadog/core/environment/container.rb +88 -0
- data/lib/datadog/core/environment/ext.rb +26 -0
- data/lib/datadog/core/environment/gc.rb +18 -0
- data/lib/datadog/core/environment/identity.rb +50 -0
- data/lib/datadog/core/environment/object_space.rb +22 -0
- data/lib/datadog/core/environment/socket.rb +16 -0
- data/lib/datadog/core/environment/thread_count.rb +18 -0
- data/lib/datadog/core/environment/variable_helpers.rb +39 -0
- data/lib/ddtrace.rb +2 -2
- data/lib/ddtrace/auto_instrument.rb +1 -0
- data/lib/ddtrace/buffer.rb +2 -2
- data/lib/ddtrace/configuration.rb +1 -23
- data/lib/ddtrace/configuration/agent_settings_resolver.rb +230 -0
- data/lib/ddtrace/configuration/base.rb +7 -10
- data/lib/ddtrace/configuration/components.rb +88 -43
- data/lib/ddtrace/configuration/options.rb +2 -2
- data/lib/ddtrace/configuration/settings.rb +76 -10
- data/lib/ddtrace/context.rb +17 -14
- data/lib/ddtrace/context_flush.rb +14 -2
- data/lib/ddtrace/contrib/action_cable/event.rb +4 -4
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +1 -1
- data/lib/ddtrace/contrib/action_pack/utils.rb +1 -1
- data/lib/ddtrace/contrib/action_view/event.rb +2 -2
- data/lib/ddtrace/contrib/action_view/patcher.rb +4 -4
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +2 -2
- data/lib/ddtrace/contrib/active_record/event.rb +2 -2
- data/lib/ddtrace/contrib/active_record/utils.rb +2 -2
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +7 -7
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -5
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -2
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -1
- data/lib/ddtrace/contrib/auto_instrument.rb +1 -2
- data/lib/ddtrace/contrib/aws/instrumentation.rb +29 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +4 -0
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +1 -1
- data/lib/ddtrace/contrib/configurable.rb +1 -1
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/dalli/patcher.rb +1 -1
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +1 -1
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +1 -1
- data/lib/ddtrace/contrib/ethon/patcher.rb +2 -2
- data/lib/ddtrace/contrib/extensions.rb +3 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +2 -2
- data/lib/ddtrace/contrib/grape/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
- data/lib/ddtrace/contrib/grpc/patcher.rb +1 -1
- data/lib/ddtrace/contrib/http/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/http/patcher.rb +1 -1
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/httpclient/patcher.rb +1 -1
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/httprb/patcher.rb +1 -1
- data/lib/ddtrace/contrib/integration.rb +3 -3
- data/lib/ddtrace/contrib/kafka/event.rb +2 -2
- data/lib/ddtrace/contrib/lograge/configuration/settings.rb +18 -0
- data/lib/ddtrace/contrib/lograge/ext.rb +10 -0
- data/lib/ddtrace/contrib/lograge/instrumentation.rb +38 -0
- data/lib/ddtrace/contrib/lograge/integration.rb +45 -0
- data/lib/ddtrace/contrib/{rspec → lograge}/patcher.rb +6 -4
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/mongodb/patcher.rb +2 -2
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/mysql2/patcher.rb +1 -1
- data/lib/ddtrace/contrib/patchable.rb +2 -2
- data/lib/ddtrace/contrib/patcher.rb +2 -2
- data/lib/ddtrace/contrib/presto/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/presto/patcher.rb +1 -1
- data/lib/ddtrace/contrib/qless/patcher.rb +3 -5
- data/lib/ddtrace/contrib/racecar/event.rb +2 -2
- data/lib/ddtrace/contrib/rack/middlewares.rb +1 -1
- data/lib/ddtrace/contrib/rails/framework.rb +25 -1
- data/lib/ddtrace/contrib/rails/log_injection.rb +0 -40
- data/lib/ddtrace/contrib/rails/patcher.rb +11 -9
- data/lib/ddtrace/contrib/rake/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/rake/patcher.rb +1 -1
- data/lib/ddtrace/contrib/registerable.rb +2 -2
- data/lib/ddtrace/contrib/resque/patcher.rb +1 -1
- data/lib/ddtrace/contrib/rest_client/patcher.rb +1 -1
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -1
- data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +18 -0
- data/lib/ddtrace/contrib/semantic_logger/ext.rb +10 -0
- data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +42 -0
- data/lib/ddtrace/contrib/semantic_logger/integration.rb +47 -0
- data/lib/ddtrace/contrib/semantic_logger/patcher.rb +25 -0
- data/lib/ddtrace/contrib/sequel/database.rb +1 -1
- data/lib/ddtrace/contrib/sequel/dataset.rb +1 -1
- data/lib/ddtrace/contrib/sequel/patcher.rb +2 -2
- data/lib/ddtrace/contrib/sinatra/patcher.rb +1 -1
- data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +4 -6
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +4 -0
- data/lib/ddtrace/correlation.rb +1 -1
- data/lib/ddtrace/diagnostics/environment_logger.rb +4 -4
- data/lib/ddtrace/error.rb +76 -9
- data/lib/ddtrace/ext/app_types.rb +0 -1
- data/lib/ddtrace/ext/environment.rb +7 -0
- data/lib/ddtrace/ext/git.rb +9 -1
- data/lib/ddtrace/ext/profiling.rb +1 -0
- data/lib/ddtrace/ext/runtime.rb +0 -9
- data/lib/ddtrace/ext/test.rb +2 -18
- data/lib/ddtrace/ext/transport.rb +1 -0
- data/lib/ddtrace/metrics.rb +64 -13
- data/lib/ddtrace/opentelemetry/extensions.rb +1 -1
- data/lib/ddtrace/opentracer.rb +20 -39
- data/lib/ddtrace/patcher.rb +2 -2
- data/lib/ddtrace/profiling.rb +75 -22
- data/lib/ddtrace/profiling/collectors/stack.rb +17 -8
- data/lib/ddtrace/profiling/encoding/profile.rb +6 -0
- data/lib/ddtrace/profiling/ext/cpu.rb +18 -5
- data/lib/ddtrace/profiling/ext/cthread.rb +56 -35
- data/lib/ddtrace/profiling/ext/forking.rb +7 -7
- data/lib/ddtrace/profiling/flush.rb +12 -10
- data/lib/ddtrace/profiling/pprof/builder.rb +26 -28
- data/lib/ddtrace/profiling/pprof/converter.rb +4 -0
- data/lib/ddtrace/profiling/pprof/stack_sample.rb +17 -1
- data/lib/ddtrace/profiling/pprof/template.rb +4 -0
- data/lib/ddtrace/profiling/profiler.rb +2 -0
- data/lib/ddtrace/profiling/recorder.rb +8 -0
- data/lib/ddtrace/profiling/scheduler.rb +44 -12
- data/lib/ddtrace/profiling/tasks/setup.rb +13 -13
- data/lib/ddtrace/profiling/transport/http.rb +58 -62
- data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +12 -2
- data/lib/ddtrace/runtime/metrics.rb +20 -14
- data/lib/ddtrace/span.rb +17 -6
- data/lib/ddtrace/sync_writer.rb +4 -3
- data/lib/ddtrace/tracer.rb +19 -44
- data/lib/ddtrace/transport/http.rb +43 -40
- data/lib/ddtrace/transport/http/statistics.rb +2 -2
- data/lib/ddtrace/transport/http/traces.rb +3 -3
- data/lib/ddtrace/transport/io/traces.rb +1 -1
- data/lib/ddtrace/utils/forking.rb +1 -1
- data/lib/ddtrace/utils/object_set.rb +3 -5
- data/lib/ddtrace/utils/time.rb +1 -3
- data/lib/ddtrace/version.rb +15 -5
- data/lib/ddtrace/workers.rb +1 -1
- data/lib/ddtrace/workers/async.rb +3 -2
- data/lib/ddtrace/workers/loop.rb +14 -2
- data/lib/ddtrace/workers/polling.rb +11 -5
- data/lib/ddtrace/workers/queue.rb +1 -1
- data/lib/ddtrace/workers/trace_writer.rb +3 -6
- data/lib/ddtrace/writer.rb +6 -3
- data/tasks/update_appraisal_gemfiles.rake +36 -0
- metadata +493 -33
- data/.circleci/images/primary/Dockerfile-2.0.0 +0 -83
- data/integration/images/ruby/2.0/Dockerfile +0 -54
- data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -28
- data/lib/ddtrace/contrib/cucumber/ext.rb +0 -17
- data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -98
- data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
- data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
- data/lib/ddtrace/contrib/cucumber/patcher.rb +0 -23
- data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -28
- data/lib/ddtrace/contrib/rspec/example.rb +0 -75
- data/lib/ddtrace/contrib/rspec/ext.rb +0 -16
- data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
- data/lib/ddtrace/environment.rb +0 -41
- data/lib/ddtrace/ext/ci.rb +0 -297
- data/lib/ddtrace/runtime/cgroup.rb +0 -44
- data/lib/ddtrace/runtime/class_count.rb +0 -17
- data/lib/ddtrace/runtime/container.rb +0 -79
- data/lib/ddtrace/runtime/gc.rb +0 -16
- data/lib/ddtrace/runtime/identity.rb +0 -48
- data/lib/ddtrace/runtime/object_space.rb +0 -19
- data/lib/ddtrace/runtime/socket.rb +0 -14
- data/lib/ddtrace/runtime/thread_count.rb +0 -16
data/lib/ddtrace/opentracer.rb
CHANGED
|
@@ -1,40 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
require 'opentracing'
|
|
2
|
+
require 'opentracing/carrier'
|
|
3
|
+
require 'ddtrace'
|
|
4
|
+
require 'ddtrace/opentracer/carrier'
|
|
5
|
+
require 'ddtrace/opentracer/tracer'
|
|
6
|
+
require 'ddtrace/opentracer/span'
|
|
7
|
+
require 'ddtrace/opentracer/span_context'
|
|
8
|
+
require 'ddtrace/opentracer/span_context_factory'
|
|
9
|
+
require 'ddtrace/opentracer/scope'
|
|
10
|
+
require 'ddtrace/opentracer/scope_manager'
|
|
11
|
+
require 'ddtrace/opentracer/thread_local_scope'
|
|
12
|
+
require 'ddtrace/opentracer/thread_local_scope_manager'
|
|
13
|
+
require 'ddtrace/opentracer/distributed_headers'
|
|
14
|
+
require 'ddtrace/opentracer/propagator'
|
|
15
|
+
require 'ddtrace/opentracer/text_map_propagator'
|
|
16
|
+
require 'ddtrace/opentracer/binary_propagator'
|
|
17
|
+
require 'ddtrace/opentracer/rack_propagator'
|
|
18
|
+
require 'ddtrace/opentracer/global_tracer'
|
|
5
19
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def load_opentracer
|
|
11
|
-
require 'opentracing'
|
|
12
|
-
require 'opentracing/carrier'
|
|
13
|
-
require 'ddtrace'
|
|
14
|
-
require 'ddtrace/opentracer/carrier'
|
|
15
|
-
require 'ddtrace/opentracer/tracer'
|
|
16
|
-
require 'ddtrace/opentracer/span'
|
|
17
|
-
require 'ddtrace/opentracer/span_context'
|
|
18
|
-
require 'ddtrace/opentracer/span_context_factory'
|
|
19
|
-
require 'ddtrace/opentracer/scope'
|
|
20
|
-
require 'ddtrace/opentracer/scope_manager'
|
|
21
|
-
require 'ddtrace/opentracer/thread_local_scope'
|
|
22
|
-
require 'ddtrace/opentracer/thread_local_scope_manager'
|
|
23
|
-
require 'ddtrace/opentracer/distributed_headers'
|
|
24
|
-
require 'ddtrace/opentracer/propagator'
|
|
25
|
-
require 'ddtrace/opentracer/text_map_propagator'
|
|
26
|
-
require 'ddtrace/opentracer/binary_propagator'
|
|
27
|
-
require 'ddtrace/opentracer/rack_propagator'
|
|
28
|
-
require 'ddtrace/opentracer/global_tracer'
|
|
29
|
-
|
|
30
|
-
# Modify the OpenTracing module functions
|
|
31
|
-
OpenTracing.module_eval do
|
|
32
|
-
class << self
|
|
33
|
-
prepend Datadog::OpenTracer::GlobalTracer
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
load_opentracer if supported?
|
|
39
|
-
end
|
|
40
|
-
end
|
|
20
|
+
# Modify the OpenTracing module functions
|
|
21
|
+
::OpenTracing.singleton_class.prepend(Datadog::OpenTracer::GlobalTracer)
|
data/lib/ddtrace/patcher.rb
CHANGED
data/lib/ddtrace/profiling.rb
CHANGED
|
@@ -4,40 +4,70 @@ module Datadog
|
|
|
4
4
|
module_function
|
|
5
5
|
|
|
6
6
|
GOOGLE_PROTOBUF_MINIMUM_VERSION = Gem::Version.new('3.0')
|
|
7
|
+
private_constant :GOOGLE_PROTOBUF_MINIMUM_VERSION
|
|
7
8
|
|
|
8
9
|
def supported?
|
|
9
|
-
|
|
10
|
+
unsupported_reason.nil?
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
def
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
def unsupported_reason
|
|
14
|
+
# NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons -- e.g. tell users
|
|
15
|
+
# first that they can't use this on JRuby before telling them that they are missing protobuf
|
|
16
|
+
|
|
17
|
+
ruby_engine_unsupported? || protobuf_gem_unavailable? || protobuf_version_unsupported? || protobuf_failed_to_load?
|
|
15
18
|
end
|
|
16
19
|
|
|
17
|
-
def
|
|
18
|
-
|
|
19
|
-
&& !Gem.loaded_specs['google-protobuf'].nil? \
|
|
20
|
-
&& Gem.loaded_specs['google-protobuf'].version >= GOOGLE_PROTOBUF_MINIMUM_VERSION \
|
|
21
|
-
&& !defined?(@failed_to_load_protobuf)
|
|
20
|
+
def self.ruby_engine_unsupported?
|
|
21
|
+
'JRuby is not supported' if RUBY_ENGINE == 'jruby'
|
|
22
22
|
end
|
|
23
|
+
private_class_method :ruby_engine_unsupported?
|
|
23
24
|
|
|
24
|
-
def
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
def self.protobuf_gem_unavailable?
|
|
26
|
+
# NOTE: On environments where protobuf is already loaded, we skip the check. This allows us to support environments
|
|
27
|
+
# where no Gem.loaded_version is NOT available but customers are able to load protobuf; see for instance
|
|
28
|
+
# https://github.com/teamcapybara/capybara/commit/caf3bcd7664f4f2691d0ca9ef3be9a2a954fecfb
|
|
29
|
+
if !defined?(::Google::Protobuf) && Gem.loaded_specs['google-protobuf'].nil?
|
|
30
|
+
"Missing google-protobuf dependency; please add `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
private_class_method :protobuf_gem_unavailable?
|
|
27
34
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
def self.protobuf_version_unsupported?
|
|
36
|
+
# See above for why we skip the check when protobuf is already loaded; note that when protobuf was already loaded
|
|
37
|
+
# we skip the version check to avoid the call to Gem.loaded_specs. Unfortunately, protobuf does not seem to
|
|
38
|
+
# expose the gem version constant elsewhere, so in that setup we are not able to check the version.
|
|
39
|
+
if !defined?(::Google::Protobuf) && Gem.loaded_specs['google-protobuf'].version < GOOGLE_PROTOBUF_MINIMUM_VERSION
|
|
40
|
+
'Your google-protobuf is too old; ensure that you have google-protobuf >= 3.0 by ' \
|
|
41
|
+
"adding `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
private_class_method :protobuf_version_unsupported?
|
|
45
|
+
|
|
46
|
+
def self.protobuf_failed_to_load?
|
|
47
|
+
unless protobuf_loaded_successfully?
|
|
48
|
+
'There was an error loading the google-protobuf library; see previous warning message for details'
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
private_class_method :protobuf_failed_to_load?
|
|
52
|
+
|
|
53
|
+
# The `google-protobuf` gem depends on a native component, and its creators helpfully tried to provide precompiled
|
|
54
|
+
# versions of this extension on rubygems.org.
|
|
55
|
+
#
|
|
56
|
+
# Unfortunately, for a long time, the supported Ruby versions metadata on these precompiled versions of the extension
|
|
57
|
+
# was not correctly set. (This is fixed in newer versions -- but not all Ruby versions we want to support can use
|
|
58
|
+
# these.)
|
|
59
|
+
#
|
|
60
|
+
# Thus, the gem can still be installed, but can be in a broken state. To avoid breaking customer applications, we
|
|
61
|
+
# use this helper to load it and gracefully handle failures.
|
|
62
|
+
def self.protobuf_loaded_successfully?
|
|
63
|
+
return @protobuf_loaded if defined?(@protobuf_loaded)
|
|
36
64
|
|
|
37
65
|
begin
|
|
38
|
-
require '
|
|
66
|
+
require 'google/protobuf'
|
|
67
|
+
@protobuf_loaded = true
|
|
39
68
|
rescue LoadError => e
|
|
40
|
-
|
|
69
|
+
# NOTE: We use Kernel#warn here because this code gets run BEFORE Datadog.logger is actually set up.
|
|
70
|
+
# In the future it'd be nice to shuffle the logger startup to happen first to avoid this special case.
|
|
41
71
|
Kernel.warn(
|
|
42
72
|
"[DDTRACE] Error while loading google-protobuf gem. Cause: '#{e.message}' Location: '#{e.backtrace.first}'. " \
|
|
43
73
|
'This can happen when google-protobuf is missing its native components. ' \
|
|
@@ -46,8 +76,31 @@ module Datadog
|
|
|
46
76
|
'If the error persists, please contact support via <https://docs.datadoghq.com/help/> or ' \
|
|
47
77
|
'file a bug at <https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug>.'
|
|
48
78
|
)
|
|
79
|
+
@protobuf_loaded = false
|
|
49
80
|
end
|
|
50
81
|
end
|
|
82
|
+
private_class_method :protobuf_loaded_successfully?
|
|
83
|
+
|
|
84
|
+
def self.load_profiling
|
|
85
|
+
return false unless supported?
|
|
86
|
+
|
|
87
|
+
require 'ddtrace/profiling/ext/cpu'
|
|
88
|
+
require 'ddtrace/profiling/ext/forking'
|
|
89
|
+
|
|
90
|
+
require 'ddtrace/profiling/collectors/stack'
|
|
91
|
+
require 'ddtrace/profiling/exporter'
|
|
92
|
+
require 'ddtrace/profiling/recorder'
|
|
93
|
+
require 'ddtrace/profiling/scheduler'
|
|
94
|
+
require 'ddtrace/profiling/tasks/setup'
|
|
95
|
+
require 'ddtrace/profiling/transport/io'
|
|
96
|
+
require 'ddtrace/profiling/transport/http'
|
|
97
|
+
require 'ddtrace/profiling/profiler'
|
|
98
|
+
|
|
99
|
+
require 'ddtrace/profiling/pprof/pprof_pb'
|
|
100
|
+
|
|
101
|
+
true
|
|
102
|
+
end
|
|
103
|
+
private_class_method :load_profiling
|
|
51
104
|
|
|
52
105
|
load_profiling if supported?
|
|
53
106
|
end
|
|
@@ -11,6 +11,7 @@ module Datadog
|
|
|
11
11
|
# Collects stack trace samples from Ruby threads for both CPU-time (if available) and wall-clock.
|
|
12
12
|
# Runs on its own background thread.
|
|
13
13
|
#
|
|
14
|
+
# rubocop:disable Metrics/ClassLength
|
|
14
15
|
class Stack < Worker
|
|
15
16
|
include Workers::Polling
|
|
16
17
|
|
|
@@ -27,7 +28,7 @@ module Datadog
|
|
|
27
28
|
|
|
28
29
|
def initialize(
|
|
29
30
|
recorder,
|
|
30
|
-
max_frames
|
|
31
|
+
max_frames:,
|
|
31
32
|
ignore_thread: nil,
|
|
32
33
|
max_time_usage_pct: DEFAULT_MAX_TIME_USAGE_PCT,
|
|
33
34
|
thread_api: Thread,
|
|
@@ -36,8 +37,7 @@ module Datadog
|
|
|
36
37
|
enabled: true
|
|
37
38
|
)
|
|
38
39
|
@recorder = recorder
|
|
39
|
-
|
|
40
|
-
@max_frames = max_frames || raise(ArgumentError, 'missing keyword :max_frames')
|
|
40
|
+
@max_frames = max_frames
|
|
41
41
|
@ignore_thread = ignore_thread
|
|
42
42
|
@max_time_usage_pct = max_time_usage_pct
|
|
43
43
|
@thread_api = thread_api
|
|
@@ -52,6 +52,11 @@ module Datadog
|
|
|
52
52
|
self.enabled = enabled
|
|
53
53
|
|
|
54
54
|
@warn_about_missing_cpu_time_instrumentation_only_once = Datadog::Utils::OnlyOnce.new
|
|
55
|
+
|
|
56
|
+
# Cache this proc, since it's pretty expensive to keep recreating it
|
|
57
|
+
@build_backtrace_location = method(:build_backtrace_location).to_proc
|
|
58
|
+
# Cache this buffer, since it's pretty expensive to keep accessing it
|
|
59
|
+
@stack_sample_event_recorder = recorder[Events::StackSample]
|
|
55
60
|
end
|
|
56
61
|
|
|
57
62
|
def start
|
|
@@ -117,7 +122,7 @@ module Datadog
|
|
|
117
122
|
# Convert backtrace locations into structs
|
|
118
123
|
locations = convert_backtrace_locations(locations)
|
|
119
124
|
|
|
120
|
-
thread_id = thread.respond_to?(:
|
|
125
|
+
thread_id = thread.respond_to?(:pthread_thread_id) ? thread.pthread_thread_id : thread.object_id
|
|
121
126
|
trace_id, span_id = get_trace_identifiers(thread)
|
|
122
127
|
cpu_time = get_cpu_time_interval!(thread)
|
|
123
128
|
|
|
@@ -183,7 +188,7 @@ module Datadog
|
|
|
183
188
|
def convert_backtrace_locations(locations)
|
|
184
189
|
locations.collect do |location|
|
|
185
190
|
# Re-use existing BacktraceLocation if identical copy, otherwise build a new one.
|
|
186
|
-
|
|
191
|
+
@stack_sample_event_recorder.cache(:backtrace_locations).fetch(
|
|
187
192
|
# Function name
|
|
188
193
|
location.base_label,
|
|
189
194
|
# Line number
|
|
@@ -191,13 +196,13 @@ module Datadog
|
|
|
191
196
|
# Filename
|
|
192
197
|
location.path,
|
|
193
198
|
# Build function
|
|
194
|
-
|
|
199
|
+
&@build_backtrace_location
|
|
195
200
|
)
|
|
196
201
|
end
|
|
197
202
|
end
|
|
198
203
|
|
|
199
204
|
def build_backtrace_location(_id, base_label, lineno, path)
|
|
200
|
-
string_table =
|
|
205
|
+
string_table = @stack_sample_event_recorder.string_table
|
|
201
206
|
|
|
202
207
|
Profiling::BacktraceLocation.new(
|
|
203
208
|
string_table.fetch_string(base_label),
|
|
@@ -219,6 +224,7 @@ module Datadog
|
|
|
219
224
|
# In this case, the fix is to make sure ddtrace gets loaded before any other parts of the application.
|
|
220
225
|
#
|
|
221
226
|
# b) The thread was started using the Ruby native APIs (e.g. from a C extension such as ffi).
|
|
227
|
+
# Known cases right now that trigger this are the ethon/typhoeus gems.
|
|
222
228
|
# We currently have no solution for this case; these threads will always be missing our CPU instrumentation.
|
|
223
229
|
#
|
|
224
230
|
# c) The thread was started with `Thread.start`/`Thread.fork` and hasn't yet enabled the instrumentation.
|
|
@@ -227,7 +233,9 @@ module Datadog
|
|
|
227
233
|
# it to run and our instrumentation to be applied.
|
|
228
234
|
#
|
|
229
235
|
if thread_api.current.respond_to?(:cpu_time) && thread_api.current.cpu_time
|
|
230
|
-
Datadog.logger.debug(
|
|
236
|
+
Datadog.logger.debug(
|
|
237
|
+
"Thread ('#{thread}') is missing profiling instrumentation; other threads should be unaffected"
|
|
238
|
+
)
|
|
231
239
|
end
|
|
232
240
|
end
|
|
233
241
|
end
|
|
@@ -248,6 +256,7 @@ module Datadog
|
|
|
248
256
|
end
|
|
249
257
|
end
|
|
250
258
|
end
|
|
259
|
+
# rubocop:enable Metrics/ClassLength
|
|
251
260
|
end
|
|
252
261
|
end
|
|
253
262
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'set'
|
|
2
|
+
require 'time'
|
|
2
3
|
|
|
3
4
|
require 'ddtrace/profiling/flush'
|
|
4
5
|
require 'ddtrace/profiling/pprof/template'
|
|
@@ -21,6 +22,11 @@ module Datadog
|
|
|
21
22
|
# Add all events to the pprof
|
|
22
23
|
flush.event_groups.each { |event_group| template.add_events!(event_group.event_class, event_group.events) }
|
|
23
24
|
|
|
25
|
+
Datadog.logger.debug do
|
|
26
|
+
"Encoding profile covering #{flush.start.iso8601} to #{flush.finish.iso8601}, " \
|
|
27
|
+
"events: #{flush.event_count} (#{template.debug_statistics})"
|
|
28
|
+
end
|
|
29
|
+
|
|
24
30
|
# Build the profile and encode it
|
|
25
31
|
template.to_pprof
|
|
26
32
|
end
|
|
@@ -24,8 +24,8 @@ module Datadog
|
|
|
24
24
|
# Applying CThread to Thread will ensure any new threads
|
|
25
25
|
# will provide a thread/clock ID for CPU timing.
|
|
26
26
|
require 'ddtrace/profiling/ext/cthread'
|
|
27
|
-
::Thread.
|
|
28
|
-
::Thread.singleton_class.
|
|
27
|
+
::Thread.prepend(Profiling::Ext::CThread)
|
|
28
|
+
::Thread.singleton_class.prepend(Datadog::Profiling::Ext::WrapThreadStartFork)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def self.unsupported_reason
|
|
@@ -40,14 +40,27 @@ module Datadog
|
|
|
40
40
|
'Feature requires Linux; Windows is not supported'
|
|
41
41
|
elsif !RUBY_PLATFORM.include?('linux')
|
|
42
42
|
"Feature requires Linux; #{RUBY_PLATFORM} is not supported"
|
|
43
|
-
elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.1')
|
|
44
|
-
'Ruby >= 2.1 is required'
|
|
45
43
|
elsif Gem::Specification.find_all_by_name('rollbar', ROLLBAR_INCOMPATIBLE_VERSIONS).any?
|
|
46
44
|
'You have an incompatible rollbar gem version installed; ensure that you have rollbar >= 3.1.2 by ' \
|
|
47
45
|
"adding `gem 'rollbar', '>= 3.1.2'` to your Gemfile or gems.rb file. " \
|
|
48
|
-
'See https://github.com/rollbar/rollbar-gem/pull/1018 for details
|
|
46
|
+
'See https://github.com/rollbar/rollbar-gem/pull/1018 for details'
|
|
47
|
+
elsif Gem::Specification.find_all_by_name('logging').any? && logging_inherit_context_enabled?
|
|
48
|
+
'The `logging` gem is installed and its thread inherit context feature is enabled. ' \
|
|
49
|
+
"Please add LOGGING_INHERIT_CONTEXT=false to your application's environment variables to disable the " \
|
|
50
|
+
'conflicting `logging` gem feature. ' \
|
|
51
|
+
'See https://github.com/TwP/logging/pull/230 for details'
|
|
49
52
|
end
|
|
50
53
|
end
|
|
54
|
+
|
|
55
|
+
private_class_method def self.logging_inherit_context_enabled?
|
|
56
|
+
# The logging gem provides a mechanism to disable the conflicting behavior, see
|
|
57
|
+
# https://github.com/TwP/logging/blob/ae9872d093833b2a5a34cbe1faa4e895a81f6845/lib/logging/diagnostic_context.rb#L418
|
|
58
|
+
# Here we check if the behavior is enabled
|
|
59
|
+
inherit_context_configuration = ENV['LOGGING_INHERIT_CONTEXT']
|
|
60
|
+
|
|
61
|
+
inherit_context_configuration.nil? ||
|
|
62
|
+
(inherit_context_configuration && !%w[false no 0].include?(inherit_context_configuration.downcase))
|
|
63
|
+
end
|
|
51
64
|
end
|
|
52
65
|
end
|
|
53
66
|
end
|
|
@@ -8,13 +8,33 @@ module Datadog
|
|
|
8
8
|
layout :value, :int
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
#
|
|
12
|
-
module
|
|
11
|
+
# Enables interfacing with pthread via FFI
|
|
12
|
+
module NativePthread
|
|
13
13
|
extend FFI::Library
|
|
14
14
|
ffi_lib ['pthread', 'libpthread.so.0']
|
|
15
15
|
attach_function :pthread_self, [], :ulong
|
|
16
16
|
attach_function :pthread_getcpuclockid, [:ulong, CClockId], :int
|
|
17
17
|
|
|
18
|
+
# NOTE: Only returns thread ID for thread that evaluates this call.
|
|
19
|
+
# a.k.a. evaluating `get_pthread_thread_id(thread_a)` from within
|
|
20
|
+
# `thread_b` will return `thread_b`'s thread ID, not `thread_a`'s.
|
|
21
|
+
def self.get_pthread_thread_id(thread)
|
|
22
|
+
return unless ::Thread.current == thread
|
|
23
|
+
|
|
24
|
+
pthread_self
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.get_clock_id(thread, pthread_id)
|
|
28
|
+
return unless ::Thread.current == thread && pthread_id
|
|
29
|
+
|
|
30
|
+
clock = CClockId.new
|
|
31
|
+
clock[:value] = 0
|
|
32
|
+
pthread_getcpuclockid(pthread_id, clock).zero? ? clock[:value] : nil
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Extension used to enable CPU-time profiling via use of pthread's `getcpuclockid`.
|
|
37
|
+
module CThread
|
|
18
38
|
def self.prepended(base)
|
|
19
39
|
# Threads that have already been created, will not have resolved
|
|
20
40
|
# a thread/clock ID. This is because these IDs can only be resolved
|
|
@@ -27,12 +47,34 @@ module Datadog
|
|
|
27
47
|
base.current.send(:update_native_ids) if base.current.is_a?(CThread)
|
|
28
48
|
end
|
|
29
49
|
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
# Process::Waiter crash workaround:
|
|
51
|
+
#
|
|
52
|
+
# This is a workaround for a Ruby VM segfault (usually something like
|
|
53
|
+
# "[BUG] Segmentation fault at 0x0000000000000008") in the affected Ruby versions.
|
|
54
|
+
# See https://bugs.ruby-lang.org/issues/17807 and the regression tests added to this module's specs for details.
|
|
55
|
+
#
|
|
56
|
+
# In those Ruby versions, there's a very special subclass of `Thread` called `Process::Waiter` that causes VM
|
|
57
|
+
# crashes whenever something tries to read its instance variables. This subclass of thread only shows up when
|
|
58
|
+
# the `Process.detach` API gets used.
|
|
59
|
+
# In this module's specs you can find crash regression tests that include a way of reproducing it.
|
|
60
|
+
#
|
|
61
|
+
# The workaround is to use `defined?` to check first if the instance variable exists. This seems to be fine
|
|
62
|
+
# with Ruby.
|
|
63
|
+
# Note that this crash doesn't affect `@foo ||=` nor instance variable writes (after the first write ever of any
|
|
64
|
+
# instance variable on a `Process::Waiter`, then further reads and writes to that or any other instance are OK;
|
|
65
|
+
# it looks like there's some lazily-created structure that is missing and did not get created).
|
|
66
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3') &&
|
|
67
|
+
Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7')
|
|
68
|
+
attr_reader :pthread_thread_id
|
|
69
|
+
else
|
|
70
|
+
def pthread_thread_id
|
|
71
|
+
defined?(@pthread_thread_id) && @pthread_thread_id
|
|
72
|
+
end
|
|
73
|
+
end
|
|
32
74
|
|
|
33
75
|
def initialize(*args)
|
|
34
76
|
@pid = ::Process.pid
|
|
35
|
-
@
|
|
77
|
+
@pthread_thread_id = nil
|
|
36
78
|
@clock_id = nil
|
|
37
79
|
|
|
38
80
|
# Wrap the work block with our own
|
|
@@ -48,15 +90,8 @@ module Datadog
|
|
|
48
90
|
end
|
|
49
91
|
ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true)
|
|
50
92
|
|
|
51
|
-
def clock_id
|
|
52
|
-
update_native_ids if forked?
|
|
53
|
-
defined?(@clock_id) && @clock_id
|
|
54
|
-
end
|
|
55
|
-
|
|
56
93
|
def cpu_time(unit = :float_second)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
::Process.clock_gettime(clock_id, unit)
|
|
94
|
+
::Process.clock_gettime(clock_id, unit) if clock_id
|
|
60
95
|
end
|
|
61
96
|
|
|
62
97
|
def cpu_time_instrumentation_installed?
|
|
@@ -71,36 +106,22 @@ module Datadog
|
|
|
71
106
|
|
|
72
107
|
private
|
|
73
108
|
|
|
74
|
-
|
|
109
|
+
def clock_id
|
|
110
|
+
update_native_ids if forked?
|
|
111
|
+
defined?(@clock_id) && @clock_id
|
|
112
|
+
end
|
|
113
|
+
|
|
75
114
|
def forked?
|
|
76
115
|
::Process.pid != (@pid ||= nil)
|
|
77
116
|
end
|
|
78
117
|
|
|
79
118
|
def update_native_ids
|
|
80
|
-
# Can only resolve if invoked from same thread
|
|
119
|
+
# Can only resolve if invoked from same thread
|
|
81
120
|
return unless ::Thread.current == self
|
|
82
121
|
|
|
83
122
|
@pid = ::Process.pid
|
|
84
|
-
@
|
|
85
|
-
@clock_id = get_clock_id(@
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def get_native_thread_id
|
|
89
|
-
return unless ::Thread.current == self
|
|
90
|
-
|
|
91
|
-
# NOTE: Only returns thread ID for thread that evaluates this call.
|
|
92
|
-
# a.k.a. evaluating `thread_a.get_native_thread_id` from within
|
|
93
|
-
# `thread_b` will return `thread_b`'s thread ID, not `thread_a`'s.
|
|
94
|
-
pthread_self
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def get_clock_id(pthread_id)
|
|
98
|
-
return unless pthread_id && alive?
|
|
99
|
-
|
|
100
|
-
# Build a struct, pass it to Pthread's getcpuclockid function.
|
|
101
|
-
clock = CClockId.new
|
|
102
|
-
clock[:value] = 0
|
|
103
|
-
pthread_getcpuclockid(pthread_id, clock).zero? ? clock[:value] : nil
|
|
123
|
+
@pthread_thread_id = NativePthread.get_pthread_thread_id(self)
|
|
124
|
+
@clock_id = NativePthread.get_clock_id(self, @pthread_thread_id)
|
|
104
125
|
end
|
|
105
126
|
end
|
|
106
127
|
|