ddtrace 0.38.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 +7 -0
- data/.circleci/config.yml +492 -0
- data/.circleci/images/primary/Dockerfile-2.0.0 +73 -0
- data/.circleci/images/primary/Dockerfile-2.1.10 +73 -0
- data/.circleci/images/primary/Dockerfile-2.2.10 +73 -0
- data/.circleci/images/primary/Dockerfile-2.3.8 +75 -0
- data/.circleci/images/primary/Dockerfile-2.4.6 +73 -0
- data/.circleci/images/primary/Dockerfile-2.5.6 +73 -0
- data/.circleci/images/primary/Dockerfile-2.6.4 +73 -0
- data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
- data/.dockerignore +1 -0
- data/.env +26 -0
- data/.github/CODEOWNERS +1 -0
- data/.gitignore +61 -0
- data/.gitlab-ci.yml +26 -0
- data/.rspec +1 -0
- data/.rubocop.yml +85 -0
- data/.yardopts +5 -0
- data/Appraisals +961 -0
- data/CHANGELOG.md +1402 -0
- data/CONTRIBUTING.md +85 -0
- data/Gemfile +7 -0
- data/LICENSE +6 -0
- data/LICENSE.Apache +200 -0
- data/LICENSE.BSD3 +24 -0
- data/NOTICE +4 -0
- data/README.md +23 -0
- data/Rakefile +753 -0
- data/benchmarks/postgres_database.yml +9 -0
- data/benchmarks/sidekiq_test.rb +154 -0
- data/ddtrace.gemspec +71 -0
- data/docker-compose.yml +370 -0
- data/docs/DevelopmentGuide.md +195 -0
- data/docs/GettingStarted.md +2224 -0
- data/lib/ddtrace.rb +76 -0
- data/lib/ddtrace/analytics.rb +36 -0
- data/lib/ddtrace/augmentation.rb +13 -0
- data/lib/ddtrace/augmentation/method_wrapper.rb +20 -0
- data/lib/ddtrace/augmentation/method_wrapping.rb +38 -0
- data/lib/ddtrace/augmentation/shim.rb +102 -0
- data/lib/ddtrace/buffer.rb +119 -0
- data/lib/ddtrace/chunker.rb +34 -0
- data/lib/ddtrace/configuration.rb +53 -0
- data/lib/ddtrace/configuration/base.rb +84 -0
- data/lib/ddtrace/configuration/components.rb +154 -0
- data/lib/ddtrace/configuration/dependency_resolver.rb +24 -0
- data/lib/ddtrace/configuration/option.rb +64 -0
- data/lib/ddtrace/configuration/option_definition.rb +123 -0
- data/lib/ddtrace/configuration/option_definition_set.rb +18 -0
- data/lib/ddtrace/configuration/option_set.rb +6 -0
- data/lib/ddtrace/configuration/options.rb +112 -0
- data/lib/ddtrace/configuration/pin_setup.rb +31 -0
- data/lib/ddtrace/configuration/settings.rb +273 -0
- data/lib/ddtrace/context.rb +305 -0
- data/lib/ddtrace/context_flush.rb +69 -0
- data/lib/ddtrace/context_provider.rb +50 -0
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +25 -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 +23 -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 +148 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +25 -0
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/action_pack/ext.rb +16 -0
- data/lib/ddtrace/contrib/action_pack/integration.rb +38 -0
- data/lib/ddtrace/contrib/action_pack/patcher.rb +23 -0
- data/lib/ddtrace/contrib/action_pack/utils.rb +36 -0
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +26 -0
- 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 +17 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +74 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +45 -0
- data/lib/ddtrace/contrib/action_view/patcher.rb +47 -0
- data/lib/ddtrace/contrib/action_view/utils.rb +32 -0
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +68 -0
- data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +17 -0
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +40 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +29 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +45 -0
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/active_record/event.rb +30 -0
- data/lib/ddtrace/contrib/active_record/events.rb +30 -0
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +60 -0
- data/lib/ddtrace/contrib/active_record/events/sql.rb +64 -0
- data/lib/ddtrace/contrib/active_record/ext.rb +21 -0
- data/lib/ddtrace/contrib/active_record/integration.rb +46 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +23 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +76 -0
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +157 -0
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +48 -0
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +47 -0
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/active_support/ext.rb +21 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +40 -0
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +64 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +66 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +159 -0
- data/lib/ddtrace/contrib/active_support/patcher.rb +23 -0
- data/lib/ddtrace/contrib/analytics.rb +24 -0
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/aws/ext.rb +20 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +56 -0
- data/lib/ddtrace/contrib/aws/integration.rb +42 -0
- data/lib/ddtrace/contrib/aws/parsed_context.rb +56 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +49 -0
- data/lib/ddtrace/contrib/aws/services.rb +115 -0
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +41 -0
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +11 -0
- data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +23 -0
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +38 -0
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +28 -0
- data/lib/ddtrace/contrib/configurable.rb +76 -0
- data/lib/ddtrace/contrib/configuration/resolver.rb +16 -0
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +53 -0
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/dalli/ext.rb +17 -0
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +50 -0
- data/lib/ddtrace/contrib/dalli/integration.rb +38 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +63 -0
- data/lib/ddtrace/contrib/dalli/quantize.rb +22 -0
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +18 -0
- data/lib/ddtrace/contrib/delayed_job/integration.rb +38 -0
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +28 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +61 -0
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +19 -0
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +39 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +117 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +80 -0
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +148 -0
- data/lib/ddtrace/contrib/ethon/ext.rb +15 -0
- data/lib/ddtrace/contrib/ethon/integration.rb +43 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +80 -0
- data/lib/ddtrace/contrib/ethon/patcher.rb +25 -0
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/excon/ext.rb +14 -0
- data/lib/ddtrace/contrib/excon/integration.rb +43 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +157 -0
- data/lib/ddtrace/contrib/excon/patcher.rb +27 -0
- data/lib/ddtrace/contrib/extensions.rb +93 -0
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +14 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +43 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +83 -0
- data/lib/ddtrace/contrib/faraday/patcher.rb +80 -0
- data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +208 -0
- data/lib/ddtrace/contrib/grape/ext.rb +19 -0
- data/lib/ddtrace/contrib/grape/instrumentation.rb +33 -0
- data/lib/ddtrace/contrib/grape/integration.rb +39 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +73 -0
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/graphql/ext.rb +13 -0
- data/lib/ddtrace/contrib/graphql/integration.rb +39 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +60 -0
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +74 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +54 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +76 -0
- data/lib/ddtrace/contrib/grpc/ext.rb +15 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +68 -0
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +39 -0
- data/lib/ddtrace/contrib/http/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/http/ext.rb +14 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +175 -0
- data/lib/ddtrace/contrib/http/integration.rb +45 -0
- data/lib/ddtrace/contrib/http/patcher.rb +26 -0
- data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +14 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
- data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
- data/lib/ddtrace/contrib/integration.rb +16 -0
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +25 -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 +38 -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 +28 -0
- data/lib/ddtrace/contrib/mongodb/ext.rb +20 -0
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +67 -0
- data/lib/ddtrace/contrib/mongodb/integration.rb +38 -0
- data/lib/ddtrace/contrib/mongodb/parsers.rb +68 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +31 -0
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +108 -0
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/mysql2/ext.rb +15 -0
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +60 -0
- data/lib/ddtrace/contrib/mysql2/integration.rb +38 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +27 -0
- data/lib/ddtrace/contrib/patchable.rb +59 -0
- data/lib/ddtrace/contrib/patcher.rb +62 -0
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/presto/ext.rb +25 -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/racecar/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/racecar/event.rb +71 -0
- data/lib/ddtrace/contrib/racecar/events.rb +30 -0
- data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
- data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
- data/lib/ddtrace/contrib/racecar/ext.rb +21 -0
- data/lib/ddtrace/contrib/racecar/integration.rb +39 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +26 -0
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +41 -0
- data/lib/ddtrace/contrib/rack/ext.rb +18 -0
- data/lib/ddtrace/contrib/rack/integration.rb +38 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +290 -0
- data/lib/ddtrace/contrib/rack/patcher.rb +107 -0
- data/lib/ddtrace/contrib/rack/request_queue.rb +39 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +83 -0
- data/lib/ddtrace/contrib/rails/ext.rb +13 -0
- data/lib/ddtrace/contrib/rails/framework.rb +124 -0
- data/lib/ddtrace/contrib/rails/integration.rb +44 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +38 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +74 -0
- data/lib/ddtrace/contrib/rails/railtie.rb +17 -0
- data/lib/ddtrace/contrib/rails/utils.rb +20 -0
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/rake/ext.rb +18 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +88 -0
- data/lib/ddtrace/contrib/rake/integration.rb +38 -0
- data/lib/ddtrace/contrib/rake/patcher.rb +30 -0
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/redis/ext.rb +18 -0
- data/lib/ddtrace/contrib/redis/integration.rb +42 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +97 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +47 -0
- data/lib/ddtrace/contrib/redis/tags.rb +38 -0
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
- data/lib/ddtrace/contrib/registerable.rb +33 -0
- data/lib/ddtrace/contrib/registry.rb +42 -0
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/resque/ext.rb +14 -0
- data/lib/ddtrace/contrib/resque/integration.rb +47 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +29 -0
- data/lib/ddtrace/contrib/resque/resque_job.rb +80 -0
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/rest_client/ext.rb +14 -0
- data/lib/ddtrace/contrib/rest_client/integration.rb +38 -0
- data/lib/ddtrace/contrib/rest_client/patcher.rb +23 -0
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +89 -0
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +23 -0
- data/lib/ddtrace/contrib/sequel/database.rb +61 -0
- data/lib/ddtrace/contrib/sequel/dataset.rb +62 -0
- data/lib/ddtrace/contrib/sequel/ext.rb +15 -0
- data/lib/ddtrace/contrib/sequel/integration.rb +38 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +33 -0
- data/lib/ddtrace/contrib/sequel/utils.rb +46 -0
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +24 -0
- data/lib/ddtrace/contrib/shoryuken/ext.rb +18 -0
- data/lib/ddtrace/contrib/shoryuken/integration.rb +39 -0
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +24 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +49 -0
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +31 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +24 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +38 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +41 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +67 -0
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +45 -0
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +34 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +58 -0
- data/lib/ddtrace/contrib/sinatra/ext.rb +24 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
- data/lib/ddtrace/contrib/sinatra/integration.rb +38 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +28 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +150 -0
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +78 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +26 -0
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +18 -0
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +84 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +38 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +42 -0
- data/lib/ddtrace/correlation.rb +38 -0
- data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
- data/lib/ddtrace/diagnostics/health.rb +33 -0
- data/lib/ddtrace/distributed_tracing/headers/b3.rb +44 -0
- data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +56 -0
- data/lib/ddtrace/distributed_tracing/headers/datadog.rb +42 -0
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +70 -0
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +45 -0
- data/lib/ddtrace/encoding.rb +69 -0
- data/lib/ddtrace/environment.rb +31 -0
- data/lib/ddtrace/error.rb +27 -0
- data/lib/ddtrace/event.rb +52 -0
- data/lib/ddtrace/ext/analytics.rb +12 -0
- data/lib/ddtrace/ext/app_types.rb +11 -0
- data/lib/ddtrace/ext/correlation.rb +11 -0
- data/lib/ddtrace/ext/diagnostics.rb +35 -0
- data/lib/ddtrace/ext/distributed.rb +33 -0
- data/lib/ddtrace/ext/environment.rb +16 -0
- data/lib/ddtrace/ext/errors.rb +10 -0
- data/lib/ddtrace/ext/forced_tracing.rb +25 -0
- data/lib/ddtrace/ext/http.rb +46 -0
- data/lib/ddtrace/ext/manual_tracing.rb +9 -0
- data/lib/ddtrace/ext/metrics.rb +15 -0
- data/lib/ddtrace/ext/net.rb +10 -0
- data/lib/ddtrace/ext/priority.rb +16 -0
- data/lib/ddtrace/ext/runtime.rb +26 -0
- data/lib/ddtrace/ext/sampling.rb +16 -0
- data/lib/ddtrace/ext/sql.rb +8 -0
- data/lib/ddtrace/ext/transport.rb +17 -0
- data/lib/ddtrace/forced_tracing.rb +36 -0
- data/lib/ddtrace/logger.rb +40 -0
- data/lib/ddtrace/metrics.rb +222 -0
- data/lib/ddtrace/monkey.rb +58 -0
- data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
- data/lib/ddtrace/opentelemetry/span.rb +33 -0
- data/lib/ddtrace/opentracer.rb +40 -0
- data/lib/ddtrace/opentracer/binary_propagator.rb +24 -0
- data/lib/ddtrace/opentracer/carrier.rb +6 -0
- data/lib/ddtrace/opentracer/distributed_headers.rb +52 -0
- data/lib/ddtrace/opentracer/global_tracer.rb +15 -0
- data/lib/ddtrace/opentracer/propagator.rb +22 -0
- data/lib/ddtrace/opentracer/rack_propagator.rb +60 -0
- data/lib/ddtrace/opentracer/scope.rb +15 -0
- data/lib/ddtrace/opentracer/scope_manager.rb +6 -0
- data/lib/ddtrace/opentracer/span.rb +98 -0
- data/lib/ddtrace/opentracer/span_context.rb +14 -0
- data/lib/ddtrace/opentracer/span_context_factory.rb +23 -0
- data/lib/ddtrace/opentracer/text_map_propagator.rb +75 -0
- data/lib/ddtrace/opentracer/thread_local_scope.rb +30 -0
- data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +40 -0
- data/lib/ddtrace/opentracer/tracer.rb +208 -0
- data/lib/ddtrace/patcher.rb +47 -0
- data/lib/ddtrace/pin.rb +138 -0
- data/lib/ddtrace/pipeline.rb +46 -0
- data/lib/ddtrace/pipeline/span_filter.rb +38 -0
- data/lib/ddtrace/pipeline/span_processor.rb +20 -0
- data/lib/ddtrace/propagation/grpc_propagator.rb +61 -0
- data/lib/ddtrace/propagation/http_propagator.rb +75 -0
- data/lib/ddtrace/quantization/hash.rb +103 -0
- data/lib/ddtrace/quantization/http.rb +86 -0
- data/lib/ddtrace/runtime/cgroup.rb +44 -0
- data/lib/ddtrace/runtime/class_count.rb +17 -0
- data/lib/ddtrace/runtime/container.rb +73 -0
- data/lib/ddtrace/runtime/gc.rb +16 -0
- data/lib/ddtrace/runtime/identity.rb +41 -0
- data/lib/ddtrace/runtime/metrics.rb +96 -0
- data/lib/ddtrace/runtime/object_space.rb +19 -0
- data/lib/ddtrace/runtime/socket.rb +14 -0
- data/lib/ddtrace/runtime/thread_count.rb +16 -0
- data/lib/ddtrace/sampler.rb +292 -0
- 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 +307 -0
- data/lib/ddtrace/sync_writer.rb +67 -0
- data/lib/ddtrace/tracer.rb +439 -0
- data/lib/ddtrace/transport/http.rb +91 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +120 -0
- data/lib/ddtrace/transport/http/adapters/registry.rb +24 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +81 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +68 -0
- data/lib/ddtrace/transport/http/api.rb +46 -0
- data/lib/ddtrace/transport/http/api/endpoint.rb +27 -0
- data/lib/ddtrace/transport/http/api/fallbacks.rb +22 -0
- data/lib/ddtrace/transport/http/api/instance.rb +33 -0
- data/lib/ddtrace/transport/http/api/map.rb +14 -0
- data/lib/ddtrace/transport/http/api/spec.rb +15 -0
- data/lib/ddtrace/transport/http/builder.rb +163 -0
- data/lib/ddtrace/transport/http/client.rb +50 -0
- data/lib/ddtrace/transport/http/env.rb +48 -0
- data/lib/ddtrace/transport/http/response.rb +26 -0
- data/lib/ddtrace/transport/http/statistics.rb +30 -0
- data/lib/ddtrace/transport/http/traces.rb +143 -0
- 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/parcel.rb +13 -0
- data/lib/ddtrace/transport/request.rb +13 -0
- data/lib/ddtrace/transport/response.rb +60 -0
- data/lib/ddtrace/transport/statistics.rb +72 -0
- data/lib/ddtrace/transport/traces.rb +183 -0
- data/lib/ddtrace/utils.rb +65 -0
- data/lib/ddtrace/utils/database.rb +25 -0
- data/lib/ddtrace/utils/time.rb +14 -0
- data/lib/ddtrace/vendor/active_record/connection_specification.rb +301 -0
- data/lib/ddtrace/version.rb +12 -0
- data/lib/ddtrace/worker.rb +20 -0
- data/lib/ddtrace/workers.rb +117 -0
- 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 +175 -0
- data/tasks/release_gem.rake +28 -0
- metadata +815 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Runtime
|
|
3
|
+
# Retrieves number of classes from runtime
|
|
4
|
+
module ClassCount
|
|
5
|
+
module_function
|
|
6
|
+
|
|
7
|
+
def value
|
|
8
|
+
::ObjectSpace.count_objects[:T_CLASS]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def available?
|
|
12
|
+
::ObjectSpace.respond_to?(:count_objects) \
|
|
13
|
+
&& ::ObjectSpace.count_objects.key?(:T_CLASS)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require 'ddtrace/ext/runtime'
|
|
2
|
+
require 'ddtrace/runtime/cgroup'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Runtime
|
|
6
|
+
# For container environments
|
|
7
|
+
module Container
|
|
8
|
+
UUID_PATTERN = '[0-9a-f]{8}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{12}'.freeze
|
|
9
|
+
CONTAINER_PATTERN = '[0-9a-f]{64}'.freeze
|
|
10
|
+
|
|
11
|
+
POD_REGEX = /(pod)?(#{UUID_PATTERN})(?:.slice)?$/
|
|
12
|
+
CONTAINER_REGEX = /(#{UUID_PATTERN}|#{CONTAINER_PATTERN})(?:.scope)?$/
|
|
13
|
+
|
|
14
|
+
Descriptor = Struct.new(
|
|
15
|
+
:platform,
|
|
16
|
+
:container_id,
|
|
17
|
+
:task_uid
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
module_function
|
|
21
|
+
|
|
22
|
+
def platform
|
|
23
|
+
descriptor.platform
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def container_id
|
|
27
|
+
descriptor.container_id
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def task_uid
|
|
31
|
+
descriptor.task_uid
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def descriptor
|
|
35
|
+
@descriptor ||= begin
|
|
36
|
+
Descriptor.new.tap do |descriptor|
|
|
37
|
+
begin
|
|
38
|
+
Cgroup.descriptors.each do |cgroup_descriptor|
|
|
39
|
+
# Parse container data from cgroup descriptor
|
|
40
|
+
path = cgroup_descriptor.path
|
|
41
|
+
next if path.nil?
|
|
42
|
+
|
|
43
|
+
# Split path into parts
|
|
44
|
+
parts = path.split('/')
|
|
45
|
+
parts.shift # Remove leading empty part
|
|
46
|
+
next if parts.length < 2
|
|
47
|
+
|
|
48
|
+
# Read info from path
|
|
49
|
+
platform = parts[0]
|
|
50
|
+
container_id = parts[-1][CONTAINER_REGEX]
|
|
51
|
+
task_uid = parts[-2][POD_REGEX]
|
|
52
|
+
|
|
53
|
+
# If container ID wasn't found, ignore.
|
|
54
|
+
# Path might describe a non-container environment.
|
|
55
|
+
next if container_id.nil?
|
|
56
|
+
|
|
57
|
+
descriptor.platform = platform
|
|
58
|
+
descriptor.container_id = container_id
|
|
59
|
+
descriptor.task_uid = task_uid
|
|
60
|
+
|
|
61
|
+
break
|
|
62
|
+
end
|
|
63
|
+
rescue StandardError => e
|
|
64
|
+
Datadog.logger.error(
|
|
65
|
+
"Error while parsing container info. Cause: #{e.message} Location: #{e.backtrace.first}"
|
|
66
|
+
)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'securerandom'
|
|
2
|
+
require 'ddtrace/ext/runtime'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Runtime
|
|
6
|
+
# For runtime identity
|
|
7
|
+
module Identity
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# Retrieves number of classes from runtime
|
|
11
|
+
def id
|
|
12
|
+
@pid ||= Process.pid
|
|
13
|
+
@id ||= SecureRandom.uuid
|
|
14
|
+
|
|
15
|
+
# Check if runtime has changed, e.g. forked.
|
|
16
|
+
if Process.pid != @pid
|
|
17
|
+
@pid = Process.pid
|
|
18
|
+
@id = SecureRandom.uuid
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
@id
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def lang
|
|
25
|
+
Ext::Runtime::LANG
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def lang_interpreter
|
|
29
|
+
Ext::Runtime::LANG_INTERPRETER
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def lang_version
|
|
33
|
+
Ext::Runtime::LANG_VERSION
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def tracer_version
|
|
37
|
+
Ext::Runtime::TRACER_VERSION
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require 'ddtrace/ext/runtime'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/metrics'
|
|
4
|
+
require 'ddtrace/runtime/class_count'
|
|
5
|
+
require 'ddtrace/runtime/gc'
|
|
6
|
+
require 'ddtrace/runtime/identity'
|
|
7
|
+
require 'ddtrace/runtime/thread_count'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Runtime
|
|
11
|
+
# For generating runtime metrics
|
|
12
|
+
class Metrics < Datadog::Metrics
|
|
13
|
+
def initialize(options = {})
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
# Initialize service list
|
|
17
|
+
@services = Set.new(options.fetch(:services, []))
|
|
18
|
+
@service_tags = nil
|
|
19
|
+
compile_service_tags!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def associate_with_span(span)
|
|
23
|
+
return if !enabled? || span.nil?
|
|
24
|
+
|
|
25
|
+
# Register service as associated with metrics
|
|
26
|
+
register_service(span.service) unless span.service.nil?
|
|
27
|
+
|
|
28
|
+
# Tag span with language and runtime ID for association with metrics
|
|
29
|
+
span.set_tag(Ext::Runtime::TAG_LANG, Runtime::Identity.lang)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Associate service with runtime metrics
|
|
33
|
+
def register_service(service)
|
|
34
|
+
return if !enabled? || service.nil?
|
|
35
|
+
|
|
36
|
+
service = service.to_s
|
|
37
|
+
|
|
38
|
+
unless @services.include?(service)
|
|
39
|
+
# Add service to list and update services tag
|
|
40
|
+
services << service
|
|
41
|
+
|
|
42
|
+
# Recompile the service tags
|
|
43
|
+
compile_service_tags!
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Flush all runtime metrics to Statsd client
|
|
48
|
+
def flush
|
|
49
|
+
return unless enabled?
|
|
50
|
+
|
|
51
|
+
try_flush { gauge(Ext::Runtime::Metrics::METRIC_CLASS_COUNT, ClassCount.value) if ClassCount.available? }
|
|
52
|
+
try_flush { gauge(Ext::Runtime::Metrics::METRIC_THREAD_COUNT, ThreadCount.value) if ThreadCount.available? }
|
|
53
|
+
try_flush { gc_metrics.each { |metric, value| gauge(metric, value) } if GC.available? }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def gc_metrics
|
|
57
|
+
Hash[
|
|
58
|
+
GC.stat.map do |k, v|
|
|
59
|
+
next if v.is_a?(Hash) # TODO: JRuby supports additional nested metrics
|
|
60
|
+
|
|
61
|
+
["#{Ext::Runtime::Metrics::METRIC_GC_PREFIX}.#{k}", v]
|
|
62
|
+
end
|
|
63
|
+
]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def try_flush
|
|
67
|
+
yield
|
|
68
|
+
rescue StandardError => e
|
|
69
|
+
Datadog.logger.error("Error while sending runtime metric. Cause: #{e.message}")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def default_metric_options
|
|
73
|
+
# Return dupes, so that the constant isn't modified,
|
|
74
|
+
# and defaults are unfrozen for mutation in Statsd.
|
|
75
|
+
super.tap do |options|
|
|
76
|
+
options[:tags] = options[:tags].dup
|
|
77
|
+
|
|
78
|
+
# Add services dynamically because they might change during runtime.
|
|
79
|
+
options[:tags].concat(service_tags) unless service_tags.nil?
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
attr_reader \
|
|
86
|
+
:service_tags,
|
|
87
|
+
:services
|
|
88
|
+
|
|
89
|
+
def compile_service_tags!
|
|
90
|
+
@service_tags = services.to_a.collect do |service|
|
|
91
|
+
"#{Ext::Runtime::Metrics::TAG_SERVICE}:#{service}".freeze
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'objspace'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Runtime
|
|
5
|
+
# Retrieves garbage collection statistics
|
|
6
|
+
module ObjectSpace
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
def estimate_bytesize(object)
|
|
10
|
+
return 0 unless ::ObjectSpace.respond_to?(:memsize_of)
|
|
11
|
+
|
|
12
|
+
# Rough calculation of bytesize; not very accurate.
|
|
13
|
+
object.instance_variables.inject(::ObjectSpace.memsize_of(object)) do |sum, var|
|
|
14
|
+
sum + ::ObjectSpace.memsize_of(object.instance_variable_get(var))
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/ext/priority'
|
|
4
|
+
require 'ddtrace/diagnostics/health'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
# \Sampler performs client-side trace sampling.
|
|
8
|
+
class Sampler
|
|
9
|
+
def sample?(_span)
|
|
10
|
+
raise NotImplementedError, 'Samplers must implement the #sample? method'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def sample!(_span)
|
|
14
|
+
raise NotImplementedError, 'Samplers must implement the #sample! method'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def sample_rate(span)
|
|
18
|
+
raise NotImplementedError, 'Samplers must implement the #sample_rate method'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# \AllSampler samples all the traces.
|
|
23
|
+
class AllSampler < Sampler
|
|
24
|
+
def sample?(span)
|
|
25
|
+
true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def sample!(span)
|
|
29
|
+
span.sampled = true
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def sample_rate(*_)
|
|
33
|
+
1.0
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# \RateSampler is based on a sample rate.
|
|
38
|
+
class RateSampler < Sampler
|
|
39
|
+
KNUTH_FACTOR = 1111111111111111111
|
|
40
|
+
SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
|
|
41
|
+
|
|
42
|
+
# Initialize a \RateSampler.
|
|
43
|
+
# This sampler keeps a random subset of the traces. Its main purpose is to
|
|
44
|
+
# reduce the instrumentation footprint.
|
|
45
|
+
#
|
|
46
|
+
# * +sample_rate+: the sample rate as a \Float between 0.0 and 1.0. 0.0
|
|
47
|
+
# means that no trace will be sampled; 1.0 means that all traces will be
|
|
48
|
+
# sampled.
|
|
49
|
+
def initialize(sample_rate = 1.0)
|
|
50
|
+
unless sample_rate > 0.0 && sample_rate <= 1.0
|
|
51
|
+
Datadog.logger.error('sample rate is not between 0 and 1, disabling the sampler')
|
|
52
|
+
sample_rate = 1.0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
self.sample_rate = sample_rate
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def sample_rate(*_)
|
|
59
|
+
@sample_rate
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def sample_rate=(sample_rate)
|
|
63
|
+
@sample_rate = sample_rate
|
|
64
|
+
@sampling_id_threshold = sample_rate * Span::MAX_ID
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def sample?(span)
|
|
68
|
+
((span.trace_id * KNUTH_FACTOR) % Datadog::Span::MAX_ID) <= @sampling_id_threshold
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def sample!(span)
|
|
72
|
+
(span.sampled = sample?(span)).tap do |sampled|
|
|
73
|
+
span.set_metric(SAMPLE_RATE_METRIC_KEY, @sample_rate) if sampled
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
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?
|
|
85
|
+
|
|
86
|
+
@default_key = default_key
|
|
87
|
+
@resolver = block
|
|
88
|
+
@mutex = Mutex.new
|
|
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]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def sample?(span)
|
|
103
|
+
key = resolve(span)
|
|
104
|
+
|
|
105
|
+
@mutex.synchronize do
|
|
106
|
+
@samplers.fetch(key, default_sampler).sample?(span)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def sample!(span)
|
|
111
|
+
key = resolve(span)
|
|
112
|
+
|
|
113
|
+
@mutex.synchronize do
|
|
114
|
+
@samplers.fetch(key, default_sampler).sample!(span)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def sample_rate(span)
|
|
119
|
+
key = resolve(span)
|
|
120
|
+
|
|
121
|
+
@mutex.synchronize do
|
|
122
|
+
@samplers.fetch(key, default_sampler).sample_rate
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def update(key, rate)
|
|
127
|
+
@mutex.synchronize do
|
|
128
|
+
set_rate(key, rate)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
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)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
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
|
+
|
|
182
|
+
private
|
|
183
|
+
|
|
184
|
+
def key_for(span)
|
|
185
|
+
# Resolve env dynamically, if Proc is given.
|
|
186
|
+
env = @env.is_a?(Proc) ? @env.call : @env
|
|
187
|
+
|
|
188
|
+
"service:#{span.service},env:#{env}"
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# \PrioritySampler
|
|
193
|
+
class PrioritySampler
|
|
194
|
+
extend Forwardable
|
|
195
|
+
|
|
196
|
+
attr_reader :pre_sampler, :priority_sampler
|
|
197
|
+
|
|
198
|
+
SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
|
|
199
|
+
|
|
200
|
+
def initialize(opts = {})
|
|
201
|
+
@pre_sampler = opts[:base_sampler] || AllSampler.new
|
|
202
|
+
@priority_sampler = opts[:post_sampler] || RateByServiceSampler.new
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def sample?(span)
|
|
206
|
+
@pre_sampler.sample?(span)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def sample!(span)
|
|
210
|
+
# If pre-sampling is configured, do it first. (By default, this will sample at 100%.)
|
|
211
|
+
# NOTE: Pre-sampling at rates < 100% may result in partial traces; not recommended.
|
|
212
|
+
span.sampled = pre_sample?(span) ? @pre_sampler.sample!(span) : true
|
|
213
|
+
|
|
214
|
+
if span.sampled
|
|
215
|
+
# If priority sampling has already been applied upstream, use that, otherwise...
|
|
216
|
+
unless priority_assigned_upstream?(span)
|
|
217
|
+
# Roll the dice and determine whether how we set the priority.
|
|
218
|
+
priority = priority_sample!(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
|
|
219
|
+
|
|
220
|
+
assign_priority!(span, priority)
|
|
221
|
+
end
|
|
222
|
+
else
|
|
223
|
+
# If discarded by pre-sampling, set "reject" priority, so other
|
|
224
|
+
# services for the same trace don't sample needlessly.
|
|
225
|
+
assign_priority!(span, Datadog::Ext::Priority::AUTO_REJECT)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
span.sampled
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def_delegators :@priority_sampler, :update
|
|
232
|
+
|
|
233
|
+
private
|
|
234
|
+
|
|
235
|
+
def pre_sample?(span)
|
|
236
|
+
case @pre_sampler
|
|
237
|
+
when RateSampler
|
|
238
|
+
@pre_sampler.sample_rate < 1.0
|
|
239
|
+
when RateByServiceSampler
|
|
240
|
+
@pre_sampler.sample_rate(span) < 1.0
|
|
241
|
+
else
|
|
242
|
+
true
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def priority_assigned_upstream?(span)
|
|
247
|
+
span.context && !span.context.sampling_priority.nil?
|
|
248
|
+
end
|
|
249
|
+
|
|
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
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def assign_priority!(span, priority)
|
|
280
|
+
if span.context
|
|
281
|
+
span.context.sampling_priority = priority
|
|
282
|
+
else
|
|
283
|
+
# Set the priority directly on the span instead, since otherwise
|
|
284
|
+
# it won't receive the appropriate tag.
|
|
285
|
+
span.set_metric(
|
|
286
|
+
Ext::DistributedTracing::SAMPLING_PRIORITY_KEY,
|
|
287
|
+
priority
|
|
288
|
+
)
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
end
|