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,67 @@
|
|
|
1
|
+
require 'ddtrace/ext/net'
|
|
2
|
+
require 'ddtrace/runtime/socket'
|
|
3
|
+
require 'ddtrace/runtime/metrics'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# SyncWriter flushes both services and traces synchronously
|
|
7
|
+
# DEV: To be replaced by Datadog::Workers::TraceWriter.
|
|
8
|
+
class SyncWriter
|
|
9
|
+
attr_reader \
|
|
10
|
+
:priority_sampler,
|
|
11
|
+
:transport
|
|
12
|
+
|
|
13
|
+
def initialize(options = {})
|
|
14
|
+
@transport = options.fetch(:transport) do
|
|
15
|
+
transport_options = options.fetch(:transport_options, {})
|
|
16
|
+
Transport::HTTP.default(transport_options)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
@priority_sampler = options.fetch(:priority_sampler, nil)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def write(trace, services = nil)
|
|
23
|
+
unless services.nil?
|
|
24
|
+
Datadog::Patcher.do_once('SyncWriter#write') do
|
|
25
|
+
Datadog.logger.warn(%(
|
|
26
|
+
write: Writing services has been deprecated and no longer need to be provided.
|
|
27
|
+
write(traces, services) can be updted to write(traces)
|
|
28
|
+
))
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
perform_concurrently(
|
|
33
|
+
proc { flush_trace(trace) }
|
|
34
|
+
)
|
|
35
|
+
rescue => e
|
|
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
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def perform_concurrently(*tasks)
|
|
48
|
+
tasks.map { |task| Thread.new(&task) }.each(&:join)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def flush_trace(trace)
|
|
52
|
+
processed_traces = Pipeline.process!([trace])
|
|
53
|
+
return if processed_traces.empty?
|
|
54
|
+
inject_hostname!(processed_traces.first) if Datadog.configuration.report_hostname
|
|
55
|
+
transport.send_traces(processed_traces)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def inject_hostname!(trace)
|
|
59
|
+
unless trace.first.nil?
|
|
60
|
+
hostname = Datadog::Runtime::Socket.hostname
|
|
61
|
+
unless hostname.nil? || hostname.empty?
|
|
62
|
+
trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
require 'pp'
|
|
2
|
+
require 'thread'
|
|
3
|
+
require 'logger'
|
|
4
|
+
require 'pathname'
|
|
5
|
+
|
|
6
|
+
require 'ddtrace/environment'
|
|
7
|
+
require 'ddtrace/span'
|
|
8
|
+
require 'ddtrace/context'
|
|
9
|
+
require 'ddtrace/logger'
|
|
10
|
+
require 'ddtrace/writer'
|
|
11
|
+
require 'ddtrace/sampler'
|
|
12
|
+
require 'ddtrace/sampling'
|
|
13
|
+
require 'ddtrace/correlation'
|
|
14
|
+
|
|
15
|
+
# \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
|
|
16
|
+
module Datadog
|
|
17
|
+
# A \Tracer keeps track of the time spent by an application processing a single operation. For
|
|
18
|
+
# example, a trace can be used to track the entire time spent processing a complicated web request.
|
|
19
|
+
# Even though the request may require multiple resources and machines to handle the request, all
|
|
20
|
+
# of these function calls and sub-requests would be encapsulated within a single trace.
|
|
21
|
+
# rubocop:disable Metrics/ClassLength
|
|
22
|
+
class Tracer
|
|
23
|
+
attr_reader :sampler, :tags, :provider, :context_flush
|
|
24
|
+
attr_accessor :enabled, :writer
|
|
25
|
+
attr_writer :default_service
|
|
26
|
+
|
|
27
|
+
ALLOWED_SPAN_OPTIONS = [:service, :resource, :span_type].freeze
|
|
28
|
+
DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
|
|
29
|
+
|
|
30
|
+
def services
|
|
31
|
+
# Only log each deprecation warning once (safeguard against log spam)
|
|
32
|
+
Datadog::Patcher.do_once('Tracer#set_service_info') do
|
|
33
|
+
Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
{}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Shorthand that calls the `shutdown!` method of a registered worker.
|
|
40
|
+
# It's useful to ensure that the Trace Buffer is properly flushed before
|
|
41
|
+
# shutting down the application.
|
|
42
|
+
#
|
|
43
|
+
# For instance:
|
|
44
|
+
#
|
|
45
|
+
# tracer.trace('operation_name', service='rake_tasks') do |span|
|
|
46
|
+
# span.set_tag('task.name', 'script')
|
|
47
|
+
# end
|
|
48
|
+
#
|
|
49
|
+
# tracer.shutdown!
|
|
50
|
+
#
|
|
51
|
+
def shutdown!
|
|
52
|
+
return unless @enabled
|
|
53
|
+
|
|
54
|
+
@writer.stop unless @writer.nil?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Return the current active \Context for this traced execution. This method is
|
|
58
|
+
# automatically called when calling Tracer.trace or Tracer.start_span,
|
|
59
|
+
# but it can be used in the application code during manual instrumentation.
|
|
60
|
+
#
|
|
61
|
+
# This method makes use of a \ContextProvider that is automatically set during the tracer
|
|
62
|
+
# initialization, or while using a library instrumentation.
|
|
63
|
+
def call_context
|
|
64
|
+
@provider.context
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Initialize a new \Tracer used to create, sample and submit spans that measure the
|
|
68
|
+
# time of sections of code. Available +options+ are:
|
|
69
|
+
#
|
|
70
|
+
# * +enabled+: set if the tracer submits or not spans to the local agent. It's enabled
|
|
71
|
+
# by default.
|
|
72
|
+
def initialize(options = {})
|
|
73
|
+
# Configurable options
|
|
74
|
+
@context_flush = if options[:partial_flush]
|
|
75
|
+
Datadog::ContextFlush::Partial.new(options)
|
|
76
|
+
else
|
|
77
|
+
Datadog::ContextFlush::Finished.new
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
@default_service = options[:default_service]
|
|
81
|
+
@enabled = options.fetch(:enabled, true)
|
|
82
|
+
@provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
|
|
83
|
+
@sampler = options.fetch(:sampler, Datadog::AllSampler.new)
|
|
84
|
+
@tags = options.fetch(:tags, {})
|
|
85
|
+
@writer = options.fetch(:writer, Datadog::Writer.new)
|
|
86
|
+
|
|
87
|
+
# Instance variables
|
|
88
|
+
@mutex = Mutex.new
|
|
89
|
+
@provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
|
|
90
|
+
|
|
91
|
+
# Enable priority sampling by default
|
|
92
|
+
activate_priority_sampling!(@sampler)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Updates the current \Tracer instance, so that the tracer can be configured after the
|
|
96
|
+
# initialization. Available +options+ are:
|
|
97
|
+
#
|
|
98
|
+
# * +enabled+: set if the tracer submits or not spans to the trace agent
|
|
99
|
+
# * +hostname+: change the location of the trace agent
|
|
100
|
+
# * +port+: change the port of the trace agent
|
|
101
|
+
# * +partial_flush+: enable partial trace flushing
|
|
102
|
+
#
|
|
103
|
+
# For instance, if the trace agent runs in a different location, just:
|
|
104
|
+
#
|
|
105
|
+
# tracer.configure(hostname: 'agent.service.consul', port: '8777')
|
|
106
|
+
#
|
|
107
|
+
def configure(options = {})
|
|
108
|
+
enabled = options.fetch(:enabled, nil)
|
|
109
|
+
|
|
110
|
+
# Those are rare "power-user" options.
|
|
111
|
+
sampler = options.fetch(:sampler, nil)
|
|
112
|
+
|
|
113
|
+
@enabled = enabled unless enabled.nil?
|
|
114
|
+
@sampler = sampler unless sampler.nil?
|
|
115
|
+
|
|
116
|
+
configure_writer(options)
|
|
117
|
+
|
|
118
|
+
if options.key?(:partial_flush)
|
|
119
|
+
@context_flush = if options[:partial_flush]
|
|
120
|
+
Datadog::ContextFlush::Partial.new(options)
|
|
121
|
+
else
|
|
122
|
+
Datadog::ContextFlush::Finished.new
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Set the information about the given service. A valid example is:
|
|
128
|
+
#
|
|
129
|
+
# tracer.set_service_info('web-application', 'rails', 'web')
|
|
130
|
+
#
|
|
131
|
+
# set_service_info is deprecated, no service information needs to be tracked
|
|
132
|
+
def set_service_info(service, app, app_type)
|
|
133
|
+
# Only log each deprecation warning once (safeguard against log spam)
|
|
134
|
+
Datadog::Patcher.do_once('Tracer#set_service_info') do
|
|
135
|
+
Datadog.logger.warn(%(
|
|
136
|
+
set_service_info: Usage of set_service_info has been deprecated,
|
|
137
|
+
service information no longer needs to be reported to the trace agent.
|
|
138
|
+
))
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# A default value for service. One should really override this one
|
|
143
|
+
# for non-root spans which have a parent. However, root spans without
|
|
144
|
+
# a service would be invalid and rejected.
|
|
145
|
+
def default_service
|
|
146
|
+
return @default_service if instance_variable_defined?(:@default_service) && @default_service
|
|
147
|
+
begin
|
|
148
|
+
@default_service = File.basename($PROGRAM_NAME, '.*')
|
|
149
|
+
rescue StandardError => e
|
|
150
|
+
Datadog.logger.error("unable to guess default service: #{e}")
|
|
151
|
+
@default_service = 'ruby'.freeze
|
|
152
|
+
end
|
|
153
|
+
@default_service
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Set the given key / value tag pair at the tracer level. These tags will be
|
|
157
|
+
# appended to each span created by the tracer. Keys and values must be strings.
|
|
158
|
+
# A valid example is:
|
|
159
|
+
#
|
|
160
|
+
# tracer.set_tags('env' => 'prod', 'component' => 'core')
|
|
161
|
+
def set_tags(tags)
|
|
162
|
+
string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
|
|
163
|
+
@tags = @tags.merge(string_tags)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Guess context and parent from child_of entry.
|
|
167
|
+
def guess_context_and_parent(child_of)
|
|
168
|
+
# call_context should not be in this code path, as start_span
|
|
169
|
+
# should never try and pick an existing context, but only get
|
|
170
|
+
# it from the parameters passed to it (child_of)
|
|
171
|
+
return [Datadog::Context.new, nil] unless child_of
|
|
172
|
+
|
|
173
|
+
return [child_of, child_of.current_span] if child_of.is_a?(Context)
|
|
174
|
+
|
|
175
|
+
[child_of.context, child_of]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Return a span that will trace an operation called \name. This method allows
|
|
179
|
+
# parenting passing \child_of as an option. If it's missing, the newly created span is a
|
|
180
|
+
# root span. Available options are:
|
|
181
|
+
#
|
|
182
|
+
# * +service+: the service name for this span
|
|
183
|
+
# * +resource+: the resource this span refers, or \name if it's missing
|
|
184
|
+
# * +span_type+: the type of the span (such as \http, \db and so on)
|
|
185
|
+
# * +child_of+: a \Span or a \Context instance representing the parent for this span.
|
|
186
|
+
# * +start_time+: when the span actually starts (defaults to \now)
|
|
187
|
+
# * +tags+: extra tags which should be added to the span.
|
|
188
|
+
def start_span(name, options = {})
|
|
189
|
+
start_time = options.fetch(:start_time, Time.now.utc)
|
|
190
|
+
|
|
191
|
+
tags = options.fetch(:tags, {})
|
|
192
|
+
|
|
193
|
+
span_options = options.select do |k, _v|
|
|
194
|
+
# Filter options, we want no side effects with unexpected args.
|
|
195
|
+
ALLOWED_SPAN_OPTIONS.include?(k)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
ctx, parent = guess_context_and_parent(options[:child_of])
|
|
199
|
+
span_options[:context] = ctx unless ctx.nil?
|
|
200
|
+
|
|
201
|
+
span = Span.new(self, name, span_options)
|
|
202
|
+
if parent.nil?
|
|
203
|
+
# root span
|
|
204
|
+
@sampler.sample!(span)
|
|
205
|
+
span.set_tag('system.pid', Process.pid)
|
|
206
|
+
|
|
207
|
+
if ctx && ctx.trace_id
|
|
208
|
+
span.trace_id = ctx.trace_id
|
|
209
|
+
span.parent_id = ctx.span_id unless ctx.span_id.nil?
|
|
210
|
+
end
|
|
211
|
+
else
|
|
212
|
+
# child span
|
|
213
|
+
span.parent = parent # sets service, trace_id, parent_id, sampled
|
|
214
|
+
end
|
|
215
|
+
span.set_tags(@tags) unless @tags.empty?
|
|
216
|
+
span.set_tags(tags) unless tags.empty?
|
|
217
|
+
span.start_time = start_time
|
|
218
|
+
|
|
219
|
+
# this could at some point be optional (start_active_span vs start_manual_span)
|
|
220
|
+
ctx.add_span(span) unless ctx.nil?
|
|
221
|
+
|
|
222
|
+
span
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Return a +span+ that will trace an operation called +name+. You could trace your code
|
|
226
|
+
# using a <tt>do-block</tt> like:
|
|
227
|
+
#
|
|
228
|
+
# tracer.trace('web.request') do |span|
|
|
229
|
+
# span.service = 'my-web-site'
|
|
230
|
+
# span.resource = '/'
|
|
231
|
+
# span.set_tag('http.method', request.request_method)
|
|
232
|
+
# do_something()
|
|
233
|
+
# end
|
|
234
|
+
#
|
|
235
|
+
# The <tt>tracer.trace()</tt> method can also be used without a block in this way:
|
|
236
|
+
#
|
|
237
|
+
# span = tracer.trace('web.request', service: 'my-web-site')
|
|
238
|
+
# do_something()
|
|
239
|
+
# span.finish()
|
|
240
|
+
#
|
|
241
|
+
# Remember that in this case, calling <tt>span.finish()</tt> is mandatory.
|
|
242
|
+
#
|
|
243
|
+
# When a Trace is started, <tt>trace()</tt> will store the created span; subsequent spans will
|
|
244
|
+
# become it's children and will inherit some properties:
|
|
245
|
+
#
|
|
246
|
+
# parent = tracer.trace('parent') # has no parent span
|
|
247
|
+
# child = tracer.trace('child') # is a child of 'parent'
|
|
248
|
+
# child.finish()
|
|
249
|
+
# parent.finish()
|
|
250
|
+
# parent2 = tracer.trace('parent2') # has no parent span
|
|
251
|
+
# parent2.finish()
|
|
252
|
+
#
|
|
253
|
+
# Available options are:
|
|
254
|
+
#
|
|
255
|
+
# * +service+: the service name for this span
|
|
256
|
+
# * +resource+: the resource this span refers, or \name if it's missing
|
|
257
|
+
# * +span_type+: the type of the span (such as \http, \db and so on)
|
|
258
|
+
# * +child_of+: a \Span or a \Context instance representing the parent for this span.
|
|
259
|
+
# If not set, defaults to Tracer.call_context
|
|
260
|
+
# * +tags+: extra tags which should be added to the span.
|
|
261
|
+
def trace(name, options = {})
|
|
262
|
+
options[:child_of] ||= call_context
|
|
263
|
+
|
|
264
|
+
# call the finish only if a block is given; this ensures
|
|
265
|
+
# that a call to tracer.trace() without a block, returns
|
|
266
|
+
# a span that should be manually finished.
|
|
267
|
+
if block_given?
|
|
268
|
+
span = nil
|
|
269
|
+
return_value = nil
|
|
270
|
+
|
|
271
|
+
begin
|
|
272
|
+
begin
|
|
273
|
+
span = start_span(name, options)
|
|
274
|
+
rescue StandardError => e
|
|
275
|
+
Datadog.logger.debug("Failed to start span: #{e}")
|
|
276
|
+
ensure
|
|
277
|
+
# We should yield to the provided block when possible, as this
|
|
278
|
+
# block is application code that we don't want to hinder. We call:
|
|
279
|
+
# * `yield(span)` during normal execution.
|
|
280
|
+
# * `yield(nil)` if `start_span` fails with a runtime error.
|
|
281
|
+
# * We don't yield during a fatal error, as the application is likely trying to
|
|
282
|
+
# end its execution (either due to a system error or graceful shutdown).
|
|
283
|
+
return_value = yield(span) if span || e.is_a?(StandardError)
|
|
284
|
+
end
|
|
285
|
+
# rubocop:disable Lint/RescueException
|
|
286
|
+
# Here we really want to catch *any* exception, not only StandardError,
|
|
287
|
+
# as we really have no clue of what is in the block,
|
|
288
|
+
# and it is user code which should be executed no matter what.
|
|
289
|
+
# It's not a problem since we re-raise it afterwards so for example a
|
|
290
|
+
# SignalException::Interrupt would still bubble up.
|
|
291
|
+
rescue Exception => e
|
|
292
|
+
(options[:on_error] || DEFAULT_ON_ERROR).call(span, e)
|
|
293
|
+
raise e
|
|
294
|
+
ensure
|
|
295
|
+
span.finish unless span.nil?
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
return_value
|
|
299
|
+
else
|
|
300
|
+
start_span(name, options)
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Record the given +context+. For compatibility with previous versions,
|
|
305
|
+
# +context+ can also be a span. It is similar to the +child_of+ argument,
|
|
306
|
+
# method will figure out what to do, submitting a +span+ for recording
|
|
307
|
+
# is like trying to record its +context+.
|
|
308
|
+
def record(context)
|
|
309
|
+
context = context.context if context.is_a?(Datadog::Span)
|
|
310
|
+
return if context.nil?
|
|
311
|
+
|
|
312
|
+
record_context(context)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# Consume trace from +context+, according to +@context_flush+
|
|
316
|
+
# criteria.
|
|
317
|
+
#
|
|
318
|
+
# \ContextFlush#consume! can return nil or an empty list if the
|
|
319
|
+
# trace is not available to flush or if the trace has not been
|
|
320
|
+
# chosen to be sampled.
|
|
321
|
+
def record_context(context)
|
|
322
|
+
trace = @context_flush.consume!(context)
|
|
323
|
+
|
|
324
|
+
write(trace) if @enabled && trace && !trace.empty?
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
# Return the current active span or +nil+.
|
|
328
|
+
def active_span
|
|
329
|
+
call_context.current_span
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
# Return the current active root span or +nil+.
|
|
333
|
+
def active_root_span
|
|
334
|
+
call_context.current_root_span
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
# Return a CorrelationIdentifier for active span
|
|
338
|
+
def active_correlation
|
|
339
|
+
Datadog::Correlation.identifier_from_context(call_context)
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
# Send the trace to the writer to enqueue the spans list in the agent
|
|
343
|
+
# sending queue.
|
|
344
|
+
def write(trace)
|
|
345
|
+
return if @writer.nil?
|
|
346
|
+
|
|
347
|
+
if Datadog.configuration.diagnostics.debug
|
|
348
|
+
Datadog.logger.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
|
|
349
|
+
str = String.new('')
|
|
350
|
+
PP.pp(trace, str)
|
|
351
|
+
Datadog.logger.debug(str)
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
@writer.write(trace)
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
# TODO: Move this kind of configuration building out of the tracer.
|
|
358
|
+
# Tracer should not have this kind of knowledge of writer.
|
|
359
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
360
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
361
|
+
# rubocop:disable Metrics/MethodLength
|
|
362
|
+
def configure_writer(options = {})
|
|
363
|
+
hostname = options.fetch(:hostname, nil)
|
|
364
|
+
port = options.fetch(:port, nil)
|
|
365
|
+
sampler = options.fetch(:sampler, nil)
|
|
366
|
+
priority_sampling = options.fetch(:priority_sampling, nil)
|
|
367
|
+
writer = options.fetch(:writer, nil)
|
|
368
|
+
transport_options = options.fetch(:transport_options, {}).dup
|
|
369
|
+
|
|
370
|
+
# Compile writer options
|
|
371
|
+
writer_options = options.fetch(:writer_options, {}).dup
|
|
372
|
+
rebuild_writer = !writer_options.empty?
|
|
373
|
+
|
|
374
|
+
# Re-build the sampler and writer if priority sampling is enabled,
|
|
375
|
+
# but neither are configured. Verify the sampler isn't already a
|
|
376
|
+
# priority sampler too, so we don't wrap one with another.
|
|
377
|
+
if options.key?(:writer)
|
|
378
|
+
if writer.priority_sampler.nil?
|
|
379
|
+
deactivate_priority_sampling!(sampler)
|
|
380
|
+
else
|
|
381
|
+
activate_priority_sampling!(writer.priority_sampler)
|
|
382
|
+
end
|
|
383
|
+
elsif priority_sampling != false && !@sampler.is_a?(PrioritySampler)
|
|
384
|
+
writer_options[:priority_sampler] = activate_priority_sampling!(@sampler)
|
|
385
|
+
rebuild_writer = true
|
|
386
|
+
elsif priority_sampling == false
|
|
387
|
+
deactivate_priority_sampling!(sampler)
|
|
388
|
+
rebuild_writer = true
|
|
389
|
+
elsif @sampler.is_a?(PrioritySampler)
|
|
390
|
+
# Make sure to add sampler to options if transport is rebuilt.
|
|
391
|
+
writer_options[:priority_sampler] = @sampler
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
# Apply options to transport
|
|
395
|
+
if transport_options.is_a?(Proc)
|
|
396
|
+
transport_options = { on_build: transport_options }
|
|
397
|
+
rebuild_writer = true
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
if hostname || port
|
|
401
|
+
transport_options[:hostname] = hostname unless hostname.nil?
|
|
402
|
+
transport_options[:port] = port unless port.nil?
|
|
403
|
+
rebuild_writer = true
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
writer_options[:transport_options] = transport_options
|
|
407
|
+
|
|
408
|
+
if rebuild_writer || writer
|
|
409
|
+
# Make sure old writer is shut down before throwing away.
|
|
410
|
+
# Don't want additional threads running...
|
|
411
|
+
@writer.stop unless writer.nil?
|
|
412
|
+
@writer = writer || Writer.new(writer_options)
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
def activate_priority_sampling!(base_sampler = nil)
|
|
417
|
+
@sampler = if base_sampler.is_a?(PrioritySampler)
|
|
418
|
+
base_sampler
|
|
419
|
+
else
|
|
420
|
+
PrioritySampler.new(
|
|
421
|
+
base_sampler: base_sampler,
|
|
422
|
+
post_sampler: Sampling::RuleSampler.new
|
|
423
|
+
)
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
def deactivate_priority_sampling!(base_sampler = nil)
|
|
428
|
+
@sampler = base_sampler || Datadog::AllSampler.new if @sampler.is_a?(PrioritySampler)
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
private \
|
|
432
|
+
:activate_priority_sampling!,
|
|
433
|
+
:configure_writer,
|
|
434
|
+
:deactivate_priority_sampling!,
|
|
435
|
+
:guess_context_and_parent,
|
|
436
|
+
:record_context,
|
|
437
|
+
:write
|
|
438
|
+
end
|
|
439
|
+
end
|