ls-trace 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +419 -544
- data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
- data/.env +2 -0
- data/.gitignore +2 -0
- data/.gitlab-ci.yml +27 -0
- data/.rubocop.yml +8 -0
- data/.simplecov +38 -0
- data/Appraisals +299 -48
- data/CHANGELOG.md +3 -4
- data/LICENSE +4 -22
- data/LICENSE.Apache +200 -0
- data/LICENSE.BSD3 +24 -0
- data/NOTICE +4 -0
- data/README.md +4 -3
- data/Rakefile +561 -405
- data/ddtrace.gemspec +13 -4
- data/docker-compose.yml +96 -2
- data/docs/DevelopmentGuide.md +17 -1
- data/docs/GettingStarted.md +433 -138
- data/lib/ddtrace.rb +15 -0
- data/lib/ddtrace/analytics.rb +7 -0
- data/lib/ddtrace/buffer.rb +9 -9
- data/lib/ddtrace/chunker.rb +34 -0
- data/lib/ddtrace/configuration.rb +59 -5
- data/lib/ddtrace/configuration/base.rb +4 -2
- data/lib/ddtrace/configuration/components.rb +151 -0
- data/lib/ddtrace/configuration/option.rb +12 -3
- data/lib/ddtrace/configuration/option_definition.rb +1 -5
- data/lib/ddtrace/configuration/options.rb +6 -1
- data/lib/ddtrace/configuration/pin_setup.rb +3 -2
- data/lib/ddtrace/configuration/settings.rb +214 -40
- data/lib/ddtrace/context.rb +84 -63
- data/lib/ddtrace/context_flush.rb +51 -114
- data/lib/ddtrace/context_provider.rb +50 -0
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +30 -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 +26 -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 +6 -2
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +3 -15
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
- data/lib/ddtrace/contrib/action_pack/integration.rb +5 -3
- data/lib/ddtrace/contrib/action_pack/patcher.rb +3 -9
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
- 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 +5 -2
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +9 -13
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +16 -16
- data/lib/ddtrace/contrib/action_view/integration.rb +5 -3
- data/lib/ddtrace/contrib/action_view/patcher.rb +19 -25
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -0
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +6 -5
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +3 -10
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +4 -5
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +4 -1
- data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -1
- data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_record/integration.rb +5 -3
- data/lib/ddtrace/contrib/active_record/patcher.rb +3 -9
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +10 -24
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_support/integration.rb +5 -3
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +3 -3
- data/lib/ddtrace/contrib/active_support/patcher.rb +3 -9
- data/lib/ddtrace/contrib/analytics.rb +5 -1
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/aws/ext.rb +5 -2
- data/lib/ddtrace/contrib/aws/integration.rb +8 -2
- data/lib/ddtrace/contrib/aws/patcher.rb +15 -15
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +8 -2
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +4 -11
- data/lib/ddtrace/contrib/configurable.rb +30 -13
- data/lib/ddtrace/contrib/configuration/resolver.rb +7 -3
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +20 -1
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
- data/lib/ddtrace/contrib/dalli/integration.rb +5 -3
- data/lib/ddtrace/contrib/dalli/patcher.rb +6 -16
- data/lib/ddtrace/contrib/dalli/quantize.rb +1 -1
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
- data/lib/ddtrace/contrib/delayed_job/integration.rb +8 -2
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +4 -10
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +4 -0
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +5 -3
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +10 -17
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +8 -2
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +22 -13
- data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
- data/lib/ddtrace/contrib/ethon/integration.rb +14 -2
- data/lib/ddtrace/contrib/ethon/patcher.rb +7 -9
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/excon/ext.rb +5 -2
- data/lib/ddtrace/contrib/excon/integration.rb +13 -2
- data/lib/ddtrace/contrib/excon/middleware.rb +15 -12
- data/lib/ddtrace/contrib/excon/patcher.rb +4 -11
- data/lib/ddtrace/contrib/extensions.rb +39 -5
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
- data/lib/ddtrace/contrib/faraday/integration.rb +10 -3
- data/lib/ddtrace/contrib/faraday/middleware.rb +24 -34
- data/lib/ddtrace/contrib/faraday/patcher.rb +26 -19
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
- data/lib/ddtrace/contrib/grape/endpoint.rb +14 -5
- data/lib/ddtrace/contrib/grape/ext.rb +5 -2
- data/lib/ddtrace/contrib/grape/integration.rb +6 -3
- data/lib/ddtrace/contrib/grape/patcher.rb +9 -15
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
- data/lib/ddtrace/contrib/graphql/integration.rb +6 -5
- data/lib/ddtrace/contrib/graphql/patcher.rb +11 -14
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +2 -4
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -2
- data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
- data/lib/ddtrace/contrib/grpc/integration.rb +5 -3
- data/lib/ddtrace/contrib/grpc/patcher.rb +9 -19
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +8 -32
- data/lib/ddtrace/contrib/http/configuration/settings.rb +8 -2
- data/lib/ddtrace/contrib/http/ext.rb +5 -2
- data/lib/ddtrace/contrib/http/instrumentation.rb +89 -28
- data/lib/ddtrace/contrib/http/integration.rb +13 -0
- data/lib/ddtrace/contrib/http/patcher.rb +3 -9
- data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
- data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -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 +41 -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 +7 -2
- data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
- data/lib/ddtrace/contrib/mongodb/integration.rb +5 -3
- data/lib/ddtrace/contrib/mongodb/patcher.rb +5 -11
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -2
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/mysql2/integration.rb +8 -2
- data/lib/ddtrace/contrib/mysql2/patcher.rb +3 -9
- data/lib/ddtrace/contrib/patchable.rb +21 -4
- data/lib/ddtrace/contrib/patcher.rb +44 -10
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/presto/ext.rb +28 -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/que/configuration/settings.rb +42 -0
- data/lib/ddtrace/contrib/que/ext.rb +30 -0
- data/lib/ddtrace/contrib/que/integration.rb +42 -0
- data/lib/ddtrace/contrib/que/patcher.rb +24 -0
- data/lib/ddtrace/contrib/que/tracer.rb +56 -0
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/racecar/event.rb +4 -0
- data/lib/ddtrace/contrib/racecar/events.rb +2 -0
- data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
- data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
- data/lib/ddtrace/contrib/racecar/integration.rb +6 -3
- data/lib/ddtrace/contrib/racecar/patcher.rb +4 -10
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/rack/ext.rb +5 -2
- data/lib/ddtrace/contrib/rack/integration.rb +8 -2
- data/lib/ddtrace/contrib/rack/middlewares.rb +23 -14
- data/lib/ddtrace/contrib/rack/patcher.rb +57 -22
- data/lib/ddtrace/contrib/rack/request_queue.rb +1 -1
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +23 -10
- data/lib/ddtrace/contrib/rails/ext.rb +7 -2
- data/lib/ddtrace/contrib/rails/framework.rb +59 -35
- data/lib/ddtrace/contrib/rails/integration.rb +12 -5
- data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
- data/lib/ddtrace/contrib/rails/patcher.rb +19 -8
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
- data/lib/ddtrace/contrib/rake/ext.rb +5 -2
- data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -2
- data/lib/ddtrace/contrib/rake/integration.rb +8 -2
- data/lib/ddtrace/contrib/rake/patcher.rb +4 -10
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/redis/ext.rb +5 -2
- data/lib/ddtrace/contrib/redis/integration.rb +9 -3
- data/lib/ddtrace/contrib/redis/patcher.rb +20 -17
- data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/resque/ext.rb +5 -2
- data/lib/ddtrace/contrib/resque/integration.rb +12 -2
- data/lib/ddtrace/contrib/resque/patcher.rb +4 -10
- data/lib/ddtrace/contrib/resque/resque_job.rb +6 -2
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
- data/lib/ddtrace/contrib/rest_client/integration.rb +9 -2
- data/lib/ddtrace/contrib/rest_client/patcher.rb +5 -7
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sequel/database.rb +1 -1
- data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
- data/lib/ddtrace/contrib/sequel/integration.rb +8 -2
- data/lib/ddtrace/contrib/sequel/patcher.rb +4 -10
- data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
- data/lib/ddtrace/contrib/shoryuken/integration.rb +11 -7
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +4 -10
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +12 -2
- data/lib/ddtrace/contrib/sidekiq/ext.rb +8 -2
- data/lib/ddtrace/contrib/sidekiq/integration.rb +5 -3
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +19 -18
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +12 -3
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +19 -2
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sinatra/env.rb +25 -4
- data/lib/ddtrace/contrib/sinatra/ext.rb +11 -2
- data/lib/ddtrace/contrib/sinatra/integration.rb +5 -3
- data/lib/ddtrace/contrib/sinatra/patcher.rb +5 -10
- data/lib/ddtrace/contrib/sinatra/tracer.rb +79 -34
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +48 -15
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
- data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
- data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
- data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +14 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +5 -3
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +8 -14
- data/lib/ddtrace/correlation.rb +15 -5
- data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
- data/lib/ddtrace/diagnostics/health.rb +11 -8
- data/lib/ddtrace/encoding.rb +15 -11
- data/lib/ddtrace/environment.rb +21 -3
- data/lib/ddtrace/event.rb +52 -0
- data/lib/ddtrace/ext/analytics.rb +1 -0
- data/lib/ddtrace/ext/correlation.rb +11 -0
- data/lib/ddtrace/ext/diagnostics.rb +11 -0
- data/lib/ddtrace/ext/environment.rb +16 -0
- data/lib/ddtrace/ext/forced_tracing.rb +1 -1
- data/lib/ddtrace/ext/sampling.rb +16 -0
- data/lib/ddtrace/ext/transport.rb +1 -0
- data/lib/ddtrace/logger.rb +4 -3
- data/lib/ddtrace/metrics.rb +12 -5
- data/lib/ddtrace/monkey.rb +1 -1
- data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
- data/lib/ddtrace/opentelemetry/span.rb +33 -0
- data/lib/ddtrace/opentracer/global_tracer.rb +1 -1
- data/lib/ddtrace/pin.rb +40 -16
- data/lib/ddtrace/pipeline.rb +1 -1
- data/lib/ddtrace/pipeline/span_filter.rb +15 -15
- data/lib/ddtrace/propagation/http_propagator.rb +2 -2
- data/lib/ddtrace/runtime/cgroup.rb +1 -1
- data/lib/ddtrace/runtime/container.rb +1 -1
- data/lib/ddtrace/runtime/metrics.rb +23 -6
- data/lib/ddtrace/sampler.rb +126 -29
- 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 +54 -7
- data/lib/ddtrace/sync_writer.rb +13 -8
- data/lib/ddtrace/tracer.rb +72 -92
- data/lib/ddtrace/transport/http.rb +16 -1
- data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
- data/lib/ddtrace/transport/http/api/instance.rb +4 -0
- data/lib/ddtrace/transport/http/builder.rb +3 -5
- data/lib/ddtrace/transport/http/client.rb +7 -64
- data/lib/ddtrace/transport/http/response.rb +1 -1
- data/lib/ddtrace/transport/http/statistics.rb +1 -1
- data/lib/ddtrace/transport/http/traces.rb +10 -7
- 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/response.rb +11 -0
- data/lib/ddtrace/transport/statistics.rb +2 -2
- data/lib/ddtrace/transport/traces.rb +160 -10
- data/lib/ddtrace/utils.rb +1 -1
- data/lib/ddtrace/version.rb +2 -2
- data/lib/ddtrace/worker.rb +20 -0
- data/lib/ddtrace/workers.rb +5 -13
- 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 +56 -38
- metadata +185 -25
- data/lib/ddtrace/provider.rb +0 -21
data/lib/ddtrace/tracer.rb
CHANGED
|
@@ -3,13 +3,13 @@ require 'thread'
|
|
|
3
3
|
require 'logger'
|
|
4
4
|
require 'pathname'
|
|
5
5
|
|
|
6
|
+
require 'ddtrace/environment'
|
|
6
7
|
require 'ddtrace/span'
|
|
7
8
|
require 'ddtrace/context'
|
|
8
|
-
require 'ddtrace/context_flush'
|
|
9
|
-
require 'ddtrace/provider'
|
|
10
9
|
require 'ddtrace/logger'
|
|
11
10
|
require 'ddtrace/writer'
|
|
12
11
|
require 'ddtrace/sampler'
|
|
12
|
+
require 'ddtrace/sampling'
|
|
13
13
|
require 'ddtrace/correlation'
|
|
14
14
|
|
|
15
15
|
# \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
|
|
@@ -20,57 +20,17 @@ module Datadog
|
|
|
20
20
|
# of these function calls and sub-requests would be encapsulated within a single trace.
|
|
21
21
|
# rubocop:disable Metrics/ClassLength
|
|
22
22
|
class Tracer
|
|
23
|
-
attr_reader :sampler, :tags, :provider
|
|
23
|
+
attr_reader :sampler, :tags, :provider, :context_flush
|
|
24
24
|
attr_accessor :enabled, :writer
|
|
25
25
|
attr_writer :default_service
|
|
26
26
|
|
|
27
27
|
ALLOWED_SPAN_OPTIONS = [:service, :resource, :span_type].freeze
|
|
28
28
|
DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
|
|
29
29
|
|
|
30
|
-
# Global, memoized, lazy initialized instance of a logger that is used within the the Datadog
|
|
31
|
-
# namespace. This logger outputs to +STDOUT+ by default, and is considered thread-safe.
|
|
32
|
-
def self.log
|
|
33
|
-
unless defined? @logger
|
|
34
|
-
@logger = Datadog::Logger.new(STDOUT)
|
|
35
|
-
@logger.level = Logger::WARN
|
|
36
|
-
end
|
|
37
|
-
@logger
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Override the default logger with a custom one.
|
|
41
|
-
def self.log=(logger)
|
|
42
|
-
return unless logger
|
|
43
|
-
return unless logger.respond_to? :methods
|
|
44
|
-
return unless logger.respond_to? :error
|
|
45
|
-
if logger.respond_to? :methods
|
|
46
|
-
unimplemented = Logger.new(STDOUT).methods - logger.methods
|
|
47
|
-
unless unimplemented.empty?
|
|
48
|
-
logger.error("logger #{logger} does not implement #{unimplemented}")
|
|
49
|
-
return
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
@logger = logger
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# Activate the debug mode providing more information related to tracer usage
|
|
56
|
-
# Default to Warn level unless using custom logger
|
|
57
|
-
def self.debug_logging=(value)
|
|
58
|
-
if value
|
|
59
|
-
log.level = Logger::DEBUG
|
|
60
|
-
elsif log.is_a?(Datadog::Logger)
|
|
61
|
-
log.level = Logger::WARN
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Return if the debug mode is activated or not
|
|
66
|
-
def self.debug_logging
|
|
67
|
-
log.level == Logger::DEBUG
|
|
68
|
-
end
|
|
69
|
-
|
|
70
30
|
def services
|
|
71
31
|
# Only log each deprecation warning once (safeguard against log spam)
|
|
72
32
|
Datadog::Patcher.do_once('Tracer#set_service_info') do
|
|
73
|
-
Datadog
|
|
33
|
+
Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
|
|
74
34
|
end
|
|
75
35
|
|
|
76
36
|
{}
|
|
@@ -89,8 +49,9 @@ module Datadog
|
|
|
89
49
|
# tracer.shutdown!
|
|
90
50
|
#
|
|
91
51
|
def shutdown!
|
|
92
|
-
return
|
|
93
|
-
|
|
52
|
+
return unless @enabled
|
|
53
|
+
|
|
54
|
+
@writer.stop unless @writer.nil?
|
|
94
55
|
end
|
|
95
56
|
|
|
96
57
|
# Return the current active \Context for this traced execution. This method is
|
|
@@ -109,17 +70,26 @@ module Datadog
|
|
|
109
70
|
# * +enabled+: set if the tracer submits or not spans to the local agent. It's enabled
|
|
110
71
|
# by default.
|
|
111
72
|
def initialize(options = {})
|
|
73
|
+
# Configurable options
|
|
74
|
+
@context_flush = if options[:partial_flush]
|
|
75
|
+
Datadog::ContextFlush::Partial.new(options)
|
|
76
|
+
else
|
|
77
|
+
Datadog::ContextFlush::Finished.new
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
@default_service = options[:default_service]
|
|
112
81
|
@enabled = options.fetch(:enabled, true)
|
|
113
|
-
@
|
|
82
|
+
@provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
|
|
114
83
|
@sampler = options.fetch(:sampler, Datadog::AllSampler.new)
|
|
84
|
+
@tags = options.fetch(:tags, {})
|
|
85
|
+
@writer = options.fetch(:writer, Datadog::Writer.new)
|
|
115
86
|
|
|
116
|
-
|
|
87
|
+
# Instance variables
|
|
88
|
+
@mutex = Mutex.new
|
|
117
89
|
@provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
|
|
118
90
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
@mutex = Mutex.new
|
|
122
|
-
@tags = {}
|
|
91
|
+
# Enable priority sampling by default
|
|
92
|
+
activate_priority_sampling!(@sampler)
|
|
123
93
|
end
|
|
124
94
|
|
|
125
95
|
# Updates the current \Tracer instance, so that the tracer can be configured after the
|
|
@@ -128,6 +98,7 @@ module Datadog
|
|
|
128
98
|
# * +enabled+: set if the tracer submits or not spans to the trace agent
|
|
129
99
|
# * +hostname+: change the location of the trace agent
|
|
130
100
|
# * +port+: change the port of the trace agent
|
|
101
|
+
# * +partial_flush+: enable partial trace flushing
|
|
131
102
|
#
|
|
132
103
|
# For instance, if the trace agent runs in a different location, just:
|
|
133
104
|
#
|
|
@@ -138,18 +109,19 @@ module Datadog
|
|
|
138
109
|
|
|
139
110
|
# Those are rare "power-user" options.
|
|
140
111
|
sampler = options.fetch(:sampler, nil)
|
|
141
|
-
max_spans_before_partial_flush = options.fetch(:max_spans_before_partial_flush, nil)
|
|
142
|
-
min_spans_before_partial_flush = options.fetch(:min_spans_before_partial_flush, nil)
|
|
143
|
-
partial_flush_timeout = options.fetch(:partial_flush_timeout, nil)
|
|
144
112
|
|
|
145
113
|
@enabled = enabled unless enabled.nil?
|
|
146
114
|
@sampler = sampler unless sampler.nil?
|
|
147
115
|
|
|
148
116
|
configure_writer(options)
|
|
149
117
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
118
|
+
if options.key?(:partial_flush)
|
|
119
|
+
@context_flush = if options[:partial_flush]
|
|
120
|
+
Datadog::ContextFlush::Partial.new(options)
|
|
121
|
+
else
|
|
122
|
+
Datadog::ContextFlush::Finished.new
|
|
123
|
+
end
|
|
124
|
+
end
|
|
153
125
|
end
|
|
154
126
|
|
|
155
127
|
# Set the information about the given service. A valid example is:
|
|
@@ -160,7 +132,7 @@ module Datadog
|
|
|
160
132
|
def set_service_info(service, app, app_type)
|
|
161
133
|
# Only log each deprecation warning once (safeguard against log spam)
|
|
162
134
|
Datadog::Patcher.do_once('Tracer#set_service_info') do
|
|
163
|
-
Datadog
|
|
135
|
+
Datadog.logger.warn(%(
|
|
164
136
|
set_service_info: Usage of set_service_info has been deprecated,
|
|
165
137
|
service information no longer needs to be reported to the trace agent.
|
|
166
138
|
))
|
|
@@ -175,7 +147,7 @@ module Datadog
|
|
|
175
147
|
begin
|
|
176
148
|
@default_service = File.basename($PROGRAM_NAME, '.*')
|
|
177
149
|
rescue StandardError => e
|
|
178
|
-
Datadog
|
|
150
|
+
Datadog.logger.error("unable to guess default service: #{e}")
|
|
179
151
|
@default_service = 'ruby'.freeze
|
|
180
152
|
end
|
|
181
153
|
@default_service
|
|
@@ -187,7 +159,8 @@ module Datadog
|
|
|
187
159
|
#
|
|
188
160
|
# tracer.set_tags('env' => 'prod', 'component' => 'core')
|
|
189
161
|
def set_tags(tags)
|
|
190
|
-
|
|
162
|
+
string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
|
|
163
|
+
@tags = @tags.merge(string_tags)
|
|
191
164
|
end
|
|
192
165
|
|
|
193
166
|
# Guess context and parent from child_of entry.
|
|
@@ -239,8 +212,8 @@ module Datadog
|
|
|
239
212
|
# child span
|
|
240
213
|
span.parent = parent # sets service, trace_id, parent_id, sampled
|
|
241
214
|
end
|
|
242
|
-
|
|
243
|
-
|
|
215
|
+
span.set_tags(@tags) unless @tags.empty?
|
|
216
|
+
span.set_tags(tags) unless tags.empty?
|
|
244
217
|
span.start_time = start_time
|
|
245
218
|
|
|
246
219
|
# this could at some point be optional (start_active_span vs start_manual_span)
|
|
@@ -282,9 +255,11 @@ module Datadog
|
|
|
282
255
|
# * +service+: the service name for this span
|
|
283
256
|
# * +resource+: the resource this span refers, or \name if it's missing
|
|
284
257
|
# * +span_type+: the type of the span (such as \http, \db and so on)
|
|
258
|
+
# * +child_of+: a \Span or a \Context instance representing the parent for this span.
|
|
259
|
+
# If not set, defaults to Tracer.call_context
|
|
285
260
|
# * +tags+: extra tags which should be added to the span.
|
|
286
261
|
def trace(name, options = {})
|
|
287
|
-
options[:child_of]
|
|
262
|
+
options[:child_of] ||= call_context
|
|
288
263
|
|
|
289
264
|
# call the finish only if a block is given; this ensures
|
|
290
265
|
# that a call to tracer.trace() without a block, returns
|
|
@@ -296,11 +271,16 @@ module Datadog
|
|
|
296
271
|
begin
|
|
297
272
|
begin
|
|
298
273
|
span = start_span(name, options)
|
|
299
|
-
# rubocop:disable Lint/UselessAssignment
|
|
300
274
|
rescue StandardError => e
|
|
301
|
-
Datadog
|
|
275
|
+
Datadog.logger.debug("Failed to start span: #{e}")
|
|
302
276
|
ensure
|
|
303
|
-
|
|
277
|
+
# We should yield to the provided block when possible, as this
|
|
278
|
+
# block is application code that we don't want to hinder. We call:
|
|
279
|
+
# * `yield(span)` during normal execution.
|
|
280
|
+
# * `yield(nil)` if `start_span` fails with a runtime error.
|
|
281
|
+
# * We don't yield during a fatal error, as the application is likely trying to
|
|
282
|
+
# end its execution (either due to a system error or graceful shutdown).
|
|
283
|
+
return_value = yield(span) if span || e.is_a?(StandardError)
|
|
304
284
|
end
|
|
305
285
|
# rubocop:disable Lint/RescueException
|
|
306
286
|
# Here we really want to catch *any* exception, not only StandardError,
|
|
@@ -328,24 +308,20 @@ module Datadog
|
|
|
328
308
|
def record(context)
|
|
329
309
|
context = context.context if context.is_a?(Datadog::Span)
|
|
330
310
|
return if context.nil?
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
else
|
|
346
|
-
ready = !trace.nil? && !trace.empty? && sampled
|
|
347
|
-
write(trace) if ready
|
|
348
|
-
end
|
|
311
|
+
|
|
312
|
+
record_context(context)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# Consume trace from +context+, according to +@context_flush+
|
|
316
|
+
# criteria.
|
|
317
|
+
#
|
|
318
|
+
# \ContextFlush#consume! can return nil or an empty list if the
|
|
319
|
+
# trace is not available to flush or if the trace has not been
|
|
320
|
+
# chosen to be sampled.
|
|
321
|
+
def record_context(context)
|
|
322
|
+
trace = @context_flush.consume!(context)
|
|
323
|
+
|
|
324
|
+
write(trace) if @enabled && trace && !trace.empty?
|
|
349
325
|
end
|
|
350
326
|
|
|
351
327
|
# Return the current active span or +nil+.
|
|
@@ -366,13 +342,13 @@ module Datadog
|
|
|
366
342
|
# Send the trace to the writer to enqueue the spans list in the agent
|
|
367
343
|
# sending queue.
|
|
368
344
|
def write(trace)
|
|
369
|
-
return if @writer.nil?
|
|
345
|
+
return if @writer.nil?
|
|
370
346
|
|
|
371
|
-
if Datadog
|
|
372
|
-
Datadog
|
|
347
|
+
if Datadog.configuration.diagnostics.debug
|
|
348
|
+
Datadog.logger.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
|
|
373
349
|
str = String.new('')
|
|
374
350
|
PP.pp(trace, str)
|
|
375
|
-
Datadog
|
|
351
|
+
Datadog.logger.debug(str)
|
|
376
352
|
end
|
|
377
353
|
|
|
378
354
|
@writer.write(trace)
|
|
@@ -389,10 +365,10 @@ module Datadog
|
|
|
389
365
|
sampler = options.fetch(:sampler, nil)
|
|
390
366
|
priority_sampling = options.fetch(:priority_sampling, nil)
|
|
391
367
|
writer = options.fetch(:writer, nil)
|
|
392
|
-
transport_options = options.fetch(:transport_options, {})
|
|
368
|
+
transport_options = options.fetch(:transport_options, {}).dup
|
|
393
369
|
|
|
394
370
|
# Compile writer options
|
|
395
|
-
writer_options = options.fetch(:writer_options, {})
|
|
371
|
+
writer_options = options.fetch(:writer_options, {}).dup
|
|
396
372
|
rebuild_writer = !writer_options.empty?
|
|
397
373
|
|
|
398
374
|
# Re-build the sampler and writer if priority sampling is enabled,
|
|
@@ -441,7 +417,10 @@ module Datadog
|
|
|
441
417
|
@sampler = if base_sampler.is_a?(PrioritySampler)
|
|
442
418
|
base_sampler
|
|
443
419
|
else
|
|
444
|
-
PrioritySampler.new(
|
|
420
|
+
PrioritySampler.new(
|
|
421
|
+
base_sampler: base_sampler,
|
|
422
|
+
post_sampler: Sampling::RuleSampler.new
|
|
423
|
+
)
|
|
445
424
|
end
|
|
446
425
|
end
|
|
447
426
|
|
|
@@ -454,6 +433,7 @@ module Datadog
|
|
|
454
433
|
:configure_writer,
|
|
455
434
|
:deactivate_priority_sampling!,
|
|
456
435
|
:guess_context_and_parent,
|
|
436
|
+
:record_context,
|
|
457
437
|
:write
|
|
458
438
|
end
|
|
459
439
|
end
|
|
@@ -10,6 +10,7 @@ require 'ddtrace/transport/http/api'
|
|
|
10
10
|
require 'ddtrace/transport/http/adapters/net'
|
|
11
11
|
require 'ddtrace/transport/http/adapters/test'
|
|
12
12
|
require 'ddtrace/transport/http/adapters/unix_socket'
|
|
13
|
+
require 'uri'
|
|
13
14
|
|
|
14
15
|
module Datadog
|
|
15
16
|
module Transport
|
|
@@ -19,7 +20,7 @@ module Datadog
|
|
|
19
20
|
|
|
20
21
|
# Builds a new Transport::HTTP::Client
|
|
21
22
|
def new(&block)
|
|
22
|
-
Builder.new(&block).
|
|
23
|
+
Builder.new(&block).to_transport
|
|
23
24
|
end
|
|
24
25
|
|
|
25
26
|
# Builds a new Transport::HTTP::Client with default settings
|
|
@@ -75,13 +76,27 @@ module Datadog
|
|
|
75
76
|
end
|
|
76
77
|
|
|
77
78
|
def default_hostname
|
|
79
|
+
return default_url.hostname if default_url
|
|
80
|
+
|
|
78
81
|
ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_HOST, Datadog::Ext::Transport::HTTP::DEFAULT_HOST)
|
|
79
82
|
end
|
|
80
83
|
|
|
81
84
|
def default_port
|
|
85
|
+
return default_url.port if default_url
|
|
86
|
+
|
|
82
87
|
ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_PORT, Datadog::Ext::Transport::HTTP::DEFAULT_PORT).to_i
|
|
83
88
|
end
|
|
84
89
|
|
|
90
|
+
def default_url
|
|
91
|
+
url_env = ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL, nil)
|
|
92
|
+
|
|
93
|
+
if url_env
|
|
94
|
+
uri_parsed = URI.parse(url_env)
|
|
95
|
+
|
|
96
|
+
uri_parsed if %w[http https].include?(uri_parsed.scheme)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
85
100
|
# Add adapters to registry
|
|
86
101
|
Builder::REGISTRY.set(Adapters::Net, :net_http)
|
|
87
102
|
Builder::REGISTRY.set(Adapters::Test, :test)
|
|
@@ -47,6 +47,10 @@ module Datadog
|
|
|
47
47
|
Response.new(http_response)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
def url
|
|
51
|
+
"http://#{hostname}:#{port}?timeout=#{timeout}"
|
|
52
|
+
end
|
|
53
|
+
|
|
50
54
|
# Raised when called with an unknown HTTP method
|
|
51
55
|
class UnknownHTTPMethod < StandardError
|
|
52
56
|
attr_reader :verb
|
|
@@ -104,6 +108,10 @@ module Datadog
|
|
|
104
108
|
return super if http_response.nil?
|
|
105
109
|
code.between?(500, 599)
|
|
106
110
|
end
|
|
111
|
+
|
|
112
|
+
def inspect
|
|
113
|
+
"#{super}, http_response:#{http_response}"
|
|
114
|
+
end
|
|
107
115
|
end
|
|
108
116
|
end
|
|
109
117
|
end
|
|
@@ -33,6 +33,8 @@ module Datadog
|
|
|
33
33
|
@status = status
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
+
def url; end
|
|
37
|
+
|
|
36
38
|
# Response for test adapter
|
|
37
39
|
class Response
|
|
38
40
|
include Datadog::Transport::Response
|
|
@@ -69,6 +71,10 @@ module Datadog
|
|
|
69
71
|
def server_error?
|
|
70
72
|
code.between?(500, 599)
|
|
71
73
|
end
|
|
74
|
+
|
|
75
|
+
def inspect
|
|
76
|
+
"#{super}, code:#{code}"
|
|
77
|
+
end
|
|
72
78
|
end
|
|
73
79
|
end
|
|
74
80
|
end
|
|
@@ -70,13 +70,11 @@ module Datadog
|
|
|
70
70
|
@default_api = key
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
def
|
|
73
|
+
def to_transport
|
|
74
74
|
raise NoDefaultApiError if @default_api.nil?
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@default_api
|
|
79
|
-
)
|
|
76
|
+
# DEV: Should not be specific to traces
|
|
77
|
+
Transport::Traces::Transport.new(to_api_instances, @default_api)
|
|
80
78
|
end
|
|
81
79
|
|
|
82
80
|
def to_api_instances
|
|
@@ -8,42 +8,31 @@ module Datadog
|
|
|
8
8
|
class Client
|
|
9
9
|
include Transport::HTTP::Statistics
|
|
10
10
|
|
|
11
|
-
attr_reader
|
|
12
|
-
:apis,
|
|
13
|
-
:current_api_id
|
|
11
|
+
attr_reader :api
|
|
14
12
|
|
|
15
|
-
def initialize(
|
|
16
|
-
@
|
|
17
|
-
|
|
18
|
-
# Activate initial API
|
|
19
|
-
change_api!(current_api_id)
|
|
13
|
+
def initialize(api)
|
|
14
|
+
@api = api
|
|
20
15
|
end
|
|
21
16
|
|
|
22
17
|
def send_request(request, &block)
|
|
23
18
|
# Build request into env
|
|
24
19
|
env = build_env(request)
|
|
25
20
|
|
|
26
|
-
# Get
|
|
27
|
-
response = yield(
|
|
21
|
+
# Get responses from API
|
|
22
|
+
response = yield(api, env)
|
|
28
23
|
|
|
29
24
|
# Update statistics
|
|
30
25
|
update_stats_from_response!(response)
|
|
31
26
|
|
|
32
|
-
# If API should be downgraded, downgrade and try again.
|
|
33
|
-
if downgrade?(response)
|
|
34
|
-
downgrade!
|
|
35
|
-
response = send_request(request, &block)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
27
|
response
|
|
39
28
|
rescue StandardError => e
|
|
40
29
|
message = "Internal error during HTTP transport request. Cause: #{e.message} Location: #{e.backtrace.first}"
|
|
41
30
|
|
|
42
31
|
# Log error
|
|
43
32
|
if stats.consecutive_errors > 0
|
|
44
|
-
Datadog
|
|
33
|
+
Datadog.logger.debug(message)
|
|
45
34
|
else
|
|
46
|
-
Datadog
|
|
35
|
+
Datadog.logger.error(message)
|
|
47
36
|
end
|
|
48
37
|
|
|
49
38
|
# Update statistics
|
|
@@ -55,52 +44,6 @@ module Datadog
|
|
|
55
44
|
def build_env(request)
|
|
56
45
|
Env.new(request)
|
|
57
46
|
end
|
|
58
|
-
|
|
59
|
-
def downgrade?(response)
|
|
60
|
-
return false unless apis.fallbacks.key?(current_api_id)
|
|
61
|
-
response.not_found? || response.unsupported?
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def current_api
|
|
65
|
-
apis[current_api_id]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def change_api!(api_id)
|
|
69
|
-
raise UnknownApiVersionError, api_id unless apis.key?(api_id)
|
|
70
|
-
@current_api_id = api_id
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def downgrade!
|
|
74
|
-
downgrade_api_id = apis.fallbacks[current_api_id]
|
|
75
|
-
raise NoDowngradeAvailableError, current_api_id if downgrade_api_id.nil?
|
|
76
|
-
change_api!(downgrade_api_id)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Raised when configured with an unknown API version
|
|
80
|
-
class UnknownApiVersionError < StandardError
|
|
81
|
-
attr_reader :version
|
|
82
|
-
|
|
83
|
-
def initialize(version)
|
|
84
|
-
@version = version
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def message
|
|
88
|
-
"No matching transport API for version #{version}!"
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# Raised when configured with an unknown API version
|
|
93
|
-
class NoDowngradeAvailableError < StandardError
|
|
94
|
-
attr_reader :version
|
|
95
|
-
|
|
96
|
-
def initialize(version)
|
|
97
|
-
@version = version
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def message
|
|
101
|
-
"No downgrade from transport API version #{version} is available!"
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
47
|
end
|
|
105
48
|
end
|
|
106
49
|
end
|