ls-trace 0.1.1
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 +673 -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/.dockerignore +1 -0
- data/.env +24 -0
- data/.github/CODEOWNERS +1 -0
- data/.gitignore +59 -0
- data/.rspec +1 -0
- data/.rubocop.yml +77 -0
- data/.yardopts +5 -0
- data/Appraisals +820 -0
- data/CHANGELOG.md +1051 -0
- data/CONTRIBUTING.md +85 -0
- data/Gemfile +7 -0
- data/LICENSE +24 -0
- data/README.md +108 -0
- data/Rakefile +635 -0
- data/benchmarks/postgres_database.yml +9 -0
- data/benchmarks/sidekiq_test.rb +154 -0
- data/ddtrace.gemspec +63 -0
- data/docker-compose.yml +276 -0
- data/docs/DevelopmentGuide.md +195 -0
- data/docs/GettingStarted.md +1981 -0
- data/lib/ddtrace.rb +63 -0
- data/lib/ddtrace/analytics.rb +29 -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/configuration.rb +30 -0
- data/lib/ddtrace/configuration/base.rb +82 -0
- data/lib/ddtrace/configuration/dependency_resolver.rb +24 -0
- data/lib/ddtrace/configuration/option.rb +55 -0
- data/lib/ddtrace/configuration/option_definition.rb +127 -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 +107 -0
- data/lib/ddtrace/configuration/pin_setup.rb +30 -0
- data/lib/ddtrace/configuration/settings.rb +105 -0
- data/lib/ddtrace/context.rb +284 -0
- data/lib/ddtrace/context_flush.rb +132 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +144 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +37 -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 +36 -0
- data/lib/ddtrace/contrib/action_pack/patcher.rb +29 -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/ext.rb +17 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +78 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +43 -0
- data/lib/ddtrace/contrib/action_view/patcher.rb +53 -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 +65 -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 +39 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +36 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +46 -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 +57 -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 +44 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +29 -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 +62 -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 +38 -0
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +62 -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 +29 -0
- data/lib/ddtrace/contrib/analytics.rb +20 -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 +36 -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 +35 -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 +32 -0
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +35 -0
- data/lib/ddtrace/contrib/configurable.rb +59 -0
- data/lib/ddtrace/contrib/configuration/resolver.rb +12 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +35 -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 +36 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +73 -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 +32 -0
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +34 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +57 -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 +37 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +124 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +80 -0
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +139 -0
- data/lib/ddtrace/contrib/ethon/ext.rb +15 -0
- data/lib/ddtrace/contrib/ethon/integration.rb +31 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +80 -0
- data/lib/ddtrace/contrib/ethon/patcher.rb +27 -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 +32 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +154 -0
- data/lib/ddtrace/contrib/excon/patcher.rb +34 -0
- data/lib/ddtrace/contrib/extensions.rb +59 -0
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +14 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +36 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +93 -0
- data/lib/ddtrace/contrib/faraday/patcher.rb +82 -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 +199 -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 +36 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +79 -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 +38 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +63 -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 +56 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +73 -0
- data/lib/ddtrace/contrib/grpc/ext.rb +15 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +36 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +78 -0
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +63 -0
- data/lib/ddtrace/contrib/http/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/http/ext.rb +14 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +114 -0
- data/lib/ddtrace/contrib/http/integration.rb +32 -0
- data/lib/ddtrace/contrib/http/patcher.rb +32 -0
- data/lib/ddtrace/contrib/integration.rb +16 -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 +68 -0
- data/lib/ddtrace/contrib/mongodb/integration.rb +36 -0
- data/lib/ddtrace/contrib/mongodb/parsers.rb +68 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +37 -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 +32 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +33 -0
- data/lib/ddtrace/contrib/patchable.rb +42 -0
- data/lib/ddtrace/contrib/patcher.rb +28 -0
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/racecar/event.rb +67 -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 +36 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +32 -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 +32 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +283 -0
- data/lib/ddtrace/contrib/rack/patcher.rb +72 -0
- data/lib/ddtrace/contrib/rack/request_queue.rb +39 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +80 -0
- data/lib/ddtrace/contrib/rails/ext.rb +12 -0
- data/lib/ddtrace/contrib/rails/framework.rb +100 -0
- data/lib/ddtrace/contrib/rails/integration.rb +37 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +38 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +78 -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 +84 -0
- data/lib/ddtrace/contrib/rake/integration.rb +32 -0
- data/lib/ddtrace/contrib/rake/patcher.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 +36 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +94 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +47 -0
- data/lib/ddtrace/contrib/redis/tags.rb +38 -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 +37 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +35 -0
- data/lib/ddtrace/contrib/resque/resque_job.rb +76 -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 +31 -0
- data/lib/ddtrace/contrib/rest_client/patcher.rb +25 -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 +32 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +39 -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 +35 -0
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +30 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +45 -0
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +21 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +36 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +40 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +58 -0
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +28 -0
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +34 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +38 -0
- data/lib/ddtrace/contrib/sinatra/ext.rb +18 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
- data/lib/ddtrace/contrib/sinatra/integration.rb +36 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +33 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +84 -0
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +72 -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 +70 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +36 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +48 -0
- data/lib/ddtrace/correlation.rb +28 -0
- data/lib/ddtrace/diagnostics/health.rb +30 -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 +65 -0
- data/lib/ddtrace/environment.rb +23 -0
- data/lib/ddtrace/error.rb +27 -0
- data/lib/ddtrace/ext/analytics.rb +11 -0
- data/lib/ddtrace/ext/app_types.rb +11 -0
- data/lib/ddtrace/ext/diagnostics.rb +25 -0
- data/lib/ddtrace/ext/distributed.rb +33 -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/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 +39 -0
- data/lib/ddtrace/metrics.rb +215 -0
- data/lib/ddtrace/monkey.rb +58 -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 +114 -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/provider.rb +21 -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 +93 -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 +195 -0
- data/lib/ddtrace/span.rb +260 -0
- data/lib/ddtrace/sync_writer.rb +62 -0
- data/lib/ddtrace/tracer.rb +459 -0
- data/lib/ddtrace/transport/http.rb +91 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +112 -0
- data/lib/ddtrace/transport/http/adapters/registry.rb +24 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +77 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +64 -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 +29 -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 +165 -0
- data/lib/ddtrace/transport/http/client.rb +107 -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 +140 -0
- data/lib/ddtrace/transport/parcel.rb +13 -0
- data/lib/ddtrace/transport/request.rb +13 -0
- data/lib/ddtrace/transport/response.rb +49 -0
- data/lib/ddtrace/transport/statistics.rb +72 -0
- data/lib/ddtrace/transport/traces.rb +33 -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/workers.rb +125 -0
- data/lib/ddtrace/writer.rb +157 -0
- data/tasks/release_gem.rake +28 -0
- metadata +682 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'ddtrace/ext/runtime'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Runtime
|
|
5
|
+
# For control groups
|
|
6
|
+
module Cgroup
|
|
7
|
+
LINE_REGEX = /^(\d+):([^:]*):(.+)$/
|
|
8
|
+
|
|
9
|
+
Descriptor = Struct.new(
|
|
10
|
+
:id,
|
|
11
|
+
:groups,
|
|
12
|
+
:path,
|
|
13
|
+
:controllers
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
module_function
|
|
17
|
+
|
|
18
|
+
def descriptors(process = 'self')
|
|
19
|
+
[].tap do |descriptors|
|
|
20
|
+
begin
|
|
21
|
+
filepath = "/proc/#{process}/cgroup"
|
|
22
|
+
|
|
23
|
+
if File.exist?(filepath)
|
|
24
|
+
File.open("/proc/#{process}/cgroup").each do |line|
|
|
25
|
+
line = line.strip
|
|
26
|
+
descriptors << parse(line) unless line.empty?
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
rescue StandardError => e
|
|
30
|
+
Datadog::Tracer.log.error("Error while parsing cgroup. Cause: #{e.message} Location: #{e.backtrace.first}")
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def parse(line)
|
|
36
|
+
id, groups, path = line.scan(LINE_REGEX).first
|
|
37
|
+
|
|
38
|
+
Descriptor.new(id, groups, path).tap do |descriptor|
|
|
39
|
+
descriptor.controllers = groups.split(',') unless groups.nil?
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Runtime
|
|
3
|
+
# Retrieves number of classes from runtime
|
|
4
|
+
module ClassCount
|
|
5
|
+
module_function
|
|
6
|
+
|
|
7
|
+
def value
|
|
8
|
+
::ObjectSpace.count_objects[:T_CLASS]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def available?
|
|
12
|
+
::ObjectSpace.respond_to?(:count_objects) \
|
|
13
|
+
&& ::ObjectSpace.count_objects.key?(:T_CLASS)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require 'ddtrace/ext/runtime'
|
|
2
|
+
require 'ddtrace/runtime/cgroup'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Runtime
|
|
6
|
+
# For container environments
|
|
7
|
+
module Container
|
|
8
|
+
UUID_PATTERN = '[0-9a-f]{8}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{12}'.freeze
|
|
9
|
+
CONTAINER_PATTERN = '[0-9a-f]{64}'.freeze
|
|
10
|
+
|
|
11
|
+
POD_REGEX = /(pod)?(#{UUID_PATTERN})(?:.slice)?$/
|
|
12
|
+
CONTAINER_REGEX = /(#{UUID_PATTERN}|#{CONTAINER_PATTERN})(?:.scope)?$/
|
|
13
|
+
|
|
14
|
+
Descriptor = Struct.new(
|
|
15
|
+
:platform,
|
|
16
|
+
:container_id,
|
|
17
|
+
:task_uid
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
module_function
|
|
21
|
+
|
|
22
|
+
def platform
|
|
23
|
+
descriptor.platform
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def container_id
|
|
27
|
+
descriptor.container_id
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def task_uid
|
|
31
|
+
descriptor.task_uid
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def descriptor
|
|
35
|
+
@descriptor ||= begin
|
|
36
|
+
Descriptor.new.tap do |descriptor|
|
|
37
|
+
begin
|
|
38
|
+
Cgroup.descriptors.each do |cgroup_descriptor|
|
|
39
|
+
# Parse container data from cgroup descriptor
|
|
40
|
+
path = cgroup_descriptor.path
|
|
41
|
+
next if path.nil?
|
|
42
|
+
|
|
43
|
+
# Split path into parts
|
|
44
|
+
parts = path.split('/')
|
|
45
|
+
parts.shift # Remove leading empty part
|
|
46
|
+
next if parts.length < 2
|
|
47
|
+
|
|
48
|
+
# Read info from path
|
|
49
|
+
platform = parts[0]
|
|
50
|
+
container_id = parts[-1][CONTAINER_REGEX]
|
|
51
|
+
task_uid = parts[-2][POD_REGEX]
|
|
52
|
+
|
|
53
|
+
# If container ID wasn't found, ignore.
|
|
54
|
+
# Path might describe a non-container environment.
|
|
55
|
+
next if container_id.nil?
|
|
56
|
+
|
|
57
|
+
descriptor.platform = platform
|
|
58
|
+
descriptor.container_id = container_id
|
|
59
|
+
descriptor.task_uid = task_uid
|
|
60
|
+
|
|
61
|
+
break
|
|
62
|
+
end
|
|
63
|
+
rescue StandardError => e
|
|
64
|
+
Datadog::Tracer.log.error(
|
|
65
|
+
"Error while parsing container info. Cause: #{e.message} Location: #{e.backtrace.first}"
|
|
66
|
+
)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'securerandom'
|
|
2
|
+
require 'ddtrace/ext/runtime'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Runtime
|
|
6
|
+
# For runtime identity
|
|
7
|
+
module Identity
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# Retrieves number of classes from runtime
|
|
11
|
+
def id
|
|
12
|
+
@pid ||= Process.pid
|
|
13
|
+
@id ||= SecureRandom.uuid
|
|
14
|
+
|
|
15
|
+
# Check if runtime has changed, e.g. forked.
|
|
16
|
+
if Process.pid != @pid
|
|
17
|
+
@pid = Process.pid
|
|
18
|
+
@id = SecureRandom.uuid
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
@id
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def lang
|
|
25
|
+
Ext::Runtime::LANG
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def lang_interpreter
|
|
29
|
+
Ext::Runtime::LANG_INTERPRETER
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def lang_version
|
|
33
|
+
Ext::Runtime::LANG_VERSION
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def tracer_version
|
|
37
|
+
Ext::Runtime::TRACER_VERSION
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require 'ddtrace/ext/runtime'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/metrics'
|
|
4
|
+
require 'ddtrace/runtime/class_count'
|
|
5
|
+
require 'ddtrace/runtime/gc'
|
|
6
|
+
require 'ddtrace/runtime/identity'
|
|
7
|
+
require 'ddtrace/runtime/thread_count'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Runtime
|
|
11
|
+
# For generating runtime metrics
|
|
12
|
+
class Metrics < Datadog::Metrics
|
|
13
|
+
def initialize(options = {})
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
# Initialize service list
|
|
17
|
+
@services = Set.new
|
|
18
|
+
@service_tags = nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def associate_with_span(span)
|
|
22
|
+
return if span.nil?
|
|
23
|
+
|
|
24
|
+
# Register service as associated with metrics
|
|
25
|
+
register_service(span.service) unless span.service.nil?
|
|
26
|
+
|
|
27
|
+
# Tag span with language and runtime ID for association with metrics
|
|
28
|
+
span.set_tag(Ext::Runtime::TAG_LANG, Runtime::Identity.lang)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Associate service with runtime metrics
|
|
32
|
+
def register_service(service)
|
|
33
|
+
return if service.nil?
|
|
34
|
+
|
|
35
|
+
service = service.to_s
|
|
36
|
+
|
|
37
|
+
unless @services.include?(service)
|
|
38
|
+
# Add service to list and update services tag
|
|
39
|
+
services << service
|
|
40
|
+
|
|
41
|
+
# Recompile the service tags
|
|
42
|
+
compile_service_tags!
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Flush all runtime metrics to Statsd client
|
|
47
|
+
def flush
|
|
48
|
+
return unless enabled?
|
|
49
|
+
|
|
50
|
+
try_flush { gauge(Ext::Runtime::Metrics::METRIC_CLASS_COUNT, ClassCount.value) if ClassCount.available? }
|
|
51
|
+
try_flush { gauge(Ext::Runtime::Metrics::METRIC_THREAD_COUNT, ThreadCount.value) if ThreadCount.available? }
|
|
52
|
+
try_flush { gc_metrics.each { |metric, value| gauge(metric, value) } if GC.available? }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def gc_metrics
|
|
56
|
+
Hash[
|
|
57
|
+
GC.stat.map do |k, v|
|
|
58
|
+
["#{Ext::Runtime::Metrics::METRIC_GC_PREFIX}.#{k}", v]
|
|
59
|
+
end
|
|
60
|
+
]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def try_flush
|
|
64
|
+
yield
|
|
65
|
+
rescue StandardError => e
|
|
66
|
+
Datadog::Tracer.log.error("Error while sending runtime metric. Cause: #{e.message}")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def default_metric_options
|
|
70
|
+
# Return dupes, so that the constant isn't modified,
|
|
71
|
+
# and defaults are unfrozen for mutation in Statsd.
|
|
72
|
+
super.tap do |options|
|
|
73
|
+
options[:tags] = options[:tags].dup
|
|
74
|
+
|
|
75
|
+
# Add services dynamically because they might change during runtime.
|
|
76
|
+
options[:tags].concat(service_tags) unless service_tags.nil?
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
attr_reader \
|
|
83
|
+
:service_tags,
|
|
84
|
+
:services
|
|
85
|
+
|
|
86
|
+
def compile_service_tags!
|
|
87
|
+
@service_tags = services.to_a.collect do |service|
|
|
88
|
+
"#{Ext::Runtime::Metrics::TAG_SERVICE}:#{service}".freeze
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'objspace'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Runtime
|
|
5
|
+
# Retrieves garbage collection statistics
|
|
6
|
+
module ObjectSpace
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
def estimate_bytesize(object)
|
|
10
|
+
return 0 unless ::ObjectSpace.respond_to?(:memsize_of)
|
|
11
|
+
|
|
12
|
+
# Rough calculation of bytesize; not very accurate.
|
|
13
|
+
object.instance_variables.inject(::ObjectSpace.memsize_of(object)) do |sum, var|
|
|
14
|
+
sum + ::ObjectSpace.memsize_of(object.instance_variable_get(var))
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/ext/priority'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# \Sampler performs client-side trace sampling.
|
|
7
|
+
class Sampler
|
|
8
|
+
def sample?(_span)
|
|
9
|
+
raise NotImplementedError, 'Samplers must implement the #sample? method'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def sample!(_span)
|
|
13
|
+
raise NotImplementedError, 'Samplers must implement the #sample! method'
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# \AllSampler samples all the traces.
|
|
18
|
+
class AllSampler < Sampler
|
|
19
|
+
def sample?(span)
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def sample!(span)
|
|
24
|
+
span.sampled = true
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# \RateSampler is based on a sample rate.
|
|
29
|
+
class RateSampler < Sampler
|
|
30
|
+
KNUTH_FACTOR = 1111111111111111111
|
|
31
|
+
SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
|
|
32
|
+
|
|
33
|
+
attr_reader :sample_rate
|
|
34
|
+
|
|
35
|
+
# Initialize a \RateSampler.
|
|
36
|
+
# This sampler keeps a random subset of the traces. Its main purpose is to
|
|
37
|
+
# reduce the instrumentation footprint.
|
|
38
|
+
#
|
|
39
|
+
# * +sample_rate+: the sample rate as a \Float between 0.0 and 1.0. 0.0
|
|
40
|
+
# means that no trace will be sampled; 1.0 means that all traces will be
|
|
41
|
+
# sampled.
|
|
42
|
+
def initialize(sample_rate = 1.0)
|
|
43
|
+
unless sample_rate > 0.0 && sample_rate <= 1.0
|
|
44
|
+
Datadog::Tracer.log.error('sample rate is not between 0 and 1, disabling the sampler')
|
|
45
|
+
sample_rate = 1.0
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
self.sample_rate = sample_rate
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def sample_rate=(sample_rate)
|
|
52
|
+
@sample_rate = sample_rate
|
|
53
|
+
@sampling_id_threshold = sample_rate * Span::MAX_ID
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def sample?(span)
|
|
57
|
+
((span.trace_id * KNUTH_FACTOR) % Datadog::Span::MAX_ID) <= @sampling_id_threshold
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def sample!(span)
|
|
61
|
+
(span.sampled = sample?(span)).tap do |sampled|
|
|
62
|
+
span.set_metric(SAMPLE_RATE_METRIC_KEY, @sample_rate) if sampled
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# \RateByServiceSampler samples different services at different rates
|
|
68
|
+
class RateByServiceSampler < Sampler
|
|
69
|
+
DEFAULT_KEY = 'service:,env:'.freeze
|
|
70
|
+
|
|
71
|
+
def initialize(rate = 1.0, opts = {})
|
|
72
|
+
@env = opts.fetch(:env, Datadog.tracer.tags[:env])
|
|
73
|
+
@mutex = Mutex.new
|
|
74
|
+
@fallback = RateSampler.new(rate)
|
|
75
|
+
@sampler = { DEFAULT_KEY => @fallback }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def sample?(span)
|
|
79
|
+
key = key_for(span)
|
|
80
|
+
|
|
81
|
+
@mutex.synchronize do
|
|
82
|
+
@sampler.fetch(key, @fallback).sample?(span)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def sample!(span)
|
|
87
|
+
key = key_for(span)
|
|
88
|
+
|
|
89
|
+
@mutex.synchronize do
|
|
90
|
+
@sampler.fetch(key, @fallback).sample!(span)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def sample_rate(span)
|
|
95
|
+
key = key_for(span)
|
|
96
|
+
|
|
97
|
+
@mutex.synchronize do
|
|
98
|
+
@sampler.fetch(key, @fallback).sample_rate
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def update(rate_by_service)
|
|
103
|
+
@mutex.synchronize do
|
|
104
|
+
@sampler.delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
|
|
105
|
+
|
|
106
|
+
rate_by_service.each do |key, rate|
|
|
107
|
+
@sampler[key] ||= RateSampler.new(rate)
|
|
108
|
+
@sampler[key].sample_rate = rate
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
private
|
|
114
|
+
|
|
115
|
+
def key_for(span)
|
|
116
|
+
"service:#{span.service},env:#{@env}"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# \PrioritySampler
|
|
121
|
+
class PrioritySampler
|
|
122
|
+
extend Forwardable
|
|
123
|
+
|
|
124
|
+
SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
|
|
125
|
+
|
|
126
|
+
def initialize(opts = {})
|
|
127
|
+
@pre_sampler = opts[:base_sampler] || AllSampler.new
|
|
128
|
+
@priority_sampler = opts[:post_sampler] || RateByServiceSampler.new
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def sample?(span)
|
|
132
|
+
@pre_sampler.sample?(span)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def sample!(span)
|
|
136
|
+
# If pre-sampling is configured, do it first. (By default, this will sample at 100%.)
|
|
137
|
+
# NOTE: Pre-sampling at rates < 100% may result in partial traces; not recommended.
|
|
138
|
+
span.sampled = pre_sample?(span) ? @pre_sampler.sample!(span) : true
|
|
139
|
+
|
|
140
|
+
if span.sampled
|
|
141
|
+
# If priority sampling has already been applied upstream, use that, otherwise...
|
|
142
|
+
unless priority_assigned_upstream?(span)
|
|
143
|
+
# Roll the dice and determine whether how we set the priority.
|
|
144
|
+
# NOTE: We'll want to leave `span.sampled = true` here; all spans for priority sampling must
|
|
145
|
+
# be sent to the agent. Otherwise metrics for traces will not be accurate, since the
|
|
146
|
+
# agent will have an incomplete dataset.
|
|
147
|
+
priority = priority_sample(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
|
|
148
|
+
assign_priority!(span, priority)
|
|
149
|
+
end
|
|
150
|
+
else
|
|
151
|
+
# If discarded by pre-sampling, set "reject" priority, so other
|
|
152
|
+
# services for the same trace don't sample needlessly.
|
|
153
|
+
assign_priority!(span, Datadog::Ext::Priority::AUTO_REJECT)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
span.sampled
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def_delegators :@priority_sampler, :update
|
|
160
|
+
|
|
161
|
+
private
|
|
162
|
+
|
|
163
|
+
def pre_sample?(span)
|
|
164
|
+
case @pre_sampler
|
|
165
|
+
when RateSampler
|
|
166
|
+
@pre_sampler.sample_rate < 1.0
|
|
167
|
+
when RateByServiceSampler
|
|
168
|
+
@pre_sampler.sample_rate(span) < 1.0
|
|
169
|
+
else
|
|
170
|
+
true
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def priority_assigned_upstream?(span)
|
|
175
|
+
span.context && !span.context.sampling_priority.nil?
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def priority_sample(span)
|
|
179
|
+
@priority_sampler.sample?(span)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def assign_priority!(span, priority)
|
|
183
|
+
if span.context
|
|
184
|
+
span.context.sampling_priority = priority
|
|
185
|
+
else
|
|
186
|
+
# Set the priority directly on the span instead, since otherwise
|
|
187
|
+
# it won't receive the appropriate tag.
|
|
188
|
+
span.set_metric(
|
|
189
|
+
Ext::DistributedTracing::SAMPLING_PRIORITY_KEY,
|
|
190
|
+
priority
|
|
191
|
+
)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|