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
|
@@ -9,18 +9,20 @@ module Datadog
|
|
|
9
9
|
class Integration
|
|
10
10
|
include Contrib::Integration
|
|
11
11
|
|
|
12
|
+
MINIMUM_VERSION = Gem::Version.new('3.5.4')
|
|
13
|
+
|
|
12
14
|
register_as :sidekiq
|
|
13
15
|
|
|
14
16
|
def self.version
|
|
15
17
|
Gem.loaded_specs['sidekiq'] && Gem.loaded_specs['sidekiq'].version
|
|
16
18
|
end
|
|
17
19
|
|
|
18
|
-
def self.
|
|
19
|
-
|
|
20
|
+
def self.loaded?
|
|
21
|
+
!defined?(::Sidekiq).nil?
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
def self.compatible?
|
|
23
|
-
super && version >=
|
|
25
|
+
super && version >= MINIMUM_VERSION
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
def default_configuration
|
|
@@ -9,28 +9,29 @@ module Datadog
|
|
|
9
9
|
|
|
10
10
|
module_function
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
|
|
12
|
+
def target_version
|
|
13
|
+
Integration.version
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def patch
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
require 'ddtrace/contrib/sidekiq/client_tracer'
|
|
20
|
-
::Sidekiq.configure_client do |config|
|
|
21
|
-
config.client_middleware do |chain|
|
|
22
|
-
chain.add(Sidekiq::ClientTracer)
|
|
23
|
-
end
|
|
24
|
-
end
|
|
17
|
+
require 'ddtrace/contrib/sidekiq/client_tracer'
|
|
18
|
+
require 'ddtrace/contrib/sidekiq/server_tracer'
|
|
25
19
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
20
|
+
::Sidekiq.configure_client do |config|
|
|
21
|
+
config.client_middleware do |chain|
|
|
22
|
+
chain.add(Sidekiq::ClientTracer)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
::Sidekiq.configure_server do |config|
|
|
27
|
+
# If a job enqueues another job, make sure it has the same client
|
|
28
|
+
# middleware.
|
|
29
|
+
config.client_middleware do |chain|
|
|
30
|
+
chain.add(Sidekiq::ClientTracer)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
config.server_middleware do |chain|
|
|
34
|
+
chain.add(Sidekiq::ServerTracer)
|
|
34
35
|
end
|
|
35
36
|
end
|
|
36
37
|
end
|
|
@@ -16,7 +16,8 @@ module Datadog
|
|
|
16
16
|
def call(worker, job, queue)
|
|
17
17
|
resource = job_resource(job)
|
|
18
18
|
|
|
19
|
-
service =
|
|
19
|
+
service = worker_config(resource, :service_name) || @sidekiq_service
|
|
20
|
+
tag_args = worker_config(resource, :tag_args) || configuration[:tag_args]
|
|
20
21
|
|
|
21
22
|
@tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
|
|
22
23
|
span.resource = resource
|
|
@@ -24,11 +25,19 @@ module Datadog
|
|
|
24
25
|
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
25
26
|
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
26
27
|
end
|
|
28
|
+
|
|
29
|
+
# Measure service stats
|
|
30
|
+
Contrib::Analytics.set_measured(span)
|
|
31
|
+
|
|
27
32
|
span.set_tag(Ext::TAG_JOB_ID, job['jid'])
|
|
28
33
|
span.set_tag(Ext::TAG_JOB_RETRY, job['retry'])
|
|
34
|
+
span.set_tag(Ext::TAG_JOB_RETRY_COUNT, job['retry_count'])
|
|
29
35
|
span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
|
|
30
36
|
span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
|
|
31
37
|
span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
|
|
38
|
+
if tag_args && !job['args'].nil? && !job['args'].empty?
|
|
39
|
+
span.set_tag(Ext::TAG_JOB_ARGS, job['args'])
|
|
40
|
+
end
|
|
32
41
|
|
|
33
42
|
yield
|
|
34
43
|
end
|
|
@@ -40,7 +49,7 @@ module Datadog
|
|
|
40
49
|
Datadog.configuration[:sidekiq]
|
|
41
50
|
end
|
|
42
51
|
|
|
43
|
-
def
|
|
52
|
+
def worker_config(resource, key)
|
|
44
53
|
# Try to get the Ruby class from the resource name.
|
|
45
54
|
worker_klass = begin
|
|
46
55
|
Object.const_get(resource)
|
|
@@ -49,7 +58,7 @@ module Datadog
|
|
|
49
58
|
end
|
|
50
59
|
|
|
51
60
|
if worker_klass.respond_to?(:datadog_tracer_config)
|
|
52
|
-
worker_klass.datadog_tracer_config[
|
|
61
|
+
worker_klass.datadog_tracer_config[key]
|
|
53
62
|
end
|
|
54
63
|
end
|
|
55
64
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
require 'ddtrace/ext/app_types'
|
|
2
2
|
require 'ddtrace/contrib/sidekiq/ext'
|
|
3
3
|
|
|
4
|
+
require 'yaml'
|
|
5
|
+
|
|
4
6
|
module Datadog
|
|
5
7
|
module Contrib
|
|
6
8
|
module Sidekiq
|
|
@@ -17,10 +19,25 @@ module Datadog
|
|
|
17
19
|
# primarily to support `ActiveJob`.
|
|
18
20
|
def job_resource(job)
|
|
19
21
|
if job['wrapped']
|
|
20
|
-
job['wrapped']
|
|
22
|
+
job['wrapped'].to_s
|
|
23
|
+
elsif job['class'] == 'Sidekiq::Extensions::DelayedClass'
|
|
24
|
+
delay_extension_class(job).to_s
|
|
21
25
|
else
|
|
22
|
-
job['class']
|
|
26
|
+
job['class'].to_s
|
|
23
27
|
end
|
|
28
|
+
rescue => e
|
|
29
|
+
Datadog.logger.debug { "Error retrieving Sidekiq job class name (jid:#{job['jid']}): #{e}" }
|
|
30
|
+
|
|
31
|
+
job['class'].to_s
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
def delay_extension_class(job)
|
|
36
|
+
clazz, method = YAML.parse(job['args'].first).children.first.children
|
|
37
|
+
|
|
38
|
+
method = method.value[1..-1] # Remove leading `:` from method symbol
|
|
39
|
+
|
|
40
|
+
"#{clazz.value}.#{method}"
|
|
24
41
|
end
|
|
25
42
|
end
|
|
26
43
|
end
|
|
@@ -12,13 +12,18 @@ module Datadog
|
|
|
12
12
|
response: %w[Content-Type X-Request-ID]
|
|
13
13
|
}.freeze
|
|
14
14
|
|
|
15
|
+
option :enabled do |o|
|
|
16
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
17
|
+
o.lazy
|
|
18
|
+
end
|
|
19
|
+
|
|
15
20
|
option :analytics_enabled do |o|
|
|
16
|
-
o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
|
|
21
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
|
|
17
22
|
o.lazy
|
|
18
23
|
end
|
|
19
24
|
|
|
20
25
|
option :analytics_sample_rate do |o|
|
|
21
|
-
o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
|
|
26
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
22
27
|
o.lazy
|
|
23
28
|
end
|
|
24
29
|
|
|
@@ -8,12 +8,13 @@ module Datadog
|
|
|
8
8
|
module Env
|
|
9
9
|
module_function
|
|
10
10
|
|
|
11
|
-
def datadog_span(env)
|
|
12
|
-
env[Ext::RACK_ENV_REQUEST_SPAN]
|
|
11
|
+
def datadog_span(env, app)
|
|
12
|
+
env[Ext::RACK_ENV_REQUEST_SPAN][app]
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def set_datadog_span(env, span)
|
|
16
|
-
env[Ext::RACK_ENV_REQUEST_SPAN]
|
|
15
|
+
def set_datadog_span(env, app, span)
|
|
16
|
+
hash = (env[Ext::RACK_ENV_REQUEST_SPAN] ||= {})
|
|
17
|
+
hash[app] = span
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def request_header_tags(env, headers)
|
|
@@ -32,6 +33,26 @@ module Datadog
|
|
|
32
33
|
def header_to_rack_header(name)
|
|
33
34
|
"HTTP_#{name.to_s.upcase.gsub(/[-\s]/, '_')}"
|
|
34
35
|
end
|
|
36
|
+
|
|
37
|
+
# Was a Sinatra already traced in this request?
|
|
38
|
+
# We don't want to create spans for intermediate Sinatra
|
|
39
|
+
# middlewares that don't match the request at hand.
|
|
40
|
+
def middleware_traced?(env)
|
|
41
|
+
env[Ext::RACK_ENV_MIDDLEWARE_TRACED]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def set_middleware_traced(env, bool)
|
|
45
|
+
env[Ext::RACK_ENV_MIDDLEWARE_TRACED] = bool
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# The start time of the top-most Sinatra middleware.
|
|
49
|
+
def middleware_start_time(env)
|
|
50
|
+
env[Ext::RACK_ENV_MIDDLEWARE_START_TIME]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def set_middleware_start_time(env, time = Time.now.utc)
|
|
54
|
+
env[Ext::RACK_ENV_MIDDLEWARE_START_TIME] = time
|
|
55
|
+
end
|
|
35
56
|
end
|
|
36
57
|
end
|
|
37
58
|
end
|
|
@@ -4,13 +4,22 @@ module Datadog
|
|
|
4
4
|
# Sinatra integration constants
|
|
5
5
|
module Ext
|
|
6
6
|
APP = 'sinatra'.freeze
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
ENV_ENABLED = 'DD_TRACE_SINATRA_ENABLED'.freeze
|
|
8
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_SINATRA_ANALYTICS_ENABLED'.freeze
|
|
9
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_SINATRA_ANALYTICS_ENABLED'.freeze
|
|
10
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SINATRA_ANALYTICS_SAMPLE_RATE'.freeze
|
|
11
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SINATRA_ANALYTICS_SAMPLE_RATE'.freeze
|
|
9
12
|
RACK_ENV_REQUEST_SPAN = 'datadog.sinatra_request_span'.freeze
|
|
13
|
+
RACK_ENV_MIDDLEWARE_START_TIME = 'datadog.sinatra_middleware_start_time'.freeze
|
|
14
|
+
RACK_ENV_MIDDLEWARE_TRACED = 'datadog.sinatra_middleware_traced'.freeze
|
|
10
15
|
SERVICE_NAME = 'sinatra'.freeze
|
|
11
16
|
SPAN_RENDER_TEMPLATE = 'sinatra.render_template'.freeze
|
|
12
17
|
SPAN_REQUEST = 'sinatra.request'.freeze
|
|
18
|
+
SPAN_ROUTE = 'sinatra.route'.freeze
|
|
19
|
+
TAG_APP_NAME = 'sinatra.app.name'.freeze
|
|
13
20
|
TAG_ROUTE_PATH = 'sinatra.route.path'.freeze
|
|
21
|
+
TAG_SCRIPT_NAME = 'sinatra.script_name'.freeze
|
|
22
|
+
TAG_TEMPLATE_ENGINE = 'sinatra.template_engine'.freeze
|
|
14
23
|
TAG_TEMPLATE_NAME = 'sinatra.template_name'.freeze
|
|
15
24
|
end
|
|
16
25
|
end
|
|
@@ -9,18 +9,20 @@ module Datadog
|
|
|
9
9
|
class Integration
|
|
10
10
|
include Contrib::Integration
|
|
11
11
|
|
|
12
|
+
MINIMUM_VERSION = Gem::Version.new('1.4')
|
|
13
|
+
|
|
12
14
|
register_as :sinatra
|
|
13
15
|
|
|
14
16
|
def self.version
|
|
15
17
|
Gem.loaded_specs['sinatra'] && Gem.loaded_specs['sinatra'].version
|
|
16
18
|
end
|
|
17
19
|
|
|
18
|
-
def self.
|
|
19
|
-
|
|
20
|
+
def self.loaded?
|
|
21
|
+
!defined?(::Sinatra).nil?
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
def self.compatible?
|
|
23
|
-
super && version >=
|
|
25
|
+
super && version >= MINIMUM_VERSION
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
def default_configuration
|
|
@@ -9,23 +9,18 @@ module Datadog
|
|
|
9
9
|
|
|
10
10
|
module_function
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
|
|
12
|
+
def target_version
|
|
13
|
+
Integration.version
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def patch
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
require 'ddtrace/contrib/sinatra/tracer'
|
|
20
|
-
register_tracer
|
|
21
|
-
rescue StandardError => e
|
|
22
|
-
Datadog::Tracer.log.error("Unable to apply Sinatra integration: #{e}")
|
|
23
|
-
end
|
|
24
|
-
end
|
|
17
|
+
require 'ddtrace/contrib/sinatra/tracer'
|
|
18
|
+
register_tracer
|
|
25
19
|
end
|
|
26
20
|
|
|
27
21
|
def register_tracer
|
|
28
22
|
::Sinatra.send(:register, Datadog::Contrib::Sinatra::Tracer)
|
|
23
|
+
::Sinatra::Base.send(:prepend, Sinatra::Tracer::Base)
|
|
29
24
|
end
|
|
30
25
|
end
|
|
31
26
|
end
|
|
@@ -21,6 +21,10 @@ module Datadog
|
|
|
21
21
|
condition do
|
|
22
22
|
# If the option to prepend script names is enabled, then
|
|
23
23
|
# prepend the script name from the request onto the action.
|
|
24
|
+
#
|
|
25
|
+
# DEV: env['sinatra.route'] already exists with very similar information,
|
|
26
|
+
# DEV: but doesn't account for our `resource_script_names` logic.
|
|
27
|
+
#
|
|
24
28
|
@datadog_route = if Datadog.configuration[:sinatra][:resource_script_names]
|
|
25
29
|
"#{request.script_name}#{action}"
|
|
26
30
|
else
|
|
@@ -32,50 +36,91 @@ module Datadog
|
|
|
32
36
|
end
|
|
33
37
|
|
|
34
38
|
def self.registered(app)
|
|
35
|
-
|
|
36
|
-
def render(engine, data, *)
|
|
37
|
-
output = ''
|
|
38
|
-
tracer = Datadog.configuration[:sinatra][:tracer]
|
|
39
|
-
if tracer.enabled
|
|
40
|
-
tracer.trace(Ext::SPAN_RENDER_TEMPLATE, span_type: Datadog::Ext::HTTP::TEMPLATE) do |span|
|
|
41
|
-
# If data is a string, it is a literal template and we don't
|
|
42
|
-
# want to record it.
|
|
43
|
-
span.set_tag(Ext::TAG_TEMPLATE_NAME, data) if data.is_a? Symbol
|
|
44
|
-
|
|
45
|
-
output = super
|
|
46
|
-
end
|
|
47
|
-
else
|
|
48
|
-
output = super
|
|
49
|
-
end
|
|
39
|
+
app.use TracerMiddleware, app_instance: app
|
|
50
40
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
41
|
+
app.after do
|
|
42
|
+
configuration = Datadog.configuration[:sinatra]
|
|
43
|
+
next unless configuration[:tracer].enabled
|
|
54
44
|
|
|
55
|
-
|
|
45
|
+
span = Sinatra::Env.datadog_span(env, app)
|
|
56
46
|
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
# TODO: `route` should *only* be populated if @datadog_route is defined.
|
|
48
|
+
# TODO: If @datadog_route is not defined, then this Sinatra app is not responsible
|
|
49
|
+
# TODO: for handling this request.
|
|
50
|
+
# TODO:
|
|
51
|
+
# TODO: This change would be BREAKING for any Sinatra app (classic or modular),
|
|
52
|
+
# TODO: as it affects the `resource` value for requests not handled by the Sinatra app.
|
|
53
|
+
# TODO: Currently we use "#{method} #{path}" in such aces, but `path` is the raw,
|
|
54
|
+
# TODO: high-cardinality HTTP path, and can contain PII.
|
|
55
|
+
# TODO:
|
|
56
|
+
# TODO: The value we should use as the `resource` when the Sinatra app is not
|
|
57
|
+
# TODO: responsible for the request is a tricky subject.
|
|
58
|
+
# TODO: The best option is a value that clearly communicates that this app did not
|
|
59
|
+
# TODO: handle this request. It's important to keep in mind that an unhandled request
|
|
60
|
+
# TODO: by this Sinatra app might still be handled by another Rack middleware (which can
|
|
61
|
+
# TODO: be a Sinatra app itself) or it might just 404 if not handled at all.
|
|
62
|
+
# TODO:
|
|
63
|
+
# TODO: A possible value for `resource` could set a high level description, e.g.
|
|
64
|
+
# TODO: `request.request_method`, given we don't have the response object available yet.
|
|
65
|
+
route = if defined?(@datadog_route)
|
|
66
|
+
@datadog_route
|
|
67
|
+
else
|
|
68
|
+
# Fallback in case no routes have matched
|
|
69
|
+
request.path
|
|
70
|
+
end
|
|
59
71
|
|
|
60
|
-
span =
|
|
61
|
-
span.set_tag(
|
|
62
|
-
span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
|
|
72
|
+
span.resource = "#{request.request_method} #{route}"
|
|
73
|
+
span.set_tag(Ext::TAG_ROUTE_PATH, route)
|
|
63
74
|
end
|
|
75
|
+
end
|
|
64
76
|
|
|
65
|
-
|
|
66
|
-
|
|
77
|
+
# Method overrides for Sinatra::Base
|
|
78
|
+
module Base
|
|
79
|
+
def render(engine, data, *)
|
|
80
|
+
tracer = Datadog.configuration[:sinatra][:tracer]
|
|
81
|
+
return super unless tracer.enabled
|
|
82
|
+
|
|
83
|
+
tracer.trace(Ext::SPAN_RENDER_TEMPLATE, span_type: Datadog::Ext::HTTP::TEMPLATE) do |span|
|
|
84
|
+
span.set_tag(Ext::TAG_TEMPLATE_ENGINE, engine)
|
|
85
|
+
|
|
86
|
+
# If data is a string, it is a literal template and we don't
|
|
87
|
+
# want to record it.
|
|
88
|
+
span.set_tag(Ext::TAG_TEMPLATE_NAME, data) if data.is_a? Symbol
|
|
67
89
|
|
|
68
|
-
|
|
90
|
+
# Measure service stats
|
|
91
|
+
Contrib::Analytics.set_measured(span)
|
|
69
92
|
|
|
70
|
-
|
|
71
|
-
Datadog::Tracer.log.error('missing request span in :after hook')
|
|
72
|
-
return
|
|
93
|
+
super
|
|
73
94
|
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Invoked when a matching route is found.
|
|
98
|
+
# This method yields directly to user code.
|
|
99
|
+
def route_eval
|
|
100
|
+
configuration = Datadog.configuration[:sinatra]
|
|
101
|
+
tracer = configuration[:tracer]
|
|
102
|
+
return super unless tracer.enabled
|
|
103
|
+
|
|
104
|
+
tracer.trace(
|
|
105
|
+
Ext::SPAN_ROUTE,
|
|
106
|
+
service: configuration[:service_name],
|
|
107
|
+
span_type: Datadog::Ext::HTTP::TYPE_INBOUND
|
|
108
|
+
) do |span|
|
|
109
|
+
span.resource = "#{request.request_method} #{@datadog_route}"
|
|
110
|
+
|
|
111
|
+
span.set_tag(Ext::TAG_APP_NAME, settings.name || settings.superclass.name)
|
|
112
|
+
span.set_tag(Ext::TAG_ROUTE_PATH, @datadog_route)
|
|
113
|
+
if request.script_name && !request.script_name.empty?
|
|
114
|
+
span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
|
|
118
|
+
rack_request_span.resource = span.resource if rack_request_span
|
|
74
119
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
120
|
+
Contrib::Analytics.set_measured(span)
|
|
121
|
+
|
|
122
|
+
super
|
|
123
|
+
end
|
|
79
124
|
end
|
|
80
125
|
end
|
|
81
126
|
end
|
|
@@ -8,10 +8,13 @@ module Datadog
|
|
|
8
8
|
module Sinatra
|
|
9
9
|
# Middleware used for automatically tagging configured headers and handle request span
|
|
10
10
|
class TracerMiddleware
|
|
11
|
-
def initialize(app)
|
|
11
|
+
def initialize(app, app_instance: nil)
|
|
12
12
|
@app = app
|
|
13
|
+
@app_instance = app_instance
|
|
13
14
|
end
|
|
14
15
|
|
|
16
|
+
# rubocop:disable Metrics/AbcSize
|
|
17
|
+
# rubocop:disable Metrics/MethodLength
|
|
15
18
|
def call(env)
|
|
16
19
|
# Set the trace context (e.g. distributed tracing)
|
|
17
20
|
if configuration[:distributed_tracing] && tracer.provider.context.trace_id.nil?
|
|
@@ -19,29 +22,59 @@ module Datadog
|
|
|
19
22
|
tracer.provider.context = context if context.trace_id
|
|
20
23
|
end
|
|
21
24
|
|
|
22
|
-
# Begin the trace
|
|
23
25
|
tracer.trace(
|
|
24
26
|
Ext::SPAN_REQUEST,
|
|
25
27
|
service: configuration[:service_name],
|
|
26
|
-
span_type: Datadog::Ext::HTTP::TYPE_INBOUND
|
|
28
|
+
span_type: Datadog::Ext::HTTP::TYPE_INBOUND,
|
|
29
|
+
resource: env['REQUEST_METHOD']
|
|
27
30
|
) do |span|
|
|
28
|
-
|
|
31
|
+
begin
|
|
32
|
+
Sinatra::Env.set_datadog_span(env, @app_instance, span)
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
response = @app.call(env)
|
|
35
|
+
ensure
|
|
36
|
+
Sinatra::Env.request_header_tags(env, configuration[:headers][:request]).each do |name, value|
|
|
37
|
+
span.set_tag(name, value) if span.get_tag(name).nil?
|
|
38
|
+
end
|
|
33
39
|
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
request = ::Sinatra::Request.new(env)
|
|
41
|
+
span.set_tag(Datadog::Ext::HTTP::URL, request.path)
|
|
42
|
+
span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
|
|
43
|
+
if request.script_name && !request.script_name.empty?
|
|
44
|
+
span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
|
|
45
|
+
end
|
|
36
46
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
span.set_tag(Ext::TAG_APP_NAME, @app_instance.settings.name)
|
|
48
|
+
|
|
49
|
+
# TODO: This backfills the non-matching Sinatra app with a "#{method} #{path}"
|
|
50
|
+
# TODO: resource name. This shouldn't be the case, as that app has never handled
|
|
51
|
+
# TODO: the response with that resource.
|
|
52
|
+
# TODO: We should replace this backfill code with a clear `resource` that signals
|
|
53
|
+
# TODO: that this Sinatra span was *not* responsible for processing the current request.
|
|
54
|
+
rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
|
|
55
|
+
span.resource = rack_request_span.resource if rack_request_span && rack_request_span.resource
|
|
56
|
+
|
|
57
|
+
if response
|
|
58
|
+
if (status = response[0])
|
|
59
|
+
sinatra_response = ::Sinatra::Response.new([], status) # Build object to use status code helpers
|
|
40
60
|
|
|
41
|
-
|
|
42
|
-
|
|
61
|
+
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, sinatra_response.status)
|
|
62
|
+
span.set_error(env['sinatra.error']) if sinatra_response.server_error?
|
|
63
|
+
end
|
|
43
64
|
|
|
44
|
-
|
|
65
|
+
if (headers = response[1])
|
|
66
|
+
Sinatra::Headers.response_header_tags(headers, configuration[:headers][:response]).each do |name, value|
|
|
67
|
+
span.set_tag(name, value) if span.get_tag(name).nil?
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Set analytics sample rate
|
|
73
|
+
Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
|
|
74
|
+
|
|
75
|
+
# Measure service stats
|
|
76
|
+
Contrib::Analytics.set_measured(span)
|
|
77
|
+
end
|
|
45
78
|
end
|
|
46
79
|
end
|
|
47
80
|
|