ddtrace 0.41.0 → 0.46.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 +4 -4
- data/.circleci/config.yml +223 -126
- data/.circleci/images/primary/Dockerfile-3.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 +396 -0
- data/.simplecov +3 -0
- data/Appraisals +429 -135
- data/CHANGELOG.md +1158 -354
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +40 -3
- data/README.md +1 -0
- data/Rakefile +236 -29
- data/ddtrace.gemspec +4 -35
- data/docker-compose.yml +30 -0
- data/docs/DevelopmentGuide.md +40 -2
- data/docs/GettingStarted.md +186 -16
- 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 +230 -134
- data/lib/ddtrace/configuration.rb +21 -5
- 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 +2 -3
- data/lib/ddtrace/configuration/settings.rb +21 -5
- data/lib/ddtrace/context.rb +23 -6
- data/lib/ddtrace/context_provider.rb +18 -5
- 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 +17 -5
- 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 +2 -0
- data/lib/ddtrace/contrib/configurable.rb +2 -0
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +6 -8
- 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 +2 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +2 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +38 -15
- 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 +28 -1
- 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/client.rb +1 -1
- 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 +151 -0
- data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +35 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +5 -6
- 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 +1 -1
- 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 +19 -5
- 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 +3 -1
- 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 +2 -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 +2 -3
- data/lib/ddtrace/pin.rb +3 -52
- data/lib/ddtrace/pipeline/span_filter.rb +1 -1
- data/lib/ddtrace/propagation/grpc_propagator.rb +17 -4
- data/lib/ddtrace/propagation/http_propagator.rb +17 -2
- data/lib/ddtrace/quantization/http.rb +1 -0
- data/lib/ddtrace/runtime/cgroup.rb +1 -1
- data/lib/ddtrace/runtime/container.rb +2 -2
- data/lib/ddtrace/runtime/identity.rb +4 -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 +7 -10
- data/lib/ddtrace/tracer.rb +23 -10
- data/lib/ddtrace/transport/http.rb +1 -3
- data/lib/ddtrace/transport/http/adapters/net.rb +9 -4
- 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 +2 -0
- data/lib/ddtrace/transport/http/traces.rb +2 -3
- data/lib/ddtrace/transport/io.rb +1 -1
- data/lib/ddtrace/transport/traces.rb +3 -0
- data/lib/ddtrace/utils.rb +10 -11
- data/lib/ddtrace/utils/forking.rb +52 -0
- data/lib/ddtrace/utils/time.rb +25 -1
- data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace/workers.rb +5 -0
- data/lib/ddtrace/workers/async.rb +8 -0
- data/lib/ddtrace/workers/loop.rb +3 -0
- data/lib/ddtrace/workers/polling.rb +1 -0
- data/lib/ddtrace/workers/runtime_metrics.rb +7 -3
- data/lib/ddtrace/workers/trace_writer.rb +9 -10
- data/lib/ddtrace/writer.rb +22 -4
- metadata +168 -358
- 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
|
@@ -7,22 +7,12 @@ module Datadog
|
|
|
7
7
|
module DelayedJob
|
|
8
8
|
# DelayedJob plugin that instruments invoke_job hook
|
|
9
9
|
class Plugin < Delayed::Plugin
|
|
10
|
-
def self.
|
|
10
|
+
def self.instrument_invoke(job, &block)
|
|
11
11
|
return block.call(job) unless tracer && tracer.enabled
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
job.payload_object.job_data['job_class']
|
|
17
|
-
else
|
|
18
|
-
job.name
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name) do |span|
|
|
22
|
-
# Set analytics sample rate
|
|
23
|
-
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
24
|
-
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
25
|
-
end
|
|
13
|
+
tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name(job),
|
|
14
|
+
on_error: configuration[:error_handler]) do |span|
|
|
15
|
+
set_sample_rate(span)
|
|
26
16
|
|
|
27
17
|
# Measure service stats
|
|
28
18
|
Contrib::Analytics.set_measured(span)
|
|
@@ -37,6 +27,23 @@ module Datadog
|
|
|
37
27
|
end
|
|
38
28
|
end
|
|
39
29
|
|
|
30
|
+
def self.instrument_enqueue(job, &block)
|
|
31
|
+
return block.call(job) unless tracer && tracer.enabled
|
|
32
|
+
|
|
33
|
+
tracer.trace(Ext::SPAN_ENQUEUE, service: configuration[:client_service_name], resource: job_name(job)) do |span|
|
|
34
|
+
set_sample_rate(span)
|
|
35
|
+
|
|
36
|
+
# Measure service stats
|
|
37
|
+
Contrib::Analytics.set_measured(span)
|
|
38
|
+
|
|
39
|
+
span.set_tag(Ext::TAG_QUEUE, job.queue) if job.queue
|
|
40
|
+
span.set_tag(Ext::TAG_PRIORITY, job.priority)
|
|
41
|
+
span.span_type = Datadog::Ext::AppTypes::WORKER
|
|
42
|
+
|
|
43
|
+
yield job
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
40
47
|
def self.flush(worker, &block)
|
|
41
48
|
yield worker
|
|
42
49
|
|
|
@@ -51,8 +58,24 @@ module Datadog
|
|
|
51
58
|
configuration[:tracer]
|
|
52
59
|
end
|
|
53
60
|
|
|
61
|
+
def self.job_name(job)
|
|
62
|
+
# When DelayedJob is used through ActiveJob, we need to parse the payload differentely
|
|
63
|
+
# to get the actual job name
|
|
64
|
+
return job.payload_object.job_data['job_class'] if job.payload_object.respond_to?(:job_data)
|
|
65
|
+
|
|
66
|
+
job.name
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.set_sample_rate(span)
|
|
70
|
+
# Set analytics sample rate
|
|
71
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
72
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
54
76
|
callbacks do |lifecycle|
|
|
55
|
-
lifecycle.around(:invoke_job, &method(:
|
|
77
|
+
lifecycle.around(:invoke_job, &method(:instrument_invoke))
|
|
78
|
+
lifecycle.around(:enqueue, &method(:instrument_enqueue))
|
|
56
79
|
lifecycle.around(:execute, &method(:flush))
|
|
57
80
|
end
|
|
58
81
|
end
|
|
@@ -17,7 +17,7 @@ module Datadog
|
|
|
17
17
|
|
|
18
18
|
def format_url(url)
|
|
19
19
|
sanitize_fragment_with_id(url)
|
|
20
|
-
.gsub(/(
|
|
20
|
+
.gsub(/(?:\d+)/, PLACEHOLDER)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def format_body(body, options = {})
|
|
@@ -60,6 +60,7 @@ module Datadog
|
|
|
60
60
|
# If JSON parsing fails, it prints fail_value.
|
|
61
61
|
def reserialize_json(string, fail_value = PLACEHOLDER)
|
|
62
62
|
return string unless block_given?
|
|
63
|
+
|
|
63
64
|
begin
|
|
64
65
|
JSON.dump(yield(JSON.parse(string)))
|
|
65
66
|
rescue JSON::ParserError
|
|
@@ -72,7 +73,7 @@ module Datadog
|
|
|
72
73
|
# This is meant as simple heuristic that attempts to detect if particular fragment
|
|
73
74
|
# represents document Id. This is meant to reduce the cardinality in most frequent cases.
|
|
74
75
|
def sanitize_fragment_with_id(url)
|
|
75
|
-
url.gsub(%r{^(/?[^/]*/[^/]*/)(?:[
|
|
76
|
+
url.gsub(%r{^(/?[^/]*/[^/]*/)(?:[^?/\d]*\d+[^?/]*)}, ID_PLACEHOLDER)
|
|
76
77
|
end
|
|
77
78
|
end
|
|
78
79
|
end
|
|
@@ -13,8 +13,8 @@ module Datadog
|
|
|
13
13
|
def self.included(base)
|
|
14
14
|
base.send(:prepend, InstanceMethods)
|
|
15
15
|
end
|
|
16
|
+
|
|
16
17
|
# InstanceMethods - implementing instrumentation
|
|
17
|
-
# rubocop:disable Metrics/ModuleLength
|
|
18
18
|
module InstanceMethods
|
|
19
19
|
include Datadog::Contrib::HttpAnnotationHelper
|
|
20
20
|
|
|
@@ -36,12 +36,14 @@ module Datadog
|
|
|
36
36
|
def perform
|
|
37
37
|
load_datadog_configuration_for(url)
|
|
38
38
|
return super unless tracer_enabled?
|
|
39
|
+
|
|
39
40
|
datadog_before_request
|
|
40
41
|
super
|
|
41
42
|
end
|
|
42
43
|
|
|
43
44
|
def complete
|
|
44
45
|
return super unless tracer_enabled?
|
|
46
|
+
|
|
45
47
|
begin
|
|
46
48
|
response_options = mirror.options
|
|
47
49
|
response_code = (response_options[:response_code] || response_options[:code]).to_i
|
|
@@ -99,21 +101,21 @@ module Datadog
|
|
|
99
101
|
|
|
100
102
|
def datadog_tag_request
|
|
101
103
|
span = @datadog_span
|
|
102
|
-
method =
|
|
103
|
-
if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
|
|
104
|
-
method = @datadog_method.to_s
|
|
105
|
-
end
|
|
104
|
+
method = Ext::NOT_APPLICABLE_METHOD
|
|
105
|
+
method = @datadog_method.to_s if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
|
|
106
106
|
span.resource = method
|
|
107
107
|
# Tag as an external peer service
|
|
108
108
|
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
109
109
|
# Set analytics sample rate
|
|
110
110
|
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
111
111
|
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
this_uri = uri
|
|
113
|
+
return unless this_uri
|
|
114
|
+
|
|
115
|
+
span.set_tag(Datadog::Ext::HTTP::URL, this_uri.path)
|
|
114
116
|
span.set_tag(Datadog::Ext::HTTP::METHOD, method)
|
|
115
|
-
span.set_tag(Datadog::Ext::NET::TARGET_HOST,
|
|
116
|
-
span.set_tag(Datadog::Ext::NET::TARGET_PORT,
|
|
117
|
+
span.set_tag(Datadog::Ext::NET::TARGET_HOST, this_uri.host)
|
|
118
|
+
span.set_tag(Datadog::Ext::NET::TARGET_PORT, this_uri.port)
|
|
117
119
|
end
|
|
118
120
|
|
|
119
121
|
def set_span_error_message(message)
|
|
@@ -124,7 +126,6 @@ module Datadog
|
|
|
124
126
|
|
|
125
127
|
def uri
|
|
126
128
|
URI.parse(url)
|
|
127
|
-
# rubocop:disable Lint/HandleExceptions
|
|
128
129
|
rescue URI::InvalidURIError
|
|
129
130
|
end
|
|
130
131
|
|
|
@@ -63,6 +63,12 @@ module Datadog
|
|
|
63
63
|
@options
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
+
# default_options in this case contains our specific middleware options
|
|
67
|
+
# so we want it to take precedence in build_request_options
|
|
68
|
+
def build_request_options!(datum)
|
|
69
|
+
datadog_configuration(datum[:host]).options_hash.merge(@default_options)
|
|
70
|
+
end
|
|
71
|
+
|
|
66
72
|
def initialize(stack)
|
|
67
73
|
super(stack, self.class.options)
|
|
68
74
|
end
|
|
@@ -113,9 +119,7 @@ module Datadog
|
|
|
113
119
|
span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
|
|
114
120
|
|
|
115
121
|
# Set analytics sample rate
|
|
116
|
-
if analytics_enabled?
|
|
117
|
-
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
|
|
118
|
-
end
|
|
122
|
+
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
119
123
|
|
|
120
124
|
span.set_tag(Datadog::Ext::HTTP::URL, datum[:path])
|
|
121
125
|
span.set_tag(Datadog::Ext::HTTP::METHOD, datum[:method].to_s.upcase)
|
|
@@ -130,9 +134,7 @@ module Datadog
|
|
|
130
134
|
|
|
131
135
|
if datum.key?(:response)
|
|
132
136
|
response = datum[:response]
|
|
133
|
-
if error_handler.call(response)
|
|
134
|
-
span.set_error(["Error #{response[:status]}", response[:body]])
|
|
135
|
-
end
|
|
137
|
+
span.set_error(["Error #{response[:status]}", response[:body]]) if error_handler.call(response)
|
|
136
138
|
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response[:status])
|
|
137
139
|
end
|
|
138
140
|
span.set_error(datum[:error]) if datum.key?(:error)
|
|
@@ -149,7 +151,7 @@ module Datadog
|
|
|
149
151
|
end
|
|
150
152
|
|
|
151
153
|
def build_request_options!(datum)
|
|
152
|
-
datadog_configuration(datum[:host]).options_hash
|
|
154
|
+
@default_options.merge(datadog_configuration(datum[:host]).options_hash)
|
|
153
155
|
end
|
|
154
156
|
|
|
155
157
|
def datadog_configuration(host = :default)
|
|
@@ -27,8 +27,27 @@ module Datadog
|
|
|
27
27
|
|
|
28
28
|
# Activate integrations
|
|
29
29
|
if target.respond_to?(:integrations_pending_activation)
|
|
30
|
+
reduce_verbosity = target.respond_to?(:reduce_verbosity?) ? target.reduce_verbosity? : false
|
|
30
31
|
target.integrations_pending_activation.each do |integration|
|
|
31
|
-
|
|
32
|
+
next unless integration.respond_to?(:patch)
|
|
33
|
+
|
|
34
|
+
# integration.patch returns either true or a hash of details on why patching failed
|
|
35
|
+
patch_results = integration.patch
|
|
36
|
+
|
|
37
|
+
next if patch_results == true
|
|
38
|
+
|
|
39
|
+
# if patching failed, only log output if verbosity is unset
|
|
40
|
+
# or if patching failure is due to compatibility or integration specific reasons
|
|
41
|
+
next unless !reduce_verbosity ||
|
|
42
|
+
((patch_results[:available] && patch_results[:loaded]) &&
|
|
43
|
+
(!patch_results[:compatible] || !patch_results[:patchable]))
|
|
44
|
+
|
|
45
|
+
desc = "Available?: #{patch_results[:available]}"
|
|
46
|
+
desc += ", Loaded? #{patch_results[:loaded]}"
|
|
47
|
+
desc += ", Compatible? #{patch_results[:compatible]}"
|
|
48
|
+
desc += ", Patchable? #{patch_results[:patchable]}"
|
|
49
|
+
|
|
50
|
+
Datadog.logger.warn("Unable to patch #{patch_results['name']} (#{desc})")
|
|
32
51
|
end
|
|
33
52
|
|
|
34
53
|
target.integrations_pending_activation.clear
|
|
@@ -86,6 +105,14 @@ module Datadog
|
|
|
86
105
|
registry[name] ||
|
|
87
106
|
raise(InvalidIntegrationError, "'#{name}' is not a valid integration.")
|
|
88
107
|
end
|
|
108
|
+
|
|
109
|
+
def reduce_verbosity?
|
|
110
|
+
defined?(@reduce_verbosity) ? @reduce_verbosity : false
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def reduce_log_verbosity
|
|
114
|
+
@reduce_verbosity ||= true
|
|
115
|
+
end
|
|
89
116
|
end
|
|
90
117
|
end
|
|
91
118
|
end
|
|
@@ -57,9 +57,7 @@ module Datadog
|
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
def handle_response(span, env, options)
|
|
60
|
-
if options.fetch(:error_handler).call(env)
|
|
61
|
-
span.set_error(["Error #{env[:status]}", env[:body]])
|
|
62
|
-
end
|
|
60
|
+
span.set_error(["Error #{env[:status]}", env[:body]]) if options.fetch(:error_handler).call(env)
|
|
63
61
|
|
|
64
62
|
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, env[:status])
|
|
65
63
|
end
|
|
@@ -20,21 +20,10 @@ module Datadog
|
|
|
20
20
|
def patch
|
|
21
21
|
require 'ddtrace/contrib/faraday/middleware'
|
|
22
22
|
|
|
23
|
-
add_pin!
|
|
24
23
|
register_middleware!
|
|
25
24
|
add_default_middleware!
|
|
26
25
|
end
|
|
27
26
|
|
|
28
|
-
def add_pin!
|
|
29
|
-
DeprecatedPin
|
|
30
|
-
.new(
|
|
31
|
-
get_option(:service_name),
|
|
32
|
-
app: Ext::APP,
|
|
33
|
-
app_type: Datadog::Ext::AppTypes::WEB,
|
|
34
|
-
tracer: -> { get_option(:tracer) }
|
|
35
|
-
).onto(::Faraday)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
27
|
def register_middleware!
|
|
39
28
|
::Faraday::Middleware.register_middleware(ddtrace: Middleware)
|
|
40
29
|
end
|
|
@@ -58,31 +47,6 @@ module Datadog
|
|
|
58
47
|
::Faraday::RackBuilder.send(:prepend, RackBuilder)
|
|
59
48
|
end
|
|
60
49
|
end
|
|
61
|
-
|
|
62
|
-
def get_option(option)
|
|
63
|
-
Datadog.configuration[:faraday].get_option(option)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Implementation of deprecated Pin, which raises warnings when accessed.
|
|
67
|
-
# To be removed when support for Datadog::Pin with Faraday is removed.
|
|
68
|
-
class DeprecatedPin < Datadog::Pin
|
|
69
|
-
include Datadog::DeprecatedPin
|
|
70
|
-
|
|
71
|
-
DEPRECATION_WARNING = %(
|
|
72
|
-
Use of Datadog::Pin with Faraday is DEPRECATED.
|
|
73
|
-
Upgrade to the configuration API using the migration guide here:
|
|
74
|
-
https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
|
|
75
|
-
|
|
76
|
-
def service_name=(service_name)
|
|
77
|
-
Datadog.configuration[:faraday][:service_name] = service_name
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def log_deprecation_warning(method_name)
|
|
81
|
-
do_once(method_name) do
|
|
82
|
-
Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
50
|
end
|
|
87
51
|
end
|
|
88
52
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/contrib/configuration/settings'
|
|
2
2
|
require 'ddtrace/ext/http'
|
|
3
3
|
require 'ddtrace/contrib/grape/ext'
|
|
4
|
+
require 'ddtrace/contrib/status_code_matcher'
|
|
4
5
|
|
|
5
6
|
module Datadog
|
|
6
7
|
module Contrib
|
|
@@ -24,6 +25,12 @@ module Datadog
|
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
option :service_name, default: Ext::SERVICE_NAME
|
|
28
|
+
|
|
29
|
+
option :error_statuses, default: nil do |o|
|
|
30
|
+
o.setter do |new_value, _old_value|
|
|
31
|
+
Datadog::Contrib::StatusCodeMatcher.new(new_value) unless new_value.nil?
|
|
32
|
+
end
|
|
33
|
+
end
|
|
27
34
|
end
|
|
28
35
|
end
|
|
29
36
|
end
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
require 'ddtrace/ext/http'
|
|
3
2
|
require 'ddtrace/ext/errors'
|
|
4
3
|
require 'ddtrace/contrib/analytics'
|
|
@@ -52,6 +51,7 @@ module Datadog
|
|
|
52
51
|
|
|
53
52
|
def endpoint_run(name, start, finish, id, payload)
|
|
54
53
|
return unless Thread.current[KEY_RUN]
|
|
54
|
+
|
|
55
55
|
Thread.current[KEY_RUN] = false
|
|
56
56
|
|
|
57
57
|
return unless enabled?
|
|
@@ -62,17 +62,12 @@ module Datadog
|
|
|
62
62
|
begin
|
|
63
63
|
# collect endpoint details
|
|
64
64
|
api = payload[:endpoint].options[:for]
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
api.to_s
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
path = payload[:endpoint].options[:path].join('/')
|
|
75
|
-
resource = "#{api_view}##{path}"
|
|
65
|
+
|
|
66
|
+
api_view = api_view(api)
|
|
67
|
+
|
|
68
|
+
request_method = payload[:endpoint].options[:method].first
|
|
69
|
+
path = endpoint_expand_path(payload[:endpoint])
|
|
70
|
+
resource = "#{api_view} #{request_method} #{path}"
|
|
76
71
|
span.resource = resource
|
|
77
72
|
|
|
78
73
|
# set the request span resource if it's a `rack.request` span
|
|
@@ -82,19 +77,22 @@ module Datadog
|
|
|
82
77
|
end
|
|
83
78
|
|
|
84
79
|
# Set analytics sample rate
|
|
85
|
-
if analytics_enabled?
|
|
86
|
-
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
|
|
87
|
-
end
|
|
80
|
+
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
88
81
|
|
|
89
82
|
# Measure service stats
|
|
90
83
|
Contrib::Analytics.set_measured(span)
|
|
91
84
|
|
|
92
85
|
# catch thrown exceptions
|
|
93
|
-
|
|
86
|
+
|
|
87
|
+
span.set_error(payload[:exception_object]) if exception_is_error?(payload[:exception_object])
|
|
94
88
|
|
|
95
89
|
# override the current span with this notification values
|
|
96
90
|
span.set_tag(Ext::TAG_ROUTE_ENDPOINT, api_view) unless api_view.nil?
|
|
97
91
|
span.set_tag(Ext::TAG_ROUTE_PATH, path)
|
|
92
|
+
span.set_tag(Ext::TAG_ROUTE_METHOD, request_method)
|
|
93
|
+
|
|
94
|
+
span.set_tag(Datadog::Ext::HTTP::METHOD, request_method)
|
|
95
|
+
span.set_tag(Datadog::Ext::HTTP::URL, path)
|
|
98
96
|
ensure
|
|
99
97
|
span.start(start)
|
|
100
98
|
span.finish(finish)
|
|
@@ -121,6 +119,7 @@ module Datadog
|
|
|
121
119
|
|
|
122
120
|
def endpoint_render(name, start, finish, id, payload)
|
|
123
121
|
return unless Thread.current[KEY_RENDER]
|
|
122
|
+
|
|
124
123
|
Thread.current[KEY_RENDER] = false
|
|
125
124
|
|
|
126
125
|
return unless enabled?
|
|
@@ -133,7 +132,7 @@ module Datadog
|
|
|
133
132
|
# Measure service stats
|
|
134
133
|
Contrib::Analytics.set_measured(span)
|
|
135
134
|
|
|
136
|
-
span.set_error(payload[:exception_object])
|
|
135
|
+
span.set_error(payload[:exception_object]) if exception_is_error?(payload[:exception_object])
|
|
137
136
|
ensure
|
|
138
137
|
span.start(start)
|
|
139
138
|
span.finish(finish)
|
|
@@ -160,15 +159,14 @@ module Datadog
|
|
|
160
159
|
|
|
161
160
|
begin
|
|
162
161
|
# Set analytics sample rate
|
|
163
|
-
if analytics_enabled?
|
|
164
|
-
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
|
|
165
|
-
end
|
|
162
|
+
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
166
163
|
|
|
167
164
|
# Measure service stats
|
|
168
165
|
Contrib::Analytics.set_measured(span)
|
|
169
166
|
|
|
170
167
|
# catch thrown exceptions
|
|
171
|
-
span.set_error(payload[:exception_object])
|
|
168
|
+
span.set_error(payload[:exception_object]) if exception_is_error?(payload[:exception_object])
|
|
169
|
+
|
|
172
170
|
span.set_tag(Ext::TAG_FILTER_TYPE, type.to_s)
|
|
173
171
|
ensure
|
|
174
172
|
span.start(start)
|
|
@@ -180,6 +178,25 @@ module Datadog
|
|
|
180
178
|
|
|
181
179
|
private
|
|
182
180
|
|
|
181
|
+
def api_view(api)
|
|
182
|
+
# If the API inherits from Grape::API in version >= 1.2.0
|
|
183
|
+
# then the API will be an instance and the name must be derived from the base.
|
|
184
|
+
# See https://github.com/ruby-grape/grape/issues/1825
|
|
185
|
+
if defined?(::Grape::API::Instance) && api <= ::Grape::API::Instance
|
|
186
|
+
api.base.to_s
|
|
187
|
+
else
|
|
188
|
+
api.to_s
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def endpoint_expand_path(endpoint)
|
|
193
|
+
route_path = endpoint.options[:path]
|
|
194
|
+
namespace = endpoint.routes.first && endpoint.routes.first.namespace || ''
|
|
195
|
+
|
|
196
|
+
parts = (namespace.split('/') + route_path).reject { |p| p.blank? || p.eql?('/') }
|
|
197
|
+
parts.join('/').prepend('/')
|
|
198
|
+
end
|
|
199
|
+
|
|
183
200
|
def tracer
|
|
184
201
|
datadog_configuration[:tracer]
|
|
185
202
|
end
|
|
@@ -196,6 +213,15 @@ module Datadog
|
|
|
196
213
|
datadog_configuration[:analytics_sample_rate]
|
|
197
214
|
end
|
|
198
215
|
|
|
216
|
+
def exception_is_error?(exception)
|
|
217
|
+
matcher = datadog_configuration[:error_statuses]
|
|
218
|
+
return false unless exception
|
|
219
|
+
return true unless matcher
|
|
220
|
+
return true unless exception.respond_to?('status')
|
|
221
|
+
|
|
222
|
+
matcher.include?(exception.status)
|
|
223
|
+
end
|
|
224
|
+
|
|
199
225
|
def enabled?
|
|
200
226
|
datadog_configuration[:enabled] == true
|
|
201
227
|
end
|