ddtrace 0.42.0 → 0.47.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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +274 -137
- data/.circleci/images/primary/Dockerfile-3.0.0 +73 -0
- data/.circleci/images/primary/{Dockerfile-jruby-9.2 → Dockerfile-jruby-9.2-latest} +2 -1
- data/.circleci/images/primary/Dockerfile-jruby-9.2.0.0 +73 -0
- data/.circleci/images/primary/Dockerfile-truffleruby-21.0.0 +73 -0
- data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
- data/.github/workflows/create-next-milestone.yml +20 -0
- data/.rubocop.yml +250 -7
- data/.rubocop_todo.yml +397 -0
- data/.simplecov +9 -0
- data/Appraisals +386 -142
- data/CHANGELOG.md +1218 -362
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +55 -3
- data/LICENSE-3rdparty.csv +2 -0
- data/README.md +1 -0
- data/Rakefile +216 -29
- data/ddtrace.gemspec +4 -36
- data/docker-compose.yml +105 -7
- data/docs/DevelopmentGuide.md +30 -2
- data/docs/GettingStarted.md +242 -22
- data/integration/README.md +68 -0
- data/integration/apps/rack/.dockerignore +1 -0
- data/integration/apps/rack/.envrc.sample +1 -0
- data/integration/apps/rack/.gitignore +4 -0
- data/integration/apps/rack/.rspec +1 -0
- data/integration/apps/rack/Dockerfile +25 -0
- data/integration/apps/rack/Dockerfile-ci +11 -0
- data/integration/apps/rack/Gemfile +24 -0
- data/integration/apps/rack/README.md +93 -0
- data/integration/apps/rack/app/acme.rb +80 -0
- data/integration/apps/rack/app/datadog.rb +17 -0
- data/integration/apps/rack/bin/run +22 -0
- data/integration/apps/rack/bin/setup +17 -0
- data/integration/apps/rack/bin/test +24 -0
- data/integration/apps/rack/config.ru +6 -0
- data/integration/apps/rack/config/puma.rb +14 -0
- data/integration/apps/rack/config/unicorn.rb +23 -0
- data/integration/apps/rack/docker-compose.ci.yml +62 -0
- data/integration/apps/rack/docker-compose.yml +78 -0
- data/integration/apps/rack/script/build-images +38 -0
- data/integration/apps/rack/script/ci +50 -0
- data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
- data/integration/apps/rack/spec/spec_helper.rb +16 -0
- data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
- data/integration/apps/rails-five/.dockerignore +1 -0
- data/integration/apps/rails-five/.env +3 -0
- data/integration/apps/rails-five/.envrc.sample +1 -0
- data/integration/apps/rails-five/.gitignore +30 -0
- data/integration/apps/rails-five/Dockerfile +25 -0
- data/integration/apps/rails-five/Dockerfile-ci +11 -0
- data/integration/apps/rails-five/Gemfile +104 -0
- data/integration/apps/rails-five/README.md +94 -0
- data/integration/apps/rails-five/Rakefile +6 -0
- data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
- data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
- data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
- data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
- data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
- data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
- data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
- data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
- data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
- data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
- data/integration/apps/rails-five/app/models/application_record.rb +3 -0
- data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
- data/integration/apps/rails-five/app/models/test.rb +2 -0
- data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
- data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
- data/integration/apps/rails-five/bin/bundle +3 -0
- data/integration/apps/rails-five/bin/rails +9 -0
- data/integration/apps/rails-five/bin/rake +9 -0
- data/integration/apps/rails-five/bin/run +24 -0
- data/integration/apps/rails-five/bin/setup +27 -0
- data/integration/apps/rails-five/bin/spring +17 -0
- data/integration/apps/rails-five/bin/test +21 -0
- data/integration/apps/rails-five/bin/update +28 -0
- data/integration/apps/rails-five/config.ru +5 -0
- data/integration/apps/rails-five/config/application.rb +97 -0
- data/integration/apps/rails-five/config/boot.rb +4 -0
- data/integration/apps/rails-five/config/cable.yml +10 -0
- data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
- data/integration/apps/rails-five/config/database.yml +28 -0
- data/integration/apps/rails-five/config/environment.rb +5 -0
- data/integration/apps/rails-five/config/environments/development.rb +51 -0
- data/integration/apps/rails-five/config/environments/production.rb +82 -0
- data/integration/apps/rails-five/config/environments/test.rb +43 -0
- data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
- data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
- data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
- data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
- data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
- data/integration/apps/rails-five/config/locales/en.yml +33 -0
- data/integration/apps/rails-five/config/puma.rb +24 -0
- data/integration/apps/rails-five/config/routes.rb +11 -0
- data/integration/apps/rails-five/config/spring.rb +6 -0
- data/integration/apps/rails-five/config/unicorn.rb +29 -0
- data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
- data/integration/apps/rails-five/db/schema.rb +23 -0
- data/integration/apps/rails-five/db/seeds.rb +7 -0
- data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
- data/integration/apps/rails-five/docker-compose.yml +100 -0
- data/integration/apps/rails-five/lib/tasks/.keep +0 -0
- data/integration/apps/rails-five/log/.keep +0 -0
- data/integration/apps/rails-five/public/robots.txt +1 -0
- data/integration/apps/rails-five/script/build-images +35 -0
- data/integration/apps/rails-five/script/ci +50 -0
- data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
- data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
- data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
- data/integration/apps/rails-five/storage/.keep +0 -0
- data/integration/apps/rails-five/tmp/.keep +0 -0
- data/integration/apps/rails-five/vendor/.keep +0 -0
- data/integration/apps/ruby/.dockerignore +1 -0
- data/integration/apps/ruby/.envrc.sample +1 -0
- data/integration/apps/ruby/.gitignore +2 -0
- data/integration/apps/ruby/Dockerfile +25 -0
- data/integration/apps/ruby/Dockerfile-ci +11 -0
- data/integration/apps/ruby/Gemfile +11 -0
- data/integration/apps/ruby/README.md +70 -0
- data/integration/apps/ruby/agent.yaml +3 -0
- data/integration/apps/ruby/app/datadog.rb +13 -0
- data/integration/apps/ruby/app/fibonacci.rb +58 -0
- data/integration/apps/ruby/bin/run +20 -0
- data/integration/apps/ruby/bin/setup +17 -0
- data/integration/apps/ruby/bin/test +21 -0
- data/integration/apps/ruby/docker-compose.ci.yml +51 -0
- data/integration/apps/ruby/docker-compose.yml +63 -0
- data/integration/apps/ruby/script/build-images +38 -0
- data/integration/apps/ruby/script/ci +50 -0
- data/integration/images/agent/Dockerfile +2 -0
- data/integration/images/agent/agent.yaml +3 -0
- data/integration/images/include/datadog/analyzer.rb +71 -0
- data/integration/images/include/datadog/demo_env.rb +101 -0
- data/integration/images/include/http-health-check +33 -0
- data/integration/images/ruby/2.0/Dockerfile +54 -0
- data/integration/images/ruby/2.1/Dockerfile +54 -0
- data/integration/images/ruby/2.2/Dockerfile +54 -0
- data/integration/images/ruby/2.3/Dockerfile +70 -0
- data/integration/images/ruby/2.4/Dockerfile +54 -0
- data/integration/images/ruby/2.5/Dockerfile +54 -0
- data/integration/images/ruby/2.6/Dockerfile +54 -0
- data/integration/images/ruby/2.7/Dockerfile +54 -0
- data/integration/images/ruby/3.0/Dockerfile +54 -0
- data/integration/images/wrk/Dockerfile +33 -0
- data/integration/images/wrk/scripts/entrypoint.sh +17 -0
- data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
- data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
- data/integration/script/build-images +43 -0
- data/lib/ddtrace.rb +10 -5
- data/lib/ddtrace/analytics.rb +2 -0
- data/lib/ddtrace/auto_instrument.rb +3 -0
- data/lib/ddtrace/auto_instrument_base.rb +6 -0
- data/lib/ddtrace/buffer.rb +4 -4
- data/lib/ddtrace/configuration.rb +108 -23
- data/lib/ddtrace/configuration/base.rb +1 -1
- data/lib/ddtrace/configuration/components.rb +2 -2
- data/lib/ddtrace/configuration/option_definition.rb +1 -3
- data/lib/ddtrace/configuration/options.rb +4 -7
- data/lib/ddtrace/configuration/settings.rb +21 -5
- data/lib/ddtrace/context.rb +23 -6
- data/lib/ddtrace/context_provider.rb +12 -2
- data/lib/ddtrace/contrib/action_cable/event.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -3
- data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_view/event.rb +1 -5
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_view/utils.rb +1 -1
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +101 -18
- data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +68 -21
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +104 -3
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +21 -0
- data/lib/ddtrace/contrib/active_support/ext.rb +3 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +12 -1
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +9 -5
- data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +2 -1
- data/lib/ddtrace/contrib/aws/patcher.rb +1 -1
- data/lib/ddtrace/contrib/aws/services.rb +3 -0
- data/lib/ddtrace/contrib/configurable.rb +63 -37
- data/lib/ddtrace/contrib/configuration/resolver.rb +70 -5
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +20 -20
- data/lib/ddtrace/contrib/configuration/settings.rb +7 -6
- data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/cucumber/ext.rb +17 -0
- data/lib/ddtrace/contrib/cucumber/formatter.rb +98 -0
- data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
- data/lib/ddtrace/contrib/cucumber/integration.rb +45 -0
- data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +0 -38
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +2 -1
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +3 -2
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +11 -10
- data/lib/ddtrace/contrib/ethon/ext.rb +1 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +9 -7
- data/lib/ddtrace/contrib/extensions.rb +53 -3
- data/lib/ddtrace/contrib/faraday/middleware.rb +1 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +0 -36
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +47 -21
- data/lib/ddtrace/contrib/grape/ext.rb +1 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +0 -42
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +8 -8
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +1 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +0 -36
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +1 -3
- data/lib/ddtrace/contrib/http/instrumentation.rb +7 -7
- data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +147 -0
- data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +38 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +15 -21
- data/lib/ddtrace/contrib/httprb/patcher.rb +5 -2
- data/lib/ddtrace/contrib/kafka/event.rb +1 -1
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -0
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -3
- data/lib/ddtrace/contrib/patchable.rb +18 -7
- data/lib/ddtrace/contrib/patcher.rb +9 -6
- data/lib/ddtrace/contrib/presto/patcher.rb +5 -2
- data/lib/ddtrace/contrib/qless/configuration/settings.rb +35 -0
- data/lib/ddtrace/contrib/qless/ext.rb +20 -0
- data/lib/ddtrace/contrib/qless/integration.rb +38 -0
- data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
- data/lib/ddtrace/contrib/qless/qless_job.rb +73 -0
- data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +33 -0
- data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/que/ext.rb +19 -19
- data/lib/ddtrace/contrib/que/tracer.rb +3 -2
- data/lib/ddtrace/contrib/racecar/event.rb +1 -0
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +3 -3
- data/lib/ddtrace/contrib/rack/integration.rb +7 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +6 -11
- data/lib/ddtrace/contrib/rack/patcher.rb +1 -3
- data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +11 -4
- data/lib/ddtrace/contrib/rails/utils.rb +4 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +4 -2
- data/lib/ddtrace/contrib/rake/integration.rb +1 -1
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +14 -5
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +5 -0
- data/lib/ddtrace/contrib/redis/ext.rb +1 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +20 -3
- data/lib/ddtrace/contrib/redis/quantize.rb +28 -0
- data/lib/ddtrace/contrib/redis/tags.rb +5 -1
- data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +6 -7
- data/lib/ddtrace/contrib/registry.rb +2 -2
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/resque/integration.rb +1 -1
- data/lib/ddtrace/contrib/resque/resque_job.rb +3 -1
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -3
- data/lib/ddtrace/contrib/rspec/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/rspec/example.rb +75 -0
- data/lib/ddtrace/contrib/rspec/ext.rb +16 -0
- data/lib/ddtrace/contrib/rspec/integration.rb +46 -0
- data/lib/ddtrace/contrib/rspec/patcher.rb +23 -0
- data/lib/ddtrace/contrib/sequel/utils.rb +5 -6
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +3 -1
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +5 -7
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -1
- data/lib/ddtrace/contrib/sinatra/env.rb +1 -3
- data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
- data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -3
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +5 -5
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sneakers/ext.rb +11 -11
- data/lib/ddtrace/contrib/sneakers/tracer.rb +16 -21
- data/lib/ddtrace/contrib/status_code_matcher.rb +69 -0
- data/lib/ddtrace/correlation.rb +1 -0
- data/lib/ddtrace/diagnostics/environment_logger.rb +2 -1
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +1 -3
- data/lib/ddtrace/ext/app_types.rb +1 -0
- data/lib/ddtrace/ext/ci.rb +297 -0
- data/lib/ddtrace/ext/distributed.rb +8 -2
- data/lib/ddtrace/ext/git.rb +11 -0
- data/lib/ddtrace/ext/http.rb +1 -1
- data/lib/ddtrace/ext/runtime.rb +4 -1
- data/lib/ddtrace/ext/test.rb +24 -0
- data/lib/ddtrace/forced_tracing.rb +2 -0
- data/lib/ddtrace/logger.rb +1 -1
- data/lib/ddtrace/metrics.rb +10 -6
- data/lib/ddtrace/opentracer/distributed_headers.rb +3 -0
- data/lib/ddtrace/opentracer/span.rb +2 -6
- data/lib/ddtrace/opentracer/thread_local_scope.rb +1 -0
- data/lib/ddtrace/patcher.rb +25 -4
- data/lib/ddtrace/pin.rb +8 -61
- data/lib/ddtrace/pipeline/span_filter.rb +1 -1
- data/lib/ddtrace/propagation/grpc_propagator.rb +1 -0
- data/lib/ddtrace/propagation/http_propagator.rb +17 -2
- data/lib/ddtrace/quantization/http.rb +1 -0
- data/lib/ddtrace/runtime/cgroup.rb +2 -2
- data/lib/ddtrace/runtime/container.rb +27 -29
- data/lib/ddtrace/runtime/identity.rb +12 -5
- data/lib/ddtrace/sampler.rb +1 -1
- data/lib/ddtrace/sampling/rate_limiter.rb +65 -16
- data/lib/ddtrace/sampling/rule_sampler.rb +1 -0
- data/lib/ddtrace/span.rb +7 -7
- data/lib/ddtrace/sync_writer.rb +12 -12
- data/lib/ddtrace/tracer.rb +21 -6
- data/lib/ddtrace/transport/http.rb +15 -8
- data/lib/ddtrace/transport/http/adapters/net.rb +27 -8
- data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
- data/lib/ddtrace/transport/http/builder.rb +7 -1
- data/lib/ddtrace/transport/http/env.rb +8 -0
- data/lib/ddtrace/transport/http/traces.rb +2 -3
- data/lib/ddtrace/transport/io.rb +1 -1
- data/lib/ddtrace/transport/io/response.rb +1 -3
- data/lib/ddtrace/transport/io/traces.rb +6 -0
- data/lib/ddtrace/transport/traces.rb +18 -1
- data/lib/ddtrace/utils.rb +10 -11
- data/lib/ddtrace/utils/compression.rb +27 -0
- data/lib/ddtrace/utils/forking.rb +52 -0
- data/lib/ddtrace/utils/object_set.rb +41 -0
- data/lib/ddtrace/utils/only_once.rb +40 -0
- data/lib/ddtrace/utils/sequence.rb +17 -0
- data/lib/ddtrace/utils/string_table.rb +45 -0
- data/lib/ddtrace/utils/time.rb +32 -1
- data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
- data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
- data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
- data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace/workers.rb +5 -0
- data/lib/ddtrace/workers/async.rb +11 -3
- data/lib/ddtrace/workers/loop.rb +17 -3
- data/lib/ddtrace/workers/polling.rb +1 -0
- data/lib/ddtrace/workers/queue.rb +1 -0
- data/lib/ddtrace/workers/runtime_metrics.rb +7 -3
- data/lib/ddtrace/workers/trace_writer.rb +10 -10
- data/lib/ddtrace/writer.rb +26 -5
- metadata +186 -373
- data/lib/ddtrace/augmentation.rb +0 -13
- data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
- data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
- data/lib/ddtrace/augmentation/shim.rb +0 -102
- data/lib/ddtrace/monkey.rb +0 -58
|
@@ -5,6 +5,7 @@ require 'ddtrace/contrib/active_record/events'
|
|
|
5
5
|
require 'ddtrace/contrib/active_record/configuration/resolver'
|
|
6
6
|
require 'ddtrace/contrib/active_record/configuration/settings'
|
|
7
7
|
require 'ddtrace/contrib/active_record/patcher'
|
|
8
|
+
require 'ddtrace/contrib/rails/utils'
|
|
8
9
|
|
|
9
10
|
module Datadog
|
|
10
11
|
module Contrib
|
|
@@ -29,6 +30,12 @@ module Datadog
|
|
|
29
30
|
super && version >= MINIMUM_VERSION
|
|
30
31
|
end
|
|
31
32
|
|
|
33
|
+
# enabled by rails integration so should only auto instrument
|
|
34
|
+
# if detected that it is being used without rails
|
|
35
|
+
def auto_instrument?
|
|
36
|
+
!Datadog::Contrib::Rails::Utils.railtie_supported?
|
|
37
|
+
end
|
|
38
|
+
|
|
32
39
|
def default_configuration
|
|
33
40
|
Configuration::Settings.new
|
|
34
41
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'ddtrace/ext/runtime'
|
|
2
|
+
|
|
1
3
|
module Datadog
|
|
2
4
|
module Contrib
|
|
3
5
|
module ActiveRecord
|
|
@@ -21,44 +23,80 @@ module Datadog
|
|
|
21
23
|
connection_config[:port]
|
|
22
24
|
end
|
|
23
25
|
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
# So, if rails is recent we'll have a direct access to the connection.
|
|
27
|
-
# Else, we'll find it thanks to the passed `connection_id`.
|
|
26
|
+
# Returns the connection configuration hash from the
|
|
27
|
+
# current connection
|
|
28
28
|
#
|
|
29
|
-
#
|
|
29
|
+
# Since Rails 6.0, we have direct access to the object,
|
|
30
|
+
# while older versions of Rails only provide us the
|
|
31
|
+
# connection id.
|
|
30
32
|
#
|
|
33
|
+
# @see https://github.com/rails/rails/pull/34602
|
|
31
34
|
def self.connection_config(connection = nil, connection_id = nil)
|
|
32
35
|
return default_connection_config if connection.nil? && connection_id.nil?
|
|
33
36
|
|
|
34
37
|
conn = if !connection.nil?
|
|
38
|
+
# Since Rails 6.0, the connection object
|
|
39
|
+
# is directly available.
|
|
35
40
|
connection
|
|
36
|
-
# Rails 3.0 - 3.2
|
|
37
|
-
elsif Gem.loaded_specs['activerecord'].version < Gem::Version.new('4.0')
|
|
38
|
-
::ActiveRecord::Base
|
|
39
|
-
.connection_handler
|
|
40
|
-
.connection_pools
|
|
41
|
-
.values
|
|
42
|
-
.flat_map(&:connections)
|
|
43
|
-
.find { |c| c.object_id == connection_id }
|
|
44
|
-
# Rails 4.2+
|
|
45
41
|
else
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
.find { |c| c.object_id == connection_id }
|
|
42
|
+
# For Rails < 6.0, only the `connection_id`
|
|
43
|
+
# is available. We have to find the connection
|
|
44
|
+
# object from it.
|
|
45
|
+
connection_from_id(connection_id)
|
|
51
46
|
end
|
|
52
47
|
|
|
53
|
-
if conn.instance_variable_defined?(:@config)
|
|
48
|
+
if conn && conn.instance_variable_defined?(:@config)
|
|
54
49
|
conn.instance_variable_get(:@config)
|
|
55
50
|
else
|
|
56
51
|
EMPTY_CONFIG
|
|
57
52
|
end
|
|
58
53
|
end
|
|
59
54
|
|
|
55
|
+
# DEV: JRuby responds to {ObjectSpace._id2ref}, despite raising an error
|
|
56
|
+
# DEV: when invoked. Thus, we have to explicitly check for Ruby runtime.
|
|
57
|
+
if Datadog::Ext::Runtime::RUBY_ENGINE != 'jruby'
|
|
58
|
+
# CRuby has access to {ObjectSpace._id2ref}, which allows for
|
|
59
|
+
# direct look up of the connection object.
|
|
60
|
+
def self.connection_from_id(connection_id)
|
|
61
|
+
# `connection_id` is the `#object_id` of the
|
|
62
|
+
# connection. We can perform an ObjectSpace
|
|
63
|
+
# lookup to find it.
|
|
64
|
+
#
|
|
65
|
+
# This works not only for ActiveRecord, but for
|
|
66
|
+
# extensions that might have their own connection
|
|
67
|
+
# pool (e.g. https://rubygems.org/gems/makara).
|
|
68
|
+
ObjectSpace._id2ref(connection_id)
|
|
69
|
+
rescue => e
|
|
70
|
+
# Because `connection_id` references a live connection
|
|
71
|
+
# present in the current stack, it is very unlikely that
|
|
72
|
+
# `_id2ref` will fail, but we add this safeguard just
|
|
73
|
+
# in case.
|
|
74
|
+
Datadog.logger.debug(
|
|
75
|
+
"connection_id #{connection_id} does not represent a valid object. " \
|
|
76
|
+
"Cause: #{e.message} Source: #{e.backtrace.first}"
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
# JRuby does not enable {ObjectSpace._id2ref} by default,
|
|
81
|
+
# as it has large performance impact:
|
|
82
|
+
# https://github.com/jruby/jruby/wiki/PerformanceTuning/cf155dd9#dont-enable-objectspace
|
|
83
|
+
#
|
|
84
|
+
# This fallback code does not support the makara gem,
|
|
85
|
+
# as its connections don't live in the ActiveRecord
|
|
86
|
+
# connection pool.
|
|
87
|
+
def self.connection_from_id(connection_id)
|
|
88
|
+
::ActiveRecord::Base
|
|
89
|
+
.connection_handler
|
|
90
|
+
.connection_pool_list
|
|
91
|
+
.flat_map(&:connections)
|
|
92
|
+
.find { |c| c.object_id == connection_id }
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @return [Hash]
|
|
60
97
|
def self.default_connection_config
|
|
61
98
|
return @default_connection_config if instance_variable_defined?(:@default_connection_config)
|
|
99
|
+
|
|
62
100
|
current_connection_name = if ::ActiveRecord::Base.respond_to?(:connection_specification_name)
|
|
63
101
|
::ActiveRecord::Base.connection_specification_name
|
|
64
102
|
else
|
|
@@ -66,10 +104,19 @@ module Datadog
|
|
|
66
104
|
end
|
|
67
105
|
|
|
68
106
|
connection_pool = ::ActiveRecord::Base.connection_handler.retrieve_connection_pool(current_connection_name)
|
|
69
|
-
connection_pool.nil? ? EMPTY_CONFIG : (@default_connection_config = connection_pool
|
|
107
|
+
connection_pool.nil? ? EMPTY_CONFIG : (@default_connection_config = db_config(connection_pool))
|
|
70
108
|
rescue StandardError
|
|
71
109
|
EMPTY_CONFIG
|
|
72
110
|
end
|
|
111
|
+
|
|
112
|
+
# @return [Hash]
|
|
113
|
+
def self.db_config(connection_pool)
|
|
114
|
+
if ::Rails::VERSION::MAJOR >= 6 && ::Rails::VERSION::MINOR >= 1
|
|
115
|
+
connection_pool.db_config.configuration_hash
|
|
116
|
+
else
|
|
117
|
+
connection_pool.spec.config
|
|
118
|
+
end
|
|
119
|
+
end
|
|
73
120
|
end
|
|
74
121
|
end
|
|
75
122
|
end
|
|
@@ -18,9 +18,13 @@ module Datadog
|
|
|
18
18
|
# NOTE: the ``finish_trace_cache()`` is fired but it already has a safe-guard
|
|
19
19
|
# to avoid any kind of issue.
|
|
20
20
|
current_span = tracer.active_span
|
|
21
|
-
return if
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
return if current_span.try(:name) == Ext::SPAN_CACHE &&
|
|
22
|
+
(
|
|
23
|
+
payload[:action] == Ext::RESOURCE_CACHE_GET &&
|
|
24
|
+
current_span.try(:resource) == Ext::RESOURCE_CACHE_GET ||
|
|
25
|
+
payload[:action] == Ext::RESOURCE_CACHE_MGET &&
|
|
26
|
+
current_span.try(:resource) == Ext::RESOURCE_CACHE_MGET
|
|
27
|
+
)
|
|
24
28
|
|
|
25
29
|
tracing_context = payload.fetch(:tracing_context)
|
|
26
30
|
|
|
@@ -59,6 +63,32 @@ module Datadog
|
|
|
59
63
|
Datadog.logger.debug(e.message)
|
|
60
64
|
end
|
|
61
65
|
|
|
66
|
+
def finish_trace_cache_multi(payload)
|
|
67
|
+
# retrieve the tracing context and continue the trace
|
|
68
|
+
tracing_context = payload.fetch(:tracing_context)
|
|
69
|
+
span = tracing_context[:dd_cache_span]
|
|
70
|
+
return unless span && !span.finished?
|
|
71
|
+
|
|
72
|
+
begin
|
|
73
|
+
# discard parameters from the cache_store configuration
|
|
74
|
+
if defined?(::Rails)
|
|
75
|
+
store, = *Array.wrap(::Rails.configuration.cache_store).flatten
|
|
76
|
+
span.set_tag(Ext::TAG_CACHE_BACKEND, store)
|
|
77
|
+
end
|
|
78
|
+
normalized_keys = payload.fetch(:keys, []).map do |key|
|
|
79
|
+
::ActiveSupport::Cache.expand_cache_key(key)
|
|
80
|
+
end
|
|
81
|
+
cache_keys = Datadog::Utils.truncate(normalized_keys, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
|
|
82
|
+
span.set_tag(Ext::TAG_CACHE_KEY_MULTI, cache_keys)
|
|
83
|
+
|
|
84
|
+
span.set_error(payload[:exception]) if payload[:exception]
|
|
85
|
+
ensure
|
|
86
|
+
span.finish
|
|
87
|
+
end
|
|
88
|
+
rescue StandardError => e
|
|
89
|
+
Datadog.logger.debug(e.message)
|
|
90
|
+
end
|
|
91
|
+
|
|
62
92
|
# Defines instrumentation for ActiveSupport cache reading
|
|
63
93
|
module Read
|
|
64
94
|
def read(*args, &block)
|
|
@@ -82,6 +112,29 @@ module Datadog
|
|
|
82
112
|
end
|
|
83
113
|
end
|
|
84
114
|
|
|
115
|
+
# Defines instrumentation for ActiveSupport cache reading of multiple keys
|
|
116
|
+
module ReadMulti
|
|
117
|
+
def read_multi(*keys, &block)
|
|
118
|
+
payload = {
|
|
119
|
+
action: Ext::RESOURCE_CACHE_MGET,
|
|
120
|
+
keys: keys,
|
|
121
|
+
tracing_context: {}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
begin
|
|
125
|
+
# process and catch cache exceptions
|
|
126
|
+
Instrumentation.start_trace_cache(payload)
|
|
127
|
+
super
|
|
128
|
+
rescue Exception => e
|
|
129
|
+
payload[:exception] = [e.class.name, e.message]
|
|
130
|
+
payload[:exception_object] = e
|
|
131
|
+
raise e
|
|
132
|
+
end
|
|
133
|
+
ensure
|
|
134
|
+
Instrumentation.finish_trace_cache_multi(payload)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
85
138
|
# Defines instrumentation for ActiveSupport cache fetching
|
|
86
139
|
module Fetch
|
|
87
140
|
def fetch(*args, &block)
|
|
@@ -105,6 +158,31 @@ module Datadog
|
|
|
105
158
|
end
|
|
106
159
|
end
|
|
107
160
|
|
|
161
|
+
# Defines instrumentation for ActiveSupport cache fetching of multiple keys
|
|
162
|
+
module FetchMulti
|
|
163
|
+
def fetch_multi(*args, &block)
|
|
164
|
+
# extract options hash
|
|
165
|
+
keys = args[-1].instance_of?(Hash) ? args[0..-2] : args
|
|
166
|
+
payload = {
|
|
167
|
+
action: Ext::RESOURCE_CACHE_MGET,
|
|
168
|
+
keys: keys,
|
|
169
|
+
tracing_context: {}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
begin
|
|
173
|
+
# process and catch cache exceptions
|
|
174
|
+
Instrumentation.start_trace_cache(payload)
|
|
175
|
+
super
|
|
176
|
+
rescue Exception => e
|
|
177
|
+
payload[:exception] = [e.class.name, e.message]
|
|
178
|
+
payload[:exception_object] = e
|
|
179
|
+
raise e
|
|
180
|
+
end
|
|
181
|
+
ensure
|
|
182
|
+
Instrumentation.finish_trace_cache_multi(payload)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
108
186
|
# Defines instrumentation for ActiveSupport cache writing
|
|
109
187
|
module Write
|
|
110
188
|
def write(*args, &block)
|
|
@@ -128,6 +206,29 @@ module Datadog
|
|
|
128
206
|
end
|
|
129
207
|
end
|
|
130
208
|
|
|
209
|
+
# Defines instrumentation for ActiveSupport cache writing of multiple keys
|
|
210
|
+
module WriteMulti
|
|
211
|
+
def write_multi(hash, options = nil)
|
|
212
|
+
payload = {
|
|
213
|
+
action: Ext::RESOURCE_CACHE_MSET,
|
|
214
|
+
keys: hash.keys,
|
|
215
|
+
tracing_context: {}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
begin
|
|
219
|
+
# process and catch cache exceptions
|
|
220
|
+
Instrumentation.start_trace_cache(payload)
|
|
221
|
+
super
|
|
222
|
+
rescue Exception => e
|
|
223
|
+
payload[:exception] = [e.class.name, e.message]
|
|
224
|
+
payload[:exception_object] = e
|
|
225
|
+
raise e
|
|
226
|
+
end
|
|
227
|
+
ensure
|
|
228
|
+
Instrumentation.finish_trace_cache_multi(payload)
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
131
232
|
# Defines instrumentation for ActiveSupport cache deleting
|
|
132
233
|
module Delete
|
|
133
234
|
def delete(*args, &block)
|
|
@@ -17,8 +17,11 @@ module Datadog
|
|
|
17
17
|
|
|
18
18
|
def patch
|
|
19
19
|
patch_cache_store_read
|
|
20
|
+
patch_cache_store_read_multi
|
|
20
21
|
patch_cache_store_fetch
|
|
22
|
+
patch_cache_store_fetch_multi
|
|
21
23
|
patch_cache_store_write
|
|
24
|
+
patch_cache_store_write_multi
|
|
22
25
|
patch_cache_store_delete
|
|
23
26
|
end
|
|
24
27
|
|
|
@@ -30,14 +33,32 @@ module Datadog
|
|
|
30
33
|
cache_store_class(:read).send(:prepend, Cache::Instrumentation::Read)
|
|
31
34
|
end
|
|
32
35
|
|
|
36
|
+
def patch_cache_store_read_multi
|
|
37
|
+
cache_store_class(:read_multi).send(:prepend, Cache::Instrumentation::ReadMulti)
|
|
38
|
+
end
|
|
39
|
+
|
|
33
40
|
def patch_cache_store_fetch
|
|
34
41
|
cache_store_class(:fetch).send(:prepend, Cache::Instrumentation::Fetch)
|
|
35
42
|
end
|
|
36
43
|
|
|
44
|
+
def patch_cache_store_fetch_multi
|
|
45
|
+
klass = cache_store_class(:fetch_multi)
|
|
46
|
+
return unless klass.public_method_defined?(:fetch_multi)
|
|
47
|
+
|
|
48
|
+
klass.send(:prepend, Cache::Instrumentation::FetchMulti)
|
|
49
|
+
end
|
|
50
|
+
|
|
37
51
|
def patch_cache_store_write
|
|
38
52
|
cache_store_class(:write).send(:prepend, Cache::Instrumentation::Write)
|
|
39
53
|
end
|
|
40
54
|
|
|
55
|
+
def patch_cache_store_write_multi
|
|
56
|
+
klass = cache_store_class(:write_multi)
|
|
57
|
+
return unless klass.public_method_defined?(:write_multi)
|
|
58
|
+
|
|
59
|
+
klass.send(:prepend, Cache::Instrumentation::WriteMulti)
|
|
60
|
+
end
|
|
61
|
+
|
|
41
62
|
def patch_cache_store_delete
|
|
42
63
|
cache_store_class(:delete).send(:prepend, Cache::Instrumentation::Delete)
|
|
43
64
|
end
|
|
@@ -12,12 +12,15 @@ module Datadog
|
|
|
12
12
|
QUANTIZE_CACHE_MAX_KEY_SIZE = 300
|
|
13
13
|
RESOURCE_CACHE_DELETE = 'DELETE'.freeze
|
|
14
14
|
RESOURCE_CACHE_GET = 'GET'.freeze
|
|
15
|
+
RESOURCE_CACHE_MGET = 'MGET'.freeze
|
|
15
16
|
RESOURCE_CACHE_SET = 'SET'.freeze
|
|
17
|
+
RESOURCE_CACHE_MSET = 'MSET'.freeze
|
|
16
18
|
SERVICE_CACHE = 'active_support-cache'.freeze
|
|
17
19
|
SPAN_CACHE = 'rails.cache'.freeze
|
|
18
20
|
SPAN_TYPE_CACHE = 'cache'.freeze
|
|
19
21
|
TAG_CACHE_BACKEND = 'rails.cache.backend'.freeze
|
|
20
22
|
TAG_CACHE_KEY = 'rails.cache.key'.freeze
|
|
23
|
+
TAG_CACHE_KEY_MULTI = 'rails.cache.keys'.freeze
|
|
21
24
|
end
|
|
22
25
|
end
|
|
23
26
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require 'ddtrace/contrib/integration'
|
|
2
2
|
require 'ddtrace/contrib/active_support/configuration/settings'
|
|
3
3
|
require 'ddtrace/contrib/active_support/patcher'
|
|
4
|
-
|
|
5
4
|
require 'ddtrace/contrib/active_support/cache/redis'
|
|
5
|
+
require 'ddtrace/contrib/rails/utils'
|
|
6
6
|
|
|
7
7
|
module Datadog
|
|
8
8
|
module Contrib
|
|
@@ -27,6 +27,12 @@ module Datadog
|
|
|
27
27
|
super && version >= MINIMUM_VERSION
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
# enabled by rails integration so should only auto instrument
|
|
31
|
+
# if detected that it is being used without rails
|
|
32
|
+
def auto_instrument?
|
|
33
|
+
!Datadog::Contrib::Rails::Utils.railtie_supported?
|
|
34
|
+
end
|
|
35
|
+
|
|
30
36
|
def default_configuration
|
|
31
37
|
Configuration::Settings.new
|
|
32
38
|
end
|
|
@@ -20,7 +20,8 @@ module Datadog
|
|
|
20
20
|
module ClassMethods
|
|
21
21
|
DEFAULT_TRACER = -> { Datadog.tracer }
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
# Publicly exposes protected method `subscribe!`
|
|
24
|
+
def subscribe! # rubocop:disable Lint/UselessMethodDefinition
|
|
24
25
|
super
|
|
25
26
|
end
|
|
26
27
|
|
|
@@ -56,6 +57,16 @@ module Datadog
|
|
|
56
57
|
def tracer
|
|
57
58
|
DEFAULT_TRACER
|
|
58
59
|
end
|
|
60
|
+
|
|
61
|
+
def report_if_exception(span, payload)
|
|
62
|
+
exception = payload_exception(payload)
|
|
63
|
+
span.set_error(payload[:exception]) if exception
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def payload_exception(payload)
|
|
67
|
+
payload[:exception_object] ||
|
|
68
|
+
payload[:exception] # Fallback for ActiveSupport < 5.0
|
|
69
|
+
end
|
|
59
70
|
end
|
|
60
71
|
end
|
|
61
72
|
end
|
|
@@ -9,7 +9,8 @@ module Datadog
|
|
|
9
9
|
:options
|
|
10
10
|
|
|
11
11
|
def initialize(tracer, span_name, options, &block)
|
|
12
|
-
raise ArgumentError, 'Must be given a block!' unless
|
|
12
|
+
raise ArgumentError, 'Must be given a block!' unless block
|
|
13
|
+
|
|
13
14
|
@tracer = tracer
|
|
14
15
|
@span_name = span_name
|
|
15
16
|
@options = options
|
|
@@ -38,21 +39,23 @@ module Datadog
|
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
def before_trace(&block)
|
|
41
|
-
callbacks.add(:before_trace, &block) if
|
|
42
|
+
callbacks.add(:before_trace, &block) if block
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
def after_trace(&block)
|
|
45
|
-
callbacks.add(:after_trace, &block) if
|
|
46
|
+
callbacks.add(:after_trace, &block) if block
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
def subscribe(pattern)
|
|
49
50
|
return false if subscribers.key?(pattern)
|
|
51
|
+
|
|
50
52
|
subscribers[pattern] = ::ActiveSupport::Notifications.subscribe(pattern, self)
|
|
51
53
|
true
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
def unsubscribe(pattern)
|
|
55
57
|
return false unless subscribers.key?(pattern)
|
|
58
|
+
|
|
56
59
|
::ActiveSupport::Notifications.unsubscribe(subscribers[pattern])
|
|
57
60
|
subscribers.delete(pattern)
|
|
58
61
|
true
|
|
@@ -60,7 +63,8 @@ module Datadog
|
|
|
60
63
|
|
|
61
64
|
def unsubscribe_all
|
|
62
65
|
return false if subscribers.empty?
|
|
63
|
-
|
|
66
|
+
|
|
67
|
+
subscribers.each_key { |pattern| unsubscribe(pattern) }
|
|
64
68
|
true
|
|
65
69
|
end
|
|
66
70
|
|
|
@@ -131,7 +135,7 @@ module Datadog
|
|
|
131
135
|
end
|
|
132
136
|
|
|
133
137
|
def add(key, &block)
|
|
134
|
-
blocks_for(key) << block if
|
|
138
|
+
blocks_for(key) << block if block
|
|
135
139
|
end
|
|
136
140
|
|
|
137
141
|
def run(event, key, *args)
|