ddtrace 0.13.0 → 0.47.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 +4 -4
- data/.circleci/config.yml +598 -381
- data/.circleci/images/primary/Dockerfile-2.0.0 +6 -2
- data/.circleci/images/primary/Dockerfile-2.1.10 +6 -2
- data/.circleci/images/primary/Dockerfile-2.2.10 +6 -2
- 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.3.7 → Dockerfile-2.5.6} +2 -2
- data/.circleci/images/primary/{Dockerfile-2.4.4 → Dockerfile-2.6.4} +2 -2
- data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
- data/.circleci/images/primary/Dockerfile-3.0.0 +73 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +78 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2.0.0 +73 -0
- data/.circleci/images/primary/{Dockerfile-1.9.3 → Dockerfile-truffleruby-21.0.0} +6 -2
- data/.env +5 -2
- data/.github/CODEOWNERS +1 -0
- data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
- data/.github/workflows/create-next-milestone.yml +20 -0
- data/.gitignore +2 -0
- data/.gitlab-ci.yml +27 -0
- data/.rubocop.yml +270 -6
- data/.rubocop_todo.yml +397 -0
- data/.simplecov +47 -0
- data/Appraisals +933 -127
- data/CHANGELOG.md +2106 -97
- data/CONTRIBUTING.md +85 -0
- data/Gemfile +55 -2
- data/LICENSE +4 -22
- data/LICENSE-3rdparty.csv +2 -0
- data/LICENSE.Apache +200 -0
- data/LICENSE.BSD3 +24 -0
- data/NOTICE +4 -0
- data/README.md +5 -34
- data/Rakefile +825 -351
- data/benchmarks/postgres_database.yml +9 -0
- data/benchmarks/sidekiq_test.rb +154 -0
- data/ddtrace.gemspec +8 -17
- data/docker-compose.yml +260 -47
- data/docs/DevelopmentGuide.md +249 -0
- data/docs/GettingStarted.md +1435 -290
- data/integration/README.md +68 -0
- data/integration/apps/rack/.dockerignore +1 -0
- data/integration/apps/rack/.envrc.sample +1 -0
- data/integration/apps/rack/.gitignore +4 -0
- data/integration/apps/rack/.rspec +1 -0
- data/integration/apps/rack/Dockerfile +25 -0
- data/integration/apps/rack/Dockerfile-ci +11 -0
- data/integration/apps/rack/Gemfile +24 -0
- data/integration/apps/rack/README.md +93 -0
- data/integration/apps/rack/app/acme.rb +80 -0
- data/integration/apps/rack/app/datadog.rb +17 -0
- data/integration/apps/rack/bin/run +22 -0
- data/integration/apps/rack/bin/setup +17 -0
- data/integration/apps/rack/bin/test +24 -0
- data/integration/apps/rack/config.ru +6 -0
- data/integration/apps/rack/config/puma.rb +14 -0
- data/integration/apps/rack/config/unicorn.rb +23 -0
- data/integration/apps/rack/docker-compose.ci.yml +62 -0
- data/integration/apps/rack/docker-compose.yml +78 -0
- data/integration/apps/rack/script/build-images +38 -0
- data/integration/apps/rack/script/ci +50 -0
- data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
- data/integration/apps/rack/spec/spec_helper.rb +16 -0
- data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
- data/integration/apps/rails-five/.dockerignore +1 -0
- data/integration/apps/rails-five/.env +3 -0
- data/integration/apps/rails-five/.envrc.sample +1 -0
- data/integration/apps/rails-five/.gitignore +30 -0
- data/integration/apps/rails-five/Dockerfile +25 -0
- data/integration/apps/rails-five/Dockerfile-ci +11 -0
- data/integration/apps/rails-five/Gemfile +104 -0
- data/integration/apps/rails-five/README.md +94 -0
- data/integration/apps/rails-five/Rakefile +6 -0
- data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
- data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
- data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
- data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
- data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
- data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
- data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
- data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
- data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
- data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
- data/integration/apps/rails-five/app/models/application_record.rb +3 -0
- data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
- data/integration/apps/rails-five/app/models/test.rb +2 -0
- data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
- data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
- data/integration/apps/rails-five/bin/bundle +3 -0
- data/integration/apps/rails-five/bin/rails +9 -0
- data/integration/apps/rails-five/bin/rake +9 -0
- data/integration/apps/rails-five/bin/run +24 -0
- data/integration/apps/rails-five/bin/setup +27 -0
- data/integration/apps/rails-five/bin/spring +17 -0
- data/integration/apps/rails-five/bin/test +21 -0
- data/integration/apps/rails-five/bin/update +28 -0
- data/integration/apps/rails-five/config.ru +5 -0
- data/integration/apps/rails-five/config/application.rb +97 -0
- data/integration/apps/rails-five/config/boot.rb +4 -0
- data/integration/apps/rails-five/config/cable.yml +10 -0
- data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
- data/integration/apps/rails-five/config/database.yml +28 -0
- data/integration/apps/rails-five/config/environment.rb +5 -0
- data/integration/apps/rails-five/config/environments/development.rb +51 -0
- data/integration/apps/rails-five/config/environments/production.rb +82 -0
- data/integration/apps/rails-five/config/environments/test.rb +43 -0
- data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
- data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
- data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
- data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
- data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
- data/integration/apps/rails-five/config/locales/en.yml +33 -0
- data/integration/apps/rails-five/config/puma.rb +24 -0
- data/integration/apps/rails-five/config/routes.rb +11 -0
- data/integration/apps/rails-five/config/spring.rb +6 -0
- data/integration/apps/rails-five/config/unicorn.rb +29 -0
- data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
- data/integration/apps/rails-five/db/schema.rb +23 -0
- data/integration/apps/rails-five/db/seeds.rb +7 -0
- data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
- data/integration/apps/rails-five/docker-compose.yml +100 -0
- data/integration/apps/rails-five/lib/tasks/.keep +0 -0
- data/integration/apps/rails-five/log/.keep +0 -0
- data/integration/apps/rails-five/public/robots.txt +1 -0
- data/integration/apps/rails-five/script/build-images +35 -0
- data/integration/apps/rails-five/script/ci +50 -0
- data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
- data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
- data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
- data/integration/apps/rails-five/storage/.keep +0 -0
- data/integration/apps/rails-five/tmp/.keep +0 -0
- data/integration/apps/rails-five/vendor/.keep +0 -0
- data/integration/apps/ruby/.dockerignore +1 -0
- data/integration/apps/ruby/.envrc.sample +1 -0
- data/integration/apps/ruby/.gitignore +2 -0
- data/integration/apps/ruby/Dockerfile +25 -0
- data/integration/apps/ruby/Dockerfile-ci +11 -0
- data/integration/apps/ruby/Gemfile +11 -0
- data/integration/apps/ruby/README.md +70 -0
- data/integration/apps/ruby/agent.yaml +3 -0
- data/integration/apps/ruby/app/datadog.rb +13 -0
- data/integration/apps/ruby/app/fibonacci.rb +58 -0
- data/integration/apps/ruby/bin/run +20 -0
- data/integration/apps/ruby/bin/setup +17 -0
- data/integration/apps/ruby/bin/test +21 -0
- data/integration/apps/ruby/docker-compose.ci.yml +51 -0
- data/integration/apps/ruby/docker-compose.yml +63 -0
- data/integration/apps/ruby/script/build-images +38 -0
- data/integration/apps/ruby/script/ci +50 -0
- data/integration/images/agent/Dockerfile +2 -0
- data/integration/images/agent/agent.yaml +3 -0
- data/integration/images/include/datadog/analyzer.rb +71 -0
- data/integration/images/include/datadog/demo_env.rb +101 -0
- data/integration/images/include/http-health-check +33 -0
- data/integration/images/ruby/2.0/Dockerfile +54 -0
- data/integration/images/ruby/2.1/Dockerfile +54 -0
- data/integration/images/ruby/2.2/Dockerfile +54 -0
- data/integration/images/ruby/2.3/Dockerfile +70 -0
- data/integration/images/ruby/2.4/Dockerfile +54 -0
- data/integration/images/ruby/2.5/Dockerfile +54 -0
- data/integration/images/ruby/2.6/Dockerfile +54 -0
- data/integration/images/ruby/2.7/Dockerfile +54 -0
- data/integration/images/ruby/3.0/Dockerfile +54 -0
- data/integration/images/wrk/Dockerfile +33 -0
- data/integration/images/wrk/scripts/entrypoint.sh +17 -0
- data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
- data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
- data/integration/script/build-images +43 -0
- data/lib/ddtrace.rb +65 -62
- data/lib/ddtrace/analytics.rb +38 -0
- data/lib/ddtrace/auto_instrument.rb +3 -0
- data/lib/ddtrace/auto_instrument_base.rb +6 -0
- data/lib/ddtrace/buffer.rb +298 -32
- data/lib/ddtrace/chunker.rb +34 -0
- data/lib/ddtrace/configuration.rb +151 -26
- data/lib/ddtrace/configuration/base.rb +84 -0
- data/lib/ddtrace/configuration/components.rb +151 -0
- data/lib/ddtrace/configuration/{resolver.rb → dependency_resolver.rb} +2 -2
- data/lib/ddtrace/configuration/option.rb +64 -0
- data/lib/ddtrace/configuration/option_definition.rb +121 -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 +111 -0
- data/lib/ddtrace/configuration/pin_setup.rb +4 -3
- data/lib/ddtrace/configuration/settings.rb +299 -0
- data/lib/ddtrace/context.rb +133 -66
- data/lib/ddtrace/context_flush.rb +51 -114
- data/lib/ddtrace/context_provider.rb +61 -0
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/action_cable/event.rb +66 -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 +26 -0
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +45 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +146 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +25 -0
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/action_pack/ext.rb +19 -0
- data/lib/ddtrace/contrib/action_pack/integration.rb +45 -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 +31 -0
- data/lib/ddtrace/contrib/action_view/event.rb +35 -0
- data/lib/ddtrace/contrib/action_view/events.rb +30 -0
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +46 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +49 -0
- data/lib/ddtrace/contrib/action_view/ext.rb +20 -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 +52 -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 +30 -0
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +14 -3
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +2 -2
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +2 -2
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +20 -0
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +40 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +12 -45
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +128 -0
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +35 -0
- data/lib/ddtrace/contrib/active_record/event.rb +1 -1
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +17 -8
- data/lib/ddtrace/contrib/active_record/events/sql.rb +32 -12
- data/lib/ddtrace/contrib/active_record/ext.rb +24 -0
- data/lib/ddtrace/contrib/active_record/integration.rb +53 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +5 -35
- data/lib/ddtrace/contrib/active_record/utils.rb +85 -31
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +258 -0
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +69 -0
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +47 -0
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/active_support/ext.rb +27 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +46 -0
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +15 -2
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -2
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +20 -12
- data/lib/ddtrace/contrib/active_support/patcher.rb +23 -0
- data/lib/ddtrace/contrib/analytics.rb +24 -0
- data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/aws/ext.rb +23 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +37 -19
- data/lib/ddtrace/contrib/aws/integration.rb +42 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +30 -40
- data/lib/ddtrace/contrib/aws/services.rb +3 -0
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +20 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +41 -0
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +12 -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 +102 -0
- data/lib/ddtrace/contrib/configuration/resolver.rb +81 -0
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
- data/lib/ddtrace/contrib/configuration/settings.rb +55 -0
- data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/cucumber/ext.rb +17 -0
- data/lib/ddtrace/contrib/cucumber/formatter.rb +98 -0
- data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
- data/lib/ddtrace/contrib/cucumber/integration.rb +45 -0
- data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/dalli/ext.rb +20 -0
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +36 -17
- data/lib/ddtrace/contrib/dalli/integration.rb +38 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +13 -41
- data/lib/ddtrace/contrib/dalli/quantize.rb +4 -4
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +23 -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 +84 -0
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +31 -0
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +22 -0
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +39 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +49 -50
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +3 -2
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +151 -0
- data/lib/ddtrace/contrib/ethon/ext.rb +19 -0
- data/lib/ddtrace/contrib/ethon/integration.rb +43 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +84 -0
- data/lib/ddtrace/contrib/ethon/patcher.rb +25 -0
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/excon/ext.rb +17 -0
- data/lib/ddtrace/contrib/excon/integration.rb +43 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +47 -23
- data/lib/ddtrace/contrib/excon/patcher.rb +7 -30
- data/lib/ddtrace/contrib/extensions.rb +143 -0
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +38 -0
- data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +17 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +43 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +46 -29
- data/lib/ddtrace/contrib/faraday/patcher.rb +36 -56
- data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +38 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +192 -120
- data/lib/ddtrace/contrib/grape/ext.rb +23 -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 +15 -59
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/graphql/ext.rb +16 -0
- data/lib/ddtrace/contrib/graphql/integration.rb +39 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +37 -34
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +36 -27
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +17 -8
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +20 -5
- data/lib/ddtrace/contrib/grpc/ext.rb +18 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +8 -38
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +37 -0
- data/lib/ddtrace/contrib/http/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/http/ext.rb +17 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +179 -0
- data/lib/ddtrace/contrib/http/integration.rb +45 -0
- data/lib/ddtrace/contrib/http/patcher.rb +9 -144
- data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
- data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +147 -0
- data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +38 -0
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +157 -0
- data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +38 -0
- data/lib/ddtrace/contrib/integration.rb +16 -0
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -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 +41 -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 +33 -0
- data/lib/ddtrace/contrib/mongodb/ext.rb +23 -0
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +69 -0
- data/lib/ddtrace/contrib/mongodb/integration.rb +38 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +11 -74
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +57 -18
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/mysql2/ext.rb +18 -0
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +64 -0
- data/lib/ddtrace/contrib/mysql2/integration.rb +38 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +9 -25
- data/lib/ddtrace/contrib/patchable.rb +70 -0
- data/lib/ddtrace/contrib/patcher.rb +65 -0
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/presto/ext.rb +28 -0
- data/lib/ddtrace/contrib/presto/instrumentation.rb +110 -0
- data/lib/ddtrace/contrib/presto/integration.rb +38 -0
- data/lib/ddtrace/contrib/presto/patcher.rb +33 -0
- data/lib/ddtrace/contrib/qless/configuration/settings.rb +35 -0
- data/lib/ddtrace/contrib/qless/ext.rb +20 -0
- data/lib/ddtrace/contrib/qless/integration.rb +38 -0
- data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
- data/lib/ddtrace/contrib/qless/qless_job.rb +73 -0
- data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +33 -0
- data/lib/ddtrace/contrib/que/configuration/settings.rb +43 -0
- data/lib/ddtrace/contrib/que/ext.rb +30 -0
- data/lib/ddtrace/contrib/que/integration.rb +42 -0
- data/lib/ddtrace/contrib/que/patcher.rb +24 -0
- data/lib/ddtrace/contrib/que/tracer.rb +57 -0
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/racecar/event.rb +22 -7
- data/lib/ddtrace/contrib/racecar/events.rb +2 -0
- data/lib/ddtrace/contrib/racecar/events/batch.rb +2 -2
- data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
- data/lib/ddtrace/contrib/racecar/events/message.rb +2 -2
- data/lib/ddtrace/contrib/racecar/ext.rb +25 -0
- data/lib/ddtrace/contrib/racecar/integration.rb +39 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +11 -42
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +46 -0
- data/lib/ddtrace/contrib/rack/ext.rb +21 -0
- data/lib/ddtrace/contrib/rack/integration.rb +45 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +105 -54
- data/lib/ddtrace/contrib/rack/patcher.rb +65 -49
- data/lib/ddtrace/contrib/rack/request_queue.rb +17 -7
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +93 -0
- data/lib/ddtrace/contrib/rails/ext.rb +17 -0
- data/lib/ddtrace/contrib/rails/framework.rb +82 -33
- data/lib/ddtrace/contrib/rails/integration.rb +44 -0
- data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
- data/lib/ddtrace/contrib/rails/middlewares.rb +8 -2
- data/lib/ddtrace/contrib/rails/patcher.rb +88 -34
- data/lib/ddtrace/contrib/rails/railtie.rb +5 -9
- data/lib/ddtrace/contrib/rails/utils.rb +7 -31
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +31 -0
- data/lib/ddtrace/contrib/rake/ext.rb +21 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +33 -13
- data/lib/ddtrace/contrib/rake/integration.rb +38 -0
- data/lib/ddtrace/contrib/rake/patcher.rb +10 -33
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +45 -0
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +35 -0
- data/lib/ddtrace/contrib/redis/ext.rb +22 -0
- data/lib/ddtrace/contrib/redis/integration.rb +42 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +58 -53
- data/lib/ddtrace/contrib/redis/quantize.rb +47 -1
- data/lib/ddtrace/contrib/redis/tags.rb +33 -7
- data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +158 -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 +32 -0
- data/lib/ddtrace/contrib/resque/ext.rb +17 -0
- data/lib/ddtrace/contrib/resque/integration.rb +47 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +16 -38
- data/lib/ddtrace/contrib/resque/resque_job.rb +61 -20
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +31 -0
- data/lib/ddtrace/contrib/rest_client/ext.rb +17 -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 +91 -0
- data/lib/ddtrace/contrib/rspec/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/rspec/example.rb +75 -0
- data/lib/ddtrace/contrib/rspec/ext.rb +16 -0
- data/lib/ddtrace/contrib/rspec/integration.rb +46 -0
- data/lib/ddtrace/contrib/rspec/patcher.rb +23 -0
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +28 -0
- data/lib/ddtrace/contrib/sequel/database.rb +9 -4
- data/lib/ddtrace/contrib/sequel/dataset.rb +7 -3
- data/lib/ddtrace/contrib/sequel/ext.rb +19 -0
- data/lib/ddtrace/contrib/sequel/integration.rb +38 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +6 -29
- data/lib/ddtrace/contrib/sequel/utils.rb +60 -14
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/shoryuken/ext.rb +21 -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 +51 -0
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +37 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +27 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +38 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +22 -14
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +65 -0
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +44 -0
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +39 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +27 -9
- data/lib/ddtrace/contrib/sinatra/ext.rb +27 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
- 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 +79 -65
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +60 -16
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
- data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
- data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
- data/lib/ddtrace/contrib/sneakers/tracer.rb +53 -0
- data/lib/ddtrace/contrib/status_code_matcher.rb +69 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +30 -0
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +21 -0
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +29 -5
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +38 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +21 -33
- data/lib/ddtrace/correlation.rb +39 -0
- data/lib/ddtrace/diagnostics/environment_logger.rb +279 -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 +71 -0
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +43 -0
- data/lib/ddtrace/encoding.rb +36 -32
- data/lib/ddtrace/environment.rb +41 -0
- data/lib/ddtrace/event.rb +52 -0
- data/lib/ddtrace/ext/analytics.rb +12 -0
- data/lib/ddtrace/ext/app_types.rb +1 -0
- data/lib/ddtrace/ext/ci.rb +297 -0
- data/lib/ddtrace/ext/correlation.rb +11 -0
- data/lib/ddtrace/ext/diagnostics.rb +36 -0
- data/lib/ddtrace/ext/distributed.rb +22 -0
- data/lib/ddtrace/ext/environment.rb +16 -0
- data/lib/ddtrace/ext/forced_tracing.rb +25 -0
- data/lib/ddtrace/ext/git.rb +11 -0
- data/lib/ddtrace/ext/http.rb +4 -2
- data/lib/ddtrace/ext/integration.rb +8 -0
- data/lib/ddtrace/ext/manual_tracing.rb +9 -0
- data/lib/ddtrace/ext/metrics.rb +15 -0
- data/lib/ddtrace/ext/net.rb +2 -0
- data/lib/ddtrace/ext/runtime.rb +30 -0
- data/lib/ddtrace/ext/sampling.rb +16 -0
- data/lib/ddtrace/ext/test.rb +24 -0
- data/lib/ddtrace/ext/transport.rb +18 -0
- data/lib/ddtrace/forced_tracing.rb +38 -0
- data/lib/ddtrace/logger.rb +5 -4
- data/lib/ddtrace/metrics.rb +226 -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 +55 -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 +94 -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 +31 -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 +33 -5
- data/lib/ddtrace/pin.rb +35 -20
- data/lib/ddtrace/pipeline.rb +1 -1
- data/lib/ddtrace/pipeline/span_filter.rb +15 -15
- data/lib/ddtrace/propagation/grpc_propagator.rb +26 -6
- data/lib/ddtrace/propagation/http_propagator.rb +72 -10
- data/lib/ddtrace/quantization/http.rb +1 -0
- data/lib/ddtrace/runtime/cgroup.rb +44 -0
- data/lib/ddtrace/runtime/class_count.rb +17 -0
- data/lib/ddtrace/runtime/container.rb +71 -0
- data/lib/ddtrace/runtime/gc.rb +16 -0
- data/lib/ddtrace/runtime/identity.rb +48 -0
- data/lib/ddtrace/runtime/metrics.rb +114 -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 +218 -37
- data/lib/ddtrace/sampling.rb +2 -0
- data/lib/ddtrace/sampling/matcher.rb +57 -0
- data/lib/ddtrace/sampling/rate_limiter.rb +176 -0
- data/lib/ddtrace/sampling/rule.rb +61 -0
- data/lib/ddtrace/sampling/rule_sampler.rb +126 -0
- data/lib/ddtrace/span.rb +244 -34
- data/lib/ddtrace/sync_writer.rb +47 -16
- data/lib/ddtrace/tracer.rb +215 -117
- data/lib/ddtrace/transport/http.rb +113 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +145 -0
- data/lib/ddtrace/transport/http/adapters/registry.rb +25 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +83 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +66 -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 +169 -0
- data/lib/ddtrace/transport/http/client.rb +50 -0
- data/lib/ddtrace/transport/http/env.rb +56 -0
- data/lib/ddtrace/transport/http/response.rb +26 -0
- data/lib/ddtrace/transport/http/statistics.rb +43 -0
- data/lib/ddtrace/transport/http/traces.rb +142 -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 +23 -0
- data/lib/ddtrace/transport/io/traces.rb +97 -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 +205 -0
- data/lib/ddtrace/utils.rb +17 -14
- data/lib/ddtrace/utils/compression.rb +27 -0
- data/lib/ddtrace/utils/database.rb +7 -3
- data/lib/ddtrace/utils/forking.rb +52 -0
- data/lib/ddtrace/utils/object_set.rb +41 -0
- data/lib/ddtrace/utils/only_once.rb +40 -0
- data/lib/ddtrace/utils/sequence.rb +17 -0
- data/lib/ddtrace/utils/string_table.rb +45 -0
- data/lib/ddtrace/utils/time.rb +45 -0
- data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
- data/lib/ddtrace/vendor/active_record/connection_specification.rb +301 -0
- data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
- data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
- data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
- data/lib/ddtrace/version.rb +3 -1
- data/lib/ddtrace/worker.rb +20 -0
- data/lib/ddtrace/workers.rb +39 -40
- data/lib/ddtrace/workers/async.rb +173 -0
- data/lib/ddtrace/workers/loop.rb +119 -0
- data/lib/ddtrace/workers/polling.rb +49 -0
- data/lib/ddtrace/workers/queue.rb +40 -0
- data/lib/ddtrace/workers/runtime_metrics.rb +51 -0
- data/lib/ddtrace/workers/trace_writer.rb +202 -0
- data/lib/ddtrace/writer.rb +121 -57
- data/tasks/release_gem.rake +28 -0
- metadata +501 -211
- data/lib/ddtrace/configurable.rb +0 -83
- data/lib/ddtrace/configuration/proxy.rb +0 -25
- data/lib/ddtrace/contrib/base.rb +0 -15
- data/lib/ddtrace/contrib/mysql2/client.rb +0 -60
- data/lib/ddtrace/contrib/rails/action_controller.rb +0 -91
- data/lib/ddtrace/contrib/rails/action_controller_patch.rb +0 -77
- data/lib/ddtrace/contrib/rails/action_view.rb +0 -19
- data/lib/ddtrace/contrib/rails/active_support.rb +0 -65
- data/lib/ddtrace/contrib/rails/core_extensions.rb +0 -356
- data/lib/ddtrace/contrib/sidekiq/tracer.rb +0 -72
- data/lib/ddtrace/ext/cache.rb +0 -8
- data/lib/ddtrace/ext/grpc.rb +0 -7
- data/lib/ddtrace/ext/mongo.rb +0 -12
- data/lib/ddtrace/ext/redis.rb +0 -17
- data/lib/ddtrace/monkey.rb +0 -65
- data/lib/ddtrace/propagation/distributed_headers.rb +0 -48
- data/lib/ddtrace/provider.rb +0 -21
- data/lib/ddtrace/registry.rb +0 -42
- data/lib/ddtrace/registry/registerable.rb +0 -20
- data/lib/ddtrace/transport.rb +0 -212
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/sampling/matcher'
|
|
4
|
+
require 'ddtrace/sampler'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Sampling
|
|
8
|
+
# Sampling rule that dictates if a span matches
|
|
9
|
+
# a specific criteria and what sampling strategy to
|
|
10
|
+
# apply in case of a positive match.
|
|
11
|
+
class Rule
|
|
12
|
+
extend Forwardable
|
|
13
|
+
|
|
14
|
+
attr_reader :matcher, :sampler
|
|
15
|
+
|
|
16
|
+
# @param [Matcher] matcher A matcher to verify span conformity against
|
|
17
|
+
# @param [Sampler] sampler A sampler to be consulted on a positive match
|
|
18
|
+
def initialize(matcher, sampler)
|
|
19
|
+
@matcher = matcher
|
|
20
|
+
@sampler = sampler
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Evaluates if the provided `span` conforms to the `matcher`.
|
|
24
|
+
#
|
|
25
|
+
# @param [Span] span
|
|
26
|
+
# @return [Boolean] whether this rules applies to the span
|
|
27
|
+
# @return [NilClass] if the matcher fails errs during evaluation
|
|
28
|
+
def match?(span)
|
|
29
|
+
@matcher.match?(span)
|
|
30
|
+
rescue => e
|
|
31
|
+
Datadog.logger.error("Matcher failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
32
|
+
nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def_delegators :@sampler, :sample?, :sample_rate
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# A \Rule that matches a span based on
|
|
39
|
+
# operation name and/or service name and
|
|
40
|
+
# applies a fixed sampling to matching spans.
|
|
41
|
+
class SimpleRule < Rule
|
|
42
|
+
# @param name [String,Regexp,Proc] Matcher for case equality (===) with the span name, defaults to always match
|
|
43
|
+
# @param service [String,Regexp,Proc] Matcher for case equality (===) with the service name, defaults to always match
|
|
44
|
+
# @param sample_rate [Float] Sampling rate between +[0,1]+
|
|
45
|
+
def initialize(name: SimpleMatcher::MATCH_ALL, service: SimpleMatcher::MATCH_ALL, sample_rate: 1.0)
|
|
46
|
+
# We want to allow 0.0 to drop all traces, but \RateSampler
|
|
47
|
+
# considers 0.0 an invalid rate and falls back to 100% sampling.
|
|
48
|
+
#
|
|
49
|
+
# We address that here by not setting the rate in the constructor,
|
|
50
|
+
# but using the setter method.
|
|
51
|
+
#
|
|
52
|
+
# We don't want to make this change directly to \RateSampler
|
|
53
|
+
# because it breaks its current contract to existing users.
|
|
54
|
+
sampler = Datadog::RateSampler.new
|
|
55
|
+
sampler.sample_rate = sample_rate
|
|
56
|
+
|
|
57
|
+
super(SimpleMatcher.new(name: name, service: service), sampler)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
require 'ddtrace/ext/priority'
|
|
4
|
+
|
|
5
|
+
require 'ddtrace/ext/sampling'
|
|
6
|
+
require 'ddtrace/sampler'
|
|
7
|
+
require 'ddtrace/sampling/rate_limiter'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Sampling
|
|
11
|
+
# Span {Sampler} that applies a set of {Rule}s to decide
|
|
12
|
+
# on sampling outcome. Then, a rate limiter is applied.
|
|
13
|
+
#
|
|
14
|
+
# If a span does not conform to any rules, a default
|
|
15
|
+
# sampling strategy is applied.
|
|
16
|
+
class RuleSampler
|
|
17
|
+
extend Forwardable
|
|
18
|
+
|
|
19
|
+
AGENT_RATE_METRIC_KEY = '_dd.agent_psr'.freeze
|
|
20
|
+
|
|
21
|
+
attr_reader :rules, :rate_limiter, :default_sampler
|
|
22
|
+
|
|
23
|
+
# @param rules [Array<Rule>] ordered list of rules to be applied to a span
|
|
24
|
+
# @param rate_limit [Float] number of traces per second, defaults to +100+
|
|
25
|
+
# @param rate_limiter [RateLimiter] limiter applied after rule matching
|
|
26
|
+
# @param default_sample_rate [Float] fallback sample rate when no rules apply to a span,
|
|
27
|
+
# between +[0,1]+, defaults to +1+
|
|
28
|
+
# @param default_sampler [Sample] fallback strategy when no rules apply to a span
|
|
29
|
+
def initialize(rules = [],
|
|
30
|
+
rate_limit: Datadog.configuration.sampling.rate_limit,
|
|
31
|
+
rate_limiter: nil,
|
|
32
|
+
default_sample_rate: Datadog.configuration.sampling.default_rate,
|
|
33
|
+
default_sampler: nil)
|
|
34
|
+
|
|
35
|
+
@rules = rules
|
|
36
|
+
|
|
37
|
+
@rate_limiter = if rate_limiter
|
|
38
|
+
rate_limiter
|
|
39
|
+
elsif rate_limit
|
|
40
|
+
Datadog::Sampling::TokenBucket.new(rate_limit)
|
|
41
|
+
else
|
|
42
|
+
Datadog::Sampling::UnlimitedLimiter.new
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
@default_sampler = if default_sampler
|
|
46
|
+
default_sampler
|
|
47
|
+
elsif default_sample_rate
|
|
48
|
+
# We want to allow 0.0 to drop all traces, but \RateSampler
|
|
49
|
+
# considers 0.0 an invalid rate and falls back to 100% sampling.
|
|
50
|
+
#
|
|
51
|
+
# We address that here by not setting the rate in the constructor,
|
|
52
|
+
# but using the setter method.
|
|
53
|
+
#
|
|
54
|
+
# We don't want to make this change directly to \RateSampler
|
|
55
|
+
# because it breaks its current contract to existing users.
|
|
56
|
+
Datadog::RateSampler.new.tap { |s| s.sample_rate = default_sample_rate }
|
|
57
|
+
else
|
|
58
|
+
RateByServiceSampler.new(1.0, env: -> { Datadog.tracer.tags[:env] })
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# /RuleSampler's components (it's rate limiter, for example) are
|
|
63
|
+
# not be guaranteed to be size-effect free.
|
|
64
|
+
# It is not possible to guarantee that a call to {#sample?} will
|
|
65
|
+
# return the same result as a successive call to {#sample!} with the same span.
|
|
66
|
+
#
|
|
67
|
+
# Use {#sample!} instead
|
|
68
|
+
def sample?(_span)
|
|
69
|
+
raise 'RuleSampler cannot be evaluated without side-effects'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def sample!(span)
|
|
73
|
+
sampled = sample_span(span) do |s|
|
|
74
|
+
@default_sampler.sample!(s).tap do
|
|
75
|
+
# We want to make sure the span is tagged with the agent-derived
|
|
76
|
+
# service rate. Retrieve this from the rate by service sampler.
|
|
77
|
+
# Only do this if it was set by a RateByServiceSampler.
|
|
78
|
+
if @default_sampler.is_a?(RateByServiceSampler)
|
|
79
|
+
s.set_metric(AGENT_RATE_METRIC_KEY, @default_sampler.sample_rate(span))
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
sampled.tap do
|
|
85
|
+
span.sampled = sampled
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def update(*args)
|
|
90
|
+
return false unless @default_sampler.respond_to?(:update)
|
|
91
|
+
|
|
92
|
+
@default_sampler.update(*args)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def sample_span(span)
|
|
98
|
+
rule = @rules.find { |r| r.match?(span) }
|
|
99
|
+
|
|
100
|
+
return yield(span) if rule.nil?
|
|
101
|
+
|
|
102
|
+
sampled = rule.sample?(span)
|
|
103
|
+
sample_rate = rule.sample_rate(span)
|
|
104
|
+
|
|
105
|
+
set_rule_metrics(span, sample_rate)
|
|
106
|
+
|
|
107
|
+
return false unless sampled
|
|
108
|
+
|
|
109
|
+
rate_limiter.allow?(1).tap do
|
|
110
|
+
set_limiter_metrics(span, rate_limiter.effective_rate)
|
|
111
|
+
end
|
|
112
|
+
rescue StandardError => e
|
|
113
|
+
Datadog.logger.error("Rule sampling failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
114
|
+
yield(span)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def set_rule_metrics(span, sample_rate)
|
|
118
|
+
span.set_metric(Ext::Sampling::RULE_SAMPLE_RATE, sample_rate)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def set_limiter_metrics(span, limiter_rate)
|
|
122
|
+
span.set_metric(Ext::Sampling::RATE_LIMITER_RATE, limiter_rate)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
data/lib/ddtrace/span.rb
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
require 'thread'
|
|
1
|
+
# frozen_string_literal: true
|
|
3
2
|
|
|
3
|
+
require 'time'
|
|
4
4
|
require 'ddtrace/utils'
|
|
5
5
|
require 'ddtrace/ext/errors'
|
|
6
|
+
require 'ddtrace/ext/priority'
|
|
7
|
+
require 'ddtrace/environment'
|
|
8
|
+
require 'ddtrace/analytics'
|
|
9
|
+
require 'ddtrace/forced_tracing'
|
|
10
|
+
require 'ddtrace/diagnostics/health'
|
|
11
|
+
require 'ddtrace/utils/time'
|
|
6
12
|
|
|
7
13
|
module Datadog
|
|
8
14
|
# Represents a logical unit of work in the system. Each trace consists of one or more spans.
|
|
@@ -10,21 +16,36 @@ module Datadog
|
|
|
10
16
|
# spent on a distributed call on a separate machine, or the time spent in a small component
|
|
11
17
|
# within a larger operation. Spans can be nested within each other, and in those instances
|
|
12
18
|
# will have a parent-child relationship.
|
|
19
|
+
#
|
|
20
|
+
# rubocop:disable Metrics/ClassLength
|
|
13
21
|
class Span
|
|
22
|
+
prepend Analytics::Span
|
|
23
|
+
prepend ForcedTracing::Span
|
|
24
|
+
|
|
14
25
|
# The max value for a \Span identifier.
|
|
15
26
|
# Span and trace identifiers should be strictly positive and strictly inferior to this limit.
|
|
16
27
|
#
|
|
17
|
-
# Limited to
|
|
18
|
-
#
|
|
19
|
-
|
|
28
|
+
# Limited to +2<<62-1+ positive integers, as Ruby is able to represent such numbers "inline",
|
|
29
|
+
# inside a +VALUE+ scalar, thus not requiring memory allocation.
|
|
30
|
+
#
|
|
31
|
+
# The range of IDs also has to consider portability across different languages and platforms.
|
|
32
|
+
RUBY_MAX_ID = (1 << 62) - 1
|
|
33
|
+
|
|
34
|
+
# While we only generate 63-bit integers due to limitations in other languages, we support
|
|
35
|
+
# parsing 64-bit integers for distributed tracing since an upstream system may generate one
|
|
36
|
+
EXTERNAL_MAX_ID = 1 << 64
|
|
37
|
+
|
|
38
|
+
# This limit is for numeric tags because uint64 could end up rounded.
|
|
39
|
+
NUMERIC_TAG_SIZE_RANGE = (-1 << 53..1 << 53).freeze
|
|
20
40
|
|
|
21
41
|
attr_accessor :name, :service, :resource, :span_type,
|
|
22
|
-
:start_time, :end_time,
|
|
23
42
|
:span_id, :trace_id, :parent_id,
|
|
24
43
|
:status, :sampled,
|
|
25
44
|
:tracer, :context
|
|
26
45
|
|
|
27
|
-
attr_reader :parent
|
|
46
|
+
attr_reader :parent, :start_time, :end_time
|
|
47
|
+
|
|
48
|
+
attr_writer :duration
|
|
28
49
|
|
|
29
50
|
# Create a new span linked to the given tracer. Call the \Tracer method <tt>start_span()</tt>
|
|
30
51
|
# and then <tt>finish()</tt> once the tracer operation is over.
|
|
@@ -56,38 +77,91 @@ module Datadog
|
|
|
56
77
|
@parent = nil
|
|
57
78
|
@sampled = true
|
|
58
79
|
|
|
59
|
-
@
|
|
60
|
-
@
|
|
80
|
+
@allocation_count_start = now_allocations
|
|
81
|
+
@allocation_count_finish = @allocation_count_start
|
|
82
|
+
|
|
83
|
+
# start_time and end_time track wall clock. In Ruby, wall clock
|
|
84
|
+
# has less accuracy than monotonic clock, so if possible we look to only use wall clock
|
|
85
|
+
# to measure duration when a time is supplied by the user, or if monotonic clock
|
|
86
|
+
# is unsupported.
|
|
87
|
+
@start_time = nil
|
|
88
|
+
@end_time = nil
|
|
89
|
+
|
|
90
|
+
# duration_start and duration_end track monotonic clock, and may remain nil in cases where it
|
|
91
|
+
# is known that we have to use wall clock to measure duration.
|
|
92
|
+
@duration_start = nil
|
|
93
|
+
@duration_end = nil
|
|
61
94
|
end
|
|
62
95
|
|
|
63
96
|
# Set the given key / value tag pair on the span. Keys and values
|
|
64
97
|
# must be strings. A valid example is:
|
|
65
98
|
#
|
|
66
99
|
# span.set_tag('http.method', request.method)
|
|
67
|
-
def set_tag(key, value)
|
|
68
|
-
|
|
100
|
+
def set_tag(key, value = nil)
|
|
101
|
+
# Keys must be unique between tags and metrics
|
|
102
|
+
@metrics.delete(key)
|
|
103
|
+
|
|
104
|
+
# Ensure `http.status_code` is always a string so it is added to
|
|
105
|
+
# @meta instead of @metrics
|
|
106
|
+
# DEV: This is necessary because the agent looks to `meta['http.status_code']` for
|
|
107
|
+
# tagging necessary metrics
|
|
108
|
+
value = value.to_s if key == Ext::HTTP::STATUS_CODE
|
|
109
|
+
|
|
110
|
+
# NOTE: Adding numeric tags as metrics is stop-gap support
|
|
111
|
+
# for numeric typed tags. Eventually they will become
|
|
112
|
+
# tags again.
|
|
113
|
+
# Any numeric that is not an integer greater than max size is logged as a metric.
|
|
114
|
+
# Everything else gets logged as a tag.
|
|
115
|
+
if value.is_a?(Numeric) && !(value.is_a?(Integer) && !NUMERIC_TAG_SIZE_RANGE.cover?(value))
|
|
116
|
+
set_metric(key, value)
|
|
117
|
+
else
|
|
118
|
+
@meta[key] = value.to_s
|
|
119
|
+
end
|
|
69
120
|
rescue StandardError => e
|
|
70
|
-
Datadog
|
|
121
|
+
Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Sets tags from given hash, for each key in hash it sets the tag with that key
|
|
125
|
+
# and associated value from the hash. It is shortcut for `set_tag`. Keys and values
|
|
126
|
+
# of the hash must be strings. Note that nested hashes are not supported.
|
|
127
|
+
# A valid example is:
|
|
128
|
+
#
|
|
129
|
+
# span.set_tags({ "http.method" => "GET", "user.id" => "234" })
|
|
130
|
+
def set_tags(tags)
|
|
131
|
+
tags.each { |k, v| set_tag(k, v) }
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# This method removes a tag for the given key.
|
|
135
|
+
def clear_tag(key)
|
|
136
|
+
@meta.delete(key)
|
|
71
137
|
end
|
|
72
138
|
|
|
73
139
|
# Return the tag with the given key, nil if it doesn't exist.
|
|
74
140
|
def get_tag(key)
|
|
75
|
-
@meta[key]
|
|
141
|
+
@meta[key] || @metrics[key]
|
|
76
142
|
end
|
|
77
143
|
|
|
78
144
|
# This method sets a tag with a floating point value for the given key. It acts
|
|
79
145
|
# like `set_tag()` and it simply add a tag without further processing.
|
|
80
146
|
def set_metric(key, value)
|
|
147
|
+
# Keys must be unique between tags and metrics
|
|
148
|
+
@meta.delete(key)
|
|
149
|
+
|
|
81
150
|
# enforce that the value is a floating point number
|
|
82
151
|
value = Float(value)
|
|
83
152
|
@metrics[key] = value
|
|
84
153
|
rescue StandardError => e
|
|
85
|
-
Datadog
|
|
154
|
+
Datadog.logger.debug("Unable to set the metric #{key}, ignoring it. Caused by: #{e}")
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# This method removes a metric for the given key. It acts like {#remove_tag}.
|
|
158
|
+
def clear_metric(key)
|
|
159
|
+
@metrics.delete(key)
|
|
86
160
|
end
|
|
87
161
|
|
|
88
162
|
# Return the metric with the given key, nil if it doesn't exist.
|
|
89
163
|
def get_metric(key)
|
|
90
|
-
@metrics[key]
|
|
164
|
+
@metrics[key] || @meta[key]
|
|
91
165
|
end
|
|
92
166
|
|
|
93
167
|
# Mark the span with the given error.
|
|
@@ -100,6 +174,28 @@ module Datadog
|
|
|
100
174
|
set_tag(Ext::Errors::STACK, e.backtrace) unless e.backtrace.empty?
|
|
101
175
|
end
|
|
102
176
|
|
|
177
|
+
# Mark the span started at the current time.
|
|
178
|
+
def start(start_time = nil)
|
|
179
|
+
# A span should not be started twice. However, this is existing
|
|
180
|
+
# behavior and so we maintain it for backward compatibility for those
|
|
181
|
+
# who are using async manual instrumentation that may rely on this
|
|
182
|
+
|
|
183
|
+
@start_time = start_time || Utils::Time.now.utc
|
|
184
|
+
@duration_start = start_time.nil? ? duration_marker : nil
|
|
185
|
+
|
|
186
|
+
self
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# for backwards compatibility
|
|
190
|
+
def start_time=(time)
|
|
191
|
+
time.tap { start(time) }
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# for backwards compatibility
|
|
195
|
+
def end_time=(time)
|
|
196
|
+
time.tap { finish(time) }
|
|
197
|
+
end
|
|
198
|
+
|
|
103
199
|
# Mark the span finished at the current time and submit it.
|
|
104
200
|
def finish(finish_time = nil)
|
|
105
201
|
# A span should not be finished twice. Note that this is not thread-safe,
|
|
@@ -108,12 +204,17 @@ module Datadog
|
|
|
108
204
|
# fallback to avoid very bad things and protect you in most common cases.
|
|
109
205
|
return if finished?
|
|
110
206
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@start_time ||= Time.now.utc
|
|
207
|
+
@allocation_count_finish = now_allocations
|
|
208
|
+
|
|
209
|
+
now = Utils::Time.now.utc
|
|
115
210
|
|
|
116
|
-
|
|
211
|
+
# Provide a default start_time if unset.
|
|
212
|
+
# Using `now` here causes duration to be 0; this is expected
|
|
213
|
+
# behavior when start_time is unknown.
|
|
214
|
+
start(finish_time || now) unless started?
|
|
215
|
+
|
|
216
|
+
@end_time = finish_time || now
|
|
217
|
+
@duration_end = finish_time.nil? ? duration_marker : nil
|
|
117
218
|
|
|
118
219
|
# Finish does not really do anything if the span is not bound to a tracer and a context.
|
|
119
220
|
return self if @tracer.nil? || @context.nil?
|
|
@@ -121,22 +222,18 @@ module Datadog
|
|
|
121
222
|
# spans without a service would be dropped, so here we provide a default.
|
|
122
223
|
# This should really never happen with integrations in contrib, as a default
|
|
123
224
|
# service is always set. It's only for custom instrumentation.
|
|
124
|
-
@service ||= @tracer
|
|
225
|
+
@service ||= (@tracer && @tracer.default_service)
|
|
125
226
|
|
|
126
227
|
begin
|
|
127
228
|
@context.close_span(self)
|
|
128
229
|
@tracer.record(self)
|
|
129
230
|
rescue StandardError => e
|
|
130
|
-
Datadog
|
|
231
|
+
Datadog.logger.debug("error recording finished trace: #{e}")
|
|
232
|
+
Datadog.health_metrics.error_span_finish(1, tags: ["error:#{e.class.name}"])
|
|
131
233
|
end
|
|
132
234
|
self
|
|
133
235
|
end
|
|
134
236
|
|
|
135
|
-
# Return whether the span is finished or not.
|
|
136
|
-
def finished?
|
|
137
|
-
!@end_time.nil?
|
|
138
|
-
end
|
|
139
|
-
|
|
140
237
|
# Return a string representation of the span.
|
|
141
238
|
def to_s
|
|
142
239
|
"Span(name:#{@name},sid:#{@span_id},tid:#{@trace_id},pid:#{@parent_id})"
|
|
@@ -163,6 +260,10 @@ module Datadog
|
|
|
163
260
|
end
|
|
164
261
|
end
|
|
165
262
|
|
|
263
|
+
def allocations
|
|
264
|
+
@allocation_count_finish - @allocation_count_start
|
|
265
|
+
end
|
|
266
|
+
|
|
166
267
|
# Return the hash representation of the current span.
|
|
167
268
|
def to_hash
|
|
168
269
|
h = {
|
|
@@ -175,22 +276,80 @@ module Datadog
|
|
|
175
276
|
type: @span_type,
|
|
176
277
|
meta: @meta,
|
|
177
278
|
metrics: @metrics,
|
|
279
|
+
allocations: allocations,
|
|
178
280
|
error: @status
|
|
179
281
|
}
|
|
180
282
|
|
|
181
|
-
if
|
|
182
|
-
h[:start] =
|
|
183
|
-
h[:duration] =
|
|
283
|
+
if finished?
|
|
284
|
+
h[:start] = start_time_nano
|
|
285
|
+
h[:duration] = duration_nano
|
|
184
286
|
end
|
|
185
287
|
|
|
186
288
|
h
|
|
187
289
|
end
|
|
188
290
|
|
|
291
|
+
# MessagePack serializer interface. Making this object
|
|
292
|
+
# respond to `#to_msgpack` allows it to be automatically
|
|
293
|
+
# serialized by MessagePack.
|
|
294
|
+
#
|
|
295
|
+
# This is more efficient than doing +MessagePack.pack(span.to_hash)+
|
|
296
|
+
# as we don't have to create an intermediate Hash.
|
|
297
|
+
#
|
|
298
|
+
# @param packer [MessagePack::Packer] serialization buffer, can be +nil+ with JRuby
|
|
299
|
+
def to_msgpack(packer = nil)
|
|
300
|
+
# As of 1.3.3, JRuby implementation doesn't pass an existing packer
|
|
301
|
+
packer ||= MessagePack::Packer.new
|
|
302
|
+
|
|
303
|
+
if finished?
|
|
304
|
+
packer.write_map_header(13) # Set header with how many elements in the map
|
|
305
|
+
|
|
306
|
+
packer.write('start')
|
|
307
|
+
packer.write(start_time_nano)
|
|
308
|
+
|
|
309
|
+
packer.write('duration')
|
|
310
|
+
packer.write(duration_nano)
|
|
311
|
+
else
|
|
312
|
+
packer.write_map_header(11) # Set header with how many elements in the map
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# DEV: We use strings as keys here, instead of symbols, as
|
|
316
|
+
# DEV: MessagePack will ultimately convert them to strings.
|
|
317
|
+
# DEV: By providing strings directly, we skip this indirection operation.
|
|
318
|
+
packer.write('span_id')
|
|
319
|
+
packer.write(@span_id)
|
|
320
|
+
packer.write('parent_id')
|
|
321
|
+
packer.write(@parent_id)
|
|
322
|
+
packer.write('trace_id')
|
|
323
|
+
packer.write(@trace_id)
|
|
324
|
+
packer.write('name')
|
|
325
|
+
packer.write(@name)
|
|
326
|
+
packer.write('service')
|
|
327
|
+
packer.write(@service)
|
|
328
|
+
packer.write('resource')
|
|
329
|
+
packer.write(@resource)
|
|
330
|
+
packer.write('type')
|
|
331
|
+
packer.write(@span_type)
|
|
332
|
+
packer.write('meta')
|
|
333
|
+
packer.write(@meta)
|
|
334
|
+
packer.write('metrics')
|
|
335
|
+
packer.write(@metrics)
|
|
336
|
+
packer.write('allocations')
|
|
337
|
+
packer.write(allocations)
|
|
338
|
+
packer.write('error')
|
|
339
|
+
packer.write(@status)
|
|
340
|
+
packer
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# JSON serializer interface.
|
|
344
|
+
# Used by older version of the transport.
|
|
345
|
+
def to_json(*args)
|
|
346
|
+
to_hash.to_json(*args)
|
|
347
|
+
end
|
|
348
|
+
|
|
189
349
|
# Return a human readable version of the span
|
|
190
350
|
def pretty_print(q)
|
|
191
|
-
start_time = (
|
|
192
|
-
end_time = (
|
|
193
|
-
duration = ((@end_time - @start_time) * 1e9).to_i rescue 0
|
|
351
|
+
start_time = (self.start_time.to_f * 1e9).to_i
|
|
352
|
+
end_time = (self.end_time.to_f * 1e9).to_i
|
|
194
353
|
q.group 0 do
|
|
195
354
|
q.breakable
|
|
196
355
|
q.text "Name: #{@name}\n"
|
|
@@ -203,7 +362,8 @@ module Datadog
|
|
|
203
362
|
q.text "Error: #{@status}\n"
|
|
204
363
|
q.text "Start: #{start_time}\n"
|
|
205
364
|
q.text "End: #{end_time}\n"
|
|
206
|
-
q.text "Duration: #{duration}\n"
|
|
365
|
+
q.text "Duration: #{duration.to_f if finished?}\n"
|
|
366
|
+
q.text "Allocations: #{allocations}\n"
|
|
207
367
|
q.group(2, 'Tags: [', "]\n") do
|
|
208
368
|
q.breakable
|
|
209
369
|
q.seplist @meta.each do |key, value|
|
|
@@ -218,5 +378,55 @@ module Datadog
|
|
|
218
378
|
end
|
|
219
379
|
end
|
|
220
380
|
end
|
|
381
|
+
|
|
382
|
+
# Return whether the duration is started or not
|
|
383
|
+
def started?
|
|
384
|
+
!@start_time.nil?
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
# Return whether the duration is finished or not.
|
|
388
|
+
def finished?
|
|
389
|
+
!@end_time.nil?
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def duration
|
|
393
|
+
if @duration_end.nil? || @duration_start.nil?
|
|
394
|
+
@end_time - @start_time
|
|
395
|
+
else
|
|
396
|
+
@duration_end - @duration_start
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
private
|
|
401
|
+
|
|
402
|
+
def duration_marker
|
|
403
|
+
Utils::Time.get_time
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
if defined?(JRUBY_VERSION) || Gem::Version.new(RUBY_VERSION) < Gem::Version.new(VERSION::MINIMUM_RUBY_VERSION)
|
|
407
|
+
def now_allocations
|
|
408
|
+
0
|
|
409
|
+
end
|
|
410
|
+
elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2.0')
|
|
411
|
+
def now_allocations
|
|
412
|
+
GC.stat.fetch(:total_allocated_object)
|
|
413
|
+
end
|
|
414
|
+
else
|
|
415
|
+
def now_allocations
|
|
416
|
+
GC.stat(:total_allocated_objects)
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
# Used for serialization
|
|
421
|
+
# @return [Integer] in nanoseconds since Epoch
|
|
422
|
+
def start_time_nano
|
|
423
|
+
@start_time.to_i * 1000000000 + @start_time.nsec
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
# Used for serialization
|
|
427
|
+
# @return [Integer] in nanoseconds since Epoch
|
|
428
|
+
def duration_nano
|
|
429
|
+
(duration * 1e9).to_i
|
|
430
|
+
end
|
|
221
431
|
end
|
|
222
432
|
end
|