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,22 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Transport
|
|
3
|
+
module HTTP
|
|
4
|
+
module API
|
|
5
|
+
# Extension for Map with adds fallback versions.
|
|
6
|
+
module Fallbacks
|
|
7
|
+
def fallbacks
|
|
8
|
+
@fallbacks ||= {}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def with_fallbacks(fallbacks)
|
|
12
|
+
tap { add_fallbacks!(fallbacks) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def add_fallbacks!(fallbacks)
|
|
16
|
+
self.fallbacks.merge!(fallbacks)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Transport
|
|
3
|
+
module HTTP
|
|
4
|
+
module API
|
|
5
|
+
# An API configured with adapter and routes
|
|
6
|
+
class Instance
|
|
7
|
+
attr_reader \
|
|
8
|
+
:adapter,
|
|
9
|
+
:headers,
|
|
10
|
+
:spec
|
|
11
|
+
|
|
12
|
+
def initialize(spec, adapter, options = {})
|
|
13
|
+
@spec = spec
|
|
14
|
+
@adapter = adapter
|
|
15
|
+
@headers = options.fetch(:headers, {})
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def encoder
|
|
19
|
+
spec.encoder
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def call(env)
|
|
23
|
+
# Add headers to request env, unless empty.
|
|
24
|
+
env.headers.merge!(headers) unless headers.empty?
|
|
25
|
+
|
|
26
|
+
# Send request env to the adapter.
|
|
27
|
+
adapter.call(env)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Transport
|
|
3
|
+
module HTTP
|
|
4
|
+
module API
|
|
5
|
+
# Specification for an HTTP API
|
|
6
|
+
# Defines behaviors without specific configuration details.
|
|
7
|
+
class Spec
|
|
8
|
+
def initialize
|
|
9
|
+
yield(self) if block_given?
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
require 'ddtrace/transport/http/adapters/registry'
|
|
2
|
+
require 'ddtrace/transport/http/api/map'
|
|
3
|
+
require 'ddtrace/transport/http/api/instance'
|
|
4
|
+
require 'ddtrace/transport/http/client'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Transport
|
|
8
|
+
module HTTP
|
|
9
|
+
# Builds new instances of Transport::HTTP::Client
|
|
10
|
+
class Builder
|
|
11
|
+
REGISTRY = Adapters::Registry.new
|
|
12
|
+
|
|
13
|
+
attr_reader \
|
|
14
|
+
:apis,
|
|
15
|
+
:api_options,
|
|
16
|
+
:default_adapter,
|
|
17
|
+
:default_api,
|
|
18
|
+
:default_headers
|
|
19
|
+
|
|
20
|
+
def initialize
|
|
21
|
+
# Global settings
|
|
22
|
+
@default_adapter = nil
|
|
23
|
+
@default_headers = {}
|
|
24
|
+
|
|
25
|
+
# Client settings
|
|
26
|
+
@apis = API::Map.new
|
|
27
|
+
@default_api = nil
|
|
28
|
+
|
|
29
|
+
# API settings
|
|
30
|
+
@api_options = {}
|
|
31
|
+
|
|
32
|
+
yield(self) if block_given?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def adapter(type, *args)
|
|
36
|
+
@default_adapter = if type.is_a?(Symbol)
|
|
37
|
+
registry_klass = REGISTRY.get(type)
|
|
38
|
+
raise UnknownAdapterError, type if registry_klass.nil?
|
|
39
|
+
registry_klass.new(*args)
|
|
40
|
+
else
|
|
41
|
+
type
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def headers(values = {})
|
|
46
|
+
@default_headers.merge!(values)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Adds a new API to the client
|
|
50
|
+
# Valid options:
|
|
51
|
+
# - :adapter
|
|
52
|
+
# - :default
|
|
53
|
+
# - :fallback
|
|
54
|
+
# - :headers
|
|
55
|
+
def api(key, spec, options = {})
|
|
56
|
+
options = options.dup
|
|
57
|
+
|
|
58
|
+
# Copy spec into API map
|
|
59
|
+
@apis[key] = spec
|
|
60
|
+
|
|
61
|
+
# Apply as default API, if specified to do so.
|
|
62
|
+
@default_api = key if options.delete(:default) || @default_api.nil?
|
|
63
|
+
|
|
64
|
+
# Save all other settings for initialization
|
|
65
|
+
(@api_options[key] ||= {}).merge!(options)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def default_api=(key)
|
|
69
|
+
raise UnknownApiError, key unless @apis.key?(key)
|
|
70
|
+
@default_api = key
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def to_transport
|
|
74
|
+
raise NoDefaultApiError if @default_api.nil?
|
|
75
|
+
|
|
76
|
+
# DEV: Should not be specific to traces
|
|
77
|
+
Transport::Traces::Transport.new(to_api_instances, @default_api)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def to_api_instances
|
|
81
|
+
raise NoApisError if @apis.empty?
|
|
82
|
+
|
|
83
|
+
@apis.inject(API::Map.new) do |instances, (key, spec)|
|
|
84
|
+
instances.tap do
|
|
85
|
+
api_options = @api_options[key].dup
|
|
86
|
+
|
|
87
|
+
# Resolve the adapter to use for this API
|
|
88
|
+
adapter = api_options.delete(:adapter) || @default_adapter
|
|
89
|
+
raise NoAdapterForApiError, key if adapter.nil?
|
|
90
|
+
|
|
91
|
+
# Resolve fallback and merge headers
|
|
92
|
+
fallback = api_options.delete(:fallback)
|
|
93
|
+
api_options[:headers] = @default_headers.merge((api_options[:headers] || {}))
|
|
94
|
+
|
|
95
|
+
# Add API::Instance with all settings
|
|
96
|
+
instances[key] = API::Instance.new(
|
|
97
|
+
spec,
|
|
98
|
+
adapter,
|
|
99
|
+
api_options
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Configure fallback, if provided.
|
|
103
|
+
instances.with_fallbacks(key => fallback) unless fallback.nil?
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Raised when the API key does not match known APIs.
|
|
109
|
+
class UnknownApiError < StandardError
|
|
110
|
+
attr_reader :key
|
|
111
|
+
|
|
112
|
+
def initialize(key)
|
|
113
|
+
@key = key
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def message
|
|
117
|
+
"Unknown transport API '#{key}'!"
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Raised when the identifier cannot be matched to an adapter.
|
|
122
|
+
class UnknownAdapterError < StandardError
|
|
123
|
+
attr_reader :type
|
|
124
|
+
|
|
125
|
+
def initialize(type)
|
|
126
|
+
@type = type
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def message
|
|
130
|
+
"Unknown transport adapter '#{type}'!"
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Raised when an adapter cannot be resolved for an API instance.
|
|
135
|
+
class NoAdapterForApiError < StandardError
|
|
136
|
+
attr_reader :key
|
|
137
|
+
|
|
138
|
+
def initialize(key)
|
|
139
|
+
@key = key
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def message
|
|
143
|
+
"No adapter resolved for transport API '#{key}'!"
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Raised when built without defining APIs.
|
|
148
|
+
class NoApisError < StandardError
|
|
149
|
+
def message
|
|
150
|
+
'No APIs configured for transport!'
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Raised when client built without defining a default API.
|
|
155
|
+
class NoDefaultApiError < StandardError
|
|
156
|
+
def message
|
|
157
|
+
'No default API configured for transport!'
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'ddtrace/transport/http/statistics'
|
|
2
|
+
require 'ddtrace/transport/http/env'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Transport
|
|
6
|
+
module HTTP
|
|
7
|
+
# Routes, encodes, and sends tracer data to the trace agent via HTTP.
|
|
8
|
+
class Client
|
|
9
|
+
include Transport::HTTP::Statistics
|
|
10
|
+
|
|
11
|
+
attr_reader :api
|
|
12
|
+
|
|
13
|
+
def initialize(api)
|
|
14
|
+
@api = api
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def send_request(request, &block)
|
|
18
|
+
# Build request into env
|
|
19
|
+
env = build_env(request)
|
|
20
|
+
|
|
21
|
+
# Get responses from API
|
|
22
|
+
response = yield(api, env)
|
|
23
|
+
|
|
24
|
+
# Update statistics
|
|
25
|
+
update_stats_from_response!(response)
|
|
26
|
+
|
|
27
|
+
response
|
|
28
|
+
rescue StandardError => e
|
|
29
|
+
message = "Internal error during HTTP transport request. Cause: #{e.message} Location: #{e.backtrace.first}"
|
|
30
|
+
|
|
31
|
+
# Log error
|
|
32
|
+
if stats.consecutive_errors > 0
|
|
33
|
+
Datadog.logger.debug(message)
|
|
34
|
+
else
|
|
35
|
+
Datadog.logger.error(message)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Update statistics
|
|
39
|
+
update_stats_from_exception!(e)
|
|
40
|
+
|
|
41
|
+
InternalErrorResponse.new(e)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def build_env(request)
|
|
45
|
+
Env.new(request)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Transport
|
|
3
|
+
module HTTP
|
|
4
|
+
# Data structure for an HTTP request
|
|
5
|
+
class Env < Hash
|
|
6
|
+
attr_reader \
|
|
7
|
+
:request
|
|
8
|
+
|
|
9
|
+
def initialize(request, options = nil)
|
|
10
|
+
@request = request
|
|
11
|
+
merge!(options) unless options.nil?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def verb
|
|
15
|
+
self[:verb]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def verb=(value)
|
|
19
|
+
self[:verb] = value
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def path
|
|
23
|
+
self[:path]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def path=(value)
|
|
27
|
+
self[:path] = value
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def body
|
|
31
|
+
self[:body]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def body=(value)
|
|
35
|
+
self[:body] = value
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def headers
|
|
39
|
+
self[:headers] ||= {}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def headers=(value)
|
|
43
|
+
self[:headers] = value
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
require 'ddtrace/transport/response'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Transport
|
|
6
|
+
module HTTP
|
|
7
|
+
# Wraps an HTTP response from an adapter.
|
|
8
|
+
#
|
|
9
|
+
# Used by endpoints to wrap responses from adapters with
|
|
10
|
+
# fields or behavior that's specific to that endpoint.
|
|
11
|
+
module Response
|
|
12
|
+
extend ::Forwardable
|
|
13
|
+
|
|
14
|
+
def initialize(http_response)
|
|
15
|
+
@http_response = http_response
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def_delegators :@http_response, *Datadog::Transport::Response.instance_methods
|
|
19
|
+
|
|
20
|
+
def code
|
|
21
|
+
@http_response.respond_to?(:code) ? @http_response.code : nil
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/transport/statistics'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Transport
|
|
5
|
+
module HTTP
|
|
6
|
+
# Tracks statistics for HTTP transports
|
|
7
|
+
module Statistics
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.send(:include, Datadog::Transport::Statistics)
|
|
10
|
+
base.send(:include, InstanceMethods)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Instance methods for HTTP statistics
|
|
14
|
+
module InstanceMethods
|
|
15
|
+
# Decorate metrics for HTTP responses
|
|
16
|
+
def metrics_for_response(response)
|
|
17
|
+
super.tap do |metrics|
|
|
18
|
+
# Add status code tag to api.responses metric
|
|
19
|
+
if metrics.key?(:api_responses)
|
|
20
|
+
(metrics[:api_responses].options[:tags] ||= []).tap do |tags|
|
|
21
|
+
tags << "status_code:#{response.code}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/transport/traces'
|
|
4
|
+
require 'ddtrace/transport/http/response'
|
|
5
|
+
require 'ddtrace/transport/http/api/endpoint'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Transport
|
|
9
|
+
module HTTP
|
|
10
|
+
# HTTP transport behavior for traces
|
|
11
|
+
module Traces
|
|
12
|
+
# Response from HTTP transport for traces
|
|
13
|
+
class Response
|
|
14
|
+
include HTTP::Response
|
|
15
|
+
include Datadog::Transport::Traces::Response
|
|
16
|
+
|
|
17
|
+
def initialize(http_response, options = {})
|
|
18
|
+
super(http_response)
|
|
19
|
+
@service_rates = options.fetch(:service_rates, nil)
|
|
20
|
+
@trace_count = options.fetch(:trace_count, 0)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Extensions for HTTP client
|
|
25
|
+
module Client
|
|
26
|
+
def send_payload(request)
|
|
27
|
+
send_request(request) do |api, env|
|
|
28
|
+
api.send_traces(env)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module API
|
|
34
|
+
# Extensions for HTTP API Spec
|
|
35
|
+
module Spec
|
|
36
|
+
attr_reader :traces
|
|
37
|
+
|
|
38
|
+
def traces=(endpoint)
|
|
39
|
+
@traces = endpoint
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def send_traces(env, &block)
|
|
43
|
+
raise NoTraceEndpointDefinedError, self if traces.nil?
|
|
44
|
+
traces.call(env, &block)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def encoder
|
|
48
|
+
traces.encoder
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Raised when traces sent but no traces endpoint is defined
|
|
52
|
+
class NoTraceEndpointDefinedError < StandardError
|
|
53
|
+
attr_reader :spec
|
|
54
|
+
|
|
55
|
+
def initialize(spec)
|
|
56
|
+
@spec = spec
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def message
|
|
60
|
+
'No trace endpoint is defined for API specification!'
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Extensions for HTTP API Instance
|
|
66
|
+
module Instance
|
|
67
|
+
def send_traces(env)
|
|
68
|
+
raise TracesNotSupportedError, spec unless spec.is_a?(Traces::API::Spec)
|
|
69
|
+
|
|
70
|
+
spec.send_traces(env) do |request_env|
|
|
71
|
+
call(request_env)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Raised when traces sent to API that does not support traces
|
|
76
|
+
class TracesNotSupportedError < StandardError
|
|
77
|
+
attr_reader :spec
|
|
78
|
+
|
|
79
|
+
def initialize(spec)
|
|
80
|
+
@spec = spec
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def message
|
|
84
|
+
'Traces not supported for this API!'
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Endpoint for submitting trace data
|
|
90
|
+
class Endpoint < HTTP::API::Endpoint
|
|
91
|
+
HEADER_CONTENT_TYPE = 'Content-Type'.freeze
|
|
92
|
+
HEADER_TRACE_COUNT = 'X-Datadog-Trace-Count'.freeze
|
|
93
|
+
SERVICE_RATE_KEY = 'rate_by_service'.freeze
|
|
94
|
+
|
|
95
|
+
attr_reader \
|
|
96
|
+
:encoder
|
|
97
|
+
|
|
98
|
+
def initialize(path, encoder, options = {})
|
|
99
|
+
super(:post, path)
|
|
100
|
+
@encoder = encoder
|
|
101
|
+
@service_rates = options.fetch(:service_rates, false)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def service_rates?
|
|
105
|
+
@service_rates == true
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def call(env, &block)
|
|
109
|
+
# Add trace count header
|
|
110
|
+
env.headers[HEADER_TRACE_COUNT] = env.request.parcel.trace_count.to_s
|
|
111
|
+
|
|
112
|
+
# Encode body & type
|
|
113
|
+
env.headers[HEADER_CONTENT_TYPE] = encoder.content_type
|
|
114
|
+
env.body = env.request.parcel.data
|
|
115
|
+
|
|
116
|
+
# Query for response
|
|
117
|
+
http_response = super(env, &block)
|
|
118
|
+
|
|
119
|
+
# Process the response
|
|
120
|
+
response_options = { trace_count: env.request.parcel.trace_count }.tap do |options|
|
|
121
|
+
# Parse service rates, if configured to do so.
|
|
122
|
+
if service_rates? && !http_response.payload.to_s.empty?
|
|
123
|
+
body = JSON.parse(http_response.payload)
|
|
124
|
+
if body.is_a?(Hash) && body.key?(SERVICE_RATE_KEY)
|
|
125
|
+
options[:service_rates] = body[SERVICE_RATE_KEY]
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Build and return a trace response
|
|
131
|
+
Traces::Response.new(http_response, response_options)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Add traces behavior to transport components
|
|
137
|
+
HTTP::Client.send(:include, Traces::Client)
|
|
138
|
+
HTTP::API::Spec.send(:include, Traces::API::Spec)
|
|
139
|
+
HTTP::API::Instance.send(:include, Traces::API::Instance)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|