ddtrace 0.38.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 +7 -0
- data/.circleci/config.yml +492 -0
- data/.circleci/images/primary/Dockerfile-2.0.0 +73 -0
- data/.circleci/images/primary/Dockerfile-2.1.10 +73 -0
- data/.circleci/images/primary/Dockerfile-2.2.10 +73 -0
- data/.circleci/images/primary/Dockerfile-2.3.8 +75 -0
- data/.circleci/images/primary/Dockerfile-2.4.6 +73 -0
- data/.circleci/images/primary/Dockerfile-2.5.6 +73 -0
- data/.circleci/images/primary/Dockerfile-2.6.4 +73 -0
- data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
- data/.dockerignore +1 -0
- data/.env +26 -0
- data/.github/CODEOWNERS +1 -0
- data/.gitignore +61 -0
- data/.gitlab-ci.yml +26 -0
- data/.rspec +1 -0
- data/.rubocop.yml +85 -0
- data/.yardopts +5 -0
- data/Appraisals +961 -0
- data/CHANGELOG.md +1402 -0
- data/CONTRIBUTING.md +85 -0
- data/Gemfile +7 -0
- data/LICENSE +6 -0
- data/LICENSE.Apache +200 -0
- data/LICENSE.BSD3 +24 -0
- data/NOTICE +4 -0
- data/README.md +23 -0
- data/Rakefile +753 -0
- data/benchmarks/postgres_database.yml +9 -0
- data/benchmarks/sidekiq_test.rb +154 -0
- data/ddtrace.gemspec +71 -0
- data/docker-compose.yml +370 -0
- data/docs/DevelopmentGuide.md +195 -0
- data/docs/GettingStarted.md +2224 -0
- data/lib/ddtrace.rb +76 -0
- data/lib/ddtrace/analytics.rb +36 -0
- data/lib/ddtrace/augmentation.rb +13 -0
- data/lib/ddtrace/augmentation/method_wrapper.rb +20 -0
- data/lib/ddtrace/augmentation/method_wrapping.rb +38 -0
- data/lib/ddtrace/augmentation/shim.rb +102 -0
- data/lib/ddtrace/buffer.rb +119 -0
- data/lib/ddtrace/chunker.rb +34 -0
- data/lib/ddtrace/configuration.rb +53 -0
- data/lib/ddtrace/configuration/base.rb +84 -0
- data/lib/ddtrace/configuration/components.rb +154 -0
- data/lib/ddtrace/configuration/dependency_resolver.rb +24 -0
- data/lib/ddtrace/configuration/option.rb +64 -0
- data/lib/ddtrace/configuration/option_definition.rb +123 -0
- data/lib/ddtrace/configuration/option_definition_set.rb +18 -0
- data/lib/ddtrace/configuration/option_set.rb +6 -0
- data/lib/ddtrace/configuration/options.rb +112 -0
- data/lib/ddtrace/configuration/pin_setup.rb +31 -0
- data/lib/ddtrace/configuration/settings.rb +273 -0
- data/lib/ddtrace/context.rb +305 -0
- data/lib/ddtrace/context_flush.rb +69 -0
- data/lib/ddtrace/context_provider.rb +50 -0
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/action_cable/event.rb +65 -0
- data/lib/ddtrace/contrib/action_cable/events.rb +33 -0
- data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +49 -0
- data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +55 -0
- data/lib/ddtrace/contrib/action_cable/events/transmit.rb +50 -0
- data/lib/ddtrace/contrib/action_cable/ext.rb +23 -0
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +38 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +148 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +25 -0
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/action_pack/ext.rb +16 -0
- data/lib/ddtrace/contrib/action_pack/integration.rb +38 -0
- data/lib/ddtrace/contrib/action_pack/patcher.rb +23 -0
- data/lib/ddtrace/contrib/action_pack/utils.rb +36 -0
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/action_view/event.rb +39 -0
- data/lib/ddtrace/contrib/action_view/events.rb +30 -0
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +45 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +48 -0
- data/lib/ddtrace/contrib/action_view/ext.rb +17 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +74 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +45 -0
- data/lib/ddtrace/contrib/action_view/patcher.rb +47 -0
- data/lib/ddtrace/contrib/action_view/utils.rb +32 -0
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +68 -0
- data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +17 -0
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +40 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +29 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +45 -0
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/active_record/event.rb +30 -0
- data/lib/ddtrace/contrib/active_record/events.rb +30 -0
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +60 -0
- data/lib/ddtrace/contrib/active_record/events/sql.rb +64 -0
- data/lib/ddtrace/contrib/active_record/ext.rb +21 -0
- data/lib/ddtrace/contrib/active_record/integration.rb +46 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +23 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +76 -0
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +157 -0
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +48 -0
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +47 -0
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/active_support/ext.rb +21 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +40 -0
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +64 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +66 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +159 -0
- data/lib/ddtrace/contrib/active_support/patcher.rb +23 -0
- data/lib/ddtrace/contrib/analytics.rb +24 -0
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/aws/ext.rb +20 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +56 -0
- data/lib/ddtrace/contrib/aws/integration.rb +42 -0
- data/lib/ddtrace/contrib/aws/parsed_context.rb +56 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +49 -0
- data/lib/ddtrace/contrib/aws/services.rb +115 -0
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +41 -0
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +11 -0
- data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +23 -0
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +38 -0
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +28 -0
- data/lib/ddtrace/contrib/configurable.rb +76 -0
- data/lib/ddtrace/contrib/configuration/resolver.rb +16 -0
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +53 -0
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/dalli/ext.rb +17 -0
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +50 -0
- data/lib/ddtrace/contrib/dalli/integration.rb +38 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +63 -0
- data/lib/ddtrace/contrib/dalli/quantize.rb +22 -0
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +18 -0
- data/lib/ddtrace/contrib/delayed_job/integration.rb +38 -0
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +28 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +61 -0
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +19 -0
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +39 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +117 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +80 -0
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +148 -0
- data/lib/ddtrace/contrib/ethon/ext.rb +15 -0
- data/lib/ddtrace/contrib/ethon/integration.rb +43 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +80 -0
- data/lib/ddtrace/contrib/ethon/patcher.rb +25 -0
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/excon/ext.rb +14 -0
- data/lib/ddtrace/contrib/excon/integration.rb +43 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +157 -0
- data/lib/ddtrace/contrib/excon/patcher.rb +27 -0
- data/lib/ddtrace/contrib/extensions.rb +93 -0
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +14 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +43 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +83 -0
- data/lib/ddtrace/contrib/faraday/patcher.rb +80 -0
- data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +208 -0
- data/lib/ddtrace/contrib/grape/ext.rb +19 -0
- data/lib/ddtrace/contrib/grape/instrumentation.rb +33 -0
- data/lib/ddtrace/contrib/grape/integration.rb +39 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +73 -0
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/graphql/ext.rb +13 -0
- data/lib/ddtrace/contrib/graphql/integration.rb +39 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +60 -0
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +74 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +54 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +76 -0
- data/lib/ddtrace/contrib/grpc/ext.rb +15 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +68 -0
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +39 -0
- data/lib/ddtrace/contrib/http/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/http/ext.rb +14 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +175 -0
- data/lib/ddtrace/contrib/http/integration.rb +45 -0
- data/lib/ddtrace/contrib/http/patcher.rb +26 -0
- data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +14 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
- data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
- data/lib/ddtrace/contrib/integration.rb +16 -0
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/event.rb +51 -0
- data/lib/ddtrace/contrib/kafka/events.rb +44 -0
- data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
- data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
- data/lib/ddtrace/contrib/kafka/ext.rb +38 -0
- data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
- data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/mongodb/ext.rb +20 -0
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +67 -0
- data/lib/ddtrace/contrib/mongodb/integration.rb +38 -0
- data/lib/ddtrace/contrib/mongodb/parsers.rb +68 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +31 -0
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +108 -0
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/mysql2/ext.rb +15 -0
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +60 -0
- data/lib/ddtrace/contrib/mysql2/integration.rb +38 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +27 -0
- data/lib/ddtrace/contrib/patchable.rb +59 -0
- data/lib/ddtrace/contrib/patcher.rb +62 -0
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/presto/ext.rb +25 -0
- data/lib/ddtrace/contrib/presto/instrumentation.rb +107 -0
- data/lib/ddtrace/contrib/presto/integration.rb +38 -0
- data/lib/ddtrace/contrib/presto/patcher.rb +30 -0
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/racecar/event.rb +71 -0
- data/lib/ddtrace/contrib/racecar/events.rb +30 -0
- data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
- data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
- data/lib/ddtrace/contrib/racecar/ext.rb +21 -0
- data/lib/ddtrace/contrib/racecar/integration.rb +39 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +26 -0
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +41 -0
- data/lib/ddtrace/contrib/rack/ext.rb +18 -0
- data/lib/ddtrace/contrib/rack/integration.rb +38 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +290 -0
- data/lib/ddtrace/contrib/rack/patcher.rb +107 -0
- data/lib/ddtrace/contrib/rack/request_queue.rb +39 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +83 -0
- data/lib/ddtrace/contrib/rails/ext.rb +13 -0
- data/lib/ddtrace/contrib/rails/framework.rb +124 -0
- data/lib/ddtrace/contrib/rails/integration.rb +44 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +38 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +74 -0
- data/lib/ddtrace/contrib/rails/railtie.rb +17 -0
- data/lib/ddtrace/contrib/rails/utils.rb +20 -0
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/rake/ext.rb +18 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +88 -0
- data/lib/ddtrace/contrib/rake/integration.rb +38 -0
- data/lib/ddtrace/contrib/rake/patcher.rb +30 -0
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/redis/ext.rb +18 -0
- data/lib/ddtrace/contrib/redis/integration.rb +42 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +97 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +47 -0
- data/lib/ddtrace/contrib/redis/tags.rb +38 -0
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
- data/lib/ddtrace/contrib/registerable.rb +33 -0
- data/lib/ddtrace/contrib/registry.rb +42 -0
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/resque/ext.rb +14 -0
- data/lib/ddtrace/contrib/resque/integration.rb +47 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +29 -0
- data/lib/ddtrace/contrib/resque/resque_job.rb +80 -0
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/rest_client/ext.rb +14 -0
- data/lib/ddtrace/contrib/rest_client/integration.rb +38 -0
- data/lib/ddtrace/contrib/rest_client/patcher.rb +23 -0
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +89 -0
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +23 -0
- data/lib/ddtrace/contrib/sequel/database.rb +61 -0
- data/lib/ddtrace/contrib/sequel/dataset.rb +62 -0
- data/lib/ddtrace/contrib/sequel/ext.rb +15 -0
- data/lib/ddtrace/contrib/sequel/integration.rb +38 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +33 -0
- data/lib/ddtrace/contrib/sequel/utils.rb +46 -0
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +24 -0
- data/lib/ddtrace/contrib/shoryuken/ext.rb +18 -0
- data/lib/ddtrace/contrib/shoryuken/integration.rb +39 -0
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +24 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +49 -0
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +31 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +24 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +38 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +41 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +67 -0
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +45 -0
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +34 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +58 -0
- data/lib/ddtrace/contrib/sinatra/ext.rb +24 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
- data/lib/ddtrace/contrib/sinatra/integration.rb +38 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +28 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +150 -0
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +78 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +26 -0
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +18 -0
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +84 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +38 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +42 -0
- data/lib/ddtrace/correlation.rb +38 -0
- data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
- data/lib/ddtrace/diagnostics/health.rb +33 -0
- data/lib/ddtrace/distributed_tracing/headers/b3.rb +44 -0
- data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +56 -0
- data/lib/ddtrace/distributed_tracing/headers/datadog.rb +42 -0
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +70 -0
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +45 -0
- data/lib/ddtrace/encoding.rb +69 -0
- data/lib/ddtrace/environment.rb +31 -0
- data/lib/ddtrace/error.rb +27 -0
- data/lib/ddtrace/event.rb +52 -0
- data/lib/ddtrace/ext/analytics.rb +12 -0
- data/lib/ddtrace/ext/app_types.rb +11 -0
- data/lib/ddtrace/ext/correlation.rb +11 -0
- data/lib/ddtrace/ext/diagnostics.rb +35 -0
- data/lib/ddtrace/ext/distributed.rb +33 -0
- data/lib/ddtrace/ext/environment.rb +16 -0
- data/lib/ddtrace/ext/errors.rb +10 -0
- data/lib/ddtrace/ext/forced_tracing.rb +25 -0
- data/lib/ddtrace/ext/http.rb +46 -0
- data/lib/ddtrace/ext/manual_tracing.rb +9 -0
- data/lib/ddtrace/ext/metrics.rb +15 -0
- data/lib/ddtrace/ext/net.rb +10 -0
- data/lib/ddtrace/ext/priority.rb +16 -0
- data/lib/ddtrace/ext/runtime.rb +26 -0
- data/lib/ddtrace/ext/sampling.rb +16 -0
- data/lib/ddtrace/ext/sql.rb +8 -0
- data/lib/ddtrace/ext/transport.rb +17 -0
- data/lib/ddtrace/forced_tracing.rb +36 -0
- data/lib/ddtrace/logger.rb +40 -0
- data/lib/ddtrace/metrics.rb +222 -0
- data/lib/ddtrace/monkey.rb +58 -0
- data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
- data/lib/ddtrace/opentelemetry/span.rb +33 -0
- data/lib/ddtrace/opentracer.rb +40 -0
- data/lib/ddtrace/opentracer/binary_propagator.rb +24 -0
- data/lib/ddtrace/opentracer/carrier.rb +6 -0
- data/lib/ddtrace/opentracer/distributed_headers.rb +52 -0
- data/lib/ddtrace/opentracer/global_tracer.rb +15 -0
- data/lib/ddtrace/opentracer/propagator.rb +22 -0
- data/lib/ddtrace/opentracer/rack_propagator.rb +60 -0
- data/lib/ddtrace/opentracer/scope.rb +15 -0
- data/lib/ddtrace/opentracer/scope_manager.rb +6 -0
- data/lib/ddtrace/opentracer/span.rb +98 -0
- data/lib/ddtrace/opentracer/span_context.rb +14 -0
- data/lib/ddtrace/opentracer/span_context_factory.rb +23 -0
- data/lib/ddtrace/opentracer/text_map_propagator.rb +75 -0
- data/lib/ddtrace/opentracer/thread_local_scope.rb +30 -0
- data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +40 -0
- data/lib/ddtrace/opentracer/tracer.rb +208 -0
- data/lib/ddtrace/patcher.rb +47 -0
- data/lib/ddtrace/pin.rb +138 -0
- data/lib/ddtrace/pipeline.rb +46 -0
- data/lib/ddtrace/pipeline/span_filter.rb +38 -0
- data/lib/ddtrace/pipeline/span_processor.rb +20 -0
- data/lib/ddtrace/propagation/grpc_propagator.rb +61 -0
- data/lib/ddtrace/propagation/http_propagator.rb +75 -0
- data/lib/ddtrace/quantization/hash.rb +103 -0
- data/lib/ddtrace/quantization/http.rb +86 -0
- data/lib/ddtrace/runtime/cgroup.rb +44 -0
- data/lib/ddtrace/runtime/class_count.rb +17 -0
- data/lib/ddtrace/runtime/container.rb +73 -0
- data/lib/ddtrace/runtime/gc.rb +16 -0
- data/lib/ddtrace/runtime/identity.rb +41 -0
- data/lib/ddtrace/runtime/metrics.rb +96 -0
- data/lib/ddtrace/runtime/object_space.rb +19 -0
- data/lib/ddtrace/runtime/socket.rb +14 -0
- data/lib/ddtrace/runtime/thread_count.rb +16 -0
- data/lib/ddtrace/sampler.rb +292 -0
- data/lib/ddtrace/sampling.rb +2 -0
- data/lib/ddtrace/sampling/matcher.rb +57 -0
- data/lib/ddtrace/sampling/rate_limiter.rb +127 -0
- data/lib/ddtrace/sampling/rule.rb +61 -0
- data/lib/ddtrace/sampling/rule_sampler.rb +125 -0
- data/lib/ddtrace/span.rb +307 -0
- data/lib/ddtrace/sync_writer.rb +67 -0
- data/lib/ddtrace/tracer.rb +439 -0
- data/lib/ddtrace/transport/http.rb +91 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +120 -0
- data/lib/ddtrace/transport/http/adapters/registry.rb +24 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +81 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +68 -0
- data/lib/ddtrace/transport/http/api.rb +46 -0
- data/lib/ddtrace/transport/http/api/endpoint.rb +27 -0
- data/lib/ddtrace/transport/http/api/fallbacks.rb +22 -0
- data/lib/ddtrace/transport/http/api/instance.rb +33 -0
- data/lib/ddtrace/transport/http/api/map.rb +14 -0
- data/lib/ddtrace/transport/http/api/spec.rb +15 -0
- data/lib/ddtrace/transport/http/builder.rb +163 -0
- data/lib/ddtrace/transport/http/client.rb +50 -0
- data/lib/ddtrace/transport/http/env.rb +48 -0
- data/lib/ddtrace/transport/http/response.rb +26 -0
- data/lib/ddtrace/transport/http/statistics.rb +30 -0
- data/lib/ddtrace/transport/http/traces.rb +143 -0
- data/lib/ddtrace/transport/io.rb +26 -0
- data/lib/ddtrace/transport/io/client.rb +76 -0
- data/lib/ddtrace/transport/io/response.rb +25 -0
- data/lib/ddtrace/transport/io/traces.rb +91 -0
- data/lib/ddtrace/transport/parcel.rb +13 -0
- data/lib/ddtrace/transport/request.rb +13 -0
- data/lib/ddtrace/transport/response.rb +60 -0
- data/lib/ddtrace/transport/statistics.rb +72 -0
- data/lib/ddtrace/transport/traces.rb +183 -0
- data/lib/ddtrace/utils.rb +65 -0
- data/lib/ddtrace/utils/database.rb +25 -0
- data/lib/ddtrace/utils/time.rb +14 -0
- data/lib/ddtrace/vendor/active_record/connection_specification.rb +301 -0
- data/lib/ddtrace/version.rb +12 -0
- data/lib/ddtrace/worker.rb +20 -0
- data/lib/ddtrace/workers.rb +117 -0
- data/lib/ddtrace/workers/async.rb +165 -0
- data/lib/ddtrace/workers/loop.rb +105 -0
- data/lib/ddtrace/workers/polling.rb +48 -0
- data/lib/ddtrace/workers/queue.rb +39 -0
- data/lib/ddtrace/workers/runtime_metrics.rb +47 -0
- data/lib/ddtrace/workers/trace_writer.rb +202 -0
- data/lib/ddtrace/writer.rb +175 -0
- data/tasks/release_gem.rake +28 -0
- metadata +815 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
2
|
+
require 'ddtrace/contrib/rack/ext'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module Rack
|
|
7
|
+
module Configuration
|
|
8
|
+
# Custom settings for the Rack integration
|
|
9
|
+
class Settings < Contrib::Configuration::Settings
|
|
10
|
+
DEFAULT_HEADERS = {
|
|
11
|
+
response: [
|
|
12
|
+
'Content-Type',
|
|
13
|
+
'X-Request-ID'
|
|
14
|
+
]
|
|
15
|
+
}.freeze
|
|
16
|
+
|
|
17
|
+
option :analytics_enabled do |o|
|
|
18
|
+
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
|
|
19
|
+
o.lazy
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
option :analytics_sample_rate do |o|
|
|
23
|
+
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
24
|
+
o.lazy
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
option :application
|
|
28
|
+
option :distributed_tracing, default: true
|
|
29
|
+
option :headers, default: DEFAULT_HEADERS
|
|
30
|
+
option :middleware_names, default: false
|
|
31
|
+
option :quantize, default: {}
|
|
32
|
+
option :request_queuing, default: false
|
|
33
|
+
|
|
34
|
+
option :service_name, default: Ext::SERVICE_NAME
|
|
35
|
+
|
|
36
|
+
option :web_service_name, default: Ext::WEBSERVER_SERVICE_NAME
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Contrib
|
|
3
|
+
module Rack
|
|
4
|
+
# Rack integration constants
|
|
5
|
+
module Ext
|
|
6
|
+
APP = 'rack'.freeze
|
|
7
|
+
ENV_ANALYTICS_ENABLED = 'DD_RACK_ANALYTICS_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_RACK_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
|
+
RACK_ENV_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
|
|
10
|
+
SERVICE_NAME = 'rack'.freeze
|
|
11
|
+
SPAN_HTTP_SERVER_QUEUE = 'http_server.queue'.freeze
|
|
12
|
+
SPAN_REQUEST = 'rack.request'.freeze
|
|
13
|
+
WEBSERVER_APP = 'webserver'.freeze
|
|
14
|
+
WEBSERVER_SERVICE_NAME = 'web-server'.freeze
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'ddtrace/contrib/integration'
|
|
2
|
+
require 'ddtrace/contrib/rack/configuration/settings'
|
|
3
|
+
require 'ddtrace/contrib/rack/patcher'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Rack
|
|
8
|
+
# Description of Rack integration
|
|
9
|
+
class Integration
|
|
10
|
+
include Contrib::Integration
|
|
11
|
+
|
|
12
|
+
MINIMUM_VERSION = Gem::Version.new('1.1.0')
|
|
13
|
+
|
|
14
|
+
register_as :rack, auto_patch: false
|
|
15
|
+
|
|
16
|
+
def self.version
|
|
17
|
+
Gem.loaded_specs['rack'] && Gem.loaded_specs['rack'].version
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.loaded?
|
|
21
|
+
!defined?(::Rack).nil?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.compatible?
|
|
25
|
+
super && version >= MINIMUM_VERSION
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def default_configuration
|
|
29
|
+
Configuration::Settings.new
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def patcher
|
|
33
|
+
Patcher
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
require 'ddtrace/ext/app_types'
|
|
2
|
+
require 'ddtrace/ext/http'
|
|
3
|
+
require 'ddtrace/propagation/http_propagator'
|
|
4
|
+
require 'ddtrace/contrib/analytics'
|
|
5
|
+
require 'ddtrace/contrib/rack/ext'
|
|
6
|
+
require 'ddtrace/contrib/rack/request_queue'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module Contrib
|
|
10
|
+
# Rack module includes middlewares that are required to trace any framework
|
|
11
|
+
# and application built on top of Rack.
|
|
12
|
+
module Rack
|
|
13
|
+
# TraceMiddleware ensures that the Rack Request is properly traced
|
|
14
|
+
# from the beginning to the end. The middleware adds the request span
|
|
15
|
+
# in the Rack environment so that it can be retrieved by the underlying
|
|
16
|
+
# application. If request tags are not set by the app, they will be set using
|
|
17
|
+
# information available at the Rack level.
|
|
18
|
+
# rubocop:disable Metrics/ClassLength
|
|
19
|
+
class TraceMiddleware
|
|
20
|
+
# DEPRECATED: Remove in 1.0 in favor of Datadog::Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN
|
|
21
|
+
# This constant will remain here until then, for backwards compatibility.
|
|
22
|
+
RACK_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
|
|
23
|
+
|
|
24
|
+
def initialize(app)
|
|
25
|
+
@app = app
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def compute_queue_time(env, tracer)
|
|
29
|
+
return unless configuration[:request_queuing]
|
|
30
|
+
|
|
31
|
+
# parse the request queue time
|
|
32
|
+
request_start = Datadog::Contrib::Rack::QueueTime.get_request_start(env)
|
|
33
|
+
return if request_start.nil?
|
|
34
|
+
|
|
35
|
+
tracer.trace(
|
|
36
|
+
Ext::SPAN_HTTP_SERVER_QUEUE,
|
|
37
|
+
span_type: Datadog::Ext::HTTP::TYPE_PROXY,
|
|
38
|
+
start_time: request_start,
|
|
39
|
+
service: configuration[:web_service_name]
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def call(env)
|
|
44
|
+
# retrieve integration settings
|
|
45
|
+
tracer = configuration[:tracer]
|
|
46
|
+
|
|
47
|
+
# Extract distributed tracing context before creating any spans,
|
|
48
|
+
# so that all spans will be added to the distributed trace.
|
|
49
|
+
if configuration[:distributed_tracing]
|
|
50
|
+
context = HTTPPropagator.extract(env)
|
|
51
|
+
tracer.provider.context = context if context.trace_id
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# [experimental] create a root Span to keep track of frontend web servers
|
|
55
|
+
# (i.e. Apache, nginx) if the header is properly set
|
|
56
|
+
frontend_span = compute_queue_time(env, tracer)
|
|
57
|
+
|
|
58
|
+
trace_options = {
|
|
59
|
+
service: configuration[:service_name],
|
|
60
|
+
resource: nil,
|
|
61
|
+
span_type: Datadog::Ext::HTTP::TYPE_INBOUND
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# start a new request span and attach it to the current Rack environment;
|
|
65
|
+
# we must ensure that the span `resource` is set later
|
|
66
|
+
request_span = tracer.trace(Ext::SPAN_REQUEST, trace_options)
|
|
67
|
+
env[RACK_REQUEST_SPAN] = request_span
|
|
68
|
+
|
|
69
|
+
# TODO: Add deprecation warnings back in
|
|
70
|
+
# DEV: Some third party Gems will loop over the rack env causing our deprecation
|
|
71
|
+
# warnings to be shown even when the user is not accessing them directly
|
|
72
|
+
#
|
|
73
|
+
# add_deprecation_warnings(env)
|
|
74
|
+
# env.without_datadog_warnings do
|
|
75
|
+
# # TODO: For backwards compatibility; this attribute is deprecated.
|
|
76
|
+
# env[:datadog_rack_request_span] = env[RACK_REQUEST_SPAN]
|
|
77
|
+
# end
|
|
78
|
+
env[:datadog_rack_request_span] = env[RACK_REQUEST_SPAN]
|
|
79
|
+
|
|
80
|
+
# Copy the original env, before the rest of the stack executes.
|
|
81
|
+
# Values may change; we want values before that happens.
|
|
82
|
+
original_env = env.dup
|
|
83
|
+
|
|
84
|
+
# call the rest of the stack
|
|
85
|
+
status, headers, response = @app.call(env)
|
|
86
|
+
[status, headers, response]
|
|
87
|
+
|
|
88
|
+
# rubocop:disable Lint/RescueException
|
|
89
|
+
# Here we really want to catch *any* exception, not only StandardError,
|
|
90
|
+
# as we really have no clue of what is in the block,
|
|
91
|
+
# and it is user code which should be executed no matter what.
|
|
92
|
+
# It's not a problem since we re-raise it afterwards so for example a
|
|
93
|
+
# SignalException::Interrupt would still bubble up.
|
|
94
|
+
rescue Exception => e
|
|
95
|
+
# catch exceptions that may be raised in the middleware chain
|
|
96
|
+
# Note: if a middleware catches an Exception without re raising,
|
|
97
|
+
# the Exception cannot be recorded here.
|
|
98
|
+
request_span.set_error(e) unless request_span.nil?
|
|
99
|
+
raise e
|
|
100
|
+
ensure
|
|
101
|
+
if request_span
|
|
102
|
+
# Rack is a really low level interface and it doesn't provide any
|
|
103
|
+
# advanced functionality like routers. Because of that, we assume that
|
|
104
|
+
# the underlying framework or application has more knowledge about
|
|
105
|
+
# the result for this request; `resource` and `tags` are expected to
|
|
106
|
+
# be set in another level but if they're missing, reasonable defaults
|
|
107
|
+
# are used.
|
|
108
|
+
set_request_tags!(request_span, env, status, headers, response, original_env || env)
|
|
109
|
+
|
|
110
|
+
# ensure the request_span is finished and the context reset;
|
|
111
|
+
# this assumes that the Rack middleware creates a root span
|
|
112
|
+
request_span.finish
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
frontend_span.finish unless frontend_span.nil?
|
|
116
|
+
|
|
117
|
+
# TODO: Remove this once we change how context propagation works. This
|
|
118
|
+
# ensures we clean thread-local variables on each HTTP request avoiding
|
|
119
|
+
# memory leaks.
|
|
120
|
+
tracer.provider.context = Datadog::Context.new if tracer
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def resource_name_for(env, status)
|
|
124
|
+
if configuration[:middleware_names] && env['RESPONSE_MIDDLEWARE']
|
|
125
|
+
"#{env['RESPONSE_MIDDLEWARE']}##{env['REQUEST_METHOD']}"
|
|
126
|
+
else
|
|
127
|
+
"#{env['REQUEST_METHOD']} #{status}".strip
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# rubocop:disable Metrics/AbcSize
|
|
132
|
+
# rubocop:disable Metrics/MethodLength
|
|
133
|
+
def set_request_tags!(request_span, env, status, headers, response, original_env)
|
|
134
|
+
# http://www.rubydoc.info/github/rack/rack/file/SPEC
|
|
135
|
+
# The source of truth in Rack is the PATH_INFO key that holds the
|
|
136
|
+
# URL for the current request; but some frameworks may override that
|
|
137
|
+
# value, especially during exception handling.
|
|
138
|
+
#
|
|
139
|
+
# Because of this, we prefer to use REQUEST_URI, if available, which is the
|
|
140
|
+
# relative path + query string, and doesn't mutate.
|
|
141
|
+
#
|
|
142
|
+
# REQUEST_URI is only available depending on what web server is running though.
|
|
143
|
+
# So when its not available, we want the original, unmutated PATH_INFO, which
|
|
144
|
+
# is just the relative path without query strings.
|
|
145
|
+
url = env['REQUEST_URI'] || original_env['PATH_INFO']
|
|
146
|
+
request_headers = parse_request_headers(env)
|
|
147
|
+
response_headers = parse_response_headers(headers || {})
|
|
148
|
+
|
|
149
|
+
request_span.resource ||= resource_name_for(env, status)
|
|
150
|
+
|
|
151
|
+
# Associate with runtime metrics
|
|
152
|
+
Datadog.runtime_metrics.associate_with_span(request_span)
|
|
153
|
+
|
|
154
|
+
# Set analytics sample rate
|
|
155
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
156
|
+
Contrib::Analytics.set_sample_rate(request_span, configuration[:analytics_sample_rate])
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Measure service stats
|
|
160
|
+
Contrib::Analytics.set_measured(request_span)
|
|
161
|
+
|
|
162
|
+
if request_span.get_tag(Datadog::Ext::HTTP::METHOD).nil?
|
|
163
|
+
request_span.set_tag(Datadog::Ext::HTTP::METHOD, env['REQUEST_METHOD'])
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
if request_span.get_tag(Datadog::Ext::HTTP::URL).nil?
|
|
167
|
+
options = configuration[:quantize]
|
|
168
|
+
request_span.set_tag(Datadog::Ext::HTTP::URL, Datadog::Quantization::HTTP.url(url, options))
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
if request_span.get_tag(Datadog::Ext::HTTP::BASE_URL).nil?
|
|
172
|
+
request_obj = ::Rack::Request.new(env)
|
|
173
|
+
|
|
174
|
+
base_url = if request_obj.respond_to?(:base_url)
|
|
175
|
+
request_obj.base_url
|
|
176
|
+
else
|
|
177
|
+
# Compatibility for older Rack versions
|
|
178
|
+
request_obj.url.chomp(request_obj.fullpath)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
request_span.set_tag(Datadog::Ext::HTTP::BASE_URL, base_url)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
if request_span.get_tag(Datadog::Ext::HTTP::STATUS_CODE).nil? && status
|
|
185
|
+
request_span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, status)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Request headers
|
|
189
|
+
request_headers.each do |name, value|
|
|
190
|
+
request_span.set_tag(name, value) if request_span.get_tag(name).nil?
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Response headers
|
|
194
|
+
response_headers.each do |name, value|
|
|
195
|
+
request_span.set_tag(name, value) if request_span.get_tag(name).nil?
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# detect if the status code is a 5xx and flag the request span as an error
|
|
199
|
+
# unless it has been already set by the underlying framework
|
|
200
|
+
if status.to_s.start_with?('5') && request_span.status.zero?
|
|
201
|
+
request_span.status = 1
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
private
|
|
206
|
+
|
|
207
|
+
REQUEST_SPAN_DEPRECATION_WARNING = %(
|
|
208
|
+
:datadog_rack_request_span is considered an internal symbol in the Rack env,
|
|
209
|
+
and has been been DEPRECATED. Public support for its usage is discontinued.
|
|
210
|
+
If you need the Rack request span, try using `Datadog.tracer.active_span`.
|
|
211
|
+
This key will be removed in version 1.0).freeze
|
|
212
|
+
|
|
213
|
+
def configuration
|
|
214
|
+
Datadog.configuration[:rack]
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def add_deprecation_warnings(env)
|
|
218
|
+
env.instance_eval do
|
|
219
|
+
unless instance_variable_defined?(:@patched_with_datadog_warnings)
|
|
220
|
+
@patched_with_datadog_warnings = true
|
|
221
|
+
@datadog_deprecation_warnings = true
|
|
222
|
+
@datadog_span_warning = true
|
|
223
|
+
|
|
224
|
+
def [](key)
|
|
225
|
+
if key == :datadog_rack_request_span \
|
|
226
|
+
&& @datadog_span_warning \
|
|
227
|
+
&& @datadog_deprecation_warnings
|
|
228
|
+
Datadog.logger.warn(REQUEST_SPAN_DEPRECATION_WARNING)
|
|
229
|
+
@datadog_span_warning = true
|
|
230
|
+
end
|
|
231
|
+
super
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def []=(key, value)
|
|
235
|
+
if key == :datadog_rack_request_span \
|
|
236
|
+
&& @datadog_span_warning \
|
|
237
|
+
&& @datadog_deprecation_warnings
|
|
238
|
+
Datadog.logger.warn(REQUEST_SPAN_DEPRECATION_WARNING)
|
|
239
|
+
@datadog_span_warning = true
|
|
240
|
+
end
|
|
241
|
+
super
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def without_datadog_warnings
|
|
245
|
+
@datadog_deprecation_warnings = false
|
|
246
|
+
yield
|
|
247
|
+
ensure
|
|
248
|
+
@datadog_deprecation_warnings = true
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def parse_request_headers(env)
|
|
255
|
+
{}.tap do |result|
|
|
256
|
+
whitelist = configuration[:headers][:request] || []
|
|
257
|
+
whitelist.each do |header|
|
|
258
|
+
rack_header = header_to_rack_header(header)
|
|
259
|
+
if env.key?(rack_header)
|
|
260
|
+
result[Datadog::Ext::HTTP::RequestHeaders.to_tag(header)] = env[rack_header]
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
def parse_response_headers(headers)
|
|
267
|
+
{}.tap do |result|
|
|
268
|
+
whitelist = configuration[:headers][:response] || []
|
|
269
|
+
whitelist.each do |header|
|
|
270
|
+
if headers.key?(header)
|
|
271
|
+
result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[header]
|
|
272
|
+
else
|
|
273
|
+
# Try a case-insensitive lookup
|
|
274
|
+
uppercased_header = header.to_s.upcase
|
|
275
|
+
matching_header = headers.keys.find { |h| h.upcase == uppercased_header }
|
|
276
|
+
if matching_header
|
|
277
|
+
result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[matching_header]
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def header_to_rack_header(name)
|
|
285
|
+
"HTTP_#{name.to_s.upcase.gsub(/[-\s]/, '_')}"
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Contrib
|
|
3
|
+
module Rack
|
|
4
|
+
# Provides instrumentation for `rack`
|
|
5
|
+
module MiddlewarePatcher
|
|
6
|
+
include Contrib::Patcher
|
|
7
|
+
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
def target_version
|
|
11
|
+
Integration.version
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def patch
|
|
15
|
+
# Patch middleware
|
|
16
|
+
require_relative 'middlewares'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Provides instrumentation for Rack middleware names
|
|
21
|
+
module MiddlewareNamePatcher
|
|
22
|
+
include Contrib::Patcher
|
|
23
|
+
|
|
24
|
+
module_function
|
|
25
|
+
|
|
26
|
+
def target_version
|
|
27
|
+
Integration.version
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def patch
|
|
31
|
+
patch_middleware_names
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def patch_middleware_names
|
|
35
|
+
retain_middleware_name(get_option(:application))
|
|
36
|
+
rescue => e
|
|
37
|
+
# We can safely ignore these exceptions since they happen only in the
|
|
38
|
+
# context of middleware patching outside a Rails server process (eg. a
|
|
39
|
+
# process that doesn't serve HTTP requests but has Rails environment
|
|
40
|
+
# loaded such as a Resque master process)
|
|
41
|
+
Datadog.logger.debug("Error patching middleware stack: #{e}")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def retain_middleware_name(middleware)
|
|
45
|
+
return unless middleware && middleware.respond_to?(:call)
|
|
46
|
+
|
|
47
|
+
middleware.singleton_class.class_eval do
|
|
48
|
+
alias_method :__call, :call
|
|
49
|
+
|
|
50
|
+
def call(env)
|
|
51
|
+
env['RESPONSE_MIDDLEWARE'] = self.class.to_s
|
|
52
|
+
__call(env)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
following = if middleware.instance_variable_defined?('@app')
|
|
57
|
+
middleware.instance_variable_get('@app')
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
retain_middleware_name(following)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def get_option(option)
|
|
64
|
+
Datadog.configuration[:rack].get_option(option)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Applies multiple patches
|
|
69
|
+
module Patcher
|
|
70
|
+
PATCHERS = [
|
|
71
|
+
MiddlewarePatcher,
|
|
72
|
+
MiddlewareNamePatcher
|
|
73
|
+
].freeze
|
|
74
|
+
|
|
75
|
+
module_function
|
|
76
|
+
|
|
77
|
+
def patched?
|
|
78
|
+
PATCHERS.all?(&:patched?)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def target_version
|
|
82
|
+
Integration.version
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def patch
|
|
86
|
+
MiddlewarePatcher.patch unless MiddlewarePatcher.patched?
|
|
87
|
+
|
|
88
|
+
# Patch middleware names
|
|
89
|
+
if !MiddlewareNamePatcher.patched? && get_option(:middleware_names)
|
|
90
|
+
if get_option(:application)
|
|
91
|
+
MiddlewareNamePatcher.patch
|
|
92
|
+
else
|
|
93
|
+
Datadog.logger.warn(%(
|
|
94
|
+
Rack :middleware_names requires you to also pass :application.
|
|
95
|
+
Middleware names have NOT been patched; please provide :application.
|
|
96
|
+
e.g. use: :rack, middleware_names: true, application: my_rack_app).freeze)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def get_option(option)
|
|
102
|
+
Datadog.configuration[:rack].get_option(option)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|