ls-trace 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|