ls-trace 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +419 -544
- data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
- data/.env +2 -0
- data/.gitignore +2 -0
- data/.gitlab-ci.yml +27 -0
- data/.rubocop.yml +8 -0
- data/.simplecov +38 -0
- data/Appraisals +299 -48
- data/CHANGELOG.md +3 -4
- data/LICENSE +4 -22
- data/LICENSE.Apache +200 -0
- data/LICENSE.BSD3 +24 -0
- data/NOTICE +4 -0
- data/README.md +4 -3
- data/Rakefile +561 -405
- data/ddtrace.gemspec +13 -4
- data/docker-compose.yml +96 -2
- data/docs/DevelopmentGuide.md +17 -1
- data/docs/GettingStarted.md +433 -138
- data/lib/ddtrace.rb +15 -0
- data/lib/ddtrace/analytics.rb +7 -0
- data/lib/ddtrace/buffer.rb +9 -9
- data/lib/ddtrace/chunker.rb +34 -0
- data/lib/ddtrace/configuration.rb +59 -5
- data/lib/ddtrace/configuration/base.rb +4 -2
- data/lib/ddtrace/configuration/components.rb +151 -0
- data/lib/ddtrace/configuration/option.rb +12 -3
- data/lib/ddtrace/configuration/option_definition.rb +1 -5
- data/lib/ddtrace/configuration/options.rb +6 -1
- data/lib/ddtrace/configuration/pin_setup.rb +3 -2
- data/lib/ddtrace/configuration/settings.rb +214 -40
- data/lib/ddtrace/context.rb +84 -63
- data/lib/ddtrace/context_flush.rb +51 -114
- data/lib/ddtrace/context_provider.rb +50 -0
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/action_cable/event.rb +65 -0
- data/lib/ddtrace/contrib/action_cable/events.rb +33 -0
- data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +49 -0
- data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +55 -0
- data/lib/ddtrace/contrib/action_cable/events/transmit.rb +50 -0
- data/lib/ddtrace/contrib/action_cable/ext.rb +26 -0
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +38 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +6 -2
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +3 -15
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
- data/lib/ddtrace/contrib/action_pack/integration.rb +5 -3
- data/lib/ddtrace/contrib/action_pack/patcher.rb +3 -9
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/action_view/event.rb +39 -0
- data/lib/ddtrace/contrib/action_view/events.rb +30 -0
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +45 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +48 -0
- data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +9 -13
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +16 -16
- data/lib/ddtrace/contrib/action_view/integration.rb +5 -3
- data/lib/ddtrace/contrib/action_view/patcher.rb +19 -25
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -0
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +6 -5
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +3 -10
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +4 -5
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +4 -1
- data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -1
- data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_record/integration.rb +5 -3
- data/lib/ddtrace/contrib/active_record/patcher.rb +3 -9
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +10 -24
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
- data/lib/ddtrace/contrib/active_support/integration.rb +5 -3
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +3 -3
- data/lib/ddtrace/contrib/active_support/patcher.rb +3 -9
- data/lib/ddtrace/contrib/analytics.rb +5 -1
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/aws/ext.rb +5 -2
- data/lib/ddtrace/contrib/aws/integration.rb +8 -2
- data/lib/ddtrace/contrib/aws/patcher.rb +15 -15
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +8 -2
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +4 -11
- data/lib/ddtrace/contrib/configurable.rb +30 -13
- data/lib/ddtrace/contrib/configuration/resolver.rb +7 -3
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +20 -1
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
- data/lib/ddtrace/contrib/dalli/integration.rb +5 -3
- data/lib/ddtrace/contrib/dalli/patcher.rb +6 -16
- data/lib/ddtrace/contrib/dalli/quantize.rb +1 -1
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
- data/lib/ddtrace/contrib/delayed_job/integration.rb +8 -2
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +4 -10
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +4 -0
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +5 -3
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +10 -17
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +8 -2
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +22 -13
- data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
- data/lib/ddtrace/contrib/ethon/integration.rb +14 -2
- data/lib/ddtrace/contrib/ethon/patcher.rb +7 -9
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/excon/ext.rb +5 -2
- data/lib/ddtrace/contrib/excon/integration.rb +13 -2
- data/lib/ddtrace/contrib/excon/middleware.rb +15 -12
- data/lib/ddtrace/contrib/excon/patcher.rb +4 -11
- data/lib/ddtrace/contrib/extensions.rb +39 -5
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
- data/lib/ddtrace/contrib/faraday/integration.rb +10 -3
- data/lib/ddtrace/contrib/faraday/middleware.rb +24 -34
- data/lib/ddtrace/contrib/faraday/patcher.rb +26 -19
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
- data/lib/ddtrace/contrib/grape/endpoint.rb +14 -5
- data/lib/ddtrace/contrib/grape/ext.rb +5 -2
- data/lib/ddtrace/contrib/grape/integration.rb +6 -3
- data/lib/ddtrace/contrib/grape/patcher.rb +9 -15
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
- data/lib/ddtrace/contrib/graphql/integration.rb +6 -5
- data/lib/ddtrace/contrib/graphql/patcher.rb +11 -14
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +2 -4
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -2
- data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
- data/lib/ddtrace/contrib/grpc/integration.rb +5 -3
- data/lib/ddtrace/contrib/grpc/patcher.rb +9 -19
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +8 -32
- data/lib/ddtrace/contrib/http/configuration/settings.rb +8 -2
- data/lib/ddtrace/contrib/http/ext.rb +5 -2
- data/lib/ddtrace/contrib/http/instrumentation.rb +89 -28
- data/lib/ddtrace/contrib/http/integration.rb +13 -0
- data/lib/ddtrace/contrib/http/patcher.rb +3 -9
- data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
- data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/event.rb +51 -0
- data/lib/ddtrace/contrib/kafka/events.rb +44 -0
- data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
- data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
- data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
- data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
- data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
- data/lib/ddtrace/contrib/mongodb/integration.rb +5 -3
- data/lib/ddtrace/contrib/mongodb/patcher.rb +5 -11
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -2
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/mysql2/integration.rb +8 -2
- data/lib/ddtrace/contrib/mysql2/patcher.rb +3 -9
- data/lib/ddtrace/contrib/patchable.rb +21 -4
- data/lib/ddtrace/contrib/patcher.rb +44 -10
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/presto/ext.rb +28 -0
- data/lib/ddtrace/contrib/presto/instrumentation.rb +107 -0
- data/lib/ddtrace/contrib/presto/integration.rb +38 -0
- data/lib/ddtrace/contrib/presto/patcher.rb +30 -0
- data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
- data/lib/ddtrace/contrib/que/ext.rb +30 -0
- data/lib/ddtrace/contrib/que/integration.rb +42 -0
- data/lib/ddtrace/contrib/que/patcher.rb +24 -0
- data/lib/ddtrace/contrib/que/tracer.rb +56 -0
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/racecar/event.rb +4 -0
- data/lib/ddtrace/contrib/racecar/events.rb +2 -0
- data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
- data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
- data/lib/ddtrace/contrib/racecar/integration.rb +6 -3
- data/lib/ddtrace/contrib/racecar/patcher.rb +4 -10
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/rack/ext.rb +5 -2
- data/lib/ddtrace/contrib/rack/integration.rb +8 -2
- data/lib/ddtrace/contrib/rack/middlewares.rb +23 -14
- data/lib/ddtrace/contrib/rack/patcher.rb +57 -22
- data/lib/ddtrace/contrib/rack/request_queue.rb +1 -1
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +23 -10
- data/lib/ddtrace/contrib/rails/ext.rb +7 -2
- data/lib/ddtrace/contrib/rails/framework.rb +59 -35
- data/lib/ddtrace/contrib/rails/integration.rb +12 -5
- data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
- data/lib/ddtrace/contrib/rails/patcher.rb +19 -8
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
- data/lib/ddtrace/contrib/rake/ext.rb +5 -2
- data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -2
- data/lib/ddtrace/contrib/rake/integration.rb +8 -2
- data/lib/ddtrace/contrib/rake/patcher.rb +4 -10
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/redis/ext.rb +5 -2
- data/lib/ddtrace/contrib/redis/integration.rb +9 -3
- data/lib/ddtrace/contrib/redis/patcher.rb +20 -17
- data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/resque/ext.rb +5 -2
- data/lib/ddtrace/contrib/resque/integration.rb +12 -2
- data/lib/ddtrace/contrib/resque/patcher.rb +4 -10
- data/lib/ddtrace/contrib/resque/resque_job.rb +6 -2
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
- data/lib/ddtrace/contrib/rest_client/integration.rb +9 -2
- data/lib/ddtrace/contrib/rest_client/patcher.rb +5 -7
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sequel/database.rb +1 -1
- data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
- data/lib/ddtrace/contrib/sequel/integration.rb +8 -2
- data/lib/ddtrace/contrib/sequel/patcher.rb +4 -10
- data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
- data/lib/ddtrace/contrib/shoryuken/integration.rb +11 -7
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +4 -10
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +12 -2
- data/lib/ddtrace/contrib/sidekiq/ext.rb +8 -2
- data/lib/ddtrace/contrib/sidekiq/integration.rb +5 -3
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +19 -18
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +12 -3
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +19 -2
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sinatra/env.rb +25 -4
- data/lib/ddtrace/contrib/sinatra/ext.rb +11 -2
- data/lib/ddtrace/contrib/sinatra/integration.rb +5 -3
- data/lib/ddtrace/contrib/sinatra/patcher.rb +5 -10
- data/lib/ddtrace/contrib/sinatra/tracer.rb +79 -34
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +48 -15
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
- data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
- data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
- data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +14 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +5 -3
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +8 -14
- data/lib/ddtrace/correlation.rb +15 -5
- data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
- data/lib/ddtrace/diagnostics/health.rb +11 -8
- data/lib/ddtrace/encoding.rb +15 -11
- data/lib/ddtrace/environment.rb +21 -3
- data/lib/ddtrace/event.rb +52 -0
- data/lib/ddtrace/ext/analytics.rb +1 -0
- data/lib/ddtrace/ext/correlation.rb +11 -0
- data/lib/ddtrace/ext/diagnostics.rb +11 -0
- data/lib/ddtrace/ext/environment.rb +16 -0
- data/lib/ddtrace/ext/forced_tracing.rb +1 -1
- data/lib/ddtrace/ext/sampling.rb +16 -0
- data/lib/ddtrace/ext/transport.rb +1 -0
- data/lib/ddtrace/logger.rb +4 -3
- data/lib/ddtrace/metrics.rb +12 -5
- data/lib/ddtrace/monkey.rb +1 -1
- data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
- data/lib/ddtrace/opentelemetry/span.rb +33 -0
- data/lib/ddtrace/opentracer/global_tracer.rb +1 -1
- data/lib/ddtrace/pin.rb +40 -16
- data/lib/ddtrace/pipeline.rb +1 -1
- data/lib/ddtrace/pipeline/span_filter.rb +15 -15
- data/lib/ddtrace/propagation/http_propagator.rb +2 -2
- data/lib/ddtrace/runtime/cgroup.rb +1 -1
- data/lib/ddtrace/runtime/container.rb +1 -1
- data/lib/ddtrace/runtime/metrics.rb +23 -6
- data/lib/ddtrace/sampler.rb +126 -29
- data/lib/ddtrace/sampling.rb +2 -0
- data/lib/ddtrace/sampling/matcher.rb +57 -0
- data/lib/ddtrace/sampling/rate_limiter.rb +127 -0
- data/lib/ddtrace/sampling/rule.rb +61 -0
- data/lib/ddtrace/sampling/rule_sampler.rb +125 -0
- data/lib/ddtrace/span.rb +54 -7
- data/lib/ddtrace/sync_writer.rb +13 -8
- data/lib/ddtrace/tracer.rb +72 -92
- data/lib/ddtrace/transport/http.rb +16 -1
- data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
- data/lib/ddtrace/transport/http/api/instance.rb +4 -0
- data/lib/ddtrace/transport/http/builder.rb +3 -5
- data/lib/ddtrace/transport/http/client.rb +7 -64
- data/lib/ddtrace/transport/http/response.rb +1 -1
- data/lib/ddtrace/transport/http/statistics.rb +1 -1
- data/lib/ddtrace/transport/http/traces.rb +10 -7
- data/lib/ddtrace/transport/io.rb +26 -0
- data/lib/ddtrace/transport/io/client.rb +76 -0
- data/lib/ddtrace/transport/io/response.rb +25 -0
- data/lib/ddtrace/transport/io/traces.rb +91 -0
- data/lib/ddtrace/transport/response.rb +11 -0
- data/lib/ddtrace/transport/statistics.rb +2 -2
- data/lib/ddtrace/transport/traces.rb +160 -10
- data/lib/ddtrace/utils.rb +1 -1
- data/lib/ddtrace/version.rb +2 -2
- data/lib/ddtrace/worker.rb +20 -0
- data/lib/ddtrace/workers.rb +5 -13
- data/lib/ddtrace/workers/async.rb +165 -0
- data/lib/ddtrace/workers/loop.rb +105 -0
- data/lib/ddtrace/workers/polling.rb +48 -0
- data/lib/ddtrace/workers/queue.rb +39 -0
- data/lib/ddtrace/workers/runtime_metrics.rb +47 -0
- data/lib/ddtrace/workers/trace_writer.rb +202 -0
- data/lib/ddtrace/writer.rb +56 -38
- metadata +185 -25
- data/lib/ddtrace/provider.rb +0 -21
data/lib/ddtrace/pipeline.rb
CHANGED
|
@@ -10,12 +10,22 @@ module Datadog
|
|
|
10
10
|
@criteria = filter || block
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
# Note: this SpanFilter implementation only handles traces in which child spans appear
|
|
14
|
+
# after parent spans in the trace array. If in the future child spans can be before
|
|
15
|
+
# parent spans, then the code below will need to be updated.
|
|
13
16
|
def call(trace)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
deleted = Set.new
|
|
18
|
+
|
|
19
|
+
trace.delete_if do |span|
|
|
20
|
+
if deleted.include?(span.parent)
|
|
21
|
+
deleted << span
|
|
22
|
+
true
|
|
23
|
+
else
|
|
24
|
+
drop = drop_it?(span)
|
|
25
|
+
deleted << span if drop
|
|
26
|
+
drop
|
|
27
|
+
end
|
|
28
|
+
end
|
|
19
29
|
end
|
|
20
30
|
|
|
21
31
|
private
|
|
@@ -23,16 +33,6 @@ module Datadog
|
|
|
23
33
|
def drop_it?(span)
|
|
24
34
|
@criteria.call(span) rescue false
|
|
25
35
|
end
|
|
26
|
-
|
|
27
|
-
def clean_trace(black_list, trace)
|
|
28
|
-
current = black_list.shift
|
|
29
|
-
|
|
30
|
-
trace.delete(current)
|
|
31
|
-
|
|
32
|
-
trace.each do |span|
|
|
33
|
-
black_list << span if span.parent == current
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -19,7 +19,7 @@ module Datadog
|
|
|
19
19
|
def self.inject!(context, env)
|
|
20
20
|
# Prevent propagation from being attempted if context provided is nil.
|
|
21
21
|
if context.nil?
|
|
22
|
-
::Datadog
|
|
22
|
+
::Datadog.logger.debug('Cannot inject context into env to propagate over HTTP: context is nil.'.freeze)
|
|
23
23
|
return
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -58,7 +58,7 @@ module Datadog
|
|
|
58
58
|
# Return an empty/new context if we have a mismatch in values extracted
|
|
59
59
|
msg = "#{context.trace_id} != #{extracted_context.trace_id} && " \
|
|
60
60
|
"#{context.span_id} != #{extracted_context.span_id}"
|
|
61
|
-
::Datadog
|
|
61
|
+
::Datadog.logger.debug("Cannot extract context from HTTP: extracted contexts differ, #{msg}".freeze)
|
|
62
62
|
# DEV: This will return from `self.extract` not this `each` block
|
|
63
63
|
return ::Datadog::Context.new
|
|
64
64
|
end
|
|
@@ -27,7 +27,7 @@ module Datadog
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
rescue StandardError => e
|
|
30
|
-
Datadog
|
|
30
|
+
Datadog.logger.error("Error while parsing cgroup. Cause: #{e.message} Location: #{e.backtrace.first}")
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
@@ -14,12 +14,13 @@ module Datadog
|
|
|
14
14
|
super
|
|
15
15
|
|
|
16
16
|
# Initialize service list
|
|
17
|
-
@services = Set.new
|
|
17
|
+
@services = Set.new(options.fetch(:services, []))
|
|
18
18
|
@service_tags = nil
|
|
19
|
+
compile_service_tags!
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
def associate_with_span(span)
|
|
22
|
-
return if span.nil?
|
|
23
|
+
return if !enabled? || span.nil?
|
|
23
24
|
|
|
24
25
|
# Register service as associated with metrics
|
|
25
26
|
register_service(span.service) unless span.service.nil?
|
|
@@ -30,7 +31,7 @@ module Datadog
|
|
|
30
31
|
|
|
31
32
|
# Associate service with runtime metrics
|
|
32
33
|
def register_service(service)
|
|
33
|
-
return if service.nil?
|
|
34
|
+
return if !enabled? || service.nil?
|
|
34
35
|
|
|
35
36
|
service = service.to_s
|
|
36
37
|
|
|
@@ -54,8 +55,8 @@ module Datadog
|
|
|
54
55
|
|
|
55
56
|
def gc_metrics
|
|
56
57
|
Hash[
|
|
57
|
-
GC.stat.
|
|
58
|
-
|
|
58
|
+
GC.stat.flat_map do |k, v|
|
|
59
|
+
nested_gc_metric(Ext::Runtime::Metrics::METRIC_GC_PREFIX, k, v)
|
|
59
60
|
end
|
|
60
61
|
]
|
|
61
62
|
end
|
|
@@ -63,7 +64,7 @@ module Datadog
|
|
|
63
64
|
def try_flush
|
|
64
65
|
yield
|
|
65
66
|
rescue StandardError => e
|
|
66
|
-
Datadog
|
|
67
|
+
Datadog.logger.error("Error while sending runtime metric. Cause: #{e.message}")
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
def default_metric_options
|
|
@@ -88,6 +89,22 @@ module Datadog
|
|
|
88
89
|
"#{Ext::Runtime::Metrics::TAG_SERVICE}:#{service}".freeze
|
|
89
90
|
end
|
|
90
91
|
end
|
|
92
|
+
|
|
93
|
+
def nested_gc_metric(prefix, k, v)
|
|
94
|
+
path = "#{prefix}.#{k}"
|
|
95
|
+
|
|
96
|
+
if v.is_a?(Hash)
|
|
97
|
+
v.flat_map do |key, value|
|
|
98
|
+
nested_gc_metric(path, key, value)
|
|
99
|
+
end
|
|
100
|
+
else
|
|
101
|
+
[[to_metric_name(path), v]]
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def to_metric_name(str)
|
|
106
|
+
str.downcase.gsub(/[-\s]/, '_')
|
|
107
|
+
end
|
|
91
108
|
end
|
|
92
109
|
end
|
|
93
110
|
end
|
data/lib/ddtrace/sampler.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'forwardable'
|
|
2
2
|
|
|
3
3
|
require 'ddtrace/ext/priority'
|
|
4
|
+
require 'ddtrace/diagnostics/health'
|
|
4
5
|
|
|
5
6
|
module Datadog
|
|
6
7
|
# \Sampler performs client-side trace sampling.
|
|
@@ -12,6 +13,10 @@ module Datadog
|
|
|
12
13
|
def sample!(_span)
|
|
13
14
|
raise NotImplementedError, 'Samplers must implement the #sample! method'
|
|
14
15
|
end
|
|
16
|
+
|
|
17
|
+
def sample_rate(span)
|
|
18
|
+
raise NotImplementedError, 'Samplers must implement the #sample_rate method'
|
|
19
|
+
end
|
|
15
20
|
end
|
|
16
21
|
|
|
17
22
|
# \AllSampler samples all the traces.
|
|
@@ -23,6 +28,10 @@ module Datadog
|
|
|
23
28
|
def sample!(span)
|
|
24
29
|
span.sampled = true
|
|
25
30
|
end
|
|
31
|
+
|
|
32
|
+
def sample_rate(*_)
|
|
33
|
+
1.0
|
|
34
|
+
end
|
|
26
35
|
end
|
|
27
36
|
|
|
28
37
|
# \RateSampler is based on a sample rate.
|
|
@@ -30,8 +39,6 @@ module Datadog
|
|
|
30
39
|
KNUTH_FACTOR = 1111111111111111111
|
|
31
40
|
SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
|
|
32
41
|
|
|
33
|
-
attr_reader :sample_rate
|
|
34
|
-
|
|
35
42
|
# Initialize a \RateSampler.
|
|
36
43
|
# This sampler keeps a random subset of the traces. Its main purpose is to
|
|
37
44
|
# reduce the instrumentation footprint.
|
|
@@ -41,13 +48,17 @@ module Datadog
|
|
|
41
48
|
# sampled.
|
|
42
49
|
def initialize(sample_rate = 1.0)
|
|
43
50
|
unless sample_rate > 0.0 && sample_rate <= 1.0
|
|
44
|
-
Datadog
|
|
51
|
+
Datadog.logger.error('sample rate is not between 0 and 1, disabling the sampler')
|
|
45
52
|
sample_rate = 1.0
|
|
46
53
|
end
|
|
47
54
|
|
|
48
55
|
self.sample_rate = sample_rate
|
|
49
56
|
end
|
|
50
57
|
|
|
58
|
+
def sample_rate(*_)
|
|
59
|
+
@sample_rate
|
|
60
|
+
end
|
|
61
|
+
|
|
51
62
|
def sample_rate=(sample_rate)
|
|
52
63
|
@sample_rate = sample_rate
|
|
53
64
|
@sampling_id_threshold = sample_rate * Span::MAX_ID
|
|
@@ -64,56 +75,117 @@ module Datadog
|
|
|
64
75
|
end
|
|
65
76
|
end
|
|
66
77
|
|
|
67
|
-
#
|
|
68
|
-
class
|
|
69
|
-
|
|
78
|
+
# Samples at different rates by key.
|
|
79
|
+
class RateByKeySampler < Sampler
|
|
80
|
+
attr_reader \
|
|
81
|
+
:default_key
|
|
82
|
+
|
|
83
|
+
def initialize(default_key, default_rate = 1.0, &block)
|
|
84
|
+
raise ArgumentError, 'No resolver given!' unless block_given?
|
|
70
85
|
|
|
71
|
-
|
|
72
|
-
@
|
|
86
|
+
@default_key = default_key
|
|
87
|
+
@resolver = block
|
|
73
88
|
@mutex = Mutex.new
|
|
74
|
-
@
|
|
75
|
-
|
|
89
|
+
@samplers = {}
|
|
90
|
+
|
|
91
|
+
set_rate(default_key, default_rate)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def resolve(span)
|
|
95
|
+
@resolver.call(span)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def default_sampler
|
|
99
|
+
@samplers[default_key]
|
|
76
100
|
end
|
|
77
101
|
|
|
78
102
|
def sample?(span)
|
|
79
|
-
key =
|
|
103
|
+
key = resolve(span)
|
|
80
104
|
|
|
81
105
|
@mutex.synchronize do
|
|
82
|
-
@
|
|
106
|
+
@samplers.fetch(key, default_sampler).sample?(span)
|
|
83
107
|
end
|
|
84
108
|
end
|
|
85
109
|
|
|
86
110
|
def sample!(span)
|
|
87
|
-
key =
|
|
111
|
+
key = resolve(span)
|
|
88
112
|
|
|
89
113
|
@mutex.synchronize do
|
|
90
|
-
@
|
|
114
|
+
@samplers.fetch(key, default_sampler).sample!(span)
|
|
91
115
|
end
|
|
92
116
|
end
|
|
93
117
|
|
|
94
118
|
def sample_rate(span)
|
|
95
|
-
key =
|
|
119
|
+
key = resolve(span)
|
|
96
120
|
|
|
97
121
|
@mutex.synchronize do
|
|
98
|
-
@
|
|
122
|
+
@samplers.fetch(key, default_sampler).sample_rate
|
|
99
123
|
end
|
|
100
124
|
end
|
|
101
125
|
|
|
102
|
-
def update(
|
|
126
|
+
def update(key, rate)
|
|
103
127
|
@mutex.synchronize do
|
|
104
|
-
|
|
128
|
+
set_rate(key, rate)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
105
131
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
132
|
+
def update_all(rate_by_key)
|
|
133
|
+
@mutex.synchronize do
|
|
134
|
+
rate_by_key.each { |key, rate| set_rate(key, rate) }
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def delete(key)
|
|
139
|
+
@mutex.synchronize do
|
|
140
|
+
@samplers.delete(key)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def delete_if(&block)
|
|
145
|
+
@mutex.synchronize do
|
|
146
|
+
@samplers.delete_if(&block)
|
|
110
147
|
end
|
|
111
148
|
end
|
|
112
149
|
|
|
150
|
+
def length
|
|
151
|
+
@samplers.length
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
private
|
|
155
|
+
|
|
156
|
+
def set_rate(key, rate)
|
|
157
|
+
@samplers[key] ||= RateSampler.new(rate)
|
|
158
|
+
@samplers[key].sample_rate = rate
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# \RateByServiceSampler samples different services at different rates
|
|
163
|
+
class RateByServiceSampler < RateByKeySampler
|
|
164
|
+
DEFAULT_KEY = 'service:,env:'.freeze
|
|
165
|
+
|
|
166
|
+
def initialize(default_rate = 1.0, options = {})
|
|
167
|
+
super(DEFAULT_KEY, default_rate, &method(:key_for))
|
|
168
|
+
@env = options[:env]
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def update(rate_by_service)
|
|
172
|
+
# Remove any old services
|
|
173
|
+
delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
|
|
174
|
+
|
|
175
|
+
# Update each service rate
|
|
176
|
+
update_all(rate_by_service)
|
|
177
|
+
|
|
178
|
+
# Emit metric for service cache size
|
|
179
|
+
Datadog.health_metrics.sampling_service_cache_length(length)
|
|
180
|
+
end
|
|
181
|
+
|
|
113
182
|
private
|
|
114
183
|
|
|
115
184
|
def key_for(span)
|
|
116
|
-
|
|
185
|
+
# Resolve env dynamically, if Proc is given.
|
|
186
|
+
env = @env.is_a?(Proc) ? @env.call : @env
|
|
187
|
+
|
|
188
|
+
"service:#{span.service},env:#{env}"
|
|
117
189
|
end
|
|
118
190
|
end
|
|
119
191
|
|
|
@@ -121,6 +193,8 @@ module Datadog
|
|
|
121
193
|
class PrioritySampler
|
|
122
194
|
extend Forwardable
|
|
123
195
|
|
|
196
|
+
attr_reader :pre_sampler, :priority_sampler
|
|
197
|
+
|
|
124
198
|
SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
|
|
125
199
|
|
|
126
200
|
def initialize(opts = {})
|
|
@@ -141,10 +215,8 @@ module Datadog
|
|
|
141
215
|
# If priority sampling has already been applied upstream, use that, otherwise...
|
|
142
216
|
unless priority_assigned_upstream?(span)
|
|
143
217
|
# Roll the dice and determine whether how we set the priority.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
# agent will have an incomplete dataset.
|
|
147
|
-
priority = priority_sample(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
|
|
218
|
+
priority = priority_sample!(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
|
|
219
|
+
|
|
148
220
|
assign_priority!(span, priority)
|
|
149
221
|
end
|
|
150
222
|
else
|
|
@@ -175,8 +247,33 @@ module Datadog
|
|
|
175
247
|
span.context && !span.context.sampling_priority.nil?
|
|
176
248
|
end
|
|
177
249
|
|
|
178
|
-
def priority_sample(span)
|
|
179
|
-
|
|
250
|
+
def priority_sample!(span)
|
|
251
|
+
preserving_sampling(span) do
|
|
252
|
+
@priority_sampler.sample!(span)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# Ensures the span is always propagated to the writer and that
|
|
257
|
+
# the sample rate metric represents the true client-side sampling.
|
|
258
|
+
def preserving_sampling(span)
|
|
259
|
+
pre_sample_rate_metric = span.get_metric(SAMPLE_RATE_METRIC_KEY)
|
|
260
|
+
|
|
261
|
+
yield.tap do
|
|
262
|
+
# NOTE: We'll want to leave `span.sampled = true` here; all spans for priority sampling must
|
|
263
|
+
# be sent to the agent. Otherwise metrics for traces will not be accurate, since the
|
|
264
|
+
# agent will have an incomplete dataset.
|
|
265
|
+
#
|
|
266
|
+
# We also ensure that the agent knows we that our `post_sampler` is not performing true sampling,
|
|
267
|
+
# to avoid erroneous metric upscaling.
|
|
268
|
+
span.sampled = true
|
|
269
|
+
if pre_sample_rate_metric
|
|
270
|
+
# Restore true sampling metric, as only the @pre_sampler can reject traces
|
|
271
|
+
span.set_metric(SAMPLE_RATE_METRIC_KEY, pre_sample_rate_metric)
|
|
272
|
+
else
|
|
273
|
+
# If @pre_sampler is not enable, sending this metric would be misleading
|
|
274
|
+
span.clear_metric(SAMPLE_RATE_METRIC_KEY)
|
|
275
|
+
end
|
|
276
|
+
end
|
|
180
277
|
end
|
|
181
278
|
|
|
182
279
|
def assign_priority!(span, priority)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Sampling
|
|
3
|
+
# Checks if a span conforms to a matching criteria.
|
|
4
|
+
class Matcher
|
|
5
|
+
# Returns `true` if the span should conforms to this rule, `false` otherwise
|
|
6
|
+
#
|
|
7
|
+
# @abstract
|
|
8
|
+
# @param [Span] span
|
|
9
|
+
# @return [Boolean]
|
|
10
|
+
def match?(span)
|
|
11
|
+
raise NotImplementedError
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# A \Matcher that supports matching a span by
|
|
16
|
+
# operation name and/or service name.
|
|
17
|
+
class SimpleMatcher < Matcher
|
|
18
|
+
# Returns `true` for case equality (===) with any object
|
|
19
|
+
MATCH_ALL = Class.new do
|
|
20
|
+
# DEV: A class that implements `#===` is ~20% faster than
|
|
21
|
+
# DEV: a `Proc` that always returns `true`.
|
|
22
|
+
def ===(other)
|
|
23
|
+
true
|
|
24
|
+
end
|
|
25
|
+
end.new
|
|
26
|
+
|
|
27
|
+
attr_reader :name, :service
|
|
28
|
+
|
|
29
|
+
# @param name [String,Regexp,Proc] Matcher for case equality (===) with the span name, defaults to always match
|
|
30
|
+
# @param service [String,Regexp,Proc] Matcher for case equality (===) with the service name, defaults to always match
|
|
31
|
+
def initialize(name: MATCH_ALL, service: MATCH_ALL)
|
|
32
|
+
@name = name
|
|
33
|
+
@service = service
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def match?(span)
|
|
37
|
+
name === span.name && service === span.service
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# A \Matcher that allows for arbitrary span matching
|
|
42
|
+
# based on the return value of a provided block.
|
|
43
|
+
class ProcMatcher < Matcher
|
|
44
|
+
attr_reader :block
|
|
45
|
+
|
|
46
|
+
# @yield [name, service] Provides span name and service to the block
|
|
47
|
+
# @yieldreturn [Boolean] Whether the span conforms to this matcher
|
|
48
|
+
def initialize(&block)
|
|
49
|
+
@block = block
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def match?(span)
|
|
53
|
+
block.call(span.name, span.service)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|