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
|
@@ -1,132 +1,69 @@
|
|
|
1
|
-
require 'set'
|
|
2
|
-
|
|
3
|
-
require 'ddtrace/context'
|
|
4
|
-
|
|
5
1
|
module Datadog
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def initialize(options = {})
|
|
21
|
-
# max_spans_before_partial_flush is the amount of spans collected before
|
|
22
|
-
# the context starts to partially flush parts of traces. With a setting of 10k,
|
|
23
|
-
# the memory overhead is about 10Mb per thread/context (depends on spans metadata,
|
|
24
|
-
# this is just an order of magnitude).
|
|
25
|
-
@max_spans_before_partial_flush = options.fetch(:max_spans_before_partial_flush,
|
|
26
|
-
DEFAULT_MAX_SPANS_BEFORE_PARTIAL_FLUSH)
|
|
27
|
-
# min_spans_before_partial_flush is the minimum number of spans required
|
|
28
|
-
# for a partial flush to happen on a timeout. This is to prevent partial flush
|
|
29
|
-
# of traces which last a very long time but yet have few spans.
|
|
30
|
-
@min_spans_before_partial_flush = options.fetch(:min_spans_before_partial_flush,
|
|
31
|
-
DEFAULT_MIN_SPANS_BEFORE_PARTIAL_FLUSH)
|
|
32
|
-
# partial_flush_timeout is the limit (in seconds) above which the context
|
|
33
|
-
# considers flushing parts of the trace. Partial flushes should not be done too
|
|
34
|
-
# late else the agent rejects them with a "too far in the past" error.
|
|
35
|
-
@partial_flush_timeout = options.fetch(:partial_flush_timeout,
|
|
36
|
-
DEFAULT_PARTIAL_FLUSH_TIMEOUT)
|
|
37
|
-
@partial_traces = []
|
|
2
|
+
module ContextFlush
|
|
3
|
+
# Consumes only completed traces (where all spans have finished)
|
|
4
|
+
class Finished
|
|
5
|
+
# Consumes and returns completed traces (where all spans have finished)
|
|
6
|
+
# from the provided +context+, if any.
|
|
7
|
+
#
|
|
8
|
+
# Any traces consumed are removed from +context+ as a side effect.
|
|
9
|
+
#
|
|
10
|
+
# @return [Array<Span>] trace to be flushed, or +nil+ if the trace is not finished
|
|
11
|
+
def consume!(context)
|
|
12
|
+
trace, sampled = context.get
|
|
13
|
+
trace if sampled
|
|
14
|
+
end
|
|
38
15
|
end
|
|
39
16
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
17
|
+
# Performs partial trace flushing to avoid large traces residing in memory for too long
|
|
18
|
+
class Partial
|
|
19
|
+
# Start flushing partial trace after this many active spans in one trace
|
|
20
|
+
DEFAULT_MIN_SPANS_FOR_PARTIAL_FLUSH = 500
|
|
43
21
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
add_children(m, spans, ids, sub)
|
|
47
|
-
end
|
|
22
|
+
def initialize(options = {})
|
|
23
|
+
@min_spans_for_partial = options.fetch(:min_spans_before_partial_flush, DEFAULT_MIN_SPANS_FOR_PARTIAL_FLUSH)
|
|
48
24
|
end
|
|
49
|
-
end
|
|
50
25
|
|
|
51
|
-
|
|
52
|
-
#
|
|
53
|
-
|
|
26
|
+
# Consumes and returns completed or partially completed
|
|
27
|
+
# traces from the provided +context+, if any.
|
|
28
|
+
#
|
|
29
|
+
# Partially completed traces, where not all spans have finished,
|
|
30
|
+
# will only be returned if there are at least
|
|
31
|
+
# +@min_spans_for_partial+ finished spans.
|
|
32
|
+
#
|
|
33
|
+
# Any spans consumed are removed from +context+ as a side effect.
|
|
34
|
+
#
|
|
35
|
+
# @return [Array<Span>] partial or complete trace to be flushed, or +nil+ if no spans are finished
|
|
36
|
+
def consume!(context)
|
|
37
|
+
trace, sampled = context.get
|
|
54
38
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
unflushable_ids.add span.span_id
|
|
58
|
-
while span.parent
|
|
59
|
-
span = span.parent
|
|
60
|
-
unflushable_ids.add span.span_id
|
|
61
|
-
end
|
|
62
|
-
end
|
|
39
|
+
return nil unless sampled
|
|
40
|
+
return trace if trace && !trace.empty?
|
|
63
41
|
|
|
64
|
-
|
|
65
|
-
# Along the road, collect a reverse-tree which allows direct walking from parents to
|
|
66
|
-
# children but only for the ones we're interested it.
|
|
67
|
-
roots = []
|
|
68
|
-
children_map = {}
|
|
69
|
-
context.send(:each_span) do |span|
|
|
70
|
-
# There's no point in trying to put the real root in those partial roots, if
|
|
71
|
-
# it's flushable, the default algorithm would figure way more quickly.
|
|
72
|
-
if span.parent && !unflushable_ids.include?(span.span_id)
|
|
73
|
-
if unflushable_ids.include?(span.parent.span_id)
|
|
74
|
-
# span is flushable but is parent is not
|
|
75
|
-
roots << span
|
|
76
|
-
else
|
|
77
|
-
# span is flushable and its parent is too, build the reverse
|
|
78
|
-
# parent to child map for this one, it will be useful
|
|
79
|
-
children_map[span.parent.span_id] ||= []
|
|
80
|
-
children_map[span.parent.span_id] << span
|
|
81
|
-
end
|
|
82
|
-
end
|
|
42
|
+
partial_trace(context)
|
|
83
43
|
end
|
|
84
44
|
|
|
85
|
-
|
|
86
|
-
partial_traces = []
|
|
87
|
-
all_ids = Set.new
|
|
88
|
-
roots.each do |root|
|
|
89
|
-
spans = []
|
|
90
|
-
add_children(children_map, spans, all_ids, root)
|
|
91
|
-
partial_traces << spans
|
|
92
|
-
end
|
|
45
|
+
private
|
|
93
46
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
47
|
+
def partial_trace(context)
|
|
48
|
+
return nil if context.finished_span_count < @min_spans_for_partial
|
|
49
|
+
|
|
50
|
+
finished_spans(context)
|
|
51
|
+
end
|
|
97
52
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return nil unless traces && flushed_ids
|
|
53
|
+
def finished_spans(context)
|
|
54
|
+
trace = context.delete_span_if(&:finished?)
|
|
101
55
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
56
|
+
# Ensure that the first span in a partial trace has
|
|
57
|
+
# sampling and origin information.
|
|
58
|
+
if trace[0]
|
|
59
|
+
context.annotate_for_flush!(trace[0])
|
|
60
|
+
else
|
|
61
|
+
Datadog.logger.debug('Tried to retrieve trace from context, but got nothing. ' \
|
|
62
|
+
"Is there another consumer for this context? #{context.trace_id}")
|
|
63
|
+
end
|
|
108
64
|
|
|
109
|
-
|
|
110
|
-
def each_partial_trace(context)
|
|
111
|
-
start_time = context.send(:start_time)
|
|
112
|
-
length = context.send(:length)
|
|
113
|
-
# Stop and do not flush anything if there are not enough spans.
|
|
114
|
-
return if length <= @min_spans_before_partial_flush
|
|
115
|
-
# If there are enough spans, but not too many, check for start time.
|
|
116
|
-
# If timeout is not given or 0, then wait
|
|
117
|
-
return if length <= @max_spans_before_partial_flush &&
|
|
118
|
-
(@partial_flush_timeout.nil? || @partial_flush_timeout <= 0 ||
|
|
119
|
-
(start_time && start_time > Time.now.utc - @partial_flush_timeout))
|
|
120
|
-
# Here, either the trace is old or we have too many spans, flush it.
|
|
121
|
-
traces = partial_flush(context)
|
|
122
|
-
return unless traces
|
|
123
|
-
traces.each do |trace|
|
|
124
|
-
yield trace
|
|
65
|
+
trace unless trace.empty?
|
|
125
66
|
end
|
|
126
67
|
end
|
|
127
|
-
|
|
128
|
-
private :add_children
|
|
129
|
-
private :partial_traces
|
|
130
|
-
private :partial_flush
|
|
131
68
|
end
|
|
132
69
|
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
# DefaultContextProvider is a default context provider that retrieves
|
|
3
|
+
# all contexts from the current thread-local storage. It is suitable for
|
|
4
|
+
# synchronous programming.
|
|
5
|
+
class DefaultContextProvider
|
|
6
|
+
# Initializes the default context provider with a thread-bound context.
|
|
7
|
+
def initialize
|
|
8
|
+
@context = ThreadLocalContext.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Sets the current context.
|
|
12
|
+
def context=(ctx)
|
|
13
|
+
@context.local = ctx
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Return the current context.
|
|
17
|
+
def context
|
|
18
|
+
@context.local
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# ThreadLocalContext can be used as a tracer global reference to create
|
|
23
|
+
# a different \Context for each thread. In synchronous tracer, this
|
|
24
|
+
# is required to prevent multiple threads sharing the same \Context
|
|
25
|
+
# in different executions.
|
|
26
|
+
class ThreadLocalContext
|
|
27
|
+
# ThreadLocalContext can be used as a tracer global reference to create
|
|
28
|
+
# a different \Context for each thread. In synchronous tracer, this
|
|
29
|
+
# is required to prevent multiple threads sharing the same \Context
|
|
30
|
+
# in different executions.
|
|
31
|
+
#
|
|
32
|
+
# To support multiple tracers simultaneously, each \ThreadLocalContext
|
|
33
|
+
# instance has its own thread-local variable.
|
|
34
|
+
def initialize
|
|
35
|
+
@key = "datadog_context_#{object_id}".to_sym
|
|
36
|
+
|
|
37
|
+
self.local = Datadog::Context.new
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Override the thread-local context with a new context.
|
|
41
|
+
def local=(ctx)
|
|
42
|
+
Thread.current[@key] = ctx
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Return the thread-local context.
|
|
46
|
+
def local
|
|
47
|
+
Thread.current[@key] ||= Datadog::Context.new
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
2
|
+
require 'ddtrace/contrib/action_cable/ext'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module ActionCable
|
|
7
|
+
module Configuration
|
|
8
|
+
# Custom settings for the ActionCable integration
|
|
9
|
+
class Settings < Contrib::Configuration::Settings
|
|
10
|
+
option :enabled do |o|
|
|
11
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
12
|
+
o.lazy
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
option :analytics_enabled do |o|
|
|
16
|
+
o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
|
|
17
|
+
o.lazy
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
option :analytics_sample_rate do |o|
|
|
21
|
+
o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
|
|
22
|
+
o.lazy
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
option :service_name, default: Ext::SERVICE_NAME
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'ddtrace/contrib/analytics'
|
|
2
|
+
require 'ddtrace/contrib/active_support/notifications/event'
|
|
3
|
+
require 'ddtrace/contrib/action_cable/ext'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module ActionCable
|
|
8
|
+
# Defines basic behaviors for an event.
|
|
9
|
+
module Event
|
|
10
|
+
def self.included(base)
|
|
11
|
+
base.send(:include, ActiveSupport::Notifications::Event)
|
|
12
|
+
base.send(:extend, ClassMethods)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Class methods for events.
|
|
16
|
+
module ClassMethods
|
|
17
|
+
def span_options
|
|
18
|
+
{ service: configuration[:service_name] }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def tracer
|
|
22
|
+
-> { configuration[:tracer] }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def configuration
|
|
26
|
+
Datadog.configuration[:action_cable]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Defines behavior for the first event of a thread execution.
|
|
32
|
+
#
|
|
33
|
+
# This event is not expected to be nested with other event,
|
|
34
|
+
# but to start a fresh tracing context.
|
|
35
|
+
module RootContextEvent
|
|
36
|
+
def self.included(base)
|
|
37
|
+
base.send(:include, ActiveSupport::Notifications::Event)
|
|
38
|
+
base.send(:extend, ClassMethods)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Class methods for events.
|
|
42
|
+
module ClassMethods
|
|
43
|
+
include Contrib::ActionCable::Event::ClassMethods
|
|
44
|
+
|
|
45
|
+
def subscription(*args)
|
|
46
|
+
super.tap do |subscription|
|
|
47
|
+
subscription.before_trace { ensure_clean_context! }
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
# Context objects are thread-bound.
|
|
54
|
+
# If an integration re-uses threads, context from a previous trace
|
|
55
|
+
# could leak into the new trace. This "cleans" current context,
|
|
56
|
+
# preventing such a leak.
|
|
57
|
+
def ensure_clean_context!
|
|
58
|
+
return unless configuration[:tracer].call_context.current_span
|
|
59
|
+
configuration[:tracer].provider.context = Context.new
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'ddtrace/contrib/action_cable/event'
|
|
2
|
+
require 'ddtrace/contrib/action_cable/events/broadcast'
|
|
3
|
+
require 'ddtrace/contrib/action_cable/events/perform_action'
|
|
4
|
+
require 'ddtrace/contrib/action_cable/events/transmit'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Contrib
|
|
8
|
+
module ActionCable
|
|
9
|
+
# Defines collection of instrumented ActionCable events
|
|
10
|
+
module Events
|
|
11
|
+
ALL = [
|
|
12
|
+
Events::Broadcast,
|
|
13
|
+
Events::PerformAction,
|
|
14
|
+
Events::Transmit
|
|
15
|
+
].freeze
|
|
16
|
+
|
|
17
|
+
module_function
|
|
18
|
+
|
|
19
|
+
def all
|
|
20
|
+
self::ALL
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def subscriptions
|
|
24
|
+
all.collect(&:subscriptions).collect(&:to_a).flatten
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def subscribe!
|
|
28
|
+
all.each(&:subscribe!)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'ddtrace/contrib/analytics'
|
|
2
|
+
require 'ddtrace/contrib/action_cable/event'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module ActionCable
|
|
7
|
+
module Events
|
|
8
|
+
# Defines instrumentation for 'broadcast.action_cable' event.
|
|
9
|
+
#
|
|
10
|
+
# A single 'broadcast' event will trigger as many 'transmit' events
|
|
11
|
+
# as there are clients subscribed to a channel.
|
|
12
|
+
module Broadcast
|
|
13
|
+
include ActionCable::Event
|
|
14
|
+
|
|
15
|
+
EVENT_NAME = 'broadcast.action_cable'.freeze
|
|
16
|
+
|
|
17
|
+
module_function
|
|
18
|
+
|
|
19
|
+
def event_name
|
|
20
|
+
self::EVENT_NAME
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def span_name
|
|
24
|
+
Ext::SPAN_BROADCAST
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def span_type
|
|
28
|
+
# Starts a broadcast of messages over WebSockets
|
|
29
|
+
Datadog::Ext::AppTypes::WEB
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def process(span, _event, _id, payload)
|
|
33
|
+
channel = payload[:broadcasting] # Channel has high cardinality
|
|
34
|
+
span.service = configuration[:service_name]
|
|
35
|
+
span.span_type = span_type
|
|
36
|
+
|
|
37
|
+
# Set analytics sample rate
|
|
38
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
39
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
span.set_tag(Ext::TAG_CHANNEL, channel)
|
|
43
|
+
span.set_tag(Ext::TAG_BROADCAST_CODER, payload[:coder])
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'ddtrace/contrib/analytics'
|
|
2
|
+
require 'ddtrace/contrib/action_cable/event'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module ActionCable
|
|
7
|
+
module Events
|
|
8
|
+
# Defines instrumentation for 'perform_action.action_cable' event.
|
|
9
|
+
#
|
|
10
|
+
# An action, triggered by a WebSockets client, invokes a method
|
|
11
|
+
# in the server's channel instance.
|
|
12
|
+
module PerformAction
|
|
13
|
+
include ActionCable::RootContextEvent
|
|
14
|
+
|
|
15
|
+
EVENT_NAME = 'perform_action.action_cable'.freeze
|
|
16
|
+
|
|
17
|
+
module_function
|
|
18
|
+
|
|
19
|
+
def event_name
|
|
20
|
+
self::EVENT_NAME
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def span_name
|
|
24
|
+
Ext::SPAN_ACTION
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def span_type
|
|
28
|
+
# A request to perform_action comes from a WebSocket connection
|
|
29
|
+
Datadog::Ext::AppTypes::WEB
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def process(span, _event, _id, payload)
|
|
33
|
+
channel_class = payload[:channel_class]
|
|
34
|
+
action = payload[:action]
|
|
35
|
+
|
|
36
|
+
span.service = configuration[:service_name]
|
|
37
|
+
span.resource = "#{channel_class}##{action}"
|
|
38
|
+
span.span_type = span_type
|
|
39
|
+
|
|
40
|
+
# Set analytics sample rate
|
|
41
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
|
42
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Measure service stats
|
|
46
|
+
Contrib::Analytics.set_measured(span)
|
|
47
|
+
|
|
48
|
+
span.set_tag(Ext::TAG_CHANNEL_CLASS, channel_class)
|
|
49
|
+
span.set_tag(Ext::TAG_ACTION, action)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|