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,107 @@
|
|
|
1
|
+
# Profiling Development
|
|
2
|
+
|
|
3
|
+
This file contains development notes specific to the profiling feature.
|
|
4
|
+
|
|
5
|
+
For a more practical view of getting started with development of `ddtrace`, see <DevelopmentGuide.md>.
|
|
6
|
+
|
|
7
|
+
## Profiling components high-level view
|
|
8
|
+
|
|
9
|
+
Components below live inside <../lib/ddtrace/profiling>:
|
|
10
|
+
|
|
11
|
+
* `Collectors::Stack`: Collects stack trace samples from Ruby threads for both CPU-time (if available) and wall-clock.
|
|
12
|
+
Runs on its own background thread.
|
|
13
|
+
* `Encoding::Profile`: Encodes gathered data into the pprof format.
|
|
14
|
+
* `Events::Stack`, `Events::StackSample`: Entity classes used to represent stacks.
|
|
15
|
+
* `Ext::CPU`: Monkey patches Ruby's `Thread` with our `Ext::CThread` to enable CPU-time profiling.
|
|
16
|
+
* `Ext::CThread`: Extension used to enable CPU-time profiling via use of Pthread's `getcpuclockid`.
|
|
17
|
+
* `Ext::Forking`: Monkey patches `Kernel#fork`, adding a `Kernel#at_fork` callback mechanism which is used to restore
|
|
18
|
+
profiling abilities after the VM forks (such as re-instrumenting the main thread, and restarting profiler threads).
|
|
19
|
+
* `Pprof::*` (in <../lib/ddtrace/profiling/pprof>): Converts samples captured in the `Recorder` into the pprof format.
|
|
20
|
+
* `Tasks::Setup`: Takes care of loading our extensions/monkey patches to handle fork() and CPU profiling.
|
|
21
|
+
* `Transport::*` (in <../lib/ddtrace/profiling/transport>): Implements transmission of profiling payloads to the Datadog agent
|
|
22
|
+
or backend.
|
|
23
|
+
* `TraceIdentifiers::*`: Used to retrieve trace id and span id from tracers, to be used to connect traces to profiles.
|
|
24
|
+
* `BacktraceLocation`: Entity class used to represent an entry in a stack trace.
|
|
25
|
+
* `Buffer`: Bounded buffer used to store profiling events.
|
|
26
|
+
* `Exporter`: Writes profiling data to a given transport.
|
|
27
|
+
* `Flush`: Entity class used to represent metadata for a given profile.
|
|
28
|
+
* `Profiler`: Profiling entry point, which coordinates collectors and a scheduler.
|
|
29
|
+
* `Recorder`: Stores profiling events gathered by `Collector`s.
|
|
30
|
+
* `Scheduler`: Periodically (every 1 minute) takes data from the `Recorder` and pushes them to all configured
|
|
31
|
+
`Exporter`s. Runs on its own background thread.
|
|
32
|
+
|
|
33
|
+
## Initialization
|
|
34
|
+
|
|
35
|
+
When started via `ddtracerb exec` (together with `DD_PROFILING_ENABLED=true`), initialization goes through the following
|
|
36
|
+
flow:
|
|
37
|
+
|
|
38
|
+
1. <../lib/ddtrace/profiling/preload.rb> triggers the creation of the `Datadog.profiler` instance by calling the method
|
|
39
|
+
2. `Datadog.profiler` is handled by `Datadog::Configuration`, which triggers the configuration of `ddtrace` components
|
|
40
|
+
in `#build_components`
|
|
41
|
+
3. Inside `Datadog::Components`, the `build_profiler` method triggers the execution of the `Tasks::Setup`
|
|
42
|
+
4. The `Setup` task activates our extensions
|
|
43
|
+
* `Datadog::Profiling::Ext::Forking`
|
|
44
|
+
* `Datadog::Profiling::Ext::CPU`
|
|
45
|
+
5. Still inside `Datadog::Components`, the `build_profiler` method then creates and wires up the Profiler as such:
|
|
46
|
+
```asciiflow
|
|
47
|
+
+------------+
|
|
48
|
+
| Profiler |
|
|
49
|
+
+-+-------+--+
|
|
50
|
+
| |
|
|
51
|
+
v v
|
|
52
|
+
+---------+--+ +-+---------+
|
|
53
|
+
| Collectors | | Scheduler |
|
|
54
|
+
+---------+--+ +-+-------+-+
|
|
55
|
+
| | |
|
|
56
|
+
v | v
|
|
57
|
+
+-----+-+ | +----+------+
|
|
58
|
+
| Stack | | | Exporters |
|
|
59
|
+
+-----+-+ | +-----------+
|
|
60
|
+
| |
|
|
61
|
+
v v
|
|
62
|
+
+-+-------+-+
|
|
63
|
+
| Recorder |
|
|
64
|
+
+-----------+
|
|
65
|
+
```
|
|
66
|
+
6. The profiler gets started when `startup!` is called by `Datadog::Configuration` after component creation.
|
|
67
|
+
|
|
68
|
+
## Run-time execution
|
|
69
|
+
|
|
70
|
+
During run-time, the `Scheduler` and the `Collectors::Stack` each execute on their own background thread.
|
|
71
|
+
|
|
72
|
+
The `Collectors::Stack` samples stack traces of threads, capturing both CPU-time (if available) and wall-clock, storing
|
|
73
|
+
them in the `Recorder`.
|
|
74
|
+
|
|
75
|
+
The `Scheduler` wakes up every 1 minute to flush the results of the `Recorder` into one or more `exporter`s.
|
|
76
|
+
Usually only one exporter is in use. By default, the `Exporter` delegates to the default `Transport::HTTP` transport, which
|
|
77
|
+
takes care of encoding the data and reporting it to the datadog agent (or to the API, when running without an agent).
|
|
78
|
+
|
|
79
|
+
## How CPU-time profiling works
|
|
80
|
+
|
|
81
|
+
**TODO**: Document our pthread-based approach to getting CPU-time for threads.
|
|
82
|
+
|
|
83
|
+
## How linking of traces to profiles works
|
|
84
|
+
|
|
85
|
+
The [code hotspots feature](https://docs.datadoghq.com/tracing/profiler/connect_traces_and_profiles) allows users to start
|
|
86
|
+
from a trace and then to investigate the profile that corresponds to that trace.
|
|
87
|
+
|
|
88
|
+
This works in two steps:
|
|
89
|
+
1. Linking a trace to the profile that was gathered while it executed
|
|
90
|
+
2. Enabling the filtering of a profile to contain only the samples relating to a given trace/span
|
|
91
|
+
|
|
92
|
+
To link a trace to a profile, we must ensure that both have the same `runtime-id` tag.
|
|
93
|
+
This tag is in `Datadog::Runtime::Identity.id` and is automatically added by both the tracer and the profiler to reported
|
|
94
|
+
traces/profiles.
|
|
95
|
+
|
|
96
|
+
The profiler backend links a trace covering a given time interval to the profiles covering the same time interval,
|
|
97
|
+
whenever they share the same `runtime-id`.
|
|
98
|
+
|
|
99
|
+
To further enable filtering of a profile to show only samples related to a given trace/span, each sample taken by the
|
|
100
|
+
profiler is tagged with the `local root span id` and `span id` for the given trace/span.
|
|
101
|
+
|
|
102
|
+
This is done using the `Datadog::Profiling::TraceIdentifiers::Helper` that retrieves a `root_span_id` and `span_id`, if
|
|
103
|
+
available, from the supported tracers. This helper is called by the `Collectors::Stack` during sampling.
|
|
104
|
+
|
|
105
|
+
Note that if a given trace executes too fast, it's possible that the profiler will not contain any samples for that
|
|
106
|
+
specific trace. Nevertheless, the linking still works and is useful, as it allows users to explore what was going on their
|
|
107
|
+
profile at that time, even if they can't filter down to the specific request.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Profiling Native Extension Design
|
|
2
|
+
|
|
3
|
+
The profiling native extension is used to implement features which are expensive (in terms of resources) or otherwise
|
|
4
|
+
impossible to implement using Ruby code.
|
|
5
|
+
|
|
6
|
+
This extension is quite coupled with MRI Ruby ("C Ruby") internals, and is not intended to support other rubies such as
|
|
7
|
+
JRuby or TruffleRuby. When below we say "Ruby", read it as "MRI Ruby".
|
|
8
|
+
|
|
9
|
+
## Disabling
|
|
10
|
+
|
|
11
|
+
The profiling native extension can be disabled by setting `DD_PROFILING_NO_EXTENSION=true` when installing or running
|
|
12
|
+
the gem. Setting `DD_PROFILING_NO_EXTENSION` at installation time skips compilation of the extension entirely.
|
|
13
|
+
|
|
14
|
+
(If you're a customer and needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.)
|
|
15
|
+
|
|
16
|
+
Currently the profiler can still "limp along" when the native extension is disabled, but the plan is to require it
|
|
17
|
+
in future releases -- e.g. disabling the extension will disable profiling entirely.
|
|
18
|
+
|
|
19
|
+
## Safety
|
|
20
|
+
|
|
21
|
+
The profiling native extension is (and must always be) designed to **not cause failures** during gem installation, even
|
|
22
|
+
if some features, Ruby versions, or operating systems are not supported.
|
|
23
|
+
|
|
24
|
+
E.g. the extension must cleanly build on Ruby 2.1 (or the oldest Ruby version we support at the time) on Windows,
|
|
25
|
+
even if at run time it will effectively do nothing for such a setup.
|
|
26
|
+
|
|
27
|
+
We have a CI setup to help validate this, but this is really important to keep in mind when adding to or changing the
|
|
28
|
+
existing codebase.
|
|
29
|
+
|
|
30
|
+
## Usage of private VM headers
|
|
31
|
+
|
|
32
|
+
To implement some of the features below, we sometimes require access to private Ruby header files (that describe VM
|
|
33
|
+
internal types, structures and functions).
|
|
34
|
+
|
|
35
|
+
Because these private header files are not included in regular Ruby installations, we have two different workarounds:
|
|
36
|
+
|
|
37
|
+
1. for Ruby versions >= 2.6 we make use use the Ruby private MJIT header
|
|
38
|
+
2. for Ruby versions < 2.6 (legacy Rubies) we make use of the `debase-ruby_core_source` gem
|
|
39
|
+
|
|
40
|
+
Functions which make use of these headers are defined in the <private_vm_api_acccess.c> file.
|
|
41
|
+
|
|
42
|
+
**Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
|
|
43
|
+
contribute upstream changes so that they become official public VM APIs.
|
|
44
|
+
|
|
45
|
+
### Approach 1: Using the Ruby private MJIT header
|
|
46
|
+
|
|
47
|
+
Ruby versions >= 2.6 introduced a JIT compiler called MJIT. This compiler does not directly generate machine code;
|
|
48
|
+
instead it generates C code and uses the system C compiler to turn it into machine code.
|
|
49
|
+
|
|
50
|
+
The generated C code `#include`s a private header -- which we reference as "the MJIT header" everywhere.
|
|
51
|
+
The MJIT header gets shipped with all MJIT-enabled Rubies and includes the layout of many internal VM structures;
|
|
52
|
+
and of course the intention is that it is only used by the Ruby MJIT compiler.
|
|
53
|
+
|
|
54
|
+
This header is placed inside the `include/` directory in a Ruby installation, and is named for that specific Ruby
|
|
55
|
+
version. e.g. `rb_mjit_min_header-2.7.4.h`.
|
|
56
|
+
|
|
57
|
+
### Approach 2: Using the `debase-ruby_core_source` gem
|
|
58
|
+
|
|
59
|
+
The [`debase-ruby_core_source`](https://github.com/ruby-debug/debase-ruby_core_source) contains almost no code;
|
|
60
|
+
instead, it just contains per-Ruby-version folders with the private VM headers (`.h`) files for that version.
|
|
61
|
+
|
|
62
|
+
Thus, even though a regular Ruby installation does not include these files, we can access the copy inside this gem.
|
|
63
|
+
|
|
64
|
+
## Feature: Getting thread CPU-time clock_ids
|
|
65
|
+
|
|
66
|
+
* **OS support**: Linux
|
|
67
|
+
* **Ruby support**: 2.6+
|
|
68
|
+
|
|
69
|
+
To enable CPU-time profiling, we use the `pthread_getcpuclockid(pthread_t thread, clockid_t *clockid)` C function to
|
|
70
|
+
obtain a `clockid_t` that can then be used with the `Process.clock_gettime` method (or directly with the
|
|
71
|
+
`clock_gettime()` C function).
|
|
72
|
+
|
|
73
|
+
The challenge with using `pthread_getcpuclockid()` is that we need to get the `pthread_t` for a given Ruby `Thread`
|
|
74
|
+
object. We previously did this with a weird combination of monkey patching and `pthread_self()` (effectively patching
|
|
75
|
+
every `Thread` to run `pthread_self()` at initialization time and stash that value somewhere), but this had a number
|
|
76
|
+
of downsides.
|
|
77
|
+
|
|
78
|
+
The approach we use in the profiling native extension is to reach inside the internal structure of the `Thread` object,
|
|
79
|
+
and extract the `pthread_t` that Ruby itself keeps, but does not expose. This is implemented in the `pthread_id_for()`
|
|
80
|
+
function in `private_vm_api_acccess.c`. Thus, using this trick we can at any point in execution go from a `Thread`
|
|
81
|
+
object into the `clockid_t` that we need.
|
|
82
|
+
|
|
83
|
+
Note that `pthread_getcpuclockid()` is not available on macOS (nor, obviously, on Windows), and hence this feature
|
|
84
|
+
is currently Linux-specific. Thus, in the <clock_id_from_pthread.c> file we implement the feature for supported Ruby
|
|
85
|
+
setups but if something is missing we instead compile in <clock_id_noop.c> that includes a no-op implementation of the
|
|
86
|
+
feature.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#include "extconf.h"
|
|
2
|
+
|
|
3
|
+
// This file is only compiled on systems where pthread_getcpuclockid() is available;
|
|
4
|
+
// Otherwise we compile clock_id_noop.c
|
|
5
|
+
#ifdef HAVE_PTHREAD_GETCPUCLOCKID
|
|
6
|
+
|
|
7
|
+
#include <pthread.h>
|
|
8
|
+
#include <time.h>
|
|
9
|
+
#include <errno.h>
|
|
10
|
+
|
|
11
|
+
#include <ruby.h>
|
|
12
|
+
|
|
13
|
+
#ifdef RUBY_2_1_WORKAROUND
|
|
14
|
+
#include <thread_native.h>
|
|
15
|
+
#else
|
|
16
|
+
#include <ruby/thread_native.h>
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
#include "private_vm_api_access.h"
|
|
20
|
+
|
|
21
|
+
#include "clock_id.h"
|
|
22
|
+
|
|
23
|
+
// Validate that our home-cooked pthread_id_for() matches pthread_self() for the current thread
|
|
24
|
+
void self_test_clock_id() {
|
|
25
|
+
rb_nativethread_id_t expected_pthread_id = pthread_self();
|
|
26
|
+
rb_nativethread_id_t actual_pthread_id = pthread_id_for(rb_thread_current());
|
|
27
|
+
|
|
28
|
+
if (expected_pthread_id != actual_pthread_id) rb_raise(rb_eRuntimeError, "pthread_id_for() self-test failed");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
VALUE clock_id_for(VALUE self, VALUE thread) {
|
|
32
|
+
rb_nativethread_id_t thread_id = pthread_id_for(thread);
|
|
33
|
+
|
|
34
|
+
clockid_t clock_id;
|
|
35
|
+
int error = pthread_getcpuclockid(thread_id, &clock_id);
|
|
36
|
+
|
|
37
|
+
if (error == 0) {
|
|
38
|
+
return CLOCKID2NUM(clock_id);
|
|
39
|
+
} else {
|
|
40
|
+
switch(error) {
|
|
41
|
+
// The more specific error messages are based on the pthread_getcpuclockid(3) man page
|
|
42
|
+
case ENOENT:
|
|
43
|
+
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: Per-thread CPU time clocks are not supported by the system."));
|
|
44
|
+
case ESRCH:
|
|
45
|
+
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: No thread could be found."));
|
|
46
|
+
default:
|
|
47
|
+
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread"));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#endif
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#include "extconf.h"
|
|
2
|
+
|
|
3
|
+
// This file is the dual of clock_id_from_pthread.c for systems where that info
|
|
4
|
+
// is not available.
|
|
5
|
+
#ifndef HAVE_PTHREAD_GETCPUCLOCKID
|
|
6
|
+
|
|
7
|
+
#include <ruby.h>
|
|
8
|
+
|
|
9
|
+
#include "clock_id.h"
|
|
10
|
+
|
|
11
|
+
void self_test_clock_id() { } // Nothing to check
|
|
12
|
+
VALUE clock_id_for(VALUE self, VALUE thread) { return Qnil; } // Nothing to return
|
|
13
|
+
|
|
14
|
+
#endif
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
# rubocop:disable Style/StderrPuts
|
|
3
|
+
|
|
4
|
+
# Older Rubies don't have the MJIT header, used by the JIT compiler, so we need to use a different approach
|
|
5
|
+
CAN_USE_MJIT_HEADER = RUBY_VERSION >= '2.6'
|
|
6
|
+
|
|
7
|
+
def on_jruby?
|
|
8
|
+
# We don't support JRuby for profiling, and JRuby doesn't support native extensions, so let's just skip this entire
|
|
9
|
+
# thing so that JRuby users of dd-trace-rb aren't impacted.
|
|
10
|
+
RUBY_ENGINE == 'jruby'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def on_truffleruby?
|
|
14
|
+
# We don't officially support TruffleRuby for dd-trace-rb at all BUT let's not break adventurous customers that
|
|
15
|
+
# want to give it a try.
|
|
16
|
+
RUBY_ENGINE == 'truffleruby'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def on_windows?
|
|
20
|
+
# Microsoft Windows is unsupported, so let's not build the extension there.
|
|
21
|
+
Gem.win_platform?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def expected_to_use_mjit_but_mjit_is_disabled?
|
|
25
|
+
# On some Rubies, we require the mjit header to be present. If Ruby was installed without MJIT support, we also skip
|
|
26
|
+
# building the extension.
|
|
27
|
+
mjit_disabled = CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
|
|
28
|
+
|
|
29
|
+
if mjit_disabled
|
|
30
|
+
$stderr.puts(%(
|
|
31
|
+
+------------------------------------------------------------------------------+
|
|
32
|
+
| Your Ruby has been compiled without JIT support (--disable-jit-support). |
|
|
33
|
+
| The profiling native extension requires a Ruby compiled with JIT support, |
|
|
34
|
+
| even if the JIT is not in use by the application itself. |
|
|
35
|
+
| |
|
|
36
|
+
| WARNING: Without the profiling native extension, some profiling features |
|
|
37
|
+
| will not be available. |
|
|
38
|
+
+------------------------------------------------------------------------------+
|
|
39
|
+
|
|
40
|
+
))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
mjit_disabled
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def disabled_via_env?
|
|
47
|
+
# Experimental toggle to disable building the extension.
|
|
48
|
+
# Disabling the extension will lead to the profiler not working in future releases.
|
|
49
|
+
# If you needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.
|
|
50
|
+
ENV['DD_PROFILING_NO_EXTENSION'].to_s.downcase == 'true'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def skip_building_extension?
|
|
54
|
+
disabled_via_env? || on_jruby? || on_truffleruby? || on_windows? || expected_to_use_mjit_but_mjit_is_disabled?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# IMPORTANT: When adding flags, remember that our customers compile with a wide range of gcc/clang versions, so
|
|
58
|
+
# doublecheck that what you're adding can be reasonably expected to work on their systems.
|
|
59
|
+
def add_compiler_flag(flag)
|
|
60
|
+
$CFLAGS << ' ' << flag
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def skip_building_extension!
|
|
64
|
+
File.write('Makefile', 'all install clean: # dummy makefile that does nothing')
|
|
65
|
+
exit
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if skip_building_extension?
|
|
69
|
+
$stderr.puts(%(
|
|
70
|
+
+------------------------------------------------------------------------------+
|
|
71
|
+
| Skipping build of profiling native extension and replacing it with a no-op |
|
|
72
|
+
| Makefile |
|
|
73
|
+
+------------------------------------------------------------------------------+
|
|
74
|
+
|
|
75
|
+
))
|
|
76
|
+
skip_building_extension!
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
$stderr.puts(%(
|
|
80
|
+
+------------------------------------------------------------------------------+
|
|
81
|
+
| ** Preparing to build the ddtrace native extension... ** |
|
|
82
|
+
| |
|
|
83
|
+
| If you run into any failures during this step, you can set the |
|
|
84
|
+
| `DD_PROFILING_NO_EXTENSION` environment variable to `true` e.g. |
|
|
85
|
+
| `$ DD_PROFILING_NO_EXTENSION=true bundle install` to skip this step. |
|
|
86
|
+
| |
|
|
87
|
+
| Disabling the extension will lead to the ddtrace profiling features not |
|
|
88
|
+
| working in future releases. |
|
|
89
|
+
| If you needed to use this, please tell us why on |
|
|
90
|
+
| <https://github.com/DataDog/dd-trace-rb/issues/new> so we can fix it :\) |
|
|
91
|
+
| |
|
|
92
|
+
| Thanks for using ddtrace! You rock! |
|
|
93
|
+
+------------------------------------------------------------------------------+
|
|
94
|
+
|
|
95
|
+
))
|
|
96
|
+
|
|
97
|
+
# NOTE: we MUST NOT require 'mkmf' before we check the #skip_building_extension? because the require triggers checks
|
|
98
|
+
# that may fail on an environment not properly setup for building Ruby extensions.
|
|
99
|
+
require 'mkmf'
|
|
100
|
+
|
|
101
|
+
# Gets really noisy when we include the MJIT header, let's omit it
|
|
102
|
+
add_compiler_flag '-Wno-unused-function'
|
|
103
|
+
|
|
104
|
+
# Allow defining variables at any point in a function
|
|
105
|
+
add_compiler_flag '-Wno-declaration-after-statement'
|
|
106
|
+
|
|
107
|
+
# If we forget to include a Ruby header, the function call may still appear to work, but then
|
|
108
|
+
# cause a segfault later. Let's ensure that never happens.
|
|
109
|
+
add_compiler_flag '-Werror-implicit-function-declaration'
|
|
110
|
+
|
|
111
|
+
if RUBY_PLATFORM.include?('linux')
|
|
112
|
+
# Supposedly, the correct way to do this is
|
|
113
|
+
# ```
|
|
114
|
+
# have_library 'pthread'
|
|
115
|
+
# have_func 'pthread_getcpuclockid'
|
|
116
|
+
# ```
|
|
117
|
+
# but it broke the build on Windows and on older Ruby versions (2.1 and 2.2)
|
|
118
|
+
# so instead we just assume that we have the function we need on Linux, and nowhere else
|
|
119
|
+
$defs << '-DHAVE_PTHREAD_GETCPUCLOCKID'
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Tag the native extension library with the Ruby version and Ruby platform.
|
|
123
|
+
# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
|
|
124
|
+
# the wrong library is never loaded.
|
|
125
|
+
# When requiring, we need to use the exact same string, including the version and the platform.
|
|
126
|
+
EXTENSION_NAME = "ddtrace_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}".freeze
|
|
127
|
+
|
|
128
|
+
if CAN_USE_MJIT_HEADER
|
|
129
|
+
mjit_header_file_name = "rb_mjit_min_header-#{RUBY_VERSION}.h"
|
|
130
|
+
|
|
131
|
+
# Validate that the mjit header can actually be compiled on this system. We learned via
|
|
132
|
+
# https://github.com/DataDog/dd-trace-rb/issues/1799 and https://github.com/DataDog/dd-trace-rb/issues/1792
|
|
133
|
+
# that even if the header seems to exist, it may not even compile.
|
|
134
|
+
# `have_macro` actually tries to compile a file that mentions the given macro, so if this passes, we should be good to
|
|
135
|
+
# use the MJIT header.
|
|
136
|
+
# Finally, the `COMMON_HEADERS` conflict with the MJIT header so we need to temporarily disable them for this check.
|
|
137
|
+
original_common_headers = MakeMakefile::COMMON_HEADERS
|
|
138
|
+
MakeMakefile::COMMON_HEADERS = ''.freeze
|
|
139
|
+
unless have_macro('RUBY_MJIT_H', mjit_header_file_name)
|
|
140
|
+
$stderr.puts(%(
|
|
141
|
+
+------------------------------------------------------------------------------+
|
|
142
|
+
| WARNING: Unable to compile a needed component for ddtrace native extension. |
|
|
143
|
+
| Your C compiler or Ruby VM just-in-time compiler seems to be broken. |
|
|
144
|
+
| |
|
|
145
|
+
| You will be NOT be able to use ddtrace profiling features, |
|
|
146
|
+
| but all other features will work fine! |
|
|
147
|
+
| |
|
|
148
|
+
| For help solving this issue, please contact Datadog support at |
|
|
149
|
+
| <https://docs.datadoghq.com/help/>. |
|
|
150
|
+
+------------------------------------------------------------------------------+
|
|
151
|
+
|
|
152
|
+
))
|
|
153
|
+
skip_building_extension!
|
|
154
|
+
end
|
|
155
|
+
MakeMakefile::COMMON_HEADERS = original_common_headers
|
|
156
|
+
|
|
157
|
+
$defs << '-DUSE_MJIT_HEADER'
|
|
158
|
+
|
|
159
|
+
# NOTE: This needs to come after all changes to $defs
|
|
160
|
+
create_header
|
|
161
|
+
|
|
162
|
+
# The MJIT header is always (afaik?) suffixed with the exact Ruby VM version,
|
|
163
|
+
# including patch (e.g. 2.7.2). Thus, we add to the header file a definition
|
|
164
|
+
# containing the exact file, so that it can be used in a #include in the C code.
|
|
165
|
+
header_contents =
|
|
166
|
+
File.read($extconf_h)
|
|
167
|
+
.sub('#endif',
|
|
168
|
+
<<-EXTCONF_H.strip
|
|
169
|
+
#define RUBY_MJIT_HEADER "#{mjit_header_file_name}"
|
|
170
|
+
|
|
171
|
+
#endif
|
|
172
|
+
EXTCONF_H
|
|
173
|
+
)
|
|
174
|
+
File.open($extconf_h, 'w') { |file| file.puts(header_contents) }
|
|
175
|
+
|
|
176
|
+
create_makefile EXTENSION_NAME
|
|
177
|
+
else
|
|
178
|
+
# On older Rubies, we use the debase-ruby_core_source gem to get access to private VM headers.
|
|
179
|
+
# This gem ships source code copies of these VM headers for the different Ruby VM versions;
|
|
180
|
+
# see https://github.com/ruby-debug/debase-ruby_core_source for details
|
|
181
|
+
|
|
182
|
+
thread_native_for_ruby_2_1 = proc { true }
|
|
183
|
+
if RUBY_VERSION < '2.2'
|
|
184
|
+
# This header became public in Ruby 2.2, but we need to pull it from the private headers folder for 2.1
|
|
185
|
+
thread_native_for_ruby_2_1 = proc { have_header('thread_native.h') }
|
|
186
|
+
$defs << '-DRUBY_2_1_WORKAROUND'
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
create_header
|
|
190
|
+
|
|
191
|
+
require 'debase/ruby_core_source'
|
|
192
|
+
dir_config('ruby') # allow user to pass in non-standard core include directory
|
|
193
|
+
|
|
194
|
+
Debase::RubyCoreSource
|
|
195
|
+
.create_makefile_with_core(proc { have_header('vm_core.h') && thread_native_for_ruby_2_1.call }, EXTENSION_NAME)
|
|
196
|
+
end
|
|
197
|
+
# rubocop:enable Style/StderrPuts
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#include "extconf.h"
|
|
2
|
+
|
|
3
|
+
// This file exports functions used to access private Ruby VM APIs and internals.
|
|
4
|
+
// To do this, it imports a few VM internal (private) headers.
|
|
5
|
+
//
|
|
6
|
+
// **Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
|
|
7
|
+
// contribute upstream changes so that they become official public VM APIs.
|
|
8
|
+
//
|
|
9
|
+
// In the meanwhile, be very careful when changing things here :)
|
|
10
|
+
|
|
11
|
+
#ifdef USE_MJIT_HEADER
|
|
12
|
+
// Pick up internal structures from the private Ruby MJIT header file
|
|
13
|
+
#include RUBY_MJIT_HEADER
|
|
14
|
+
#else
|
|
15
|
+
// On older Rubies, use a copy of the VM internal headers shipped in the debase-ruby_core_source gem
|
|
16
|
+
#include <vm_core.h>
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
// MRI has a similar rb_thread_ptr() function which we can't call it directly
|
|
20
|
+
// because Ruby does not expose the thread_data_type publicly.
|
|
21
|
+
// Instead, we have our own version of that function, and we lazily initialize the thread_data_type pointer
|
|
22
|
+
// from a known-correct object: the current thread.
|
|
23
|
+
//
|
|
24
|
+
// Note that beyond returning the rb_thread_struct*, rb_check_typeddata() raises an exception
|
|
25
|
+
// if the argument passed in is not actually a `Thread` instance.
|
|
26
|
+
static inline struct rb_thread_struct *thread_struct_from_object(VALUE thread) {
|
|
27
|
+
static const rb_data_type_t *thread_data_type = NULL;
|
|
28
|
+
if (thread_data_type == NULL) thread_data_type = RTYPEDDATA_TYPE(rb_thread_current());
|
|
29
|
+
|
|
30
|
+
return (struct rb_thread_struct *) rb_check_typeddata(thread, thread_data_type);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
rb_nativethread_id_t pthread_id_for(VALUE thread) {
|
|
34
|
+
return thread_struct_from_object(thread)->thread_id;
|
|
35
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
|
|
3
|
+
#include "clock_id.h"
|
|
4
|
+
|
|
5
|
+
static VALUE native_working_p(VALUE self);
|
|
6
|
+
|
|
7
|
+
void Init_ddtrace_profiling_native_extension(void) {
|
|
8
|
+
VALUE datadog_module = rb_define_module("Datadog");
|
|
9
|
+
VALUE profiling_module = rb_define_module_under(datadog_module, "Profiling");
|
|
10
|
+
VALUE native_extension_module = rb_define_module_under(profiling_module, "NativeExtension");
|
|
11
|
+
|
|
12
|
+
rb_define_singleton_method(native_extension_module, "native_working?", native_working_p, 0);
|
|
13
|
+
rb_funcall(native_extension_module, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("native_working?")));
|
|
14
|
+
|
|
15
|
+
rb_define_singleton_method(native_extension_module, "clock_id_for", clock_id_for, 1); // from clock_id.h
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static VALUE native_working_p(VALUE self) {
|
|
19
|
+
self_test_clock_id();
|
|
20
|
+
|
|
21
|
+
return Qtrue;
|
|
22
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'datadog/ci/context_flush'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module CI
|
|
6
|
+
module Configuration
|
|
7
|
+
# Adds CI behavior to Datadog trace components
|
|
8
|
+
module Components
|
|
9
|
+
def initialize(settings)
|
|
10
|
+
# Activate CI mode if enabled
|
|
11
|
+
activate_ci_mode!(settings) if settings.ci_mode.enabled
|
|
12
|
+
|
|
13
|
+
# Initialize normally
|
|
14
|
+
super
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def activate_ci_mode!(settings)
|
|
18
|
+
# Activate underlying tracing test mode
|
|
19
|
+
settings.test_mode.enabled = true
|
|
20
|
+
|
|
21
|
+
# Choose user defined ContextFlush or default to CI ContextFlush
|
|
22
|
+
settings.test_mode.context_flush = settings.ci_mode.context_flush \
|
|
23
|
+
|| Datadog::CI::ContextFlush::Finished.new
|
|
24
|
+
|
|
25
|
+
# Pass through any other options
|
|
26
|
+
settings.test_mode.writer_options = settings.ci_mode.writer_options
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'datadog/ci/ext/settings'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module CI
|
|
6
|
+
module Configuration
|
|
7
|
+
# Adds CI behavior to Datadog trace settings
|
|
8
|
+
module Settings
|
|
9
|
+
def self.extended(base)
|
|
10
|
+
base = base.singleton_class unless base.is_a?(Class)
|
|
11
|
+
add_settings!(base)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.add_settings!(base)
|
|
15
|
+
base.class_eval do
|
|
16
|
+
settings :ci_mode do
|
|
17
|
+
option :enabled do |o|
|
|
18
|
+
o.default { env_to_bool(Datadog::CI::Ext::Settings::ENV_MODE_ENABLED, false) }
|
|
19
|
+
o.lazy
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
option :context_flush do |o|
|
|
23
|
+
o.default { nil }
|
|
24
|
+
o.lazy
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
option :writer_options do |o|
|
|
28
|
+
o.default { {} }
|
|
29
|
+
o.lazy
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/context_flush'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module CI
|
|
6
|
+
module ContextFlush
|
|
7
|
+
# Common behavior for CI flushing
|
|
8
|
+
module Tagging
|
|
9
|
+
# Decorate a trace with CI tags
|
|
10
|
+
def get_trace(context)
|
|
11
|
+
context.get do |trace|
|
|
12
|
+
# Origin tag is required on every span
|
|
13
|
+
trace.each { |span| context.attach_origin(span) } if trace
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Consumes only completed traces (where all spans have finished)
|
|
19
|
+
class Finished < Datadog::ContextFlush::Finished
|
|
20
|
+
prepend Tagging
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Performs partial trace flushing to avoid large traces residing in memory for too long
|
|
24
|
+
class Partial < Datadog::ContextFlush::Partial
|
|
25
|
+
prepend Tagging
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
3
|
+
require 'datadog/ci/contrib/cucumber/ext'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module CI
|
|
7
|
+
module Contrib
|
|
8
|
+
module Cucumber
|
|
9
|
+
module Configuration
|
|
10
|
+
# Custom settings for the Cucumber integration
|
|
11
|
+
class Settings < Datadog::Contrib::Configuration::Settings
|
|
12
|
+
option :enabled do |o|
|
|
13
|
+
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
|
|
14
|
+
o.lazy
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
option :service_name do |o|
|
|
18
|
+
o.default { Datadog.configuration.service_without_fallback || Ext::SERVICE_NAME }
|
|
19
|
+
o.lazy
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
option :operation_name do |o|
|
|
23
|
+
o.default { ENV.key?(Ext::ENV_OPERATION_NAME) ? ENV[Ext::ENV_OPERATION_NAME] : Ext::OPERATION_NAME }
|
|
24
|
+
o.lazy
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|