ls-trace 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +673 -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/.dockerignore +1 -0
- data/.env +24 -0
- data/.github/CODEOWNERS +1 -0
- data/.gitignore +59 -0
- data/.rspec +1 -0
- data/.rubocop.yml +77 -0
- data/.yardopts +5 -0
- data/Appraisals +820 -0
- data/CHANGELOG.md +1051 -0
- data/CONTRIBUTING.md +85 -0
- data/Gemfile +7 -0
- data/LICENSE +24 -0
- data/README.md +108 -0
- data/Rakefile +635 -0
- data/benchmarks/postgres_database.yml +9 -0
- data/benchmarks/sidekiq_test.rb +154 -0
- data/ddtrace.gemspec +63 -0
- data/docker-compose.yml +276 -0
- data/docs/DevelopmentGuide.md +195 -0
- data/docs/GettingStarted.md +1981 -0
- data/lib/ddtrace.rb +63 -0
- data/lib/ddtrace/analytics.rb +29 -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/configuration.rb +30 -0
- data/lib/ddtrace/configuration/base.rb +82 -0
- data/lib/ddtrace/configuration/dependency_resolver.rb +24 -0
- data/lib/ddtrace/configuration/option.rb +55 -0
- data/lib/ddtrace/configuration/option_definition.rb +127 -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 +107 -0
- data/lib/ddtrace/configuration/pin_setup.rb +30 -0
- data/lib/ddtrace/configuration/settings.rb +105 -0
- data/lib/ddtrace/context.rb +284 -0
- data/lib/ddtrace/context_flush.rb +132 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +144 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +37 -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 +36 -0
- data/lib/ddtrace/contrib/action_pack/patcher.rb +29 -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/ext.rb +17 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +78 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +43 -0
- data/lib/ddtrace/contrib/action_view/patcher.rb +53 -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 +65 -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 +39 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +36 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +46 -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 +57 -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 +44 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +29 -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 +62 -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 +38 -0
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +62 -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 +29 -0
- data/lib/ddtrace/contrib/analytics.rb +20 -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 +36 -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 +35 -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 +32 -0
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +35 -0
- data/lib/ddtrace/contrib/configurable.rb +59 -0
- data/lib/ddtrace/contrib/configuration/resolver.rb +12 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +35 -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 +36 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +73 -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 +32 -0
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +34 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +57 -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 +37 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +124 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +80 -0
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +139 -0
- data/lib/ddtrace/contrib/ethon/ext.rb +15 -0
- data/lib/ddtrace/contrib/ethon/integration.rb +31 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +80 -0
- data/lib/ddtrace/contrib/ethon/patcher.rb +27 -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 +32 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +154 -0
- data/lib/ddtrace/contrib/excon/patcher.rb +34 -0
- data/lib/ddtrace/contrib/extensions.rb +59 -0
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +14 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +36 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +93 -0
- data/lib/ddtrace/contrib/faraday/patcher.rb +82 -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 +199 -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 +36 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +79 -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 +38 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +63 -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 +56 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +73 -0
- data/lib/ddtrace/contrib/grpc/ext.rb +15 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +36 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +78 -0
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +63 -0
- data/lib/ddtrace/contrib/http/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/http/ext.rb +14 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +114 -0
- data/lib/ddtrace/contrib/http/integration.rb +32 -0
- data/lib/ddtrace/contrib/http/patcher.rb +32 -0
- data/lib/ddtrace/contrib/integration.rb +16 -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 +68 -0
- data/lib/ddtrace/contrib/mongodb/integration.rb +36 -0
- data/lib/ddtrace/contrib/mongodb/parsers.rb +68 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +37 -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 +32 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +33 -0
- data/lib/ddtrace/contrib/patchable.rb +42 -0
- data/lib/ddtrace/contrib/patcher.rb +28 -0
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/racecar/event.rb +67 -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 +36 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +32 -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 +32 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +283 -0
- data/lib/ddtrace/contrib/rack/patcher.rb +72 -0
- data/lib/ddtrace/contrib/rack/request_queue.rb +39 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +80 -0
- data/lib/ddtrace/contrib/rails/ext.rb +12 -0
- data/lib/ddtrace/contrib/rails/framework.rb +100 -0
- data/lib/ddtrace/contrib/rails/integration.rb +37 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +38 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +78 -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 +84 -0
- data/lib/ddtrace/contrib/rake/integration.rb +32 -0
- data/lib/ddtrace/contrib/rake/patcher.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 +36 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +94 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +47 -0
- data/lib/ddtrace/contrib/redis/tags.rb +38 -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 +37 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +35 -0
- data/lib/ddtrace/contrib/resque/resque_job.rb +76 -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 +31 -0
- data/lib/ddtrace/contrib/rest_client/patcher.rb +25 -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 +32 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +39 -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 +35 -0
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +30 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +45 -0
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +21 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +36 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +40 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +58 -0
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +28 -0
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +34 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +38 -0
- data/lib/ddtrace/contrib/sinatra/ext.rb +18 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
- data/lib/ddtrace/contrib/sinatra/integration.rb +36 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +33 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +84 -0
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +72 -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 +70 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +36 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +48 -0
- data/lib/ddtrace/correlation.rb +28 -0
- data/lib/ddtrace/diagnostics/health.rb +30 -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 +65 -0
- data/lib/ddtrace/environment.rb +23 -0
- data/lib/ddtrace/error.rb +27 -0
- data/lib/ddtrace/ext/analytics.rb +11 -0
- data/lib/ddtrace/ext/app_types.rb +11 -0
- data/lib/ddtrace/ext/diagnostics.rb +25 -0
- data/lib/ddtrace/ext/distributed.rb +33 -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/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 +39 -0
- data/lib/ddtrace/metrics.rb +215 -0
- data/lib/ddtrace/monkey.rb +58 -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 +114 -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/provider.rb +21 -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 +93 -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 +195 -0
- data/lib/ddtrace/span.rb +260 -0
- data/lib/ddtrace/sync_writer.rb +62 -0
- data/lib/ddtrace/tracer.rb +459 -0
- data/lib/ddtrace/transport/http.rb +91 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +112 -0
- data/lib/ddtrace/transport/http/adapters/registry.rb +24 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +77 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +64 -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 +29 -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 +165 -0
- data/lib/ddtrace/transport/http/client.rb +107 -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 +140 -0
- data/lib/ddtrace/transport/parcel.rb +13 -0
- data/lib/ddtrace/transport/request.rb +13 -0
- data/lib/ddtrace/transport/response.rb +49 -0
- data/lib/ddtrace/transport/statistics.rb +72 -0
- data/lib/ddtrace/transport/traces.rb +33 -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/workers.rb +125 -0
- data/lib/ddtrace/writer.rb +157 -0
- data/tasks/release_gem.rake +28 -0
- metadata +682 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'ddtrace/contrib/integration'
|
|
2
|
+
require 'ddtrace/contrib/racecar/configuration/settings'
|
|
3
|
+
require 'ddtrace/contrib/racecar/patcher'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Racecar
|
|
8
|
+
# Description of Racecar integration
|
|
9
|
+
class Integration
|
|
10
|
+
include Contrib::Integration
|
|
11
|
+
|
|
12
|
+
register_as :racecar, auto_patch: false
|
|
13
|
+
|
|
14
|
+
def self.version
|
|
15
|
+
Gem.loaded_specs['racecar'] && Gem.loaded_specs['racecar'].version
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.present?
|
|
19
|
+
super && defined?(::Racecar)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.compatible?
|
|
23
|
+
super && defined?(::ActiveSupport::Notifications)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def default_configuration
|
|
27
|
+
Configuration::Settings.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def patcher
|
|
31
|
+
Patcher
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'ddtrace/contrib/patcher'
|
|
2
|
+
require 'ddtrace/ext/app_types'
|
|
3
|
+
require 'ddtrace/contrib/racecar/ext'
|
|
4
|
+
require 'ddtrace/contrib/racecar/events'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Contrib
|
|
8
|
+
module Racecar
|
|
9
|
+
# Patcher enables patching of 'racecar' module.
|
|
10
|
+
module Patcher
|
|
11
|
+
include Contrib::Patcher
|
|
12
|
+
|
|
13
|
+
module_function
|
|
14
|
+
|
|
15
|
+
def patched?
|
|
16
|
+
done?(:racecar)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def patch
|
|
20
|
+
do_once(:racecar) do
|
|
21
|
+
begin
|
|
22
|
+
# Subscribe to Racecar events
|
|
23
|
+
Events.subscribe!
|
|
24
|
+
rescue StandardError => e
|
|
25
|
+
Datadog::Tracer.log.error("Unable to apply Racecar integration: #{e}")
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -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,32 @@
|
|
|
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
|
+
register_as :rack, auto_patch: false
|
|
13
|
+
|
|
14
|
+
def self.version
|
|
15
|
+
Gem.loaded_specs['rack'] && Gem.loaded_specs['rack'].version
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.present?
|
|
19
|
+
super && defined?(::Rack)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def default_configuration
|
|
23
|
+
Configuration::Settings.new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def patcher
|
|
27
|
+
Patcher
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,283 @@
|
|
|
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
|
+
# Rack is a really low level interface and it doesn't provide any
|
|
102
|
+
# advanced functionality like routers. Because of that, we assume that
|
|
103
|
+
# the underlying framework or application has more knowledge about
|
|
104
|
+
# the result for this request; `resource` and `tags` are expected to
|
|
105
|
+
# be set in another level but if they're missing, reasonable defaults
|
|
106
|
+
# are used.
|
|
107
|
+
set_request_tags!(request_span, env, status, headers, response, original_env)
|
|
108
|
+
|
|
109
|
+
# ensure the request_span is finished and the context reset;
|
|
110
|
+
# this assumes that the Rack middleware creates a root span
|
|
111
|
+
request_span.finish
|
|
112
|
+
frontend_span.finish unless frontend_span.nil?
|
|
113
|
+
|
|
114
|
+
# TODO: Remove this once we change how context propagation works. This
|
|
115
|
+
# ensures we clean thread-local variables on each HTTP request avoiding
|
|
116
|
+
# memory leaks.
|
|
117
|
+
tracer.provider.context = Datadog::Context.new
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def resource_name_for(env, status)
|
|
121
|
+
if configuration[:middleware_names] && env['RESPONSE_MIDDLEWARE']
|
|
122
|
+
"#{env['RESPONSE_MIDDLEWARE']}##{env['REQUEST_METHOD']}"
|
|
123
|
+
else
|
|
124
|
+
"#{env['REQUEST_METHOD']} #{status}".strip
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# rubocop:disable Metrics/AbcSize
|
|
129
|
+
def set_request_tags!(request_span, env, status, headers, response, original_env)
|
|
130
|
+
# http://www.rubydoc.info/github/rack/rack/file/SPEC
|
|
131
|
+
# The source of truth in Rack is the PATH_INFO key that holds the
|
|
132
|
+
# URL for the current request; but some frameworks may override that
|
|
133
|
+
# value, especially during exception handling.
|
|
134
|
+
#
|
|
135
|
+
# Because of this, we prefer to use REQUEST_URI, if available, which is the
|
|
136
|
+
# relative path + query string, and doesn't mutate.
|
|
137
|
+
#
|
|
138
|
+
# REQUEST_URI is only available depending on what web server is running though.
|
|
139
|
+
# So when its not available, we want the original, unmutated PATH_INFO, which
|
|
140
|
+
# is just the relative path without query strings.
|
|
141
|
+
url = env['REQUEST_URI'] || original_env['PATH_INFO']
|
|
142
|
+
request_headers = parse_request_headers(env)
|
|
143
|
+
response_headers = parse_response_headers(headers || {})
|
|
144
|
+
|
|
145
|
+
request_span.resource ||= resource_name_for(env, status)
|
|
146
|
+
|
|
147
|
+
# Associate with runtime metrics
|
|
148
|
+
Datadog.runtime_metrics.associate_with_span(request_span)
|
|
149
|
+
|
|
150
|
+
# Set analytics sample rate
|
|
151
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
152
|
+
Contrib::Analytics.set_sample_rate(request_span, configuration[:analytics_sample_rate])
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
if request_span.get_tag(Datadog::Ext::HTTP::METHOD).nil?
|
|
156
|
+
request_span.set_tag(Datadog::Ext::HTTP::METHOD, env['REQUEST_METHOD'])
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
if request_span.get_tag(Datadog::Ext::HTTP::URL).nil?
|
|
160
|
+
options = configuration[:quantize]
|
|
161
|
+
request_span.set_tag(Datadog::Ext::HTTP::URL, Datadog::Quantization::HTTP.url(url, options))
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
if request_span.get_tag(Datadog::Ext::HTTP::BASE_URL).nil?
|
|
165
|
+
request_obj = ::Rack::Request.new(env)
|
|
166
|
+
|
|
167
|
+
base_url = if request_obj.respond_to?(:base_url)
|
|
168
|
+
request_obj.base_url
|
|
169
|
+
else
|
|
170
|
+
# Compatibility for older Rack versions
|
|
171
|
+
request_obj.url.chomp(request_obj.fullpath)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
request_span.set_tag(Datadog::Ext::HTTP::BASE_URL, base_url)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
if request_span.get_tag(Datadog::Ext::HTTP::STATUS_CODE).nil? && status
|
|
178
|
+
request_span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, status)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Request headers
|
|
182
|
+
request_headers.each do |name, value|
|
|
183
|
+
request_span.set_tag(name, value) if request_span.get_tag(name).nil?
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Response headers
|
|
187
|
+
response_headers.each do |name, value|
|
|
188
|
+
request_span.set_tag(name, value) if request_span.get_tag(name).nil?
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# detect if the status code is a 5xx and flag the request span as an error
|
|
192
|
+
# unless it has been already set by the underlying framework
|
|
193
|
+
if status.to_s.start_with?('5') && request_span.status.zero?
|
|
194
|
+
request_span.status = 1
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
private
|
|
199
|
+
|
|
200
|
+
REQUEST_SPAN_DEPRECATION_WARNING = %(
|
|
201
|
+
:datadog_rack_request_span is considered an internal symbol in the Rack env,
|
|
202
|
+
and has been been DEPRECATED. Public support for its usage is discontinued.
|
|
203
|
+
If you need the Rack request span, try using `Datadog.tracer.active_span`.
|
|
204
|
+
This key will be removed in version 1.0).freeze
|
|
205
|
+
|
|
206
|
+
def configuration
|
|
207
|
+
Datadog.configuration[:rack]
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def add_deprecation_warnings(env)
|
|
211
|
+
env.instance_eval do
|
|
212
|
+
unless instance_variable_defined?(:@patched_with_datadog_warnings)
|
|
213
|
+
@patched_with_datadog_warnings = true
|
|
214
|
+
@datadog_deprecation_warnings = true
|
|
215
|
+
@datadog_span_warning = true
|
|
216
|
+
|
|
217
|
+
def [](key)
|
|
218
|
+
if key == :datadog_rack_request_span \
|
|
219
|
+
&& @datadog_span_warning \
|
|
220
|
+
&& @datadog_deprecation_warnings
|
|
221
|
+
Datadog::Tracer.log.warn(REQUEST_SPAN_DEPRECATION_WARNING)
|
|
222
|
+
@datadog_span_warning = true
|
|
223
|
+
end
|
|
224
|
+
super
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def []=(key, value)
|
|
228
|
+
if key == :datadog_rack_request_span \
|
|
229
|
+
&& @datadog_span_warning \
|
|
230
|
+
&& @datadog_deprecation_warnings
|
|
231
|
+
Datadog::Tracer.log.warn(REQUEST_SPAN_DEPRECATION_WARNING)
|
|
232
|
+
@datadog_span_warning = true
|
|
233
|
+
end
|
|
234
|
+
super
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def without_datadog_warnings
|
|
238
|
+
@datadog_deprecation_warnings = false
|
|
239
|
+
yield
|
|
240
|
+
ensure
|
|
241
|
+
@datadog_deprecation_warnings = true
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def parse_request_headers(env)
|
|
248
|
+
{}.tap do |result|
|
|
249
|
+
whitelist = configuration[:headers][:request] || []
|
|
250
|
+
whitelist.each do |header|
|
|
251
|
+
rack_header = header_to_rack_header(header)
|
|
252
|
+
if env.key?(rack_header)
|
|
253
|
+
result[Datadog::Ext::HTTP::RequestHeaders.to_tag(header)] = env[rack_header]
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def parse_response_headers(headers)
|
|
260
|
+
{}.tap do |result|
|
|
261
|
+
whitelist = configuration[:headers][:response] || []
|
|
262
|
+
whitelist.each do |header|
|
|
263
|
+
if headers.key?(header)
|
|
264
|
+
result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[header]
|
|
265
|
+
else
|
|
266
|
+
# Try a case-insensitive lookup
|
|
267
|
+
uppercased_header = header.to_s.upcase
|
|
268
|
+
matching_header = headers.keys.find { |h| h.upcase == uppercased_header }
|
|
269
|
+
if matching_header
|
|
270
|
+
result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[matching_header]
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def header_to_rack_header(name)
|
|
278
|
+
"HTTP_#{name.to_s.upcase.gsub(/[-\s]/, '_')}"
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|