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,14 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module OpenTracer
|
|
3
|
+
# OpenTracing adapter for SpanContext
|
|
4
|
+
class SpanContext < ::OpenTracing::SpanContext
|
|
5
|
+
attr_reader \
|
|
6
|
+
:datadog_context
|
|
7
|
+
|
|
8
|
+
def initialize(datadog_context:, baggage: {})
|
|
9
|
+
@datadog_context = datadog_context
|
|
10
|
+
@baggage = baggage.freeze
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module OpenTracer
|
|
3
|
+
# Creates new Datadog::OpenTracer::SpanContext
|
|
4
|
+
module SpanContextFactory
|
|
5
|
+
module_function
|
|
6
|
+
|
|
7
|
+
def build(datadog_context:, baggage: {})
|
|
8
|
+
SpanContext.new(
|
|
9
|
+
datadog_context: datadog_context,
|
|
10
|
+
baggage: baggage.dup
|
|
11
|
+
)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def clone(span_context:, baggage: {})
|
|
15
|
+
SpanContext.new(
|
|
16
|
+
datadog_context: span_context.datadog_context,
|
|
17
|
+
# Merge baggage from previous SpanContext
|
|
18
|
+
baggage: span_context.baggage.merge(baggage)
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require 'ddtrace/ext/distributed'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module OpenTracer
|
|
5
|
+
# OpenTracing propagator for Datadog::OpenTracer::Tracer
|
|
6
|
+
module TextMapPropagator
|
|
7
|
+
extend Propagator
|
|
8
|
+
extend Datadog::Ext::DistributedTracing
|
|
9
|
+
include Datadog::Ext::DistributedTracing
|
|
10
|
+
|
|
11
|
+
BAGGAGE_PREFIX = 'ot-baggage-'.freeze
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
# Inject a SpanContext into the given carrier
|
|
15
|
+
#
|
|
16
|
+
# @param span_context [SpanContext]
|
|
17
|
+
# @param carrier [Carrier] A carrier object of Rack type
|
|
18
|
+
def inject(span_context, carrier)
|
|
19
|
+
# Inject Datadog trace properties
|
|
20
|
+
span_context.datadog_context.tap do |datadog_context|
|
|
21
|
+
carrier[HTTP_HEADER_TRACE_ID] = datadog_context.trace_id
|
|
22
|
+
carrier[HTTP_HEADER_PARENT_ID] = datadog_context.span_id
|
|
23
|
+
carrier[HTTP_HEADER_SAMPLING_PRIORITY] = datadog_context.sampling_priority
|
|
24
|
+
carrier[HTTP_HEADER_ORIGIN] = datadog_context.origin
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Inject baggage
|
|
28
|
+
span_context.baggage.each do |key, value|
|
|
29
|
+
carrier[BAGGAGE_PREFIX + key] = value
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Extract a SpanContext in TextMap format from the given carrier.
|
|
36
|
+
#
|
|
37
|
+
# @param carrier [Carrier] A carrier object of TextMap type
|
|
38
|
+
# @return [SpanContext, nil] the extracted SpanContext or nil if none could be found
|
|
39
|
+
def extract(carrier)
|
|
40
|
+
# First extract & build a Datadog context
|
|
41
|
+
headers = DistributedHeaders.new(carrier)
|
|
42
|
+
|
|
43
|
+
datadog_context = if headers.valid?
|
|
44
|
+
Datadog::Context.new(
|
|
45
|
+
trace_id: headers.trace_id,
|
|
46
|
+
span_id: headers.parent_id,
|
|
47
|
+
sampling_priority: headers.sampling_priority,
|
|
48
|
+
origin: headers.origin
|
|
49
|
+
)
|
|
50
|
+
else
|
|
51
|
+
Datadog::Context.new
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Then extract any other baggage
|
|
55
|
+
baggage = {}
|
|
56
|
+
carrier.each do |key, value|
|
|
57
|
+
baggage[item_to_baggage(key)] = value if baggage_item?(key)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
SpanContextFactory.build(datadog_context: datadog_context, baggage: baggage)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
def baggage_item?(item)
|
|
66
|
+
item.to_s.start_with?(BAGGAGE_PREFIX)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def item_to_baggage(key)
|
|
70
|
+
key[BAGGAGE_PREFIX.length, key.length]
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module OpenTracer
|
|
3
|
+
# OpenTracing adapter for thread local scopes
|
|
4
|
+
class ThreadLocalScope < Scope
|
|
5
|
+
attr_reader \
|
|
6
|
+
:finish_on_close
|
|
7
|
+
|
|
8
|
+
def initialize(
|
|
9
|
+
manager:,
|
|
10
|
+
span:,
|
|
11
|
+
finish_on_close: true
|
|
12
|
+
)
|
|
13
|
+
super(manager: manager, span: span)
|
|
14
|
+
@finish_on_close = finish_on_close
|
|
15
|
+
@previous_scope = manager.active
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Mark the end of the active period for the current thread and Scope,
|
|
19
|
+
# updating the ScopeManager#active in the process.
|
|
20
|
+
#
|
|
21
|
+
# NOTE: Calling close more than once on a single Scope instance leads to
|
|
22
|
+
# undefined behavior.
|
|
23
|
+
def close
|
|
24
|
+
return unless equal?(manager.active)
|
|
25
|
+
span.finish if finish_on_close
|
|
26
|
+
manager.send(:set_scope, @previous_scope)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module OpenTracer
|
|
3
|
+
# OpenTracing adapter for thread local scope management
|
|
4
|
+
class ThreadLocalScopeManager < ScopeManager
|
|
5
|
+
# Make a span instance active.
|
|
6
|
+
#
|
|
7
|
+
# @param span [Span] the Span that should become active
|
|
8
|
+
# @param finish_on_close [Boolean] whether the Span should automatically be
|
|
9
|
+
# finished when Scope#close is called
|
|
10
|
+
# @return [Scope] instance to control the end of the active period for the
|
|
11
|
+
# Span. It is a programming error to neglect to call Scope#close on the
|
|
12
|
+
# returned instance.
|
|
13
|
+
def activate(span, finish_on_close: true)
|
|
14
|
+
ThreadLocalScope.new(
|
|
15
|
+
manager: self,
|
|
16
|
+
span: span,
|
|
17
|
+
finish_on_close: finish_on_close
|
|
18
|
+
).tap do |scope|
|
|
19
|
+
set_scope(scope)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Scope] the currently active Scope which can be used to access the
|
|
24
|
+
# currently active Span.
|
|
25
|
+
#
|
|
26
|
+
# If there is a non-null Scope, its wrapped Span becomes an implicit parent
|
|
27
|
+
# (as Reference#CHILD_OF) of any newly-created Span at Tracer#start_active_span
|
|
28
|
+
# or Tracer#start_span time.
|
|
29
|
+
def active
|
|
30
|
+
Thread.current[object_id.to_s]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def set_scope(scope)
|
|
36
|
+
Thread.current[object_id.to_s] = scope
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
require 'ddtrace/tracer'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module OpenTracer
|
|
5
|
+
# OpenTracing adapter for Datadog::Tracer
|
|
6
|
+
class Tracer < ::OpenTracing::Tracer
|
|
7
|
+
extend Forwardable
|
|
8
|
+
|
|
9
|
+
attr_reader \
|
|
10
|
+
:datadog_tracer
|
|
11
|
+
|
|
12
|
+
def_delegators \
|
|
13
|
+
:datadog_tracer,
|
|
14
|
+
:configure
|
|
15
|
+
|
|
16
|
+
def initialize(options = {})
|
|
17
|
+
super()
|
|
18
|
+
@datadog_tracer = Datadog::Tracer.new(options)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @return [ScopeManager] the current ScopeManager.
|
|
22
|
+
def scope_manager
|
|
23
|
+
@scope_manager ||= ThreadLocalScopeManager.new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns a newly started and activated Scope.
|
|
27
|
+
#
|
|
28
|
+
# If the Tracer's ScopeManager#active is not nil, no explicit references
|
|
29
|
+
# are provided, and `ignore_active_scope` is false, then an inferred
|
|
30
|
+
# References#CHILD_OF reference is created to the ScopeManager#active's
|
|
31
|
+
# SpanContext when start_active is invoked.
|
|
32
|
+
#
|
|
33
|
+
# @param operation_name [String] The operation name for the Span
|
|
34
|
+
# @param child_of [SpanContext, Span] SpanContext that acts as a parent to
|
|
35
|
+
# the newly-started Span. If a Span instance is provided, its
|
|
36
|
+
# context is automatically substituted. See [Reference] for more
|
|
37
|
+
# information.
|
|
38
|
+
#
|
|
39
|
+
# If specified, the `references` parameter must be omitted.
|
|
40
|
+
# @param references [Array<Reference>] An array of reference
|
|
41
|
+
# objects that identify one or more parent SpanContexts.
|
|
42
|
+
# @param start_time [Time] When the Span started, if not now
|
|
43
|
+
# @param tags [Hash] Tags to assign to the Span at start time
|
|
44
|
+
# @param ignore_active_scope [Boolean] whether to create an implicit
|
|
45
|
+
# References#CHILD_OF reference to the ScopeManager#active.
|
|
46
|
+
# @param finish_on_close [Boolean] whether span should automatically be
|
|
47
|
+
# finished when Scope#close is called
|
|
48
|
+
# @yield [Scope] If an optional block is passed to start_active it will
|
|
49
|
+
# yield the newly-started Scope. If `finish_on_close` is true then the
|
|
50
|
+
# Span will be finished automatically after the block is executed.
|
|
51
|
+
# @return [Scope] The newly-started and activated Scope
|
|
52
|
+
def start_active_span(operation_name,
|
|
53
|
+
child_of: nil,
|
|
54
|
+
references: nil,
|
|
55
|
+
start_time: Time.now,
|
|
56
|
+
tags: nil,
|
|
57
|
+
ignore_active_scope: false,
|
|
58
|
+
finish_on_close: true)
|
|
59
|
+
|
|
60
|
+
# When meant to automatically determine the parent,
|
|
61
|
+
# Use the active scope first, otherwise fall back to any
|
|
62
|
+
# context generated by Datadog, so as to append to it and gain
|
|
63
|
+
# the benefit of any out-of-the-box tracing from Datadog preceding
|
|
64
|
+
# the OpenTracer::Tracer.
|
|
65
|
+
#
|
|
66
|
+
# We do this here instead of in #start_span because #start_span generates
|
|
67
|
+
# spans that are not assigned to a scope, a.k.a not supposed to be used by
|
|
68
|
+
# subsequent spans implicitly. By using the existing Datadog context, the span
|
|
69
|
+
# effectively ends up "assigned to a scope", by virtue of being added to the
|
|
70
|
+
# Context. Hence, it would behave more like an active span, which is why it
|
|
71
|
+
# should only be here.
|
|
72
|
+
unless child_of || ignore_active_scope
|
|
73
|
+
child_of = if scope_manager.active
|
|
74
|
+
scope_manager.active.span.context
|
|
75
|
+
else
|
|
76
|
+
SpanContextFactory.build(datadog_context: datadog_tracer.call_context)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Create the span, and auto-add it to the Datadog context.
|
|
81
|
+
span = start_span(
|
|
82
|
+
operation_name,
|
|
83
|
+
child_of: child_of,
|
|
84
|
+
references: references,
|
|
85
|
+
start_time: start_time,
|
|
86
|
+
tags: tags,
|
|
87
|
+
ignore_active_scope: ignore_active_scope
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Overwrite the tracer context with the OpenTracing managed context.
|
|
91
|
+
# This is mostly for the benefit of any out-of-the-box tracing from Datadog,
|
|
92
|
+
# such that spans generated by that tracing will be attached to the OpenTracer
|
|
93
|
+
# parent span.
|
|
94
|
+
datadog_tracer.provider.context = span.datadog_span.context
|
|
95
|
+
|
|
96
|
+
scope_manager.activate(span, finish_on_close: finish_on_close).tap do |scope|
|
|
97
|
+
if block_given?
|
|
98
|
+
begin
|
|
99
|
+
yield(scope)
|
|
100
|
+
ensure
|
|
101
|
+
scope.close
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Like #start_active_span, but the returned Span has not been registered via the
|
|
108
|
+
# ScopeManager.
|
|
109
|
+
#
|
|
110
|
+
# @param operation_name [String] The operation name for the Span
|
|
111
|
+
# @param child_of [SpanContext, Span] SpanContext that acts as a parent to
|
|
112
|
+
# the newly-started Span. If a Span instance is provided, its
|
|
113
|
+
# context is automatically substituted. See [Reference] for more
|
|
114
|
+
# information.
|
|
115
|
+
#
|
|
116
|
+
# If specified, the `references` parameter must be omitted.
|
|
117
|
+
# @param references [Array<Reference>] An array of reference
|
|
118
|
+
# objects that identify one or more parent SpanContexts.
|
|
119
|
+
# @param start_time [Time] When the Span started, if not now
|
|
120
|
+
# @param tags [Hash] Tags to assign to the Span at start time
|
|
121
|
+
# @param ignore_active_scope [Boolean] whether to create an implicit
|
|
122
|
+
# References#CHILD_OF reference to the ScopeManager#active.
|
|
123
|
+
# @return [Span] the newly-started Span instance, which has not been
|
|
124
|
+
# automatically registered via the ScopeManager
|
|
125
|
+
def start_span(operation_name,
|
|
126
|
+
child_of: nil,
|
|
127
|
+
references: nil,
|
|
128
|
+
start_time: Time.now,
|
|
129
|
+
tags: nil,
|
|
130
|
+
ignore_active_scope: false)
|
|
131
|
+
|
|
132
|
+
# Derive the OpenTracer::SpanContext to inherit from.
|
|
133
|
+
parent_span_context = inherited_span_context(child_of, ignore_active_scope: ignore_active_scope)
|
|
134
|
+
|
|
135
|
+
# Retrieve Datadog::Context from parent SpanContext.
|
|
136
|
+
datadog_context = parent_span_context.nil? ? nil : parent_span_context.datadog_context
|
|
137
|
+
|
|
138
|
+
# Build the new Datadog span
|
|
139
|
+
datadog_span = datadog_tracer.start_span(
|
|
140
|
+
operation_name,
|
|
141
|
+
child_of: datadog_context,
|
|
142
|
+
start_time: start_time,
|
|
143
|
+
tags: tags || {}
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Build or extend the OpenTracer::SpanContext
|
|
147
|
+
span_context = if parent_span_context
|
|
148
|
+
SpanContextFactory.clone(span_context: parent_span_context)
|
|
149
|
+
else
|
|
150
|
+
SpanContextFactory.build(datadog_context: datadog_span.context)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Wrap the Datadog span and OpenTracer::Span context in a OpenTracer::Span
|
|
154
|
+
Span.new(datadog_span: datadog_span, span_context: span_context)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Inject a SpanContext into the given carrier
|
|
158
|
+
#
|
|
159
|
+
# @param span_context [SpanContext]
|
|
160
|
+
# @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
|
|
161
|
+
# @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
|
|
162
|
+
def inject(span_context, format, carrier)
|
|
163
|
+
case format
|
|
164
|
+
when OpenTracing::FORMAT_TEXT_MAP
|
|
165
|
+
TextMapPropagator.inject(span_context, carrier)
|
|
166
|
+
when OpenTracing::FORMAT_BINARY
|
|
167
|
+
BinaryPropagator.inject(span_context, carrier)
|
|
168
|
+
when OpenTracing::FORMAT_RACK
|
|
169
|
+
RackPropagator.inject(span_context, carrier)
|
|
170
|
+
else
|
|
171
|
+
warn 'Unknown inject format'
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Extract a SpanContext in the given format from the given carrier.
|
|
176
|
+
#
|
|
177
|
+
# @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
|
|
178
|
+
# @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
|
|
179
|
+
# @return [SpanContext, nil] the extracted SpanContext or nil if none could be found
|
|
180
|
+
def extract(format, carrier)
|
|
181
|
+
case format
|
|
182
|
+
when OpenTracing::FORMAT_TEXT_MAP
|
|
183
|
+
TextMapPropagator.extract(carrier)
|
|
184
|
+
when OpenTracing::FORMAT_BINARY
|
|
185
|
+
BinaryPropagator.extract(carrier)
|
|
186
|
+
when OpenTracing::FORMAT_RACK
|
|
187
|
+
RackPropagator.extract(carrier)
|
|
188
|
+
else
|
|
189
|
+
warn 'Unknown extract format'
|
|
190
|
+
nil
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
private
|
|
195
|
+
|
|
196
|
+
def inherited_span_context(parent, ignore_active_scope: false)
|
|
197
|
+
case parent
|
|
198
|
+
when Span
|
|
199
|
+
parent.context
|
|
200
|
+
when SpanContext
|
|
201
|
+
parent
|
|
202
|
+
else
|
|
203
|
+
ignore_active_scope ? nil : scope_manager.active && scope_manager.active.span.context
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
# Defines some useful patching methods for integrations
|
|
3
|
+
module Patcher
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.send(:extend, CommonMethods)
|
|
6
|
+
base.send(:include, CommonMethods)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Defines some common methods for patching, that can be used
|
|
10
|
+
# at the instance, class, or module level.
|
|
11
|
+
module CommonMethods
|
|
12
|
+
def without_warnings
|
|
13
|
+
# This is typically used when monkey patching functions such as
|
|
14
|
+
# intialize, which Ruby advices you not to. Use cautiously.
|
|
15
|
+
v = $VERBOSE
|
|
16
|
+
$VERBOSE = nil
|
|
17
|
+
begin
|
|
18
|
+
yield
|
|
19
|
+
ensure
|
|
20
|
+
$VERBOSE = v
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def do_once(key = nil, options = {})
|
|
25
|
+
# If already done, don't do again
|
|
26
|
+
@done_once ||= Hash.new { |h, k| h[k] = {} }
|
|
27
|
+
if @done_once.key?(key) && @done_once[key].key?(options[:for])
|
|
28
|
+
return @done_once[key][options[:for]]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Otherwise 'do'
|
|
32
|
+
yield.tap do
|
|
33
|
+
# Then add the key so we don't do again.
|
|
34
|
+
@done_once[key][options[:for]] = true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def done?(key, options = {})
|
|
39
|
+
return false unless instance_variable_defined?(:@done_once)
|
|
40
|
+
!@done_once.nil? && @done_once.key?(key) && @done_once[key].key?(options[:for])
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Extend the common methods so they're available as a module function.
|
|
45
|
+
extend(CommonMethods)
|
|
46
|
+
end
|
|
47
|
+
end
|
data/lib/ddtrace/pin.rb
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
require 'ddtrace/patcher'
|
|
2
|
+
|
|
3
|
+
# \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
|
|
4
|
+
module Datadog
|
|
5
|
+
# A \Pin (a.k.a Patch INfo) is a small class which is used to
|
|
6
|
+
# set tracing metadata on a particular traced object.
|
|
7
|
+
# This is useful if you wanted to, say, trace two different
|
|
8
|
+
# database clusters.
|
|
9
|
+
class Pin
|
|
10
|
+
def self.get_from(obj)
|
|
11
|
+
return nil unless obj.respond_to? :datadog_pin
|
|
12
|
+
obj.datadog_pin
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
attr_accessor :app
|
|
16
|
+
attr_accessor :app_type
|
|
17
|
+
attr_accessor :config
|
|
18
|
+
attr_accessor :name
|
|
19
|
+
attr_accessor :service_name
|
|
20
|
+
attr_accessor :tags
|
|
21
|
+
attr_reader :tracer
|
|
22
|
+
attr_accessor :writer
|
|
23
|
+
|
|
24
|
+
alias service= service_name=
|
|
25
|
+
alias service service_name
|
|
26
|
+
|
|
27
|
+
def initialize(service_name, options = {})
|
|
28
|
+
deprecation_warning unless options[:tracer].is_a?(Proc) || options[:tracer].nil?
|
|
29
|
+
|
|
30
|
+
@app = options[:app]
|
|
31
|
+
@app_type = options[:app_type]
|
|
32
|
+
@config = options[:config]
|
|
33
|
+
@name = nil # this would rarely be overriden as it's really span-specific
|
|
34
|
+
@service_name = service_name
|
|
35
|
+
@tags = options[:tags]
|
|
36
|
+
@tracer = options[:tracer]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def tracer
|
|
40
|
+
@tracer.is_a?(Proc) ? @tracer.call : (@tracer || Datadog.tracer)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def enabled?
|
|
44
|
+
return tracer.enabled if tracer
|
|
45
|
+
false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# rubocop:disable Style/TrivialAccessors
|
|
49
|
+
def onto(obj)
|
|
50
|
+
unless obj.respond_to? :datadog_pin=
|
|
51
|
+
obj.instance_exec do
|
|
52
|
+
def datadog_pin=(pin)
|
|
53
|
+
@datadog_pin = pin
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
unless obj.respond_to? :datadog_pin
|
|
59
|
+
obj.instance_exec do
|
|
60
|
+
def datadog_pin
|
|
61
|
+
@datadog_pin
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
obj.datadog_pin = self
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def to_s
|
|
70
|
+
"Pin(service:#{service},app:#{app},app_type:#{app_type},name:#{name})"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
DEPRECATION_WARNING = %(
|
|
76
|
+
Explicitly providing a tracer instance is DEPRECATED.
|
|
77
|
+
It's recommended to not provide an explicit tracer instance
|
|
78
|
+
and let Datadog::Pin resolve the correct tracer internally.
|
|
79
|
+
).freeze
|
|
80
|
+
|
|
81
|
+
def deprecation_warning
|
|
82
|
+
log_deprecation_warning('Datadog::Pin.new')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
include Datadog::Patcher
|
|
86
|
+
|
|
87
|
+
def log_deprecation_warning(method_name)
|
|
88
|
+
# Only log each deprecation warning once (safeguard against log spam)
|
|
89
|
+
do_once(method_name) do
|
|
90
|
+
Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Modification to Pin which logs deprecation warnings if accessed.
|
|
96
|
+
# Will be used by integrations which are phasing out the direct use of #datadog_pin.
|
|
97
|
+
module DeprecatedPin
|
|
98
|
+
include Datadog::Patcher
|
|
99
|
+
|
|
100
|
+
DEPRECATION_WARNING = %(
|
|
101
|
+
Use of Datadog::Pin is DEPRECATED.
|
|
102
|
+
Upgrade to the configuration API using the migration guide here:
|
|
103
|
+
https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
|
|
104
|
+
|
|
105
|
+
# Raise a deprecation warning when #datadog_pin or #datadog_pin= is accessed.
|
|
106
|
+
def onto(obj)
|
|
107
|
+
obj.instance_exec(self) do |pin|
|
|
108
|
+
@datadog_deprecated_pin = pin
|
|
109
|
+
|
|
110
|
+
unless respond_to? :datadog_pin=
|
|
111
|
+
def datadog_pin=(pin)
|
|
112
|
+
@datadog_deprecated_pin.log_deprecation_warning('#datadog_pin=')
|
|
113
|
+
@datadog_pin = pin
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
unless respond_to? :datadog_pin
|
|
118
|
+
def datadog_pin
|
|
119
|
+
@datadog_deprecated_pin.log_deprecation_warning('#datadog_pin')
|
|
120
|
+
@datadog_pin
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Set instance variable to avoid deprecation warnings
|
|
125
|
+
@datadog_pin = @datadog_deprecated_pin
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
self
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def log_deprecation_warning(method_name)
|
|
132
|
+
# Only log each deprecation warning once (safeguard against log spam)
|
|
133
|
+
do_once(method_name) do
|
|
134
|
+
Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|