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
data/lib/ddtrace.rb
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
3
|
+
# During development, we load `ddtrace` by through `ddtrace.gemspec`,
|
|
4
|
+
# which in turn eager loads 'ddtrace/version'.
|
|
5
|
+
#
|
|
6
|
+
# Users load this gem by requiring this file.
|
|
7
|
+
# We need to ensure that any files loaded in our gemspec are also loaded here.
|
|
8
|
+
require 'ddtrace/version'
|
|
9
|
+
|
|
10
|
+
require 'ddtrace/pin'
|
|
11
|
+
require 'ddtrace/tracer'
|
|
12
|
+
require 'ddtrace/error'
|
|
13
|
+
require 'ddtrace/quantization/hash'
|
|
14
|
+
require 'ddtrace/quantization/http'
|
|
15
|
+
require 'ddtrace/pipeline'
|
|
16
|
+
require 'ddtrace/configuration'
|
|
17
|
+
require 'ddtrace/patcher'
|
|
18
|
+
require 'ddtrace/augmentation'
|
|
19
|
+
require 'ddtrace/metrics'
|
|
20
|
+
|
|
21
|
+
# \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
|
|
22
|
+
module Datadog
|
|
23
|
+
extend Augmentation
|
|
24
|
+
extend Configuration
|
|
25
|
+
|
|
26
|
+
# Load and extend Contrib by default
|
|
27
|
+
require 'ddtrace/contrib/extensions'
|
|
28
|
+
extend Contrib::Extensions
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
require 'ddtrace/contrib/action_pack/integration'
|
|
32
|
+
require 'ddtrace/contrib/action_view/integration'
|
|
33
|
+
require 'ddtrace/contrib/active_model_serializers/integration'
|
|
34
|
+
require 'ddtrace/contrib/active_record/integration'
|
|
35
|
+
require 'ddtrace/contrib/active_support/integration'
|
|
36
|
+
require 'ddtrace/contrib/aws/integration'
|
|
37
|
+
require 'ddtrace/contrib/concurrent_ruby/integration'
|
|
38
|
+
require 'ddtrace/contrib/dalli/integration'
|
|
39
|
+
require 'ddtrace/contrib/delayed_job/integration'
|
|
40
|
+
require 'ddtrace/contrib/elasticsearch/integration'
|
|
41
|
+
require 'ddtrace/contrib/ethon/integration'
|
|
42
|
+
require 'ddtrace/contrib/excon/integration'
|
|
43
|
+
require 'ddtrace/contrib/faraday/integration'
|
|
44
|
+
require 'ddtrace/contrib/grape/integration'
|
|
45
|
+
require 'ddtrace/contrib/graphql/integration'
|
|
46
|
+
require 'ddtrace/contrib/grpc/integration'
|
|
47
|
+
require 'ddtrace/contrib/http/integration'
|
|
48
|
+
require 'ddtrace/contrib/integration'
|
|
49
|
+
require 'ddtrace/contrib/mysql2/integration'
|
|
50
|
+
require 'ddtrace/contrib/mongodb/integration'
|
|
51
|
+
require 'ddtrace/contrib/racecar/integration'
|
|
52
|
+
require 'ddtrace/contrib/rack/integration'
|
|
53
|
+
require 'ddtrace/contrib/rails/integration'
|
|
54
|
+
require 'ddtrace/contrib/rake/integration'
|
|
55
|
+
require 'ddtrace/contrib/redis/integration'
|
|
56
|
+
require 'ddtrace/contrib/resque/integration'
|
|
57
|
+
require 'ddtrace/contrib/rest_client/integration'
|
|
58
|
+
require 'ddtrace/contrib/sequel/integration'
|
|
59
|
+
require 'ddtrace/contrib/shoryuken/integration'
|
|
60
|
+
require 'ddtrace/contrib/sidekiq/integration'
|
|
61
|
+
require 'ddtrace/contrib/sinatra/integration'
|
|
62
|
+
require 'ddtrace/contrib/sucker_punch/integration'
|
|
63
|
+
require 'ddtrace/monkey'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'ddtrace/ext/analytics'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
# Defines analytics behavior
|
|
5
|
+
module Analytics
|
|
6
|
+
class << self
|
|
7
|
+
def set_sample_rate(span, sample_rate)
|
|
8
|
+
return if span.nil? || !sample_rate.is_a?(Numeric)
|
|
9
|
+
span.set_metric(Datadog::Ext::Analytics::TAG_SAMPLE_RATE, sample_rate)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Extension for Datadog::Span
|
|
14
|
+
module Span
|
|
15
|
+
def set_tag(key, value)
|
|
16
|
+
case key
|
|
17
|
+
when Ext::Analytics::TAG_ENABLED
|
|
18
|
+
# If true, set rate to 1.0, otherwise set 0.0.
|
|
19
|
+
value = value == true ? Ext::Analytics::DEFAULT_SAMPLE_RATE : 0.0
|
|
20
|
+
Analytics.set_sample_rate(self, value)
|
|
21
|
+
when Ext::Analytics::TAG_SAMPLE_RATE
|
|
22
|
+
Analytics.set_sample_rate(self, value)
|
|
23
|
+
else
|
|
24
|
+
super if defined?(super)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'ddtrace/augmentation/method_wrapper'
|
|
2
|
+
require 'ddtrace/augmentation/method_wrapping'
|
|
3
|
+
require 'ddtrace/augmentation/shim'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# Namespace for components that help modify
|
|
7
|
+
# existing code for instrumentation purposes.
|
|
8
|
+
module Augmentation
|
|
9
|
+
def shim(object, &block)
|
|
10
|
+
Shim.new(object, &block)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
# Represents an wrapped method, with a reference to the original block
|
|
3
|
+
# and the block that wraps around it.
|
|
4
|
+
class MethodWrapper
|
|
5
|
+
attr_reader \
|
|
6
|
+
:original,
|
|
7
|
+
:wrapper
|
|
8
|
+
|
|
9
|
+
DEFAULT_WRAPPER = proc { |original, *args, &block| original.call(*args, &block) }
|
|
10
|
+
|
|
11
|
+
def initialize(original, &block)
|
|
12
|
+
@original = original
|
|
13
|
+
@wrapper = block_given? ? block : DEFAULT_WRAPPER
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def call(*args, &block)
|
|
17
|
+
wrapper.call(original, *args, &block)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
require 'ddtrace/patcher'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
# Shorthands for wrapping methods
|
|
6
|
+
module MethodWrapping
|
|
7
|
+
include Datadog::Patcher
|
|
8
|
+
|
|
9
|
+
def wrapped_methods
|
|
10
|
+
@wrapped_methods ||= Set.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Adds method block directly to the object.
|
|
14
|
+
# Block is evaluated in the context of the object.
|
|
15
|
+
# Faster than #wrap_method!
|
|
16
|
+
def override_method!(method_name, &block)
|
|
17
|
+
return unless block_given?
|
|
18
|
+
|
|
19
|
+
without_warnings do
|
|
20
|
+
define_singleton_method(method_name, &block).tap do
|
|
21
|
+
wrapped_methods.add(method_name)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Adds method wrapper to the object.
|
|
27
|
+
# Block is evaluated in the original context of the block.
|
|
28
|
+
# Slower than #override_method!
|
|
29
|
+
def wrap_method!(original_method, &block)
|
|
30
|
+
return unless block_given?
|
|
31
|
+
original_method = original_method.is_a?(Symbol) ? method(original_method) : original_method
|
|
32
|
+
|
|
33
|
+
override_method!(original_method.name) do |*original_args, &original_block|
|
|
34
|
+
block.call(original_method, *original_args, &original_block)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
require 'ddtrace/patcher'
|
|
3
|
+
require 'ddtrace/augmentation/method_wrapping'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# A "stand-in" that intercepts calls to another object. i.e. man-in-the-middle.
|
|
7
|
+
# This shim forwards all methods to object, except those overriden.
|
|
8
|
+
# Useful if you want to intercept inbound behavior to an object without modifying
|
|
9
|
+
# the object in question, especially useful if the overridding behavior shouldn't be global.
|
|
10
|
+
class Shim
|
|
11
|
+
extend Forwardable
|
|
12
|
+
include Datadog::Patcher
|
|
13
|
+
include Datadog::MethodWrapping
|
|
14
|
+
|
|
15
|
+
METHODS = Set[
|
|
16
|
+
:override_method!,
|
|
17
|
+
:shim,
|
|
18
|
+
:shim?,
|
|
19
|
+
:shim_target,
|
|
20
|
+
:wrap_method!,
|
|
21
|
+
:wrapped_methods
|
|
22
|
+
].freeze
|
|
23
|
+
|
|
24
|
+
EXCLUDED_METHODS = Set[
|
|
25
|
+
# For all objects
|
|
26
|
+
:__binding__,
|
|
27
|
+
:__id__,
|
|
28
|
+
:__send__,
|
|
29
|
+
:extend,
|
|
30
|
+
:itself,
|
|
31
|
+
:object_id,
|
|
32
|
+
:respond_to?,
|
|
33
|
+
:tap
|
|
34
|
+
].freeze
|
|
35
|
+
|
|
36
|
+
attr_reader :shim_target, :shim
|
|
37
|
+
|
|
38
|
+
def self.shim?(object)
|
|
39
|
+
# Check whether it responds to #shim? because otherwise the
|
|
40
|
+
# Shim forwards all method calls, including type checks to
|
|
41
|
+
# the wrapped object, to mimimize its intrusion.
|
|
42
|
+
object.respond_to?(:shim?)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Pass this a block to override methods
|
|
46
|
+
def initialize(shim_target)
|
|
47
|
+
@shim = self
|
|
48
|
+
@shim_target = shim_target
|
|
49
|
+
|
|
50
|
+
# Save a reference to the original :define_singleton_method
|
|
51
|
+
# so methods can be defined on the shim after forwarding is applied.
|
|
52
|
+
@definition_method = method(:define_singleton_method)
|
|
53
|
+
|
|
54
|
+
# Wrap any methods
|
|
55
|
+
yield(self) if block_given?
|
|
56
|
+
|
|
57
|
+
# Forward methods
|
|
58
|
+
forwarded_methods = (
|
|
59
|
+
shim_target.public_methods.to_set \
|
|
60
|
+
- METHODS \
|
|
61
|
+
- EXCLUDED_METHODS \
|
|
62
|
+
- wrapped_methods
|
|
63
|
+
)
|
|
64
|
+
forward_methods!(*forwarded_methods)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def override_method!(method_name, &block)
|
|
68
|
+
return unless block_given?
|
|
69
|
+
|
|
70
|
+
without_warnings do
|
|
71
|
+
@definition_method.call(method_name, &block).tap do
|
|
72
|
+
wrapped_methods.add(method_name)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def wrap_method!(method_name, &block)
|
|
78
|
+
super(shim_target.method(method_name), &block)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def shim?
|
|
82
|
+
true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def respond_to?(method_name)
|
|
86
|
+
return true if METHODS.include?(method_name)
|
|
87
|
+
shim_target.respond_to?(method_name)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
def forward_methods!(*forwarded_methods)
|
|
93
|
+
return if forwarded_methods.empty?
|
|
94
|
+
|
|
95
|
+
singleton_class.send(
|
|
96
|
+
:def_delegators,
|
|
97
|
+
:@shim_target,
|
|
98
|
+
*forwarded_methods
|
|
99
|
+
)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
require 'ddtrace/diagnostics/health'
|
|
3
|
+
require 'ddtrace/runtime/object_space'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# Trace buffer that stores application traces. The buffer has a maximum size and when
|
|
7
|
+
# the buffer is full, a random trace is discarded. This class is thread-safe and is used
|
|
8
|
+
# automatically by the ``Tracer`` instance when a ``Span`` is finished.
|
|
9
|
+
class TraceBuffer
|
|
10
|
+
def initialize(max_size)
|
|
11
|
+
@max_size = max_size
|
|
12
|
+
|
|
13
|
+
@mutex = Mutex.new()
|
|
14
|
+
@traces = []
|
|
15
|
+
@closed = false
|
|
16
|
+
|
|
17
|
+
# Initialize metric values
|
|
18
|
+
@buffer_accepted = 0
|
|
19
|
+
@buffer_accepted_lengths = 0
|
|
20
|
+
@buffer_dropped = 0
|
|
21
|
+
@buffer_spans = 0
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Add a new ``trace`` in the local queue. This method doesn't block the execution
|
|
25
|
+
# even if the buffer is full. In that case, a random trace is discarded.
|
|
26
|
+
def push(trace)
|
|
27
|
+
@mutex.synchronize do
|
|
28
|
+
return if @closed
|
|
29
|
+
len = @traces.length
|
|
30
|
+
if len < @max_size || @max_size <= 0
|
|
31
|
+
@traces << trace
|
|
32
|
+
else
|
|
33
|
+
# we should replace a random trace with the new one
|
|
34
|
+
replace_index = rand(len)
|
|
35
|
+
replaced_trace = @traces[replace_index]
|
|
36
|
+
@traces[replace_index] = trace
|
|
37
|
+
measure_drop(replaced_trace)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
measure_accept(trace)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Return the current number of stored traces.
|
|
45
|
+
def length
|
|
46
|
+
@mutex.synchronize do
|
|
47
|
+
return @traces.length
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Return if the buffer is empty.
|
|
52
|
+
def empty?
|
|
53
|
+
@mutex.synchronize do
|
|
54
|
+
return @traces.empty?
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Stored traces are returned and the local buffer is reset.
|
|
59
|
+
def pop
|
|
60
|
+
@mutex.synchronize do
|
|
61
|
+
traces = @traces
|
|
62
|
+
@traces = []
|
|
63
|
+
|
|
64
|
+
measure_pop(traces)
|
|
65
|
+
|
|
66
|
+
return traces
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def close
|
|
71
|
+
@mutex.synchronize do
|
|
72
|
+
@closed = true
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Aggregate metrics:
|
|
77
|
+
# They reflect buffer activity since last #pop.
|
|
78
|
+
# These may not be as accurate or as granular, but they
|
|
79
|
+
# don't use as much network traffic as live stats.
|
|
80
|
+
|
|
81
|
+
def measure_accept(trace)
|
|
82
|
+
@buffer_spans += trace.length
|
|
83
|
+
@buffer_accepted += 1
|
|
84
|
+
@buffer_accepted_lengths += trace.length
|
|
85
|
+
rescue StandardError => e
|
|
86
|
+
Datadog::Tracer.log.debug("Failed to measure queue accept. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def measure_drop(trace)
|
|
90
|
+
@buffer_dropped += 1
|
|
91
|
+
@buffer_spans -= trace.length
|
|
92
|
+
@buffer_accepted_lengths -= trace.length
|
|
93
|
+
rescue StandardError => e
|
|
94
|
+
Datadog::Tracer.log.debug("Failed to measure queue drop. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def measure_pop(traces)
|
|
98
|
+
# Accepted
|
|
99
|
+
Diagnostics::Health.metrics.queue_accepted(@buffer_accepted)
|
|
100
|
+
Diagnostics::Health.metrics.queue_accepted_lengths(@buffer_accepted_lengths)
|
|
101
|
+
|
|
102
|
+
# Dropped
|
|
103
|
+
Diagnostics::Health.metrics.queue_dropped(@buffer_dropped)
|
|
104
|
+
|
|
105
|
+
# Queue gauges
|
|
106
|
+
Diagnostics::Health.metrics.queue_max_length(@max_size)
|
|
107
|
+
Diagnostics::Health.metrics.queue_spans(@buffer_spans)
|
|
108
|
+
Diagnostics::Health.metrics.queue_length(traces.length)
|
|
109
|
+
|
|
110
|
+
# Reset aggregated metrics
|
|
111
|
+
@buffer_accepted = 0
|
|
112
|
+
@buffer_accepted_lengths = 0
|
|
113
|
+
@buffer_dropped = 0
|
|
114
|
+
@buffer_spans = 0
|
|
115
|
+
rescue StandardError => e
|
|
116
|
+
Datadog::Tracer.log.debug("Failed to measure queue. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/configuration/pin_setup'
|
|
2
|
+
require 'ddtrace/configuration/settings'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
# Configuration provides a unique access point for configurations
|
|
6
|
+
module Configuration
|
|
7
|
+
attr_writer :configuration
|
|
8
|
+
|
|
9
|
+
def configuration
|
|
10
|
+
@configuration ||= Settings.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def configure(target = configuration, opts = {})
|
|
14
|
+
if target.is_a?(Settings)
|
|
15
|
+
yield(target) if block_given?
|
|
16
|
+
else
|
|
17
|
+
PinSetup.new(target, opts).call
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Helper methods
|
|
22
|
+
def tracer
|
|
23
|
+
configuration.tracer
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def runtime_metrics
|
|
27
|
+
tracer.writer.runtime_metrics
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'ddtrace/environment'
|
|
2
|
+
require 'ddtrace/configuration/options'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Configuration
|
|
6
|
+
# Basic configuration behavior
|
|
7
|
+
module Base
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.send(:extend, Datadog::Environment::Helpers)
|
|
10
|
+
base.send(:include, Options)
|
|
11
|
+
|
|
12
|
+
base.send(:extend, ClassMethods)
|
|
13
|
+
base.send(:include, InstanceMethods)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Class methods for configuration
|
|
17
|
+
module ClassMethods
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
# Allows subgroupings of settings to be defined.
|
|
21
|
+
# e.g. `settings :foo { option :bar }` --> `config.foo.bar`
|
|
22
|
+
def settings(name, &block)
|
|
23
|
+
settings_class = new_settings_class(&block)
|
|
24
|
+
|
|
25
|
+
option(name) do |o|
|
|
26
|
+
o.default settings_class.new
|
|
27
|
+
o.resetter do |value|
|
|
28
|
+
value.reset! if value.respond_to?(:reset!)
|
|
29
|
+
value
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def new_settings_class(&block)
|
|
37
|
+
Class.new { include Datadog::Configuration::Base }.tap do |klass|
|
|
38
|
+
klass.instance_eval(&block) if block_given?
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Instance methods for configuration
|
|
44
|
+
module InstanceMethods
|
|
45
|
+
def initialize(options = {})
|
|
46
|
+
configure(options)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def configure(opts = {})
|
|
50
|
+
# Sort the options in preference of dependency order first
|
|
51
|
+
ordering = self.class.options.dependency_order
|
|
52
|
+
sorted_opts = opts.sort_by do |name, _value|
|
|
53
|
+
ordering.index(name) || (ordering.length + 1)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Ruby 2.0 doesn't support Array#to_h
|
|
57
|
+
sorted_opts = Hash[*sorted_opts.flatten]
|
|
58
|
+
|
|
59
|
+
# Apply options in sort order
|
|
60
|
+
sorted_opts.each do |name, value|
|
|
61
|
+
if respond_to?("#{name}=")
|
|
62
|
+
send("#{name}=", value)
|
|
63
|
+
elsif option_defined?(name)
|
|
64
|
+
set_option(name, value)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Apply any additional settings from block
|
|
69
|
+
yield(self) if block_given?
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def to_h
|
|
73
|
+
options_hash
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def reset!
|
|
77
|
+
reset_options!
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|