ddtrace 0.40.0 → 0.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.editorconfig +22 -0
- data/.gitignore +7 -1
- data/CHANGELOG.md +1667 -350
- data/CONTRIBUTING.md +3 -7
- data/LICENSE-3rdparty.csv +2 -0
- data/README.md +1 -0
- data/bin/ddtracerb +15 -0
- data/ddtrace.gemspec +21 -37
- data/docs/DevelopmentGuide.md +56 -8
- data/docs/GettingStarted.md +438 -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 +166 -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 +278 -57
- 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 +10 -10
- data/lib/ddtrace/configuration/pin_setup.rb +1 -0
- data/lib/ddtrace/configuration/settings.rb +147 -13
- data/lib/ddtrace/configuration.rb +133 -22
- data/lib/ddtrace/context.rb +51 -22
- data/lib/ddtrace/context_flush.rb +15 -2
- data/lib/ddtrace/context_provider.rb +17 -5
- 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 +5 -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 +12 -7
- 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 +36 -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 +6 -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 +3 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +3 -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 +40 -16
- 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 +6 -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 +15 -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 +6 -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 +14 -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 +6 -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 +73 -35
- 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 +6 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -1
- 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 +13 -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 +20 -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 +7 -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 +6 -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 +5 -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 +8 -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 +47 -17
- 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 +10 -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 +7 -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 +5 -2
- data/lib/ddtrace/contrib/sequel/dataset.rb +5 -3
- data/lib/ddtrace/contrib/sequel/ext.rb +2 -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 +16 -5
- 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 +9 -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 +57 -0
- data/lib/ddtrace/ext/runtime.rb +5 -6
- 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 +5 -1
- 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 +301 -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 +134 -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 +101 -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 +20 -6
- 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 +40 -15
- data/lib/ddtrace/sampler.rb +22 -11
- 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 +174 -36
- 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 +72 -62
- data/lib/ddtrace/transport/http/adapters/net.rb +48 -12
- 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 +17 -3
- 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 +28 -5
- 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 +29 -14
- 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 +32 -5
- data/lib/ddtrace/workers/polling.rb +13 -5
- 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 +180 -374
- 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 -1071
- data/Gemfile +0 -7
- data/Rakefile +0 -791
- 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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/transport/statistics'
|
|
2
3
|
|
|
3
4
|
module Datadog
|
|
@@ -6,8 +7,8 @@ module Datadog
|
|
|
6
7
|
# Tracks statistics for HTTP transports
|
|
7
8
|
module Statistics
|
|
8
9
|
def self.included(base)
|
|
9
|
-
base.
|
|
10
|
-
base.
|
|
10
|
+
base.include(Datadog::Transport::Statistics)
|
|
11
|
+
base.include(InstanceMethods)
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
# Instance methods for HTTP statistics
|
|
@@ -18,11 +19,24 @@ module Datadog
|
|
|
18
19
|
# Add status code tag to api.responses metric
|
|
19
20
|
if metrics.key?(:api_responses)
|
|
20
21
|
(metrics[:api_responses].options[:tags] ||= []).tap do |tags|
|
|
21
|
-
tags <<
|
|
22
|
+
tags << metrics_tag_value(response.code)
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
end
|
|
25
26
|
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
# The most common status code on a healthy tracer
|
|
31
|
+
STATUS_CODE_200 = 'status_code:200'.freeze
|
|
32
|
+
|
|
33
|
+
def metrics_tag_value(status_code)
|
|
34
|
+
if status_code == 200
|
|
35
|
+
STATUS_CODE_200 # DEV Saves string concatenation/creation for common case
|
|
36
|
+
else
|
|
37
|
+
"status_code:#{status_code}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
26
40
|
end
|
|
27
41
|
end
|
|
28
42
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: false
|
|
1
2
|
require 'json'
|
|
2
3
|
|
|
3
4
|
require 'ddtrace/transport/traces'
|
|
@@ -41,6 +42,7 @@ module Datadog
|
|
|
41
42
|
|
|
42
43
|
def send_traces(env, &block)
|
|
43
44
|
raise NoTraceEndpointDefinedError, self if traces.nil?
|
|
45
|
+
|
|
44
46
|
traces.call(env, &block)
|
|
45
47
|
end
|
|
46
48
|
|
|
@@ -121,9 +123,7 @@ module Datadog
|
|
|
121
123
|
# Parse service rates, if configured to do so.
|
|
122
124
|
if service_rates? && !http_response.payload.to_s.empty?
|
|
123
125
|
body = JSON.parse(http_response.payload)
|
|
124
|
-
if body.is_a?(Hash) && body.key?(SERVICE_RATE_KEY)
|
|
125
|
-
options[:service_rates] = body[SERVICE_RATE_KEY]
|
|
126
|
-
end
|
|
126
|
+
options[:service_rates] = body[SERVICE_RATE_KEY] if body.is_a?(Hash) && body.key?(SERVICE_RATE_KEY)
|
|
127
127
|
end
|
|
128
128
|
end
|
|
129
129
|
|
|
@@ -134,9 +134,9 @@ module Datadog
|
|
|
134
134
|
end
|
|
135
135
|
|
|
136
136
|
# Add traces behavior to transport components
|
|
137
|
-
HTTP::Client.
|
|
138
|
-
HTTP::API::Spec.
|
|
139
|
-
HTTP::API::Instance.
|
|
137
|
+
HTTP::Client.include(Traces::Client)
|
|
138
|
+
HTTP::API::Spec.include(Traces::API::Spec)
|
|
139
|
+
HTTP::API::Instance.include(Traces::API::Instance)
|
|
140
140
|
end
|
|
141
141
|
end
|
|
142
142
|
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/version'
|
|
2
|
-
require '
|
|
3
|
+
require 'datadog/core/environment/ext'
|
|
3
4
|
require 'ddtrace/ext/transport'
|
|
4
5
|
|
|
5
|
-
require '
|
|
6
|
+
require 'datadog/core/environment/container'
|
|
6
7
|
|
|
7
8
|
require 'ddtrace/transport/http/builder'
|
|
8
9
|
require 'ddtrace/transport/http/api'
|
|
@@ -16,6 +17,8 @@ module Datadog
|
|
|
16
17
|
module Transport
|
|
17
18
|
# Namespace for HTTP transport components
|
|
18
19
|
module HTTP
|
|
20
|
+
include Kernel # Ensure that kernel methods are always available (https://sorbet.org/docs/error-reference#7003)
|
|
21
|
+
|
|
19
22
|
module_function
|
|
20
23
|
|
|
21
24
|
# Builds a new Transport::HTTP::Client
|
|
@@ -25,11 +28,17 @@ module Datadog
|
|
|
25
28
|
|
|
26
29
|
# Builds a new Transport::HTTP::Client with default settings
|
|
27
30
|
# Pass a block to override any settings.
|
|
28
|
-
def default(
|
|
31
|
+
def default(agent_settings: Datadog::Configuration::AgentSettingsResolver::ENVIRONMENT_AGENT_SETTINGS, **options)
|
|
29
32
|
new do |transport|
|
|
30
|
-
transport.adapter
|
|
33
|
+
transport.adapter(agent_settings)
|
|
31
34
|
transport.headers default_headers
|
|
32
35
|
|
|
36
|
+
if agent_settings.deprecated_for_removal_transport_configuration_options
|
|
37
|
+
# The deprecated_for_removal_transport_configuration_options take precedence over any options the caller
|
|
38
|
+
# specifies
|
|
39
|
+
options = options.merge(**agent_settings.deprecated_for_removal_transport_configuration_options)
|
|
40
|
+
end
|
|
41
|
+
|
|
33
42
|
apis = API.defaults
|
|
34
43
|
|
|
35
44
|
transport.api API::V4, apis[API::V4], fallback: API::V3, default: true
|
|
@@ -38,69 +47,67 @@ module Datadog
|
|
|
38
47
|
|
|
39
48
|
# Apply any settings given by options
|
|
40
49
|
unless options.empty?
|
|
41
|
-
# Change hostname/port
|
|
42
|
-
if options.key?(:hostname) || options.key?(:port)
|
|
43
|
-
hostname = options.fetch(:hostname, default_hostname)
|
|
44
|
-
port = options.fetch(:port, default_port)
|
|
45
|
-
transport.adapter :net_http, hostname, port
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Change default API
|
|
49
50
|
transport.default_api = options[:api_version] if options.key?(:api_version)
|
|
50
|
-
|
|
51
|
-
# Add headers
|
|
52
51
|
transport.headers options[:headers] if options.key?(:headers)
|
|
52
|
+
end
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
if agent_settings.deprecated_for_removal_transport_configuration_proc
|
|
55
|
+
agent_settings.deprecated_for_removal_transport_configuration_proc.call(transport)
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
# Call block to apply any customization, if provided
|
|
58
|
+
# Call block to apply any customization, if provided
|
|
59
59
|
yield(transport) if block_given?
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def default_headers
|
|
64
64
|
{
|
|
65
|
-
Datadog::Ext::Transport::HTTP::HEADER_META_LANG => Datadog::Ext::
|
|
66
|
-
Datadog::Ext::Transport::HTTP::HEADER_META_LANG_VERSION => Datadog::Ext::
|
|
67
|
-
Datadog::Ext::Transport::HTTP::HEADER_META_LANG_INTERPRETER => Datadog::Ext::
|
|
68
|
-
Datadog::Ext::Transport::HTTP::HEADER_META_TRACER_VERSION => Datadog::Ext::
|
|
65
|
+
Datadog::Ext::Transport::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
|
|
66
|
+
Datadog::Ext::Transport::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
|
|
67
|
+
Datadog::Ext::Transport::HTTP::HEADER_META_LANG_INTERPRETER => Datadog::Core::Environment::Ext::LANG_INTERPRETER,
|
|
68
|
+
Datadog::Ext::Transport::HTTP::HEADER_META_TRACER_VERSION => Datadog::Core::Environment::Ext::TRACER_VERSION
|
|
69
69
|
}.tap do |headers|
|
|
70
70
|
# Add container ID, if present.
|
|
71
|
-
container_id = Datadog::
|
|
72
|
-
unless container_id.nil?
|
|
73
|
-
headers[Datadog::Ext::Transport::HTTP::HEADER_CONTAINER_ID] = container_id
|
|
74
|
-
end
|
|
71
|
+
container_id = Datadog::Core::Environment::Container.container_id
|
|
72
|
+
headers[Datadog::Ext::Transport::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
|
|
75
73
|
end
|
|
76
74
|
end
|
|
77
75
|
|
|
78
|
-
def
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_HOST, Datadog::Ext::Transport::HTTP::DEFAULT_HOST)
|
|
76
|
+
def default_adapter
|
|
77
|
+
Ext::Transport::HTTP::ADAPTER
|
|
82
78
|
end
|
|
83
79
|
|
|
84
|
-
def
|
|
85
|
-
|
|
80
|
+
def default_hostname(logger: Datadog.logger)
|
|
81
|
+
logger.warn(
|
|
82
|
+
'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \
|
|
83
|
+
'be removed on a future ddtrace release.'
|
|
84
|
+
)
|
|
86
85
|
|
|
87
|
-
|
|
86
|
+
Datadog::Configuration::AgentSettingsResolver::ENVIRONMENT_AGENT_SETTINGS.hostname
|
|
88
87
|
end
|
|
89
88
|
|
|
90
|
-
def
|
|
91
|
-
|
|
89
|
+
def default_port(logger: Datadog.logger)
|
|
90
|
+
logger.warn(
|
|
91
|
+
'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \
|
|
92
|
+
'be removed on a future ddtrace release.'
|
|
93
|
+
)
|
|
92
94
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
+
Datadog::Configuration::AgentSettingsResolver::ENVIRONMENT_AGENT_SETTINGS.port
|
|
96
|
+
end
|
|
95
97
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
def default_url(logger: Datadog.logger)
|
|
99
|
+
logger.warn(
|
|
100
|
+
'Deprecated for removal: Using #default_url for configuration is deprecated and will ' \
|
|
101
|
+
'be removed on a future ddtrace release.'
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
nil
|
|
98
105
|
end
|
|
99
106
|
|
|
100
107
|
# Add adapters to registry
|
|
101
|
-
Builder::REGISTRY.set(Adapters::Net,
|
|
102
|
-
Builder::REGISTRY.set(Adapters::Test,
|
|
103
|
-
Builder::REGISTRY.set(Adapters::UnixSocket,
|
|
108
|
+
Builder::REGISTRY.set(Adapters::Net, Ext::Transport::HTTP::ADAPTER)
|
|
109
|
+
Builder::REGISTRY.set(Adapters::Test, Ext::Transport::Test::ADAPTER)
|
|
110
|
+
Builder::REGISTRY.set(Adapters::UnixSocket, Ext::Transport::UnixSocket::ADAPTER)
|
|
104
111
|
end
|
|
105
112
|
end
|
|
106
113
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/transport/statistics'
|
|
2
3
|
require 'ddtrace/transport/io/response'
|
|
3
4
|
|
|
@@ -12,19 +13,24 @@ module Datadog
|
|
|
12
13
|
:encoder,
|
|
13
14
|
:out
|
|
14
15
|
|
|
15
|
-
def initialize(out, encoder)
|
|
16
|
+
def initialize(out, encoder, options = {})
|
|
16
17
|
@out = out
|
|
17
18
|
@encoder = encoder
|
|
19
|
+
|
|
20
|
+
@request_block = options.fetch(:request, method(:send_default_request))
|
|
21
|
+
@encode_block = options.fetch(:encode, method(:encode_data))
|
|
22
|
+
@write_block = options.fetch(:write, method(:write_data))
|
|
23
|
+
@response_block = options.fetch(:response, method(:build_response))
|
|
18
24
|
end
|
|
19
25
|
|
|
20
26
|
def send_request(request)
|
|
21
27
|
# Write data to IO
|
|
22
28
|
# If block is given, allow it to handle writing
|
|
23
|
-
# Otherwise
|
|
29
|
+
# Otherwise do a standard encode/write/response.
|
|
24
30
|
response = if block_given?
|
|
25
31
|
yield(out, request)
|
|
26
32
|
else
|
|
27
|
-
|
|
33
|
+
@request_block.call(out, request)
|
|
28
34
|
end
|
|
29
35
|
|
|
30
36
|
# Update statistics
|
|
@@ -33,7 +39,7 @@ module Datadog
|
|
|
33
39
|
# Return response
|
|
34
40
|
response
|
|
35
41
|
rescue StandardError => e
|
|
36
|
-
message = "Internal error during IO transport request. Cause: #{e.message} Location: #{e.backtrace.first}"
|
|
42
|
+
message = "Internal error during IO transport request. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
37
43
|
|
|
38
44
|
# Log error
|
|
39
45
|
if stats.consecutive_errors > 0
|
|
@@ -48,8 +54,6 @@ module Datadog
|
|
|
48
54
|
InternalErrorResponse.new(e)
|
|
49
55
|
end
|
|
50
56
|
|
|
51
|
-
protected
|
|
52
|
-
|
|
53
57
|
def encode_data(encoder, request)
|
|
54
58
|
request.parcel.encode_with(encoder)
|
|
55
59
|
end
|
|
@@ -58,17 +62,21 @@ module Datadog
|
|
|
58
62
|
out.puts(data)
|
|
59
63
|
end
|
|
60
64
|
|
|
65
|
+
def build_response(_request, _data, result)
|
|
66
|
+
IO::Response.new(result)
|
|
67
|
+
end
|
|
68
|
+
|
|
61
69
|
private
|
|
62
70
|
|
|
63
71
|
def send_default_request(out, request)
|
|
64
72
|
# Encode data
|
|
65
|
-
data =
|
|
73
|
+
data = @encode_block.call(encoder, request)
|
|
66
74
|
|
|
67
75
|
# Write to IO
|
|
68
|
-
result =
|
|
76
|
+
result = @write_block.call(out, data)
|
|
69
77
|
|
|
70
78
|
# Generate a response
|
|
71
|
-
|
|
79
|
+
@response_block.call(request, data, result)
|
|
72
80
|
end
|
|
73
81
|
end
|
|
74
82
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/transport/response'
|
|
2
3
|
|
|
3
4
|
module Datadog
|
|
@@ -6,14 +7,12 @@ module Datadog
|
|
|
6
7
|
# Response from HTTP transport for traces
|
|
7
8
|
class Response
|
|
8
9
|
include Transport::Response
|
|
9
|
-
include Transport::Traces::Response
|
|
10
10
|
|
|
11
11
|
attr_reader \
|
|
12
12
|
:result
|
|
13
13
|
|
|
14
|
-
def initialize(result
|
|
14
|
+
def initialize(result)
|
|
15
15
|
@result = result
|
|
16
|
-
@trace_count = trace_count
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
def ok?
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: false
|
|
1
2
|
require 'ddtrace/transport/traces'
|
|
2
3
|
|
|
3
4
|
require 'ddtrace/transport/io/response'
|
|
@@ -10,10 +11,18 @@ module Datadog
|
|
|
10
11
|
module Traces
|
|
11
12
|
# Response from HTTP transport for traces
|
|
12
13
|
class Response < IO::Response
|
|
14
|
+
include Transport::Traces::Response
|
|
15
|
+
|
|
16
|
+
def initialize(result, trace_count = 1)
|
|
17
|
+
super(result)
|
|
18
|
+
@trace_count = trace_count
|
|
19
|
+
end
|
|
13
20
|
end
|
|
14
21
|
|
|
15
22
|
# Extensions for HTTP client
|
|
16
23
|
module Client
|
|
24
|
+
include Kernel # Ensure that kernel methods are always available (https://sorbet.org/docs/error-reference#7003)
|
|
25
|
+
|
|
17
26
|
def send_traces(traces)
|
|
18
27
|
# Build a request
|
|
19
28
|
req = Transport::Traces::Request.new(Parcel.new(traces))
|
|
@@ -84,7 +93,7 @@ module Datadog
|
|
|
84
93
|
end
|
|
85
94
|
|
|
86
95
|
# Add traces behavior to transport components
|
|
87
|
-
IO::Client.
|
|
96
|
+
IO::Client.include(Traces::Client)
|
|
88
97
|
end
|
|
89
98
|
end
|
|
90
99
|
end
|
data/lib/ddtrace/transport/io.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/encoding'
|
|
2
3
|
require 'ddtrace/transport/io/client'
|
|
3
4
|
require 'ddtrace/transport/io/traces'
|
|
@@ -17,7 +18,7 @@ module Datadog
|
|
|
17
18
|
# Pass options to override any settings.
|
|
18
19
|
def default(options = {})
|
|
19
20
|
new(
|
|
20
|
-
options.fetch(:out,
|
|
21
|
+
options.fetch(:out, $stdout),
|
|
21
22
|
options.fetch(:encoder, Encoding::JSONEncoder)
|
|
22
23
|
)
|
|
23
24
|
end
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
module Datadog
|
|
2
3
|
module Transport
|
|
3
4
|
# Data transfer object for generic data
|
|
4
5
|
module Parcel
|
|
6
|
+
include Kernel # Ensure that kernel methods are always available (https://sorbet.org/docs/error-reference#7003)
|
|
7
|
+
|
|
5
8
|
attr_reader \
|
|
6
9
|
:data
|
|
7
10
|
|
|
8
11
|
def initialize(data)
|
|
9
12
|
@data = data
|
|
10
13
|
end
|
|
14
|
+
|
|
15
|
+
def encode_with(encoder)
|
|
16
|
+
raise NotImplementedError
|
|
17
|
+
end
|
|
11
18
|
end
|
|
12
19
|
end
|
|
13
20
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'ddtrace/transport/parcel'
|
|
2
3
|
require 'ddtrace/transport/request'
|
|
3
4
|
require 'ddtrace/chunker'
|
|
@@ -7,7 +8,7 @@ module Datadog
|
|
|
7
8
|
module Traces
|
|
8
9
|
# Data transfer object for encoded traces
|
|
9
10
|
class EncodedParcel
|
|
10
|
-
include Transport::Parcel
|
|
11
|
+
include Datadog::Transport::Parcel
|
|
11
12
|
|
|
12
13
|
attr_reader :trace_count
|
|
13
14
|
|
|
@@ -22,7 +23,7 @@ module Datadog
|
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
# Traces request
|
|
25
|
-
class Request < Transport::Request
|
|
26
|
+
class Request < Datadog::Transport::Request
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
# Traces response
|
|
@@ -57,7 +58,12 @@ module Datadog
|
|
|
57
58
|
# @return [Enumerable[Array[Bytes,Integer]]] list of encoded chunks: each containing a byte array and
|
|
58
59
|
# number of traces
|
|
59
60
|
def encode_in_chunks(traces)
|
|
60
|
-
encoded_traces = traces.
|
|
61
|
+
encoded_traces = if traces.respond_to?(:filter_map)
|
|
62
|
+
# DEV Supported since Ruby 2.7, saves an intermediate object creation
|
|
63
|
+
traces.filter_map { |t| encode_one(t) }
|
|
64
|
+
else
|
|
65
|
+
traces.map { |t| encode_one(t) }.reject(&:nil?)
|
|
66
|
+
end
|
|
61
67
|
|
|
62
68
|
Datadog::Chunker.chunk_by_size(encoded_traces, max_size).map do |chunk|
|
|
63
69
|
[encoder.join(chunk), chunk.size]
|
|
@@ -86,7 +92,7 @@ module Datadog
|
|
|
86
92
|
module_function
|
|
87
93
|
|
|
88
94
|
def encode_trace(encoder, trace)
|
|
89
|
-
encoder.encode(trace
|
|
95
|
+
encoder.encode(trace)
|
|
90
96
|
end
|
|
91
97
|
end
|
|
92
98
|
|
|
@@ -118,7 +124,21 @@ module Datadog
|
|
|
118
124
|
return send_traces(traces)
|
|
119
125
|
end
|
|
120
126
|
end
|
|
121
|
-
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Force resolution of lazy enumerator.
|
|
130
|
+
#
|
|
131
|
+
# The "correct" method to call here would be `#force`,
|
|
132
|
+
# as this method was created to force the eager loading
|
|
133
|
+
# of a lazy enumerator.
|
|
134
|
+
#
|
|
135
|
+
# Unfortunately, JRuby < 9.2.9.0 erroneously eagerly loads
|
|
136
|
+
# the lazy Enumerator during intermediate steps.
|
|
137
|
+
# This forces us to use `#to_a`, as this method works for both
|
|
138
|
+
# lazy and regular Enumerators.
|
|
139
|
+
# Using `#to_a` can mask the fact that we expect a lazy
|
|
140
|
+
# Enumerator.
|
|
141
|
+
responses = responses.to_a
|
|
122
142
|
|
|
123
143
|
Datadog.health_metrics.transport_chunked(responses.size)
|
|
124
144
|
|
|
@@ -137,17 +157,20 @@ module Datadog
|
|
|
137
157
|
|
|
138
158
|
def downgrade?(response)
|
|
139
159
|
return false unless apis.fallbacks.key?(@current_api_id)
|
|
160
|
+
|
|
140
161
|
response.not_found? || response.unsupported?
|
|
141
162
|
end
|
|
142
163
|
|
|
143
164
|
def downgrade!
|
|
144
165
|
downgrade_api_id = apis.fallbacks[@current_api_id]
|
|
145
166
|
raise NoDowngradeAvailableError, @current_api_id if downgrade_api_id.nil?
|
|
167
|
+
|
|
146
168
|
change_api!(downgrade_api_id)
|
|
147
169
|
end
|
|
148
170
|
|
|
149
171
|
def change_api!(api_id)
|
|
150
172
|
raise UnknownApiVersionError, api_id unless apis.key?(api_id)
|
|
173
|
+
|
|
151
174
|
@current_api_id = api_id
|
|
152
175
|
@client = HTTP::Client.new(current_api)
|
|
153
176
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'zlib'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Utils
|
|
6
|
+
# Common database-related utility functions.
|
|
7
|
+
module Compression
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
def gzip(string, level: nil, strategy: nil)
|
|
11
|
+
sio = StringIO.new
|
|
12
|
+
sio.binmode
|
|
13
|
+
gz = Zlib::GzipWriter.new(sio, level, strategy)
|
|
14
|
+
gz.write(string)
|
|
15
|
+
gz.close
|
|
16
|
+
sio.string
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def gunzip(string, encoding = ::Encoding::ASCII_8BIT)
|
|
20
|
+
sio = StringIO.new(string)
|
|
21
|
+
gz = Zlib::GzipReader.new(sio, encoding: encoding)
|
|
22
|
+
gz.read
|
|
23
|
+
ensure
|
|
24
|
+
gz && gz.close
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
module Datadog
|
|
3
|
+
module Utils
|
|
4
|
+
# Helper methods for managing forking behavior
|
|
5
|
+
module Forking
|
|
6
|
+
def self.included(base)
|
|
7
|
+
base.prepend(ClassExtensions) if base.is_a?(Class)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.extended(base)
|
|
11
|
+
# Explicitly update PID here because there's a case where
|
|
12
|
+
# the code path that lazily updates the PID may not be exercised
|
|
13
|
+
# until after a fork occurs, thus causing the event to be missed.
|
|
14
|
+
# By eagerly setting this, we avoid this scenario.
|
|
15
|
+
base.update_fork_pid!
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def after_fork!
|
|
19
|
+
if forked?
|
|
20
|
+
yield
|
|
21
|
+
update_fork_pid!
|
|
22
|
+
true
|
|
23
|
+
else
|
|
24
|
+
false
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def forked?
|
|
29
|
+
Process.pid != fork_pid
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def update_fork_pid!
|
|
33
|
+
@fork_pid = Process.pid
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def fork_pid
|
|
37
|
+
@fork_pid ||= Process.pid
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Adds additional functionality for Classes that implement Forking
|
|
41
|
+
module ClassExtensions
|
|
42
|
+
# Addresses an edge case where forking before invoking #update_fork_pid! on the
|
|
43
|
+
# object will cause forking to not be detected in the fork when it should have.
|
|
44
|
+
#
|
|
45
|
+
# This wrapper prevents this by initializing the fork PID when the object is created.
|
|
46
|
+
def initialize(*args, &block)
|
|
47
|
+
super
|
|
48
|
+
update_fork_pid!
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/utils/sequence'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Utils
|
|
6
|
+
# Acts as a unique dictionary of objects
|
|
7
|
+
class ObjectSet
|
|
8
|
+
# You can provide a block that defines how the key
|
|
9
|
+
# for this message type is resolved.
|
|
10
|
+
def initialize(seed = 0, &block)
|
|
11
|
+
@sequence = Utils::Sequence.new(seed)
|
|
12
|
+
@items = {}
|
|
13
|
+
@key_block = block
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Submit an array of arguments that define the message.
|
|
17
|
+
# If they match an existing message, it will return the
|
|
18
|
+
# matching object. If it doesn't match, it will yield to
|
|
19
|
+
# the block with the next ID & args given.
|
|
20
|
+
def fetch(*args)
|
|
21
|
+
# TODO: Array hashing is **really** expensive, we probably want to get rid of it in the future
|
|
22
|
+
key = @key_block ? @key_block.call(*args) : args.hash
|
|
23
|
+
@items[key] ||= yield(@sequence.next, *args)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def length
|
|
27
|
+
@items.length
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def objects
|
|
31
|
+
@items.values
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def freeze
|
|
35
|
+
super
|
|
36
|
+
@items.freeze
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Utils
|
|
6
|
+
# Helper class to execute something only once such as not repeating warning logs, and instrumenting classes
|
|
7
|
+
# only once.
|
|
8
|
+
#
|
|
9
|
+
# Thread-safe when used correctly (e.g. be careful of races when lazily initializing instances of this class).
|
|
10
|
+
#
|
|
11
|
+
# Note: In its current state, this class is not Ractor-safe.
|
|
12
|
+
# In https://github.com/DataDog/dd-trace-rb/pull/1398#issuecomment-797378810 we have a discussion of alternatives,
|
|
13
|
+
# including an alternative implementation that is Ractor-safe once spent.
|
|
14
|
+
class OnlyOnce
|
|
15
|
+
def initialize
|
|
16
|
+
@mutex = Mutex.new
|
|
17
|
+
@ran_once = false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def run
|
|
21
|
+
@mutex.synchronize do
|
|
22
|
+
return if @ran_once
|
|
23
|
+
|
|
24
|
+
@ran_once = true
|
|
25
|
+
|
|
26
|
+
yield
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def ran?
|
|
31
|
+
@mutex.synchronize { @ran_once }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def reset_ran_once_state_for_tests
|
|
37
|
+
@mutex.synchronize { @ran_once = false }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|