ddtrace 0.42.0 → 0.54.2
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/.editorconfig +22 -0
- data/.gitignore +7 -1
- data/CHANGELOG.md +1645 -370
- data/CONTRIBUTING.md +2 -6
- data/LICENSE-3rdparty.csv +2 -0
- data/README.md +1 -0
- data/bin/ddtracerb +15 -0
- data/ddtrace.gemspec +21 -39
- data/docs/DevelopmentGuide.md +46 -8
- data/docs/GettingStarted.md +439 -92
- data/docs/ProfilingDevelopment.md +107 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +86 -0
- data/ext/ddtrace_profiling_native_extension/clock_id.h +4 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +52 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +14 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +197 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +35 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +22 -0
- data/lib/datadog/ci/configuration/components.rb +31 -0
- data/lib/datadog/ci/configuration/settings.rb +37 -0
- data/lib/datadog/ci/context_flush.rb +29 -0
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +31 -0
- data/lib/datadog/ci/contrib/cucumber/ext.rb +20 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +99 -0
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +27 -0
- data/lib/datadog/ci/contrib/cucumber/integration.rb +48 -0
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +26 -0
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +31 -0
- data/lib/datadog/ci/contrib/rspec/example.rb +75 -0
- data/lib/datadog/ci/contrib/rspec/ext.rb +19 -0
- data/lib/datadog/ci/contrib/rspec/integration.rb +49 -0
- data/lib/datadog/ci/contrib/rspec/patcher.rb +26 -0
- data/lib/datadog/ci/ext/app_types.rb +10 -0
- data/lib/datadog/ci/ext/environment.rb +485 -0
- data/lib/datadog/ci/ext/settings.rb +11 -0
- data/lib/datadog/ci/ext/test.rb +36 -0
- data/lib/datadog/ci/extensions.rb +18 -0
- data/lib/datadog/ci/test.rb +81 -0
- data/lib/datadog/ci.rb +17 -0
- data/lib/datadog/contrib.rb +71 -0
- data/lib/datadog/core/environment/cgroup.rb +52 -0
- data/lib/datadog/core/environment/class_count.rb +20 -0
- data/lib/datadog/core/environment/container.rb +91 -0
- data/lib/datadog/core/environment/ext.rb +27 -0
- data/lib/datadog/core/environment/gc.rb +19 -0
- data/lib/datadog/core/environment/identity.rb +51 -0
- data/lib/datadog/core/environment/socket.rb +17 -0
- data/lib/datadog/core/environment/thread_count.rb +19 -0
- data/lib/datadog/core/environment/variable_helpers.rb +42 -0
- data/lib/datadog/core/environment/vm_cache.rb +46 -0
- data/lib/ddtrace/analytics.rb +3 -0
- data/lib/ddtrace/auto_instrument.rb +5 -0
- data/lib/ddtrace/auto_instrument_base.rb +7 -0
- data/lib/ddtrace/buffer.rb +38 -24
- data/lib/ddtrace/chunker.rb +1 -0
- data/lib/ddtrace/configuration/agent_settings_resolver.rb +309 -0
- data/lib/ddtrace/configuration/base.rb +9 -11
- data/lib/ddtrace/configuration/components.rb +167 -26
- data/lib/ddtrace/configuration/dependency_resolver.rb +1 -0
- data/lib/ddtrace/configuration/option.rb +1 -0
- data/lib/ddtrace/configuration/option_definition.rb +2 -3
- data/lib/ddtrace/configuration/option_definition_set.rb +1 -0
- data/lib/ddtrace/configuration/option_set.rb +1 -0
- data/lib/ddtrace/configuration/options.rb +7 -9
- data/lib/ddtrace/configuration/pin_setup.rb +1 -0
- data/lib/ddtrace/configuration/settings.rb +142 -12
- data/lib/ddtrace/configuration.rb +132 -24
- data/lib/ddtrace/context.rb +51 -22
- data/lib/ddtrace/context_flush.rb +15 -2
- data/lib/ddtrace/context_provider.rb +13 -2
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/event.rb +6 -4
- data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/events/transmit.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/events.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/ext.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +47 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +8 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +2 -0
- data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/event.rb +50 -0
- data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +54 -0
- data/lib/ddtrace/contrib/action_mailer/events/process.rb +41 -0
- data/lib/ddtrace/contrib/action_mailer/events.rb +31 -0
- data/lib/ddtrace/contrib/action_mailer/ext.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/integration.rb +45 -0
- data/lib/ddtrace/contrib/action_mailer/patcher.rb +27 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +22 -13
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +2 -1
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/action_pack/ext.rb +1 -0
- data/lib/ddtrace/contrib/action_pack/integration.rb +8 -0
- data/lib/ddtrace/contrib/action_pack/patcher.rb +1 -0
- data/lib/ddtrace/contrib/action_pack/utils.rb +2 -1
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/action_view/event.rb +4 -7
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +2 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +2 -0
- data/lib/ddtrace/contrib/action_view/events.rb +1 -0
- data/lib/ddtrace/contrib/action_view/ext.rb +1 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +1 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +8 -0
- data/lib/ddtrace/contrib/action_view/patcher.rb +5 -4
- data/lib/ddtrace/contrib/action_view/utils.rb +2 -1
- data/lib/ddtrace/contrib/active_job/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/active_job/event.rb +54 -0
- data/lib/ddtrace/contrib/active_job/events/discard.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +47 -0
- data/lib/ddtrace/contrib/active_job/events/perform.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events.rb +39 -0
- data/lib/ddtrace/contrib/active_job/ext.rb +32 -0
- data/lib/ddtrace/contrib/active_job/integration.rb +46 -0
- data/lib/ddtrace/contrib/active_job/log_injection.rb +21 -0
- data/lib/ddtrace/contrib/active_job/patcher.rb +33 -0
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -2
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/events.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +1 -0
- data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +31 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +108 -18
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/active_record/event.rb +3 -2
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -0
- data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -0
- data/lib/ddtrace/contrib/active_record/events.rb +1 -0
- data/lib/ddtrace/contrib/active_record/ext.rb +1 -0
- data/lib/ddtrace/contrib/active_record/integration.rb +8 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +69 -21
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +105 -3
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +26 -4
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +2 -5
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/active_support/ext.rb +4 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +8 -1
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +15 -3
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -1
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +10 -5
- data/lib/ddtrace/contrib/active_support/patcher.rb +1 -0
- data/lib/ddtrace/contrib/analytics.rb +1 -0
- data/lib/ddtrace/contrib/auto_instrument.rb +48 -0
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/aws/ext.rb +1 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +32 -1
- data/lib/ddtrace/contrib/aws/integration.rb +1 -0
- data/lib/ddtrace/contrib/aws/parsed_context.rb +1 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +6 -1
- data/lib/ddtrace/contrib/aws/services.rb +4 -0
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +3 -1
- data/lib/ddtrace/contrib/configurable.rb +65 -38
- data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +21 -20
- data/lib/ddtrace/contrib/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/dalli/ext.rb +1 -0
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +2 -1
- data/lib/ddtrace/contrib/dalli/integration.rb +1 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +2 -39
- data/lib/ddtrace/contrib/dalli/quantize.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/integration.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +5 -3
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +6 -2
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +13 -11
- data/lib/ddtrace/contrib/ethon/ext.rb +2 -0
- data/lib/ddtrace/contrib/ethon/integration.rb +1 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +2 -1
- data/lib/ddtrace/contrib/ethon/patcher.rb +4 -2
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/excon/ext.rb +1 -0
- data/lib/ddtrace/contrib/excon/integration.rb +1 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +10 -7
- data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
- data/lib/ddtrace/contrib/extensions.rb +90 -14
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/faraday/connection.rb +1 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +1 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +1 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +2 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +3 -38
- data/lib/ddtrace/contrib/faraday/rack_builder.rb +1 -0
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +68 -32
- data/lib/ddtrace/contrib/grape/ext.rb +2 -0
- data/lib/ddtrace/contrib/grape/instrumentation.rb +4 -3
- data/lib/ddtrace/contrib/grape/integration.rb +1 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +2 -43
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/graphql/ext.rb +1 -0
- data/lib/ddtrace/contrib/graphql/integration.rb +1 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +1 -0
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -4
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +13 -8
- data/lib/ddtrace/contrib/grpc/ext.rb +1 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +1 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +1 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +3 -37
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +2 -3
- data/lib/ddtrace/contrib/http/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/http/ext.rb +1 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +9 -8
- data/lib/ddtrace/contrib/http/integration.rb +1 -0
- data/lib/ddtrace/contrib/http/patcher.rb +2 -1
- data/lib/ddtrace/contrib/http_annotation_helper.rb +1 -0
- data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/httpclient/ext.rb +18 -0
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +148 -0
- data/lib/ddtrace/contrib/httpclient/integration.rb +44 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +39 -0
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +1 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +17 -22
- data/lib/ddtrace/contrib/httprb/integration.rb +1 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +8 -4
- data/lib/ddtrace/contrib/integration.rb +4 -3
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/kafka/consumer_event.rb +1 -0
- data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +1 -0
- data/lib/ddtrace/contrib/kafka/event.rb +4 -3
- data/lib/ddtrace/contrib/kafka/events/connection/request.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events.rb +1 -0
- data/lib/ddtrace/contrib/kafka/ext.rb +1 -0
- data/lib/ddtrace/contrib/kafka/integration.rb +1 -0
- data/lib/ddtrace/contrib/kafka/patcher.rb +1 -0
- data/lib/ddtrace/contrib/lograge/configuration/settings.rb +19 -0
- data/lib/ddtrace/contrib/lograge/ext.rb +11 -0
- data/lib/ddtrace/contrib/lograge/instrumentation.rb +39 -0
- data/lib/ddtrace/contrib/lograge/integration.rb +46 -0
- data/lib/ddtrace/contrib/lograge/patcher.rb +26 -0
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/mongodb/ext.rb +1 -0
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +6 -3
- data/lib/ddtrace/contrib/mongodb/integration.rb +6 -0
- data/lib/ddtrace/contrib/mongodb/parsers.rb +1 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -2
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +3 -3
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/mysql2/ext.rb +1 -0
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +2 -1
- data/lib/ddtrace/contrib/mysql2/integration.rb +1 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -1
- data/lib/ddtrace/contrib/patchable.rb +21 -9
- data/lib/ddtrace/contrib/patcher.rb +12 -8
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/presto/ext.rb +1 -0
- data/lib/ddtrace/contrib/presto/instrumentation.rb +2 -1
- data/lib/ddtrace/contrib/presto/integration.rb +1 -0
- data/lib/ddtrace/contrib/presto/patcher.rb +7 -3
- data/lib/ddtrace/contrib/qless/configuration/settings.rb +36 -0
- data/lib/ddtrace/contrib/qless/ext.rb +21 -0
- data/lib/ddtrace/contrib/qless/integration.rb +39 -0
- data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
- data/lib/ddtrace/contrib/qless/qless_job.rb +74 -0
- data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +34 -0
- data/lib/ddtrace/contrib/que/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/que/ext.rb +20 -19
- data/lib/ddtrace/contrib/que/integration.rb +1 -0
- data/lib/ddtrace/contrib/que/patcher.rb +1 -0
- data/lib/ddtrace/contrib/que/tracer.rb +4 -2
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/racecar/event.rb +4 -2
- data/lib/ddtrace/contrib/racecar/events/batch.rb +1 -0
- data/lib/ddtrace/contrib/racecar/events/consume.rb +1 -0
- data/lib/ddtrace/contrib/racecar/events/message.rb +1 -0
- data/lib/ddtrace/contrib/racecar/events.rb +1 -0
- data/lib/ddtrace/contrib/racecar/ext.rb +1 -0
- data/lib/ddtrace/contrib/racecar/integration.rb +1 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +1 -0
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +4 -3
- data/lib/ddtrace/contrib/rack/ext.rb +1 -0
- data/lib/ddtrace/contrib/rack/integration.rb +8 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +8 -12
- data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
- data/lib/ddtrace/contrib/rack/request_queue.rb +7 -1
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +8 -0
- data/lib/ddtrace/contrib/rails/ext.rb +1 -0
- data/lib/ddtrace/contrib/rails/framework.rb +50 -2
- data/lib/ddtrace/contrib/rails/integration.rb +1 -0
- data/lib/ddtrace/contrib/rails/log_injection.rb +1 -40
- data/lib/ddtrace/contrib/rails/middlewares.rb +1 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +40 -21
- data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
- data/lib/ddtrace/contrib/rails/utils.rb +5 -0
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/rake/ext.rb +1 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -3
- data/lib/ddtrace/contrib/rake/integration.rb +2 -1
- data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +15 -5
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +6 -0
- data/lib/ddtrace/contrib/redis/ext.rb +2 -0
- data/lib/ddtrace/contrib/redis/instrumentation.rb +90 -0
- data/lib/ddtrace/contrib/redis/integration.rb +1 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +3 -67
- data/lib/ddtrace/contrib/redis/quantize.rb +29 -0
- data/lib/ddtrace/contrib/redis/tags.rb +6 -1
- data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +7 -7
- data/lib/ddtrace/contrib/registerable.rb +4 -4
- data/lib/ddtrace/contrib/registry.rb +3 -2
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +19 -1
- data/lib/ddtrace/contrib/resque/ext.rb +1 -0
- data/lib/ddtrace/contrib/resque/integration.rb +2 -5
- data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
- data/lib/ddtrace/contrib/resque/resque_job.rb +26 -2
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/rest_client/ext.rb +1 -0
- data/lib/ddtrace/contrib/rest_client/integration.rb +1 -0
- data/lib/ddtrace/contrib/rest_client/patcher.rb +3 -1
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +3 -4
- data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +19 -0
- data/lib/ddtrace/contrib/semantic_logger/ext.rb +11 -0
- data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +43 -0
- data/lib/ddtrace/contrib/semantic_logger/integration.rb +48 -0
- data/lib/ddtrace/contrib/semantic_logger/patcher.rb +26 -0
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sequel/database.rb +2 -1
- data/lib/ddtrace/contrib/sequel/dataset.rb +2 -1
- data/lib/ddtrace/contrib/sequel/ext.rb +1 -0
- data/lib/ddtrace/contrib/sequel/integration.rb +1 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +3 -2
- data/lib/ddtrace/contrib/sequel/utils.rb +6 -6
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +3 -0
- data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/integration.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +9 -2
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +4 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +11 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +27 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +29 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +6 -7
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +4 -4
- data/lib/ddtrace/contrib/sinatra/ext.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +2 -3
- data/lib/ddtrace/contrib/sinatra/integration.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +3 -1
- data/lib/ddtrace/contrib/sinatra/tracer.rb +28 -7
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +13 -6
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/sneakers/ext.rb +12 -11
- data/lib/ddtrace/contrib/sneakers/integration.rb +1 -0
- data/lib/ddtrace/contrib/sneakers/patcher.rb +1 -0
- data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -21
- data/lib/ddtrace/contrib/status_code_matcher.rb +70 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +5 -6
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -0
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +5 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +1 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +2 -0
- data/lib/ddtrace/correlation.rb +3 -1
- data/lib/ddtrace/diagnostics/environment_logger.rb +9 -7
- data/lib/ddtrace/diagnostics/health.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/b3.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +2 -3
- data/lib/ddtrace/encoding.rb +3 -0
- data/lib/ddtrace/error.rb +78 -8
- data/lib/ddtrace/event.rb +1 -0
- data/lib/ddtrace/ext/analytics.rb +1 -0
- data/lib/ddtrace/ext/app_types.rb +1 -0
- data/lib/ddtrace/ext/correlation.rb +1 -0
- data/lib/ddtrace/ext/diagnostics.rb +1 -0
- data/lib/ddtrace/ext/distributed.rb +9 -2
- data/lib/ddtrace/ext/environment.rb +8 -0
- data/lib/ddtrace/ext/errors.rb +1 -0
- data/lib/ddtrace/ext/forced_tracing.rb +1 -0
- data/lib/ddtrace/ext/git.rb +32 -0
- data/lib/ddtrace/ext/http.rb +2 -1
- data/lib/ddtrace/ext/integration.rb +1 -0
- data/lib/ddtrace/ext/manual_tracing.rb +1 -0
- data/lib/ddtrace/ext/metrics.rb +1 -0
- data/lib/ddtrace/ext/net.rb +1 -0
- data/lib/ddtrace/ext/priority.rb +7 -4
- data/lib/ddtrace/ext/profiling.rb +53 -0
- data/lib/ddtrace/ext/runtime.rb +5 -7
- data/lib/ddtrace/ext/sampling.rb +1 -0
- data/lib/ddtrace/ext/sql.rb +1 -0
- data/lib/ddtrace/ext/test.rb +9 -0
- data/lib/ddtrace/ext/transport.rb +14 -0
- data/lib/ddtrace/forced_tracing.rb +3 -0
- data/lib/ddtrace/logger.rb +2 -1
- data/lib/ddtrace/metrics.rb +84 -24
- data/lib/ddtrace/opentelemetry/extensions.rb +2 -1
- data/lib/ddtrace/opentelemetry/span.rb +1 -0
- data/lib/ddtrace/opentracer/binary_propagator.rb +1 -0
- data/lib/ddtrace/opentracer/carrier.rb +1 -0
- data/lib/ddtrace/opentracer/distributed_headers.rb +4 -0
- data/lib/ddtrace/opentracer/global_tracer.rb +1 -0
- data/lib/ddtrace/opentracer/propagator.rb +1 -0
- data/lib/ddtrace/opentracer/rack_propagator.rb +1 -0
- data/lib/ddtrace/opentracer/scope.rb +1 -0
- data/lib/ddtrace/opentracer/scope_manager.rb +1 -0
- data/lib/ddtrace/opentracer/span.rb +3 -6
- data/lib/ddtrace/opentracer/span_context.rb +1 -0
- data/lib/ddtrace/opentracer/span_context_factory.rb +1 -0
- data/lib/ddtrace/opentracer/text_map_propagator.rb +1 -0
- data/lib/ddtrace/opentracer/thread_local_scope.rb +2 -0
- data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +1 -0
- data/lib/ddtrace/opentracer/tracer.rb +1 -0
- data/lib/ddtrace/opentracer.rb +21 -39
- data/lib/ddtrace/patcher.rb +28 -6
- data/lib/ddtrace/pin.rb +9 -61
- data/lib/ddtrace/pipeline/span_filter.rb +2 -1
- data/lib/ddtrace/pipeline/span_processor.rb +1 -0
- data/lib/ddtrace/pipeline.rb +1 -0
- data/lib/ddtrace/profiling/backtrace_location.rb +33 -0
- data/lib/ddtrace/profiling/buffer.rb +42 -0
- data/lib/ddtrace/profiling/collectors/stack.rb +297 -0
- data/lib/ddtrace/profiling/encoding/profile.rb +46 -0
- data/lib/ddtrace/profiling/event.rb +14 -0
- data/lib/ddtrace/profiling/events/stack.rb +81 -0
- data/lib/ddtrace/profiling/exporter.rb +24 -0
- data/lib/ddtrace/profiling/ext/forking.rb +98 -0
- data/lib/ddtrace/profiling/flush.rb +44 -0
- data/lib/ddtrace/profiling/native_extension.rb +40 -0
- data/lib/ddtrace/profiling/pprof/builder.rb +126 -0
- data/lib/ddtrace/profiling/pprof/converter.rb +103 -0
- data/lib/ddtrace/profiling/pprof/message_set.rb +15 -0
- data/lib/ddtrace/profiling/pprof/payload.rb +19 -0
- data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
- data/lib/ddtrace/profiling/pprof/pprof_pb.rb +82 -0
- data/lib/ddtrace/profiling/pprof/stack_sample.rb +140 -0
- data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
- data/lib/ddtrace/profiling/pprof/template.rb +119 -0
- data/lib/ddtrace/profiling/preload.rb +4 -0
- data/lib/ddtrace/profiling/profiler.rb +31 -0
- data/lib/ddtrace/profiling/recorder.rb +96 -0
- data/lib/ddtrace/profiling/scheduler.rb +150 -0
- data/lib/ddtrace/profiling/tasks/setup.rb +90 -0
- data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +42 -0
- data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
- data/lib/ddtrace/profiling/transport/client.rb +15 -0
- data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +94 -0
- data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
- data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
- data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
- data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
- data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
- data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
- data/lib/ddtrace/profiling/transport/http.rb +111 -0
- data/lib/ddtrace/profiling/transport/io/client.rb +28 -0
- data/lib/ddtrace/profiling/transport/io/response.rb +17 -0
- data/lib/ddtrace/profiling/transport/io.rb +31 -0
- data/lib/ddtrace/profiling/transport/parcel.rb +18 -0
- data/lib/ddtrace/profiling/transport/request.rb +16 -0
- data/lib/ddtrace/profiling/transport/response.rb +9 -0
- data/lib/ddtrace/profiling.rb +149 -0
- data/lib/ddtrace/propagation/grpc_propagator.rb +2 -0
- data/lib/ddtrace/propagation/http_propagator.rb +18 -2
- data/lib/ddtrace/quantization/hash.rb +1 -0
- data/lib/ddtrace/quantization/http.rb +4 -0
- data/lib/ddtrace/runtime/metrics.rb +35 -14
- data/lib/ddtrace/sampler.rb +20 -9
- data/lib/ddtrace/sampling/matcher.rb +1 -0
- data/lib/ddtrace/sampling/rate_limiter.rb +66 -16
- data/lib/ddtrace/sampling/rule.rb +2 -1
- data/lib/ddtrace/sampling/rule_sampler.rb +19 -11
- data/lib/ddtrace/sampling.rb +1 -0
- data/lib/ddtrace/span.rb +27 -14
- data/lib/ddtrace/sync_writer.rb +17 -15
- data/lib/ddtrace/tasks/exec.rb +47 -0
- data/lib/ddtrace/tasks/help.rb +15 -0
- data/lib/ddtrace/tracer.rb +61 -50
- data/lib/ddtrace/transport/http/adapters/net.rb +41 -11
- data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +5 -2
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +26 -16
- data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
- data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
- data/lib/ddtrace/transport/http/api/instance.rb +1 -0
- data/lib/ddtrace/transport/http/api/map.rb +1 -0
- data/lib/ddtrace/transport/http/api/spec.rb +1 -0
- data/lib/ddtrace/transport/http/api.rb +1 -0
- data/lib/ddtrace/transport/http/builder.rb +21 -7
- data/lib/ddtrace/transport/http/client.rb +3 -1
- data/lib/ddtrace/transport/http/env.rb +9 -0
- data/lib/ddtrace/transport/http/response.rb +1 -0
- data/lib/ddtrace/transport/http/statistics.rb +3 -2
- data/lib/ddtrace/transport/http/traces.rb +6 -6
- data/lib/ddtrace/transport/http.rb +48 -41
- data/lib/ddtrace/transport/io/client.rb +17 -9
- data/lib/ddtrace/transport/io/response.rb +2 -3
- data/lib/ddtrace/transport/io/traces.rb +10 -1
- data/lib/ddtrace/transport/io.rb +2 -1
- data/lib/ddtrace/transport/parcel.rb +7 -0
- data/lib/ddtrace/transport/request.rb +1 -0
- data/lib/ddtrace/transport/response.rb +1 -0
- data/lib/ddtrace/transport/statistics.rb +1 -0
- data/lib/ddtrace/transport/traces.rb +21 -3
- data/lib/ddtrace/utils/compression.rb +28 -0
- data/lib/ddtrace/utils/database.rb +1 -0
- data/lib/ddtrace/utils/forking.rb +53 -0
- data/lib/ddtrace/utils/object_set.rb +40 -0
- data/lib/ddtrace/utils/only_once.rb +41 -0
- data/lib/ddtrace/utils/sequence.rb +18 -0
- data/lib/ddtrace/utils/string_table.rb +46 -0
- data/lib/ddtrace/utils/time.rb +40 -3
- data/lib/ddtrace/utils.rb +23 -12
- data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
- data/lib/ddtrace/vendor/active_record/connection_specification.rb +1 -0
- data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +117 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +58 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +136 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +10 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +9 -0
- data/lib/ddtrace/vendor/multipart-post/multipart.rb +13 -0
- data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +33 -0
- data/lib/ddtrace/version.rb +16 -3
- data/lib/ddtrace/worker.rb +1 -0
- data/lib/ddtrace/workers/async.rb +15 -5
- data/lib/ddtrace/workers/{loop.rb → interval_loop.rb} +23 -12
- data/lib/ddtrace/workers/polling.rb +14 -6
- data/lib/ddtrace/workers/queue.rb +3 -1
- data/lib/ddtrace/workers/runtime_metrics.rb +22 -4
- data/lib/ddtrace/workers/trace_writer.rb +14 -16
- data/lib/ddtrace/workers.rb +8 -2
- data/lib/ddtrace/writer.rb +33 -8
- data/lib/ddtrace.rb +22 -48
- metadata +182 -405
- data/.circleci/config.yml +0 -548
- data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
- data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
- data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
- data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
- data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
- data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
- data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
- data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
- data/.dockerignore +0 -1
- data/.env +0 -26
- data/.github/CODEOWNERS +0 -1
- data/.gitlab-ci.yml +0 -27
- data/.rspec +0 -1
- data/.rubocop.yml +0 -85
- data/.simplecov +0 -38
- data/Appraisals +0 -1121
- data/Gemfile +0 -7
- data/Rakefile +0 -788
- data/benchmarks/postgres_database.yml +0 -9
- data/benchmarks/sidekiq_test.rb +0 -154
- data/docker-compose.yml +0 -370
- data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
- data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
- data/lib/ddtrace/augmentation/shim.rb +0 -102
- data/lib/ddtrace/augmentation.rb +0 -13
- data/lib/ddtrace/environment.rb +0 -41
- data/lib/ddtrace/monkey.rb +0 -58
- data/lib/ddtrace/runtime/cgroup.rb +0 -44
- data/lib/ddtrace/runtime/class_count.rb +0 -17
- data/lib/ddtrace/runtime/container.rb +0 -73
- data/lib/ddtrace/runtime/gc.rb +0 -16
- data/lib/ddtrace/runtime/identity.rb +0 -41
- data/lib/ddtrace/runtime/object_space.rb +0 -19
- data/lib/ddtrace/runtime/socket.rb +0 -14
- data/lib/ddtrace/runtime/thread_count.rb +0 -16
- data/tasks/release_gem.rake +0 -28
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/profiling/transport/io/client'
|
|
3
|
+
require 'ddtrace/profiling/encoding/profile'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Profiling
|
|
7
|
+
module Transport
|
|
8
|
+
# Namespace for profiling IO transport components
|
|
9
|
+
module IO
|
|
10
|
+
module_function
|
|
11
|
+
|
|
12
|
+
# Builds a new Profiling::Transport::IO::Client
|
|
13
|
+
def new(out, encoder, options = {})
|
|
14
|
+
Client.new(out, encoder, options)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Builds a new Profiling::Transport::IO::Client with default settings
|
|
18
|
+
# Pass options to override any settings.
|
|
19
|
+
def default(options = {})
|
|
20
|
+
options = options.dup
|
|
21
|
+
|
|
22
|
+
new(
|
|
23
|
+
options.delete(:out) || $stdout,
|
|
24
|
+
options.delete(:encoder) || Profiling::Encoding::Profile::Protobuf,
|
|
25
|
+
options
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/transport/parcel'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Profiling
|
|
6
|
+
module Transport
|
|
7
|
+
# Data transfer object for profiling data
|
|
8
|
+
class Parcel
|
|
9
|
+
include Datadog::Transport::Parcel
|
|
10
|
+
|
|
11
|
+
def encode_with(encoder)
|
|
12
|
+
# TODO: Determine encoding behavior
|
|
13
|
+
encoder.encode(data)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/transport/request'
|
|
3
|
+
require 'ddtrace/profiling/transport/parcel'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Profiling
|
|
7
|
+
module Transport
|
|
8
|
+
# Profiling request
|
|
9
|
+
class Request < Datadog::Transport::Request
|
|
10
|
+
def initialize(flush)
|
|
11
|
+
super(Parcel.new(flush))
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'datadog/core/environment/variable_helpers'
|
|
3
|
+
require 'ddtrace/utils/only_once'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# Contains profiler for generating stack profiles, etc.
|
|
7
|
+
module Profiling # rubocop:disable Metrics/ModuleLength
|
|
8
|
+
GOOGLE_PROTOBUF_MINIMUM_VERSION = Gem::Version.new('3.0')
|
|
9
|
+
private_constant :GOOGLE_PROTOBUF_MINIMUM_VERSION
|
|
10
|
+
|
|
11
|
+
SKIPPED_NATIVE_EXTENSION_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
|
|
12
|
+
private_constant :SKIPPED_NATIVE_EXTENSION_ONLY_ONCE
|
|
13
|
+
|
|
14
|
+
def self.supported?
|
|
15
|
+
unsupported_reason.nil?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.unsupported_reason
|
|
19
|
+
# NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons -- e.g. tell users
|
|
20
|
+
# first that they can't use this on JRuby before telling them that they are missing protobuf
|
|
21
|
+
|
|
22
|
+
ruby_engine_unsupported? ||
|
|
23
|
+
native_library_failed_to_load? ||
|
|
24
|
+
protobuf_gem_unavailable? ||
|
|
25
|
+
protobuf_version_unsupported? ||
|
|
26
|
+
protobuf_failed_to_load?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private_class_method def self.ruby_engine_unsupported?
|
|
30
|
+
'JRuby is not supported' if RUBY_ENGINE == 'jruby'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private_class_method def self.protobuf_gem_unavailable?
|
|
34
|
+
# NOTE: On environments where protobuf is already loaded, we skip the check. This allows us to support environments
|
|
35
|
+
# where no Gem.loaded_version is NOT available but customers are able to load protobuf; see for instance
|
|
36
|
+
# https://github.com/teamcapybara/capybara/commit/caf3bcd7664f4f2691d0ca9ef3be9a2a954fecfb
|
|
37
|
+
if !defined?(::Google::Protobuf) && Gem.loaded_specs['google-protobuf'].nil?
|
|
38
|
+
"Missing google-protobuf dependency; please add `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private_class_method def self.protobuf_version_unsupported?
|
|
43
|
+
# See above for why we skip the check when protobuf is already loaded; note that when protobuf was already loaded
|
|
44
|
+
# we skip the version check to avoid the call to Gem.loaded_specs. Unfortunately, protobuf does not seem to
|
|
45
|
+
# expose the gem version constant elsewhere, so in that setup we are not able to check the version.
|
|
46
|
+
if !defined?(::Google::Protobuf) && Gem.loaded_specs['google-protobuf'].version < GOOGLE_PROTOBUF_MINIMUM_VERSION
|
|
47
|
+
'Your google-protobuf is too old; ensure that you have google-protobuf >= 3.0 by ' \
|
|
48
|
+
"adding `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private_class_method def self.protobuf_failed_to_load?
|
|
53
|
+
unless protobuf_loaded_successfully?
|
|
54
|
+
'There was an error loading the google-protobuf library; see previous warning message for details'
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# The `google-protobuf` gem depends on a native component, and its creators helpfully tried to provide precompiled
|
|
59
|
+
# versions of this extension on rubygems.org.
|
|
60
|
+
#
|
|
61
|
+
# Unfortunately, for a long time, the supported Ruby versions metadata on these precompiled versions of the extension
|
|
62
|
+
# was not correctly set. (This is fixed in newer versions -- but not all Ruby versions we want to support can use
|
|
63
|
+
# these.)
|
|
64
|
+
#
|
|
65
|
+
# Thus, the gem can still be installed, but can be in a broken state. To avoid breaking customer applications, we
|
|
66
|
+
# use this helper to load it and gracefully handle failures.
|
|
67
|
+
private_class_method def self.protobuf_loaded_successfully?
|
|
68
|
+
return @protobuf_loaded if defined?(@protobuf_loaded)
|
|
69
|
+
|
|
70
|
+
begin
|
|
71
|
+
require 'google/protobuf'
|
|
72
|
+
@protobuf_loaded = true
|
|
73
|
+
rescue LoadError => e
|
|
74
|
+
# NOTE: We use Kernel#warn here because this code gets run BEFORE Datadog.logger is actually set up.
|
|
75
|
+
# In the future it'd be nice to shuffle the logger startup to happen first to avoid this special case.
|
|
76
|
+
Kernel.warn(
|
|
77
|
+
'[DDTRACE] Error while loading google-protobuf gem. ' \
|
|
78
|
+
"Cause: '#{e.message}' Location: '#{Array(e.backtrace).first}'. " \
|
|
79
|
+
'This can happen when google-protobuf is missing its native components. ' \
|
|
80
|
+
'To fix this, try removing and reinstalling the gem, forcing it to recompile the components: ' \
|
|
81
|
+
'`gem uninstall google-protobuf -a; BUNDLE_FORCE_RUBY_PLATFORM=true bundle install`. ' \
|
|
82
|
+
'If the error persists, please contact support via <https://docs.datadoghq.com/help/> or ' \
|
|
83
|
+
'file a bug at <https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug>.'
|
|
84
|
+
)
|
|
85
|
+
@protobuf_loaded = false
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
private_class_method def self.native_library_failed_to_load?
|
|
90
|
+
success, exception = try_loading_native_library
|
|
91
|
+
|
|
92
|
+
unless success
|
|
93
|
+
if exception
|
|
94
|
+
'There was an error loading the profiling native extension due to ' \
|
|
95
|
+
"'#{exception.message}' at '#{exception.backtrace.first}'"
|
|
96
|
+
else
|
|
97
|
+
'The profiling native extension did not load correctly. ' \
|
|
98
|
+
'If the error persists, please contact support via <https://docs.datadoghq.com/help/> or ' \
|
|
99
|
+
'file a bug at <https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug>.'
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
private_class_method def self.try_loading_native_library
|
|
105
|
+
if Datadog::Core::Environment::VariableHelpers.env_to_bool('DD_PROFILING_NO_EXTENSION', false)
|
|
106
|
+
SKIPPED_NATIVE_EXTENSION_ONLY_ONCE.run do
|
|
107
|
+
Kernel.warn(
|
|
108
|
+
'[DDTRACE] Skipped loading of profiling native extension due to DD_PROFILING_NO_EXTENSION environment ' \
|
|
109
|
+
'variable being set. ' \
|
|
110
|
+
'This option is experimental and will lead to the profiler not working in future releases. ' \
|
|
111
|
+
'If you needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.'
|
|
112
|
+
)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
return [true, nil]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
begin
|
|
119
|
+
require "ddtrace_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}"
|
|
120
|
+
success =
|
|
121
|
+
defined?(Datadog::Profiling::NativeExtension) && Datadog::Profiling::NativeExtension.send(:native_working?)
|
|
122
|
+
[success, nil]
|
|
123
|
+
rescue StandardError, LoadError => e
|
|
124
|
+
[false, e]
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
private_class_method def self.load_profiling
|
|
129
|
+
return false unless supported?
|
|
130
|
+
|
|
131
|
+
require 'ddtrace/profiling/ext/forking'
|
|
132
|
+
require 'ddtrace/profiling/collectors/stack'
|
|
133
|
+
require 'ddtrace/profiling/exporter'
|
|
134
|
+
require 'ddtrace/profiling/recorder'
|
|
135
|
+
require 'ddtrace/profiling/scheduler'
|
|
136
|
+
require 'ddtrace/profiling/tasks/setup'
|
|
137
|
+
require 'ddtrace/profiling/transport/io'
|
|
138
|
+
require 'ddtrace/profiling/transport/http'
|
|
139
|
+
require 'ddtrace/profiling/profiler'
|
|
140
|
+
require 'ddtrace/profiling/native_extension'
|
|
141
|
+
require 'ddtrace/profiling/trace_identifiers/helper'
|
|
142
|
+
require 'ddtrace/profiling/pprof/pprof_pb'
|
|
143
|
+
|
|
144
|
+
true
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
load_profiling if supported?
|
|
148
|
+
end
|
|
149
|
+
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/context'
|
|
2
3
|
require 'ddtrace/ext/distributed'
|
|
3
4
|
|
|
@@ -19,6 +20,7 @@ module Datadog
|
|
|
19
20
|
def self.extract(metadata)
|
|
20
21
|
metadata = Carrier.new(metadata)
|
|
21
22
|
return Datadog::Context.new unless metadata.valid?
|
|
23
|
+
|
|
22
24
|
Datadog::Context.new(trace_id: metadata.trace_id,
|
|
23
25
|
span_id: metadata.parent_id,
|
|
24
26
|
sampling_priority: metadata.sampling_priority,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: false
|
|
1
2
|
require 'ddtrace/configuration'
|
|
2
3
|
require 'ddtrace/context'
|
|
3
4
|
require 'ddtrace/ext/distributed'
|
|
@@ -26,7 +27,14 @@ module Datadog
|
|
|
26
27
|
# Inject all configured propagation styles
|
|
27
28
|
::Datadog.configuration.distributed_tracing.propagation_inject_style.each do |style|
|
|
28
29
|
propagator = PROPAGATION_STYLES[style]
|
|
29
|
-
|
|
30
|
+
begin
|
|
31
|
+
propagator.inject!(context, env) unless propagator.nil?
|
|
32
|
+
rescue => e
|
|
33
|
+
Datadog.logger.error(
|
|
34
|
+
'Error injecting propagated context into the environment. ' \
|
|
35
|
+
"Cause: #{e} Location: #{Array(e.backtrace).first}"
|
|
36
|
+
)
|
|
37
|
+
end
|
|
30
38
|
end
|
|
31
39
|
end
|
|
32
40
|
|
|
@@ -42,7 +50,15 @@ module Datadog
|
|
|
42
50
|
|
|
43
51
|
# Extract context
|
|
44
52
|
# DEV: `propagator.extract` will return `nil`, where `HTTPPropagator#extract` will not
|
|
45
|
-
|
|
53
|
+
begin
|
|
54
|
+
extracted_context = propagator.extract(env)
|
|
55
|
+
rescue => e
|
|
56
|
+
Datadog.logger.error(
|
|
57
|
+
'Error extracting propagated context from the environment. ' \
|
|
58
|
+
"Cause: #{e} Location: #{Array(e.backtrace).first}"
|
|
59
|
+
)
|
|
60
|
+
end
|
|
61
|
+
|
|
46
62
|
# Skip this style if no valid headers were found
|
|
47
63
|
next if extracted_context.nil?
|
|
48
64
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'uri'
|
|
2
3
|
require 'set'
|
|
3
4
|
|
|
@@ -5,6 +6,8 @@ module Datadog
|
|
|
5
6
|
module Quantization
|
|
6
7
|
# Quantization for HTTP resources
|
|
7
8
|
module HTTP
|
|
9
|
+
include Kernel # Ensure that kernel methods are always available (https://sorbet.org/docs/error-reference#7003)
|
|
10
|
+
|
|
8
11
|
PLACEHOLDER = '?'.freeze
|
|
9
12
|
|
|
10
13
|
module_function
|
|
@@ -61,6 +64,7 @@ module Datadog
|
|
|
61
64
|
# e.g. Reduces "foo&bar=bar&bar=bar&foo" to "foo&bar=bar&bar=bar"
|
|
62
65
|
def collect_query(query, options = {})
|
|
63
66
|
return query unless block_given?
|
|
67
|
+
|
|
64
68
|
uniq = options[:uniq].nil? ? false : options[:uniq]
|
|
65
69
|
keys = Set.new
|
|
66
70
|
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/ext/integration'
|
|
2
3
|
require 'ddtrace/ext/runtime'
|
|
3
4
|
|
|
4
5
|
require 'ddtrace/metrics'
|
|
5
|
-
require '
|
|
6
|
-
require '
|
|
7
|
-
require '
|
|
8
|
-
require '
|
|
6
|
+
require 'datadog/core/environment/class_count'
|
|
7
|
+
require 'datadog/core/environment/gc'
|
|
8
|
+
require 'datadog/core/environment/identity'
|
|
9
|
+
require 'datadog/core/environment/thread_count'
|
|
10
|
+
require 'datadog/core/environment/vm_cache'
|
|
9
11
|
|
|
10
12
|
module Datadog
|
|
11
13
|
module Runtime
|
|
12
14
|
# For generating runtime metrics
|
|
13
15
|
class Metrics < Datadog::Metrics
|
|
14
|
-
def initialize(options
|
|
16
|
+
def initialize(**options)
|
|
15
17
|
super
|
|
16
18
|
|
|
17
19
|
# Initialize service list
|
|
@@ -29,7 +31,7 @@ module Datadog
|
|
|
29
31
|
# Tag span with language and runtime ID for association with metrics.
|
|
30
32
|
# We only tag spans that performed internal application work.
|
|
31
33
|
unless span.get_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE)
|
|
32
|
-
span.set_tag(Ext::Runtime::TAG_LANG,
|
|
34
|
+
span.set_tag(Ext::Runtime::TAG_LANG, Core::Environment::Identity.lang)
|
|
33
35
|
end
|
|
34
36
|
end
|
|
35
37
|
|
|
@@ -52,17 +54,36 @@ module Datadog
|
|
|
52
54
|
def flush
|
|
53
55
|
return unless enabled?
|
|
54
56
|
|
|
55
|
-
try_flush
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
try_flush do
|
|
58
|
+
if Core::Environment::ClassCount.available?
|
|
59
|
+
gauge(Ext::Runtime::Metrics::METRIC_CLASS_COUNT, Core::Environment::ClassCount.value)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
try_flush do
|
|
64
|
+
if Core::Environment::ThreadCount.available?
|
|
65
|
+
gauge(Ext::Runtime::Metrics::METRIC_THREAD_COUNT, Core::Environment::ThreadCount.value)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
try_flush { gc_metrics.each { |metric, value| gauge(metric, value) } if Core::Environment::GC.available? }
|
|
70
|
+
|
|
71
|
+
try_flush do
|
|
72
|
+
if Core::Environment::VMCache.available?
|
|
73
|
+
gauge(Ext::Runtime::Metrics::METRIC_GLOBAL_CONSTANT_STATE, Core::Environment::VMCache.global_constant_state)
|
|
74
|
+
|
|
75
|
+
# global_method_state is not available since Ruby >= 3.0,
|
|
76
|
+
# as method caching was moved to a per-class basis.
|
|
77
|
+
global_method_state = Core::Environment::VMCache.global_method_state
|
|
78
|
+
gauge(Ext::Runtime::Metrics::METRIC_GLOBAL_METHOD_STATE, global_method_state) if global_method_state
|
|
79
|
+
end
|
|
80
|
+
end
|
|
58
81
|
end
|
|
59
82
|
|
|
60
83
|
def gc_metrics
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
end
|
|
65
|
-
]
|
|
84
|
+
Core::Environment::GC.stat.flat_map do |k, v|
|
|
85
|
+
nested_gc_metric(Ext::Runtime::Metrics::METRIC_GC_PREFIX, k, v)
|
|
86
|
+
end.to_h
|
|
66
87
|
end
|
|
67
88
|
|
|
68
89
|
def try_flush
|
data/lib/ddtrace/sampler.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'forwardable'
|
|
2
3
|
|
|
3
4
|
require 'ddtrace/ext/priority'
|
|
@@ -81,7 +82,7 @@ module Datadog
|
|
|
81
82
|
:default_key
|
|
82
83
|
|
|
83
84
|
def initialize(default_key, default_rate = 1.0, &block)
|
|
84
|
-
raise ArgumentError, 'No resolver given!' unless
|
|
85
|
+
raise ArgumentError, 'No resolver given!' unless block
|
|
85
86
|
|
|
86
87
|
@default_key = default_key
|
|
87
88
|
@resolver = block
|
|
@@ -193,6 +194,12 @@ module Datadog
|
|
|
193
194
|
class PrioritySampler
|
|
194
195
|
extend Forwardable
|
|
195
196
|
|
|
197
|
+
# NOTE: We do not advise using a pre-sampler. It can save resources,
|
|
198
|
+
# but pre-sampling at rates < 100% may result in partial traces, unless
|
|
199
|
+
# the pre-sampler knows exactly how to drop a span without dropping its ancestors.
|
|
200
|
+
#
|
|
201
|
+
# Additionally, as service metrics are calculated in the Datadog Agent,
|
|
202
|
+
# the service's throughput will be underestimated.
|
|
196
203
|
attr_reader :pre_sampler, :priority_sampler
|
|
197
204
|
|
|
198
205
|
SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
|
|
@@ -208,17 +215,21 @@ module Datadog
|
|
|
208
215
|
|
|
209
216
|
def sample!(span)
|
|
210
217
|
# If pre-sampling is configured, do it first. (By default, this will sample at 100%.)
|
|
211
|
-
# NOTE: Pre-sampling at rates < 100% may result in partial traces; not recommended.
|
|
212
218
|
span.sampled = pre_sample?(span) ? @pre_sampler.sample!(span) : true
|
|
213
219
|
|
|
214
220
|
if span.sampled
|
|
215
|
-
# If priority sampling has already been applied upstream, use that
|
|
216
|
-
|
|
217
|
-
# Roll the dice and determine whether how we set the priority.
|
|
218
|
-
priority = priority_sample!(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
|
|
221
|
+
# If priority sampling has already been applied upstream, use that value.
|
|
222
|
+
return true if priority_assigned?(span)
|
|
219
223
|
|
|
220
|
-
|
|
221
|
-
|
|
224
|
+
# Check with post sampler how we set the priority.
|
|
225
|
+
sample = priority_sample!(span)
|
|
226
|
+
|
|
227
|
+
# Check if post sampler has already assigned a priority.
|
|
228
|
+
return true if priority_assigned?(span)
|
|
229
|
+
|
|
230
|
+
# If not, use agent priority values.
|
|
231
|
+
priority = sample ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
|
|
232
|
+
assign_priority!(span, priority)
|
|
222
233
|
else
|
|
223
234
|
# If discarded by pre-sampling, set "reject" priority, so other
|
|
224
235
|
# services for the same trace don't sample needlessly.
|
|
@@ -243,7 +254,7 @@ module Datadog
|
|
|
243
254
|
end
|
|
244
255
|
end
|
|
245
256
|
|
|
246
|
-
def
|
|
257
|
+
def priority_assigned?(span)
|
|
247
258
|
span.context && !span.context.sampling_priority.nil?
|
|
248
259
|
end
|
|
249
260
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/utils/time'
|
|
2
3
|
|
|
3
4
|
module Datadog
|
|
@@ -38,6 +39,10 @@ module Datadog
|
|
|
38
39
|
@tokens = max_tokens
|
|
39
40
|
@total_messages = 0
|
|
40
41
|
@conforming_messages = 0
|
|
42
|
+
@prev_conforming_messages = nil
|
|
43
|
+
@prev_total_messages = nil
|
|
44
|
+
@current_window = nil
|
|
45
|
+
|
|
41
46
|
@last_refill = Utils::Time.get_time
|
|
42
47
|
end
|
|
43
48
|
|
|
@@ -47,28 +52,17 @@ module Datadog
|
|
|
47
52
|
# If it does, return +true+ and remove +size+
|
|
48
53
|
# tokens from the bucket.
|
|
49
54
|
# If it does not, return +false+ without affecting
|
|
50
|
-
# the tokens
|
|
55
|
+
# the tokens from the bucket.
|
|
51
56
|
#
|
|
52
57
|
# @return [Boolean] +true+ if message conforms with current bucket limit
|
|
53
58
|
def allow?(size)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
refill_since_last_message
|
|
58
|
-
|
|
59
|
-
increment_total_count
|
|
60
|
-
|
|
61
|
-
return false if @tokens < size
|
|
62
|
-
|
|
63
|
-
increment_conforming_count
|
|
64
|
-
|
|
65
|
-
@tokens -= size
|
|
66
|
-
|
|
67
|
-
true
|
|
59
|
+
allowed = should_allow?(size)
|
|
60
|
+
update_rate_counts(allowed)
|
|
61
|
+
allowed
|
|
68
62
|
end
|
|
69
63
|
|
|
70
64
|
# Ratio of 'conformance' per 'total messages' checked
|
|
71
|
-
#
|
|
65
|
+
# averaged for the past 2 buckets
|
|
72
66
|
#
|
|
73
67
|
# Returns +1.0+ when no messages have been checked yet.
|
|
74
68
|
#
|
|
@@ -77,6 +71,20 @@ module Datadog
|
|
|
77
71
|
return 0.0 if @rate.zero?
|
|
78
72
|
return 1.0 if @rate < 0 || @total_messages.zero?
|
|
79
73
|
|
|
74
|
+
return current_window_rate if @prev_conforming_messages.nil? || @prev_total_messages.nil?
|
|
75
|
+
|
|
76
|
+
(@conforming_messages.to_f + @prev_conforming_messages.to_f) / (@total_messages + @prev_total_messages)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Ratio of 'conformance' per 'total messages' checked
|
|
80
|
+
# on this bucket
|
|
81
|
+
#
|
|
82
|
+
# Returns +1.0+ when no messages have been checked yet.
|
|
83
|
+
#
|
|
84
|
+
# @return [Float] Conformance ratio, between +[0,1]+
|
|
85
|
+
def current_window_rate
|
|
86
|
+
return 1.0 if @total_messages.zero?
|
|
87
|
+
|
|
80
88
|
@conforming_messages.to_f / @total_messages
|
|
81
89
|
end
|
|
82
90
|
|
|
@@ -91,6 +99,8 @@ module Datadog
|
|
|
91
99
|
now = Utils::Time.get_time
|
|
92
100
|
elapsed = now - @last_refill
|
|
93
101
|
|
|
102
|
+
# Update the number of available tokens, but ensure we do not exceed the max
|
|
103
|
+
# we return the min of tokens + rate*elapsed, or max tokens
|
|
94
104
|
refill_tokens(@rate * elapsed)
|
|
95
105
|
|
|
96
106
|
@last_refill = now
|
|
@@ -108,6 +118,46 @@ module Datadog
|
|
|
108
118
|
def increment_conforming_count
|
|
109
119
|
@conforming_messages += 1
|
|
110
120
|
end
|
|
121
|
+
|
|
122
|
+
def should_allow?(size)
|
|
123
|
+
# rate limit of 0 blocks everything
|
|
124
|
+
return false if @rate.zero?
|
|
125
|
+
|
|
126
|
+
# negative rate limit disables rate limiting
|
|
127
|
+
return true if @rate < 0
|
|
128
|
+
|
|
129
|
+
refill_since_last_message
|
|
130
|
+
|
|
131
|
+
# if tokens < 1 we don't allow?
|
|
132
|
+
return false if @tokens < size
|
|
133
|
+
|
|
134
|
+
@tokens -= size
|
|
135
|
+
|
|
136
|
+
true
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Sets and Updates the past two 1 second windows for which
|
|
140
|
+
# the rate limiter must compute it's rate over and updates
|
|
141
|
+
# the total count, and conforming message count if +allowed+
|
|
142
|
+
def update_rate_counts(allowed)
|
|
143
|
+
now = Utils::Time.get_time
|
|
144
|
+
|
|
145
|
+
# No tokens have been seen yet, start a new window
|
|
146
|
+
if @current_window.nil?
|
|
147
|
+
@current_window = now
|
|
148
|
+
# If more than 1 second has past since last window, reset
|
|
149
|
+
elsif now - @current_window >= 1
|
|
150
|
+
@prev_conforming_messages = @conforming_messages
|
|
151
|
+
@prev_total_messages = @total_messages
|
|
152
|
+
@conforming_messages = 0
|
|
153
|
+
@total_messages = 0
|
|
154
|
+
@current_window = now
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
increment_conforming_count if allowed
|
|
158
|
+
|
|
159
|
+
increment_total_count
|
|
160
|
+
end
|
|
111
161
|
end
|
|
112
162
|
|
|
113
163
|
# \RateLimiter that accepts all resources,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'forwardable'
|
|
2
3
|
|
|
3
4
|
require 'ddtrace/sampling/matcher'
|
|
@@ -28,7 +29,7 @@ module Datadog
|
|
|
28
29
|
def match?(span)
|
|
29
30
|
@matcher.match?(span)
|
|
30
31
|
rescue => e
|
|
31
|
-
Datadog.logger.error("Matcher failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
32
|
+
Datadog.logger.error("Matcher failed. Cause: #{e.message} Source: #{Array(e.backtrace).first}")
|
|
32
33
|
nil
|
|
33
34
|
end
|
|
34
35
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'forwardable'
|
|
2
3
|
|
|
3
4
|
require 'ddtrace/ext/priority'
|
|
@@ -5,6 +6,7 @@ require 'ddtrace/ext/priority'
|
|
|
5
6
|
require 'ddtrace/ext/sampling'
|
|
6
7
|
require 'ddtrace/sampler'
|
|
7
8
|
require 'ddtrace/sampling/rate_limiter'
|
|
9
|
+
require 'ddtrace/sampling/rule'
|
|
8
10
|
|
|
9
11
|
module Datadog
|
|
10
12
|
module Sampling
|
|
@@ -45,15 +47,8 @@ module Datadog
|
|
|
45
47
|
@default_sampler = if default_sampler
|
|
46
48
|
default_sampler
|
|
47
49
|
elsif default_sample_rate
|
|
48
|
-
#
|
|
49
|
-
|
|
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 }
|
|
50
|
+
# Add to the end of the rule list a rule always matches any span
|
|
51
|
+
@rules << SimpleRule.new(sample_rate: default_sample_rate)
|
|
57
52
|
else
|
|
58
53
|
RateByServiceSampler.new(1.0, env: -> { Datadog.tracer.tags[:env] })
|
|
59
54
|
end
|
|
@@ -88,6 +83,7 @@ module Datadog
|
|
|
88
83
|
|
|
89
84
|
def update(*args)
|
|
90
85
|
return false unless @default_sampler.respond_to?(:update)
|
|
86
|
+
|
|
91
87
|
@default_sampler.update(*args)
|
|
92
88
|
end
|
|
93
89
|
|
|
@@ -101,18 +97,30 @@ module Datadog
|
|
|
101
97
|
sampled = rule.sample?(span)
|
|
102
98
|
sample_rate = rule.sample_rate(span)
|
|
103
99
|
|
|
100
|
+
set_priority(span, sampled)
|
|
104
101
|
set_rule_metrics(span, sample_rate)
|
|
105
102
|
|
|
106
103
|
return false unless sampled
|
|
107
104
|
|
|
108
|
-
rate_limiter.allow?(1).tap do
|
|
105
|
+
rate_limiter.allow?(1).tap do |allowed|
|
|
106
|
+
set_priority(span, allowed)
|
|
109
107
|
set_limiter_metrics(span, rate_limiter.effective_rate)
|
|
110
108
|
end
|
|
111
109
|
rescue StandardError => e
|
|
112
|
-
Datadog.logger.error("Rule sampling failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
110
|
+
Datadog.logger.error("Rule sampling failed. Cause: #{e.message} Source: #{Array(e.backtrace).first}")
|
|
113
111
|
yield(span)
|
|
114
112
|
end
|
|
115
113
|
|
|
114
|
+
# Span priority should only be set when the {RuleSampler}
|
|
115
|
+
# was responsible for the sampling decision.
|
|
116
|
+
def set_priority(span, sampled)
|
|
117
|
+
if sampled
|
|
118
|
+
ForcedTracing.keep(span)
|
|
119
|
+
else
|
|
120
|
+
ForcedTracing.drop(span)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
116
124
|
def set_rule_metrics(span, sample_rate)
|
|
117
125
|
span.set_metric(Ext::Sampling::RULE_SAMPLE_RATE, sample_rate)
|
|
118
126
|
end
|
data/lib/ddtrace/sampling.rb
CHANGED