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
|
@@ -15,7 +15,7 @@ module Datadog
|
|
|
15
15
|
@http_response = http_response
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def_delegators :@http_response, *Transport::Response.instance_methods
|
|
18
|
+
def_delegators :@http_response, *Datadog::Transport::Response.instance_methods
|
|
19
19
|
|
|
20
20
|
def code
|
|
21
21
|
@http_response.respond_to?(:code) ? @http_response.code : nil
|
|
@@ -12,19 +12,18 @@ module Datadog
|
|
|
12
12
|
# Response from HTTP transport for traces
|
|
13
13
|
class Response
|
|
14
14
|
include HTTP::Response
|
|
15
|
-
include Transport::Traces::Response
|
|
15
|
+
include Datadog::Transport::Traces::Response
|
|
16
16
|
|
|
17
17
|
def initialize(http_response, options = {})
|
|
18
18
|
super(http_response)
|
|
19
19
|
@service_rates = options.fetch(:service_rates, nil)
|
|
20
|
+
@trace_count = options.fetch(:trace_count, 0)
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
# Extensions for HTTP client
|
|
24
25
|
module Client
|
|
25
|
-
def
|
|
26
|
-
request = Transport::Traces::Request.new(traces)
|
|
27
|
-
|
|
26
|
+
def send_payload(request)
|
|
28
27
|
send_request(request) do |api, env|
|
|
29
28
|
api.send_traces(env)
|
|
30
29
|
end
|
|
@@ -45,6 +44,10 @@ module Datadog
|
|
|
45
44
|
traces.call(env, &block)
|
|
46
45
|
end
|
|
47
46
|
|
|
47
|
+
def encoder
|
|
48
|
+
traces.encoder
|
|
49
|
+
end
|
|
50
|
+
|
|
48
51
|
# Raised when traces sent but no traces endpoint is defined
|
|
49
52
|
class NoTraceEndpointDefinedError < StandardError
|
|
50
53
|
attr_reader :spec
|
|
@@ -104,17 +107,17 @@ module Datadog
|
|
|
104
107
|
|
|
105
108
|
def call(env, &block)
|
|
106
109
|
# Add trace count header
|
|
107
|
-
env.headers[HEADER_TRACE_COUNT] = env.request.parcel.
|
|
110
|
+
env.headers[HEADER_TRACE_COUNT] = env.request.parcel.trace_count.to_s
|
|
108
111
|
|
|
109
112
|
# Encode body & type
|
|
110
113
|
env.headers[HEADER_CONTENT_TYPE] = encoder.content_type
|
|
111
|
-
env.body = env.request.parcel.
|
|
114
|
+
env.body = env.request.parcel.data
|
|
112
115
|
|
|
113
116
|
# Query for response
|
|
114
117
|
http_response = super(env, &block)
|
|
115
118
|
|
|
116
119
|
# Process the response
|
|
117
|
-
response_options = {}.tap do |options|
|
|
120
|
+
response_options = { trace_count: env.request.parcel.trace_count }.tap do |options|
|
|
118
121
|
# Parse service rates, if configured to do so.
|
|
119
122
|
if service_rates? && !http_response.payload.to_s.empty?
|
|
120
123
|
body = JSON.parse(http_response.payload)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'ddtrace/encoding'
|
|
2
|
+
require 'ddtrace/transport/io/client'
|
|
3
|
+
require 'ddtrace/transport/io/traces'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Transport
|
|
7
|
+
# Namespace for IO transport components
|
|
8
|
+
module IO
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
# Builds a new Transport::IO::Client
|
|
12
|
+
def new(out, encoder)
|
|
13
|
+
Client.new(out, encoder)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Builds a new Transport::IO::Client with default settings
|
|
17
|
+
# Pass options to override any settings.
|
|
18
|
+
def default(options = {})
|
|
19
|
+
new(
|
|
20
|
+
options.fetch(:out, STDOUT),
|
|
21
|
+
options.fetch(:encoder, Encoding::JSONEncoder)
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'ddtrace/transport/statistics'
|
|
2
|
+
require 'ddtrace/transport/io/response'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Transport
|
|
6
|
+
module IO
|
|
7
|
+
# Encodes and writes tracer data to IO
|
|
8
|
+
class Client
|
|
9
|
+
include Transport::Statistics
|
|
10
|
+
|
|
11
|
+
attr_reader \
|
|
12
|
+
:encoder,
|
|
13
|
+
:out
|
|
14
|
+
|
|
15
|
+
def initialize(out, encoder)
|
|
16
|
+
@out = out
|
|
17
|
+
@encoder = encoder
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def send_request(request)
|
|
21
|
+
# Write data to IO
|
|
22
|
+
# If block is given, allow it to handle writing
|
|
23
|
+
# Otherwise use default encoding.
|
|
24
|
+
response = if block_given?
|
|
25
|
+
yield(out, request)
|
|
26
|
+
else
|
|
27
|
+
send_default_request(out, request)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Update statistics
|
|
31
|
+
update_stats_from_response!(response)
|
|
32
|
+
|
|
33
|
+
# Return response
|
|
34
|
+
response
|
|
35
|
+
rescue StandardError => e
|
|
36
|
+
message = "Internal error during IO transport request. Cause: #{e.message} Location: #{e.backtrace.first}"
|
|
37
|
+
|
|
38
|
+
# Log error
|
|
39
|
+
if stats.consecutive_errors > 0
|
|
40
|
+
Datadog.logger.debug(message)
|
|
41
|
+
else
|
|
42
|
+
Datadog.logger.error(message)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Update statistics
|
|
46
|
+
update_stats_from_exception!(e)
|
|
47
|
+
|
|
48
|
+
InternalErrorResponse.new(e)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
protected
|
|
52
|
+
|
|
53
|
+
def encode_data(encoder, request)
|
|
54
|
+
request.parcel.encode_with(encoder)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def write_data(out, data)
|
|
58
|
+
out.puts(data)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def send_default_request(out, request)
|
|
64
|
+
# Encode data
|
|
65
|
+
data = encode_data(encoder, request)
|
|
66
|
+
|
|
67
|
+
# Write to IO
|
|
68
|
+
result = write_data(out, data)
|
|
69
|
+
|
|
70
|
+
# Generate a response
|
|
71
|
+
IO::Response.new(result)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'ddtrace/transport/response'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Transport
|
|
5
|
+
module IO
|
|
6
|
+
# Response from HTTP transport for traces
|
|
7
|
+
class Response
|
|
8
|
+
include Transport::Response
|
|
9
|
+
include Transport::Traces::Response
|
|
10
|
+
|
|
11
|
+
attr_reader \
|
|
12
|
+
:result
|
|
13
|
+
|
|
14
|
+
def initialize(result, trace_count = 1)
|
|
15
|
+
@result = result
|
|
16
|
+
@trace_count = trace_count
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def ok?
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'ddtrace/transport/traces'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/transport/io/response'
|
|
4
|
+
require 'ddtrace/transport/io/client'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Transport
|
|
8
|
+
module IO
|
|
9
|
+
# IO transport behavior for traces
|
|
10
|
+
module Traces
|
|
11
|
+
# Response from HTTP transport for traces
|
|
12
|
+
class Response < IO::Response
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Extensions for HTTP client
|
|
16
|
+
module Client
|
|
17
|
+
def send_traces(traces)
|
|
18
|
+
# Build a request
|
|
19
|
+
req = Transport::Traces::Request.new(Parcel.new(traces))
|
|
20
|
+
|
|
21
|
+
[send_request(req) do |out, request|
|
|
22
|
+
# Encode trace data
|
|
23
|
+
data = encode_data(encoder, request)
|
|
24
|
+
|
|
25
|
+
# Write to IO
|
|
26
|
+
result = if block_given?
|
|
27
|
+
yield(out, data)
|
|
28
|
+
else
|
|
29
|
+
write_data(out, data)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Generate response
|
|
33
|
+
Traces::Response.new(result)
|
|
34
|
+
end]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Encoder for IO-specific trace encoding
|
|
39
|
+
# API compliant when used with {JSONEncoder}.
|
|
40
|
+
module Encoder
|
|
41
|
+
ENCODED_IDS = [
|
|
42
|
+
:trace_id,
|
|
43
|
+
:span_id,
|
|
44
|
+
:parent_id
|
|
45
|
+
].freeze
|
|
46
|
+
|
|
47
|
+
# Encodes a list of traces
|
|
48
|
+
def encode_traces(encoder, traces)
|
|
49
|
+
trace_hashes = traces.map do |trace|
|
|
50
|
+
encode_trace(trace)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Wrap traces & encode them
|
|
54
|
+
encoder.encode(traces: trace_hashes)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def encode_trace(trace)
|
|
60
|
+
# Convert each trace to hash
|
|
61
|
+
trace.map(&:to_hash).tap do |spans|
|
|
62
|
+
# Convert IDs to hexadecimal
|
|
63
|
+
spans.each do |span|
|
|
64
|
+
ENCODED_IDS.each do |id|
|
|
65
|
+
span[id] = span[id].to_s(16) if span.key?(id)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Transfer object for list of traces
|
|
73
|
+
class Parcel
|
|
74
|
+
include Transport::Parcel
|
|
75
|
+
include Encoder
|
|
76
|
+
|
|
77
|
+
def count
|
|
78
|
+
data.length
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def encode_with(encoder)
|
|
82
|
+
encode_traces(encoder, data)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Add traces behavior to transport components
|
|
87
|
+
IO::Client.send(:include, Traces::Client)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -29,6 +29,13 @@ module Datadog
|
|
|
29
29
|
def internal_error?
|
|
30
30
|
nil
|
|
31
31
|
end
|
|
32
|
+
|
|
33
|
+
def inspect
|
|
34
|
+
"#{self.class} ok?:#{ok?} unsupported?:#{unsupported?}, " \
|
|
35
|
+
"not_found?:#{not_found?}, client_error?:#{client_error?}, " \
|
|
36
|
+
"server_error?:#{server_error?}, internal_error?:#{internal_error?}, " \
|
|
37
|
+
"payload:#{payload}"
|
|
38
|
+
end
|
|
32
39
|
end
|
|
33
40
|
|
|
34
41
|
# A generic error response for internal errors
|
|
@@ -44,6 +51,10 @@ module Datadog
|
|
|
44
51
|
def internal_error?
|
|
45
52
|
true
|
|
46
53
|
end
|
|
54
|
+
|
|
55
|
+
def inspect
|
|
56
|
+
"#{super}, error_type:#{error.class} error:#{error}"
|
|
57
|
+
end
|
|
47
58
|
end
|
|
48
59
|
end
|
|
49
60
|
end
|
|
@@ -20,7 +20,7 @@ module Datadog
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
# Send health metrics
|
|
23
|
-
|
|
23
|
+
Datadog.health_metrics.send_metrics(
|
|
24
24
|
metrics_for_response(response).values
|
|
25
25
|
)
|
|
26
26
|
end
|
|
@@ -37,7 +37,7 @@ module Datadog
|
|
|
37
37
|
stats.consecutive_errors += 1
|
|
38
38
|
|
|
39
39
|
# Send health metrics
|
|
40
|
-
|
|
40
|
+
Datadog.health_metrics.send_metrics(
|
|
41
41
|
metrics_for_exception(exception).values
|
|
42
42
|
)
|
|
43
43
|
end
|
|
@@ -1,32 +1,182 @@
|
|
|
1
1
|
require 'ddtrace/transport/parcel'
|
|
2
2
|
require 'ddtrace/transport/request'
|
|
3
|
+
require 'ddtrace/chunker'
|
|
3
4
|
|
|
4
5
|
module Datadog
|
|
5
6
|
module Transport
|
|
6
7
|
module Traces
|
|
7
|
-
# Data transfer object for
|
|
8
|
-
class
|
|
8
|
+
# Data transfer object for encoded traces
|
|
9
|
+
class EncodedParcel
|
|
9
10
|
include Transport::Parcel
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
attr_reader :trace_count
|
|
13
|
+
|
|
14
|
+
def initialize(data, trace_count)
|
|
15
|
+
super(data)
|
|
16
|
+
@trace_count = trace_count
|
|
13
17
|
end
|
|
14
18
|
|
|
15
|
-
def
|
|
16
|
-
|
|
19
|
+
def count
|
|
20
|
+
data.length
|
|
17
21
|
end
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
# Traces request
|
|
21
25
|
class Request < Transport::Request
|
|
22
|
-
def initialize(traces)
|
|
23
|
-
super(Parcel.new(traces))
|
|
24
|
-
end
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
# Traces response
|
|
28
29
|
module Response
|
|
29
|
-
attr_reader :service_rates
|
|
30
|
+
attr_reader :service_rates, :trace_count
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Traces chunker
|
|
34
|
+
class Chunker
|
|
35
|
+
# Trace agent limit payload size of 10 MiB (since agent v5.11.0):
|
|
36
|
+
# https://github.com/DataDog/datadog-agent/blob/6.14.1/pkg/trace/api/api.go#L46
|
|
37
|
+
#
|
|
38
|
+
# We set the value to a conservative 5 MiB, in case network speed is slow.
|
|
39
|
+
DEFAULT_MAX_PAYLOAD_SIZE = 5 * 1024 * 1024
|
|
40
|
+
|
|
41
|
+
attr_reader :encoder, :max_size
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Single traces larger than +max_size+ will be discarded.
|
|
45
|
+
#
|
|
46
|
+
# @param encoder [Datadog::Encoding::Encoder]
|
|
47
|
+
# @param max_size [String] maximum acceptable payload size
|
|
48
|
+
def initialize(encoder, max_size: DEFAULT_MAX_PAYLOAD_SIZE)
|
|
49
|
+
@encoder = encoder
|
|
50
|
+
@max_size = max_size
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Encodes a list of traces in chunks.
|
|
54
|
+
# Before serializing, all traces are normalized. Trace nesting is not changed.
|
|
55
|
+
#
|
|
56
|
+
# @param traces [Enumerable<Trace>] list of traces
|
|
57
|
+
# @return [Enumerable[Array[Bytes,Integer]]] list of encoded chunks: each containing a byte array and
|
|
58
|
+
# number of traces
|
|
59
|
+
def encode_in_chunks(traces)
|
|
60
|
+
encoded_traces = traces.map { |t| encode_one(t) }.reject(&:nil?)
|
|
61
|
+
|
|
62
|
+
Datadog::Chunker.chunk_by_size(encoded_traces, max_size).map do |chunk|
|
|
63
|
+
[encoder.join(chunk), chunk.size]
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def encode_one(trace)
|
|
70
|
+
encoded = Encoder.encode_trace(encoder, trace)
|
|
71
|
+
|
|
72
|
+
if encoded.size > max_size
|
|
73
|
+
# This single trace is too large, we can't flush it
|
|
74
|
+
Datadog.logger.debug { "Dropping trace. Payload too large: '#{trace.map(&:to_hash)}'" }
|
|
75
|
+
Datadog.health_metrics.transport_trace_too_large(1)
|
|
76
|
+
|
|
77
|
+
return nil
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
encoded
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Encodes traces using {Datadog::Encoding::Encoder} instances.
|
|
85
|
+
module Encoder
|
|
86
|
+
module_function
|
|
87
|
+
|
|
88
|
+
def encode_trace(encoder, trace)
|
|
89
|
+
encoder.encode(trace.map(&:to_hash))
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Sends traces based on transport API configuration.
|
|
94
|
+
#
|
|
95
|
+
# This class initializes the HTTP client, breaks down large
|
|
96
|
+
# batches of traces into smaller chunks and handles
|
|
97
|
+
# API version downgrade handshake.
|
|
98
|
+
class Transport
|
|
99
|
+
attr_reader :client, :apis, :default_api, :current_api_id
|
|
100
|
+
|
|
101
|
+
def initialize(apis, default_api)
|
|
102
|
+
@apis = apis
|
|
103
|
+
@default_api = default_api
|
|
104
|
+
|
|
105
|
+
change_api!(default_api)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def send_traces(traces)
|
|
109
|
+
encoder = current_api.encoder
|
|
110
|
+
chunker = Datadog::Transport::Traces::Chunker.new(encoder)
|
|
111
|
+
|
|
112
|
+
responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count|
|
|
113
|
+
request = Request.new(EncodedParcel.new(encoded_traces, trace_count))
|
|
114
|
+
|
|
115
|
+
client.send_payload(request).tap do |response|
|
|
116
|
+
if downgrade?(response)
|
|
117
|
+
downgrade!
|
|
118
|
+
return send_traces(traces)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end.force
|
|
122
|
+
|
|
123
|
+
Datadog.health_metrics.transport_chunked(responses.size)
|
|
124
|
+
|
|
125
|
+
responses
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def stats
|
|
129
|
+
@client.stats
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def current_api
|
|
133
|
+
apis[@current_api_id]
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
private
|
|
137
|
+
|
|
138
|
+
def downgrade?(response)
|
|
139
|
+
return false unless apis.fallbacks.key?(@current_api_id)
|
|
140
|
+
response.not_found? || response.unsupported?
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def downgrade!
|
|
144
|
+
downgrade_api_id = apis.fallbacks[@current_api_id]
|
|
145
|
+
raise NoDowngradeAvailableError, @current_api_id if downgrade_api_id.nil?
|
|
146
|
+
change_api!(downgrade_api_id)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def change_api!(api_id)
|
|
150
|
+
raise UnknownApiVersionError, api_id unless apis.key?(api_id)
|
|
151
|
+
@current_api_id = api_id
|
|
152
|
+
@client = HTTP::Client.new(current_api)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Raised when configured with an unknown API version
|
|
156
|
+
class UnknownApiVersionError < StandardError
|
|
157
|
+
attr_reader :version
|
|
158
|
+
|
|
159
|
+
def initialize(version)
|
|
160
|
+
@version = version
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def message
|
|
164
|
+
"No matching transport API for version #{version}!"
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Raised when configured with an unknown API version
|
|
169
|
+
class NoDowngradeAvailableError < StandardError
|
|
170
|
+
attr_reader :version
|
|
171
|
+
|
|
172
|
+
def initialize(version)
|
|
173
|
+
@version = version
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def message
|
|
177
|
+
"No downgrade from transport API version #{version} is available!"
|
|
178
|
+
end
|
|
179
|
+
end
|
|
30
180
|
end
|
|
31
181
|
end
|
|
32
182
|
end
|