ddtrace 0.42.0 → 0.54.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|