ddtrace 0.45.0 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.editorconfig +22 -0
- data/.gitignore +7 -1
- data/CHANGELOG.md +406 -1
- data/CONTRIBUTING.md +1 -5
- data/LICENSE-3rdparty.csv +2 -0
- data/bin/ddtracerb +15 -0
- data/ddtrace.gemspec +19 -38
- data/docs/DevelopmentGuide.md +43 -0
- data/docs/GettingStarted.md +164 -76
- data/docs/ProfilingDevelopment.md +107 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +28 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +17 -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 +98 -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 +74 -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 +443 -0
- data/lib/datadog/ci/ext/settings.rb +11 -0
- data/lib/datadog/ci/ext/test.rb +35 -0
- data/lib/datadog/ci/extensions.rb +18 -0
- data/lib/datadog/ci/test.rb +77 -0
- data/lib/datadog/ci.rb +17 -0
- data/lib/datadog/contrib.rb +69 -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/ddtrace/analytics.rb +3 -0
- data/lib/ddtrace/auto_instrument.rb +2 -0
- data/lib/ddtrace/auto_instrument_base.rb +1 -0
- data/lib/ddtrace/buffer.rb +10 -8
- data/lib/ddtrace/chunker.rb +1 -0
- data/lib/ddtrace/configuration/agent_settings_resolver.rb +231 -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 +128 -10
- data/lib/ddtrace/configuration.rb +118 -26
- data/lib/ddtrace/context.rb +23 -20
- data/lib/ddtrace/context_flush.rb +15 -2
- data/lib/ddtrace/context_provider.rb +1 -1
- 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 +1 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +1 -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 +1 -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 -3
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -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 +1 -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_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 +1 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +5 -3
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +1 -0
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +8 -7
- 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 +1 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +1 -0
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +5 -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 +4 -3
- 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 +30 -0
- 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 -0
- data/lib/ddtrace/contrib/aws/services.rb +3 -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 -40
- data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +20 -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 +1 -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 +1 -1
- 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 +7 -6
- data/lib/ddtrace/contrib/ethon/ext.rb +1 -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 +3 -6
- data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
- data/lib/ddtrace/contrib/extensions.rb +64 -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 +1 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +34 -31
- data/lib/ddtrace/contrib/grape/ext.rb +1 -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 +7 -6
- 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 +1 -0
- data/lib/ddtrace/contrib/httpclient/ext.rb +1 -0
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +16 -20
- data/lib/ddtrace/contrib/httpclient/integration.rb +1 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +8 -4
- 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 +16 -21
- 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 +3 -2
- 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/{cucumber → lograge}/patcher.rb +7 -4
- 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 +5 -2
- data/lib/ddtrace/contrib/mongodb/integration.rb +1 -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 +3 -2
- 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 +1 -0
- data/lib/ddtrace/contrib/qless/ext.rb +1 -0
- data/lib/ddtrace/contrib/qless/integration.rb +1 -0
- data/lib/ddtrace/contrib/qless/patcher.rb +5 -5
- data/lib/ddtrace/contrib/qless/qless_job.rb +2 -0
- data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +2 -0
- data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -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 +2 -1
- 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 +1 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +7 -11
- data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
- data/lib/ddtrace/contrib/rack/request_queue.rb +1 -0
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +1 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/rails/ext.rb +1 -0
- data/lib/ddtrace/contrib/rails/framework.rb +26 -1
- 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 +18 -11
- data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
- data/lib/ddtrace/contrib/rails/utils.rb +1 -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 +1 -0
- data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +12 -4
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/redis/ext.rb +1 -0
- data/lib/ddtrace/contrib/redis/integration.rb +1 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +1 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +2 -0
- data/lib/ddtrace/contrib/redis/tags.rb +1 -0
- 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 +5 -4
- data/lib/ddtrace/contrib/registry.rb +3 -2
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +18 -1
- data/lib/ddtrace/contrib/resque/ext.rb +1 -0
- data/lib/ddtrace/contrib/resque/integration.rb +2 -1
- data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
- data/lib/ddtrace/contrib/resque/resque_job.rb +25 -1
- 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 +2 -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 +8 -4
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +3 -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 +2 -3
- 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 +14 -6
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +11 -4
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -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 +3 -4
- data/lib/ddtrace/contrib/status_code_matcher.rb +6 -3
- 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 -1
- data/lib/ddtrace/ext/correlation.rb +1 -0
- data/lib/ddtrace/ext/diagnostics.rb +1 -0
- data/lib/ddtrace/ext/distributed.rb +2 -1
- 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 +10 -1
- 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 +1 -0
- data/lib/ddtrace/ext/profiling.rb +56 -0
- data/lib/ddtrace/ext/runtime.rb +1 -7
- data/lib/ddtrace/ext/sampling.rb +1 -0
- data/lib/ddtrace/ext/sql.rb +1 -0
- data/lib/ddtrace/ext/test.rb +3 -18
- data/lib/ddtrace/ext/transport.rb +3 -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 +257 -0
- data/lib/ddtrace/profiling/encoding/profile.rb +38 -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/cpu.rb +67 -0
- data/lib/ddtrace/profiling/ext/cthread.rb +156 -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 +18 -0
- data/lib/ddtrace/profiling/pprof/builder.rb +120 -0
- data/lib/ddtrace/profiling/pprof/converter.rb +90 -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 +117 -0
- data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
- data/lib/ddtrace/profiling/pprof/template.rb +119 -0
- data/lib/ddtrace/profiling/preload.rb +4 -0
- data/lib/ddtrace/profiling/profiler.rb +31 -0
- data/lib/ddtrace/profiling/recorder.rb +96 -0
- data/lib/ddtrace/profiling/scheduler.rb +134 -0
- data/lib/ddtrace/profiling/tasks/setup.rb +82 -0
- data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +41 -0
- data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
- data/lib/ddtrace/profiling/transport/client.rb +15 -0
- data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +101 -0
- data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
- data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
- data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
- data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
- data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
- data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
- data/lib/ddtrace/profiling/transport/http.rb +120 -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 +151 -0
- data/lib/ddtrace/propagation/grpc_propagator.rb +2 -0
- data/lib/ddtrace/propagation/http_propagator.rb +3 -2
- data/lib/ddtrace/quantization/hash.rb +1 -0
- data/lib/ddtrace/quantization/http.rb +4 -0
- data/lib/ddtrace/runtime/metrics.rb +21 -14
- data/lib/ddtrace/sampler.rb +2 -1
- data/lib/ddtrace/sampling/matcher.rb +1 -0
- data/lib/ddtrace/sampling/rate_limiter.rb +1 -0
- data/lib/ddtrace/sampling/rule.rb +2 -1
- data/lib/ddtrace/sampling/rule_sampler.rb +6 -10
- data/lib/ddtrace/sampling.rb +1 -0
- data/lib/ddtrace/span.rb +44 -19
- 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 +48 -50
- data/lib/ddtrace/transport/http/adapters/net.rb +28 -8
- data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +1 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +3 -4
- 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 +8 -1
- 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 +51 -38
- 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 +2 -1
- 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 +34 -2
- data/lib/ddtrace/utils.rb +14 -2
- 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 +15 -2
- data/lib/ddtrace/worker.rb +1 -0
- data/lib/ddtrace/workers/async.rb +15 -5
- data/lib/ddtrace/workers/loop.rb +32 -5
- data/lib/ddtrace/workers/polling.rb +13 -5
- data/lib/ddtrace/workers/queue.rb +3 -1
- data/lib/ddtrace/workers/runtime_metrics.rb +15 -1
- data/lib/ddtrace/workers/trace_writer.rb +14 -16
- data/lib/ddtrace/workers.rb +8 -2
- data/lib/ddtrace/writer.rb +14 -7
- data/lib/ddtrace.rb +20 -56
- metadata +130 -446
- data/.circleci/config.yml +0 -566
- 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-3.0.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/.github/workflows/add-milestone-to-pull-requests.yml +0 -42
- data/.github/workflows/create-next-milestone.yml +0 -20
- data/.gitlab-ci.yml +0 -27
- data/.rspec +0 -1
- data/.rubocop.yml +0 -85
- data/.simplecov +0 -41
- data/Appraisals +0 -1350
- data/Gemfile +0 -9
- data/Rakefile +0 -993
- data/benchmarks/postgres_database.yml +0 -9
- data/benchmarks/sidekiq_test.rb +0 -154
- data/docker-compose.yml +0 -400
- 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/contrib/cucumber/configuration/settings.rb +0 -38
- data/lib/ddtrace/contrib/cucumber/ext.rb +0 -19
- data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -104
- data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
- data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
- data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -38
- data/lib/ddtrace/contrib/rspec/example.rb +0 -61
- data/lib/ddtrace/contrib/rspec/example_group.rb +0 -61
- data/lib/ddtrace/contrib/rspec/ext.rb +0 -19
- data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
- data/lib/ddtrace/contrib/rspec/patcher.rb +0 -25
- data/lib/ddtrace/environment.rb +0 -41
- data/lib/ddtrace/ext/ci.rb +0 -297
- 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 -40
- 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 trace_id and span_id for the given trace/span.
|
|
101
|
+
|
|
102
|
+
This is done using the `Datadog::Profiling::TraceIdentifiers::Helper` that retrieves a trace_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,28 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
def skip_building_extension?
|
|
3
|
+
# We don't support JRuby for profiling, and JRuby doesn't support native extensions, so let's just skip this entire
|
|
4
|
+
# thing so that JRuby users of dd-trace-rb aren't impacted.
|
|
5
|
+
on_jruby = RUBY_ENGINE == 'jruby'
|
|
6
|
+
|
|
7
|
+
# Experimental toggle to disable building the extension.
|
|
8
|
+
# Disabling the extension will lead to the profiler not working in future releases.
|
|
9
|
+
# If you needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.
|
|
10
|
+
disabled_via_env = ENV['DD_PROFILING_NO_EXTENSION'].to_s.downcase == 'true'
|
|
11
|
+
|
|
12
|
+
on_jruby || disabled_via_env
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
if skip_building_extension?
|
|
16
|
+
File.write('Makefile', 'all install clean: # dummy makefile that does nothing')
|
|
17
|
+
return
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# NOTE: we MUST NOT require 'mkmf' before we check the #skip_building_extension? because the require triggers checks
|
|
21
|
+
# that may fail on an environment not properly setup for building Ruby extensions.
|
|
22
|
+
require 'mkmf'
|
|
23
|
+
|
|
24
|
+
# Tag the native extension library with the Ruby version and Ruby platform.
|
|
25
|
+
# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
|
|
26
|
+
# the wrong library is never loaded.
|
|
27
|
+
# When requiring, we need to use the exact same string, including the version and the platform.
|
|
28
|
+
create_makefile "ddtrace_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include <stdio.h>
|
|
3
|
+
|
|
4
|
+
static VALUE native_working_p(VALUE self);
|
|
5
|
+
|
|
6
|
+
void Init_ddtrace_profiling_native_extension(void) {
|
|
7
|
+
VALUE datadog_module = rb_define_module("Datadog");
|
|
8
|
+
VALUE profiling_module = rb_define_module_under(datadog_module, "Profiling");
|
|
9
|
+
VALUE native_extension_module = rb_define_module_under(profiling_module, "NativeExtension");
|
|
10
|
+
|
|
11
|
+
rb_define_singleton_method(native_extension_module, "native_working?", native_working_p, 0);
|
|
12
|
+
rb_funcall(native_extension_module, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("native_working?")));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static VALUE native_working_p(VALUE self) {
|
|
16
|
+
return Qtrue;
|
|
17
|
+
}
|
|
@@ -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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
module Datadog
|
|
3
|
+
module CI
|
|
4
|
+
module Contrib
|
|
5
|
+
module Cucumber
|
|
6
|
+
# Cucumber integration constants
|
|
7
|
+
module Ext
|
|
8
|
+
APP = 'cucumber'.freeze
|
|
9
|
+
ENV_ENABLED = 'DD_TRACE_CUCUMBER_ENABLED'.freeze
|
|
10
|
+
ENV_OPERATION_NAME = 'DD_TRACE_CUCUMBER_OPERATION_NAME'.freeze
|
|
11
|
+
FRAMEWORK = 'cucumber'.freeze
|
|
12
|
+
OPERATION_NAME = 'cucumber.test'.freeze
|
|
13
|
+
SERVICE_NAME = 'cucumber'.freeze
|
|
14
|
+
STEP_SPAN_TYPE = 'step'.freeze
|
|
15
|
+
TEST_TYPE = 'test'.freeze
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'datadog/ci/test'
|
|
3
|
+
require 'datadog/ci/ext/app_types'
|
|
4
|
+
require 'datadog/ci/ext/environment'
|
|
5
|
+
require 'datadog/ci/ext/test'
|
|
6
|
+
require 'datadog/ci/contrib/cucumber/ext'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module CI
|
|
10
|
+
module Contrib
|
|
11
|
+
module Cucumber
|
|
12
|
+
# Defines collection of instrumented Cucumber events
|
|
13
|
+
class Formatter
|
|
14
|
+
attr_reader :config, :current_feature_span, :current_step_span
|
|
15
|
+
private :config
|
|
16
|
+
private :current_feature_span, :current_step_span
|
|
17
|
+
|
|
18
|
+
def initialize(config)
|
|
19
|
+
@config = config
|
|
20
|
+
|
|
21
|
+
bind_events(config)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def bind_events(config)
|
|
25
|
+
config.on_event :test_case_started, &method(:on_test_case_started)
|
|
26
|
+
config.on_event :test_case_finished, &method(:on_test_case_finished)
|
|
27
|
+
config.on_event :test_step_started, &method(:on_test_step_started)
|
|
28
|
+
config.on_event :test_step_finished, &method(:on_test_step_finished)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def on_test_case_started(event)
|
|
32
|
+
@current_feature_span = CI::Test.trace(
|
|
33
|
+
tracer,
|
|
34
|
+
configuration[:operation_name],
|
|
35
|
+
{
|
|
36
|
+
span_options: {
|
|
37
|
+
app: Ext::APP,
|
|
38
|
+
resource: event.test_case.name,
|
|
39
|
+
service: configuration[:service_name]
|
|
40
|
+
},
|
|
41
|
+
framework: Ext::FRAMEWORK,
|
|
42
|
+
test_name: event.test_case.name,
|
|
43
|
+
test_suite: event.test_case.location.file,
|
|
44
|
+
test_type: Ext::TEST_TYPE
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def on_test_case_finished(event)
|
|
50
|
+
return if @current_feature_span.nil?
|
|
51
|
+
|
|
52
|
+
if event.result.skipped?
|
|
53
|
+
CI::Test.skipped!(@current_feature_span)
|
|
54
|
+
elsif event.result.ok?
|
|
55
|
+
CI::Test.passed!(@current_feature_span)
|
|
56
|
+
elsif event.result.failed?
|
|
57
|
+
CI::Test.failed!(@current_feature_span)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
@current_feature_span.finish
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def on_test_step_started(event)
|
|
64
|
+
trace_options = {
|
|
65
|
+
resource: event.test_step.to_s,
|
|
66
|
+
span_type: Ext::STEP_SPAN_TYPE
|
|
67
|
+
}
|
|
68
|
+
@current_step_span = tracer.trace(Ext::STEP_SPAN_TYPE, trace_options)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def on_test_step_finished(event)
|
|
72
|
+
return if @current_step_span.nil?
|
|
73
|
+
|
|
74
|
+
if event.result.skipped?
|
|
75
|
+
CI::Test.skipped!(@current_step_span, event.result.exception)
|
|
76
|
+
elsif event.result.ok?
|
|
77
|
+
CI::Test.passed!(@current_step_span)
|
|
78
|
+
elsif event.result.failed?
|
|
79
|
+
CI::Test.failed!(@current_step_span, event.result.exception)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
@current_step_span.finish
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
def configuration
|
|
88
|
+
Datadog.configuration[:cucumber]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def tracer
|
|
92
|
+
configuration[:tracer]
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'datadog/ci/contrib/cucumber/formatter'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module CI
|
|
6
|
+
module Contrib
|
|
7
|
+
module Cucumber
|
|
8
|
+
# Instrumentation for Cucumber
|
|
9
|
+
module Instrumentation
|
|
10
|
+
def self.included(base)
|
|
11
|
+
base.prepend(InstanceMethods)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Instance methods for configuration
|
|
15
|
+
module InstanceMethods
|
|
16
|
+
attr_reader :datadog_formatter
|
|
17
|
+
|
|
18
|
+
def formatters
|
|
19
|
+
@datadog_formatter ||= Datadog::CI::Contrib::Cucumber::Formatter.new(@configuration)
|
|
20
|
+
[@datadog_formatter] + super
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/contrib/integration'
|
|
3
|
+
|
|
4
|
+
require 'datadog/ci/contrib/cucumber/configuration/settings'
|
|
5
|
+
require 'datadog/ci/contrib/cucumber/patcher'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module CI
|
|
9
|
+
module Contrib
|
|
10
|
+
module Cucumber
|
|
11
|
+
# Description of Cucumber integration
|
|
12
|
+
class Integration
|
|
13
|
+
include Datadog::Contrib::Integration
|
|
14
|
+
|
|
15
|
+
MINIMUM_VERSION = Gem::Version.new('3.0.0')
|
|
16
|
+
|
|
17
|
+
register_as :cucumber, auto_patch: true
|
|
18
|
+
|
|
19
|
+
def self.version
|
|
20
|
+
Gem.loaded_specs['cucumber'] \
|
|
21
|
+
&& Gem.loaded_specs['cucumber'].version
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.loaded?
|
|
25
|
+
!defined?(::Cucumber).nil? && !defined?(::Cucumber::Runtime).nil?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.compatible?
|
|
29
|
+
super && version >= MINIMUM_VERSION
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# test environments should not auto instrument test libraries
|
|
33
|
+
def auto_instrument?
|
|
34
|
+
false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def default_configuration
|
|
38
|
+
Configuration::Settings.new
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def patcher
|
|
42
|
+
Patcher
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/contrib/patcher'
|
|
3
|
+
require 'datadog/ci/contrib/cucumber/instrumentation'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module CI
|
|
7
|
+
module Contrib
|
|
8
|
+
module Cucumber
|
|
9
|
+
# Patcher enables patching of 'cucumber' module.
|
|
10
|
+
module Patcher
|
|
11
|
+
include Datadog::Contrib::Patcher
|
|
12
|
+
|
|
13
|
+
module_function
|
|
14
|
+
|
|
15
|
+
def target_version
|
|
16
|
+
Integration.version
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def patch
|
|
20
|
+
::Cucumber::Runtime.include(Instrumentation)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
3
|
+
require 'datadog/ci/contrib/rspec/ext'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module CI
|
|
7
|
+
module Contrib
|
|
8
|
+
module RSpec
|
|
9
|
+
module Configuration
|
|
10
|
+
# Custom settings for the RSpec 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
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'datadog/ci/test'
|
|
3
|
+
|
|
4
|
+
require 'datadog/ci/ext/app_types'
|
|
5
|
+
require 'datadog/ci/ext/environment'
|
|
6
|
+
require 'datadog/ci/ext/test'
|
|
7
|
+
require 'datadog/ci/contrib/rspec/ext'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module CI
|
|
11
|
+
module Contrib
|
|
12
|
+
module RSpec
|
|
13
|
+
# Instrument RSpec::Core::Example
|
|
14
|
+
module Example
|
|
15
|
+
def self.included(base)
|
|
16
|
+
base.prepend(InstanceMethods)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Instance methods for configuration
|
|
20
|
+
module InstanceMethods
|
|
21
|
+
def run(example_group_instance, reporter)
|
|
22
|
+
return super unless configuration[:enabled]
|
|
23
|
+
|
|
24
|
+
test_name = full_description.strip
|
|
25
|
+
if metadata[:description].empty?
|
|
26
|
+
# for unnamed it blocks this appends something like "example at ./spec/some_spec.rb:10"
|
|
27
|
+
test_name += " #{description}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
CI::Test.trace(
|
|
31
|
+
tracer,
|
|
32
|
+
configuration[:operation_name],
|
|
33
|
+
{
|
|
34
|
+
span_options: {
|
|
35
|
+
app: Ext::APP,
|
|
36
|
+
resource: test_name,
|
|
37
|
+
service: configuration[:service_name]
|
|
38
|
+
},
|
|
39
|
+
framework: Ext::FRAMEWORK,
|
|
40
|
+
test_name: test_name,
|
|
41
|
+
test_suite: file_path,
|
|
42
|
+
test_type: Ext::TEST_TYPE
|
|
43
|
+
}
|
|
44
|
+
) do |span|
|
|
45
|
+
result = super
|
|
46
|
+
|
|
47
|
+
case execution_result.status
|
|
48
|
+
when :passed
|
|
49
|
+
CI::Test.passed!(span)
|
|
50
|
+
when :failed
|
|
51
|
+
CI::Test.failed!(span, execution_result.exception)
|
|
52
|
+
else
|
|
53
|
+
CI::Test.skipped!(span, execution_result.exception) if execution_result.example_skipped?
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
result
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def configuration
|
|
63
|
+
Datadog.configuration[:rspec]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def tracer
|
|
67
|
+
configuration[:tracer]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
module Datadog
|
|
3
|
+
module CI
|
|
4
|
+
module Contrib
|
|
5
|
+
module RSpec
|
|
6
|
+
# RSpec integration constants
|
|
7
|
+
module Ext
|
|
8
|
+
APP = 'rspec'.freeze
|
|
9
|
+
ENV_ENABLED = 'DD_TRACE_RSPEC_ENABLED'.freeze
|
|
10
|
+
ENV_OPERATION_NAME = 'DD_TRACE_RSPEC_OPERATION_NAME'.freeze
|
|
11
|
+
FRAMEWORK = 'rspec'.freeze
|
|
12
|
+
OPERATION_NAME = 'rspec.example'.freeze
|
|
13
|
+
SERVICE_NAME = 'rspec'.freeze
|
|
14
|
+
TEST_TYPE = 'test'.freeze
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/contrib/integration'
|
|
3
|
+
|
|
4
|
+
require 'datadog/ci/contrib/rspec/configuration/settings'
|
|
5
|
+
require 'datadog/ci/contrib/rspec/patcher'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module CI
|
|
9
|
+
module Contrib
|
|
10
|
+
module RSpec
|
|
11
|
+
# Description of RSpec integration
|
|
12
|
+
class Integration
|
|
13
|
+
include Datadog::Contrib::Integration
|
|
14
|
+
|
|
15
|
+
MINIMUM_VERSION = Gem::Version.new('3.0.0')
|
|
16
|
+
|
|
17
|
+
register_as :rspec, auto_patch: true
|
|
18
|
+
|
|
19
|
+
def self.version
|
|
20
|
+
Gem.loaded_specs['rspec'] \
|
|
21
|
+
&& Gem.loaded_specs['rspec'].version
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.loaded?
|
|
25
|
+
!defined?(::RSpec).nil? && !defined?(::RSpec::Core).nil? && \
|
|
26
|
+
!defined?(::RSpec::Core::Example).nil?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.compatible?
|
|
30
|
+
super && version >= MINIMUM_VERSION
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# test environments should not auto instrument test libraries
|
|
34
|
+
def auto_instrument?
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def default_configuration
|
|
39
|
+
Configuration::Settings.new
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def patcher
|
|
43
|
+
Patcher
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|