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
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
require 'ddtrace/utils/time'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Sampling
|
|
5
|
+
# Checks for rate limiting on a resource.
|
|
6
|
+
class RateLimiter
|
|
7
|
+
# Checks if resource of specified size can be
|
|
8
|
+
# conforms with the current limit.
|
|
9
|
+
#
|
|
10
|
+
# Implementations of this method are not guaranteed
|
|
11
|
+
# to be side-effect free.
|
|
12
|
+
#
|
|
13
|
+
# @return [Boolean] whether a resource conforms with the current limit
|
|
14
|
+
def allow?(size); end
|
|
15
|
+
|
|
16
|
+
# The effective rate limiting ratio based on
|
|
17
|
+
# recent calls to `allow?`.
|
|
18
|
+
#
|
|
19
|
+
# @return [Float] recent allowance ratio
|
|
20
|
+
def effective_rate; end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Implementation of the Token Bucket metering algorithm
|
|
24
|
+
# for rate limiting.
|
|
25
|
+
#
|
|
26
|
+
# @see https://en.wikipedia.org/wiki/Token_bucket Token bucket
|
|
27
|
+
class TokenBucket < RateLimiter
|
|
28
|
+
attr_reader :rate, :max_tokens
|
|
29
|
+
|
|
30
|
+
# @param rate [Numeric] Allowance rate, in units per second
|
|
31
|
+
# if rate is negative, always allow
|
|
32
|
+
# if rate is zero, never allow
|
|
33
|
+
# @param max_tokens [Numeric] Limit of available tokens
|
|
34
|
+
def initialize(rate, max_tokens = rate)
|
|
35
|
+
@rate = rate
|
|
36
|
+
@max_tokens = max_tokens
|
|
37
|
+
|
|
38
|
+
@tokens = max_tokens
|
|
39
|
+
@total_messages = 0
|
|
40
|
+
@conforming_messages = 0
|
|
41
|
+
@last_refill = Utils::Time.get_time
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Checks if a message of provided +size+
|
|
45
|
+
# conforms with the current bucket limit.
|
|
46
|
+
#
|
|
47
|
+
# If it does, return +true+ and remove +size+
|
|
48
|
+
# tokens from the bucket.
|
|
49
|
+
# If it does not, return +false+ without affecting
|
|
50
|
+
# the tokens form the bucket.
|
|
51
|
+
#
|
|
52
|
+
# @return [Boolean] +true+ if message conforms with current bucket limit
|
|
53
|
+
def allow?(size)
|
|
54
|
+
return false if @rate.zero?
|
|
55
|
+
return true if @rate < 0
|
|
56
|
+
|
|
57
|
+
refill_since_last_message
|
|
58
|
+
|
|
59
|
+
increment_total_count
|
|
60
|
+
|
|
61
|
+
return false if @tokens < size
|
|
62
|
+
|
|
63
|
+
increment_conforming_count
|
|
64
|
+
|
|
65
|
+
@tokens -= size
|
|
66
|
+
|
|
67
|
+
true
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Ratio of 'conformance' per 'total messages' checked
|
|
71
|
+
# on this bucket.
|
|
72
|
+
#
|
|
73
|
+
# Returns +1.0+ when no messages have been checked yet.
|
|
74
|
+
#
|
|
75
|
+
# @return [Float] Conformance ratio, between +[0,1]+
|
|
76
|
+
def effective_rate
|
|
77
|
+
return 0.0 if @rate.zero?
|
|
78
|
+
return 1.0 if @rate < 0 || @total_messages.zero?
|
|
79
|
+
|
|
80
|
+
@conforming_messages.to_f / @total_messages
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @return [Numeric] number of tokens currently available
|
|
84
|
+
def available_tokens
|
|
85
|
+
@tokens
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def refill_since_last_message
|
|
91
|
+
now = Utils::Time.get_time
|
|
92
|
+
elapsed = now - @last_refill
|
|
93
|
+
|
|
94
|
+
refill_tokens(@rate * elapsed)
|
|
95
|
+
|
|
96
|
+
@last_refill = now
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def refill_tokens(size)
|
|
100
|
+
@tokens += size
|
|
101
|
+
@tokens = @max_tokens if @tokens > @max_tokens
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def increment_total_count
|
|
105
|
+
@total_messages += 1
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def increment_conforming_count
|
|
109
|
+
@conforming_messages += 1
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# \RateLimiter that accepts all resources,
|
|
114
|
+
# with no limits.
|
|
115
|
+
class UnlimitedLimiter < RateLimiter
|
|
116
|
+
# @return [Boolean] always +true+
|
|
117
|
+
def allow?(_)
|
|
118
|
+
true
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# @return [Float] always 100%
|
|
122
|
+
def effective_rate
|
|
123
|
+
1.0
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/sampling/matcher'
|
|
4
|
+
require 'ddtrace/sampler'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Sampling
|
|
8
|
+
# Sampling rule that dictates if a span matches
|
|
9
|
+
# a specific criteria and what sampling strategy to
|
|
10
|
+
# apply in case of a positive match.
|
|
11
|
+
class Rule
|
|
12
|
+
extend Forwardable
|
|
13
|
+
|
|
14
|
+
attr_reader :matcher, :sampler
|
|
15
|
+
|
|
16
|
+
# @param [Matcher] matcher A matcher to verify span conformity against
|
|
17
|
+
# @param [Sampler] sampler A sampler to be consulted on a positive match
|
|
18
|
+
def initialize(matcher, sampler)
|
|
19
|
+
@matcher = matcher
|
|
20
|
+
@sampler = sampler
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Evaluates if the provided `span` conforms to the `matcher`.
|
|
24
|
+
#
|
|
25
|
+
# @param [Span] span
|
|
26
|
+
# @return [Boolean] whether this rules applies to the span
|
|
27
|
+
# @return [NilClass] if the matcher fails errs during evaluation
|
|
28
|
+
def match?(span)
|
|
29
|
+
@matcher.match?(span)
|
|
30
|
+
rescue => e
|
|
31
|
+
Datadog.logger.error("Matcher failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
32
|
+
nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def_delegators :@sampler, :sample?, :sample_rate
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# A \Rule that matches a span based on
|
|
39
|
+
# operation name and/or service name and
|
|
40
|
+
# applies a fixed sampling to matching spans.
|
|
41
|
+
class SimpleRule < Rule
|
|
42
|
+
# @param name [String,Regexp,Proc] Matcher for case equality (===) with the span name, defaults to always match
|
|
43
|
+
# @param service [String,Regexp,Proc] Matcher for case equality (===) with the service name, defaults to always match
|
|
44
|
+
# @param sample_rate [Float] Sampling rate between +[0,1]+
|
|
45
|
+
def initialize(name: SimpleMatcher::MATCH_ALL, service: SimpleMatcher::MATCH_ALL, sample_rate: 1.0)
|
|
46
|
+
# We want to allow 0.0 to drop all traces, but \RateSampler
|
|
47
|
+
# considers 0.0 an invalid rate and falls back to 100% sampling.
|
|
48
|
+
#
|
|
49
|
+
# We address that here by not setting the rate in the constructor,
|
|
50
|
+
# but using the setter method.
|
|
51
|
+
#
|
|
52
|
+
# We don't want to make this change directly to \RateSampler
|
|
53
|
+
# because it breaks its current contract to existing users.
|
|
54
|
+
sampler = Datadog::RateSampler.new
|
|
55
|
+
sampler.sample_rate = sample_rate
|
|
56
|
+
|
|
57
|
+
super(SimpleMatcher.new(name: name, service: service), sampler)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/ext/priority'
|
|
4
|
+
|
|
5
|
+
require 'ddtrace/ext/sampling'
|
|
6
|
+
require 'ddtrace/sampler'
|
|
7
|
+
require 'ddtrace/sampling/rate_limiter'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Sampling
|
|
11
|
+
# Span {Sampler} that applies a set of {Rule}s to decide
|
|
12
|
+
# on sampling outcome. Then, a rate limiter is applied.
|
|
13
|
+
#
|
|
14
|
+
# If a span does not conform to any rules, a default
|
|
15
|
+
# sampling strategy is applied.
|
|
16
|
+
class RuleSampler
|
|
17
|
+
extend Forwardable
|
|
18
|
+
|
|
19
|
+
AGENT_RATE_METRIC_KEY = '_dd.agent_psr'.freeze
|
|
20
|
+
|
|
21
|
+
attr_reader :rules, :rate_limiter, :default_sampler
|
|
22
|
+
|
|
23
|
+
# @param rules [Array<Rule>] ordered list of rules to be applied to a span
|
|
24
|
+
# @param rate_limit [Float] number of traces per second, defaults to +100+
|
|
25
|
+
# @param rate_limiter [RateLimiter] limiter applied after rule matching
|
|
26
|
+
# @param default_sample_rate [Float] fallback sample rate when no rules apply to a span,
|
|
27
|
+
# between +[0,1]+, defaults to +1+
|
|
28
|
+
# @param default_sampler [Sample] fallback strategy when no rules apply to a span
|
|
29
|
+
def initialize(rules = [],
|
|
30
|
+
rate_limit: Datadog.configuration.sampling.rate_limit,
|
|
31
|
+
rate_limiter: nil,
|
|
32
|
+
default_sample_rate: Datadog.configuration.sampling.default_rate,
|
|
33
|
+
default_sampler: nil)
|
|
34
|
+
|
|
35
|
+
@rules = rules
|
|
36
|
+
|
|
37
|
+
@rate_limiter = if rate_limiter
|
|
38
|
+
rate_limiter
|
|
39
|
+
elsif rate_limit
|
|
40
|
+
Datadog::Sampling::TokenBucket.new(rate_limit)
|
|
41
|
+
else
|
|
42
|
+
Datadog::Sampling::UnlimitedLimiter.new
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
@default_sampler = if default_sampler
|
|
46
|
+
default_sampler
|
|
47
|
+
elsif default_sample_rate
|
|
48
|
+
# We want to allow 0.0 to drop all traces, but \RateSampler
|
|
49
|
+
# considers 0.0 an invalid rate and falls back to 100% sampling.
|
|
50
|
+
#
|
|
51
|
+
# We address that here by not setting the rate in the constructor,
|
|
52
|
+
# but using the setter method.
|
|
53
|
+
#
|
|
54
|
+
# We don't want to make this change directly to \RateSampler
|
|
55
|
+
# because it breaks its current contract to existing users.
|
|
56
|
+
Datadog::RateSampler.new.tap { |s| s.sample_rate = default_sample_rate }
|
|
57
|
+
else
|
|
58
|
+
RateByServiceSampler.new(1.0, env: -> { Datadog.tracer.tags[:env] })
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# /RuleSampler's components (it's rate limiter, for example) are
|
|
63
|
+
# not be guaranteed to be size-effect free.
|
|
64
|
+
# It is not possible to guarantee that a call to {#sample?} will
|
|
65
|
+
# return the same result as a successive call to {#sample!} with the same span.
|
|
66
|
+
#
|
|
67
|
+
# Use {#sample!} instead
|
|
68
|
+
def sample?(_span)
|
|
69
|
+
raise 'RuleSampler cannot be evaluated without side-effects'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def sample!(span)
|
|
73
|
+
sampled = sample_span(span) do |s|
|
|
74
|
+
@default_sampler.sample!(s).tap do
|
|
75
|
+
# We want to make sure the span is tagged with the agent-derived
|
|
76
|
+
# service rate. Retrieve this from the rate by service sampler.
|
|
77
|
+
# Only do this if it was set by a RateByServiceSampler.
|
|
78
|
+
if @default_sampler.is_a?(RateByServiceSampler)
|
|
79
|
+
s.set_metric(AGENT_RATE_METRIC_KEY, @default_sampler.sample_rate(span))
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
sampled.tap do
|
|
85
|
+
span.sampled = sampled
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def update(*args)
|
|
90
|
+
return false unless @default_sampler.respond_to?(:update)
|
|
91
|
+
@default_sampler.update(*args)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
private
|
|
95
|
+
|
|
96
|
+
def sample_span(span)
|
|
97
|
+
rule = @rules.find { |r| r.match?(span) }
|
|
98
|
+
|
|
99
|
+
return yield(span) if rule.nil?
|
|
100
|
+
|
|
101
|
+
sampled = rule.sample?(span)
|
|
102
|
+
sample_rate = rule.sample_rate(span)
|
|
103
|
+
|
|
104
|
+
set_rule_metrics(span, sample_rate)
|
|
105
|
+
|
|
106
|
+
return false unless sampled
|
|
107
|
+
|
|
108
|
+
rate_limiter.allow?(1).tap do
|
|
109
|
+
set_limiter_metrics(span, rate_limiter.effective_rate)
|
|
110
|
+
end
|
|
111
|
+
rescue StandardError => e
|
|
112
|
+
Datadog.logger.error("Rule sampling failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
113
|
+
yield(span)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def set_rule_metrics(span, sample_rate)
|
|
117
|
+
span.set_metric(Ext::Sampling::RULE_SAMPLE_RATE, sample_rate)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def set_limiter_metrics(span, limiter_rate)
|
|
121
|
+
span.set_metric(Ext::Sampling::RATE_LIMITER_RATE, limiter_rate)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
data/lib/ddtrace/span.rb
CHANGED
|
@@ -4,8 +4,10 @@ require 'thread'
|
|
|
4
4
|
require 'ddtrace/utils'
|
|
5
5
|
require 'ddtrace/ext/errors'
|
|
6
6
|
require 'ddtrace/ext/priority'
|
|
7
|
+
require 'ddtrace/environment'
|
|
7
8
|
require 'ddtrace/analytics'
|
|
8
9
|
require 'ddtrace/forced_tracing'
|
|
10
|
+
require 'ddtrace/diagnostics/health'
|
|
9
11
|
|
|
10
12
|
module Datadog
|
|
11
13
|
# Represents a logical unit of work in the system. Each trace consists of one or more spans.
|
|
@@ -30,6 +32,9 @@ module Datadog
|
|
|
30
32
|
# parsing 64-bit integers for distributed tracing since an upstream system may generate one
|
|
31
33
|
EXTERNAL_MAX_ID = 2**64
|
|
32
34
|
|
|
35
|
+
# This limit is for numeric tags because uint64 could end up rounded.
|
|
36
|
+
NUMERIC_TAG_SIZE_RANGE = (-2**53..2**53)
|
|
37
|
+
|
|
33
38
|
attr_accessor :name, :service, :resource, :span_type,
|
|
34
39
|
:start_time, :end_time,
|
|
35
40
|
:span_id, :trace_id, :parent_id,
|
|
@@ -79,29 +84,70 @@ module Datadog
|
|
|
79
84
|
#
|
|
80
85
|
# span.set_tag('http.method', request.method)
|
|
81
86
|
def set_tag(key, value = nil)
|
|
82
|
-
|
|
87
|
+
# Keys must be unique between tags and metrics
|
|
88
|
+
@metrics.delete(key)
|
|
89
|
+
|
|
90
|
+
# Ensure `http.status_code` is always a string so it is added to
|
|
91
|
+
# @meta instead of @metrics
|
|
92
|
+
# DEV: This is necessary because the agent looks to `meta['http.status_code']` for
|
|
93
|
+
# tagging necessary metrics
|
|
94
|
+
value = value.to_s if key == Ext::HTTP::STATUS_CODE
|
|
95
|
+
|
|
96
|
+
# NOTE: Adding numeric tags as metrics is stop-gap support
|
|
97
|
+
# for numeric typed tags. Eventually they will become
|
|
98
|
+
# tags again.
|
|
99
|
+
# Any numeric that is not an integer greater than max size is logged as a metric.
|
|
100
|
+
# Everything else gets logged as a tag.
|
|
101
|
+
if value.is_a?(Numeric) && !(value.is_a?(Integer) && !NUMERIC_TAG_SIZE_RANGE.cover?(value))
|
|
102
|
+
set_metric(key, value)
|
|
103
|
+
else
|
|
104
|
+
@meta[key] = value.to_s
|
|
105
|
+
end
|
|
83
106
|
rescue StandardError => e
|
|
84
|
-
Datadog
|
|
107
|
+
Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Sets tags from given hash, for each key in hash it sets the tag with that key
|
|
111
|
+
# and associated value from the hash. It is shortcut for `set_tag`. Keys and values
|
|
112
|
+
# of the hash must be strings. Note that nested hashes are not supported.
|
|
113
|
+
# A valid example is:
|
|
114
|
+
#
|
|
115
|
+
# span.set_tags({ "http.method" => "GET", "user.id" => "234" })
|
|
116
|
+
def set_tags(tags)
|
|
117
|
+
tags.each { |k, v| set_tag(k, v) }
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# This method removes a tag for the given key.
|
|
121
|
+
def clear_tag(key)
|
|
122
|
+
@meta.delete(key)
|
|
85
123
|
end
|
|
86
124
|
|
|
87
125
|
# Return the tag with the given key, nil if it doesn't exist.
|
|
88
126
|
def get_tag(key)
|
|
89
|
-
@meta[key]
|
|
127
|
+
@meta[key] || @metrics[key]
|
|
90
128
|
end
|
|
91
129
|
|
|
92
130
|
# This method sets a tag with a floating point value for the given key. It acts
|
|
93
131
|
# like `set_tag()` and it simply add a tag without further processing.
|
|
94
132
|
def set_metric(key, value)
|
|
133
|
+
# Keys must be unique between tags and metrics
|
|
134
|
+
@meta.delete(key)
|
|
135
|
+
|
|
95
136
|
# enforce that the value is a floating point number
|
|
96
137
|
value = Float(value)
|
|
97
138
|
@metrics[key] = value
|
|
98
139
|
rescue StandardError => e
|
|
99
|
-
Datadog
|
|
140
|
+
Datadog.logger.debug("Unable to set the metric #{key}, ignoring it. Caused by: #{e}")
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# This method removes a metric for the given key. It acts like {#remove_tag}.
|
|
144
|
+
def clear_metric(key)
|
|
145
|
+
@metrics.delete(key)
|
|
100
146
|
end
|
|
101
147
|
|
|
102
148
|
# Return the metric with the given key, nil if it doesn't exist.
|
|
103
149
|
def get_metric(key)
|
|
104
|
-
@metrics[key]
|
|
150
|
+
@metrics[key] || @meta[key]
|
|
105
151
|
end
|
|
106
152
|
|
|
107
153
|
# Mark the span with the given error.
|
|
@@ -137,13 +183,14 @@ module Datadog
|
|
|
137
183
|
# spans without a service would be dropped, so here we provide a default.
|
|
138
184
|
# This should really never happen with integrations in contrib, as a default
|
|
139
185
|
# service is always set. It's only for custom instrumentation.
|
|
140
|
-
@service ||= @tracer
|
|
186
|
+
@service ||= (@tracer && @tracer.default_service)
|
|
141
187
|
|
|
142
188
|
begin
|
|
143
189
|
@context.close_span(self)
|
|
144
190
|
@tracer.record(self)
|
|
145
191
|
rescue StandardError => e
|
|
146
|
-
Datadog
|
|
192
|
+
Datadog.logger.debug("error recording finished trace: #{e}")
|
|
193
|
+
Datadog.health_metrics.error_span_finish(1, tags: ["error:#{e.class.name}"])
|
|
147
194
|
end
|
|
148
195
|
self
|
|
149
196
|
end
|
data/lib/ddtrace/sync_writer.rb
CHANGED
|
@@ -4,9 +4,10 @@ require 'ddtrace/runtime/metrics'
|
|
|
4
4
|
|
|
5
5
|
module Datadog
|
|
6
6
|
# SyncWriter flushes both services and traces synchronously
|
|
7
|
+
# DEV: To be replaced by Datadog::Workers::TraceWriter.
|
|
7
8
|
class SyncWriter
|
|
8
9
|
attr_reader \
|
|
9
|
-
:
|
|
10
|
+
:priority_sampler,
|
|
10
11
|
:transport
|
|
11
12
|
|
|
12
13
|
def initialize(options = {})
|
|
@@ -15,16 +16,13 @@ module Datadog
|
|
|
15
16
|
Transport::HTTP.default(transport_options)
|
|
16
17
|
end
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
@runtime_metrics = options.fetch(:runtime_metrics) do
|
|
20
|
-
Runtime::Metrics.new
|
|
21
|
-
end
|
|
19
|
+
@priority_sampler = options.fetch(:priority_sampler, nil)
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
def write(trace, services = nil)
|
|
25
23
|
unless services.nil?
|
|
26
24
|
Datadog::Patcher.do_once('SyncWriter#write') do
|
|
27
|
-
Datadog
|
|
25
|
+
Datadog.logger.warn(%(
|
|
28
26
|
write: Writing services has been deprecated and no longer need to be provided.
|
|
29
27
|
write(traces, services) can be updted to write(traces)
|
|
30
28
|
))
|
|
@@ -35,7 +33,13 @@ module Datadog
|
|
|
35
33
|
proc { flush_trace(trace) }
|
|
36
34
|
)
|
|
37
35
|
rescue => e
|
|
38
|
-
|
|
36
|
+
Datadog.logger.debug(e)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Added for interface completeness
|
|
40
|
+
def stop
|
|
41
|
+
# No cleanup to do for the SyncWriter
|
|
42
|
+
true
|
|
39
43
|
end
|
|
40
44
|
|
|
41
45
|
private
|
|
@@ -46,8 +50,9 @@ module Datadog
|
|
|
46
50
|
|
|
47
51
|
def flush_trace(trace)
|
|
48
52
|
processed_traces = Pipeline.process!([trace])
|
|
53
|
+
return if processed_traces.empty?
|
|
49
54
|
inject_hostname!(processed_traces.first) if Datadog.configuration.report_hostname
|
|
50
|
-
transport.
|
|
55
|
+
transport.send_traces(processed_traces)
|
|
51
56
|
end
|
|
52
57
|
|
|
53
58
|
def inject_hostname!(trace)
|