ddtrace 0.40.0 → 0.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.editorconfig +22 -0
- data/.gitignore +7 -1
- data/CHANGELOG.md +1667 -350
- data/CONTRIBUTING.md +3 -7
- data/LICENSE-3rdparty.csv +2 -0
- data/README.md +1 -0
- data/bin/ddtracerb +15 -0
- data/ddtrace.gemspec +21 -37
- data/docs/DevelopmentGuide.md +56 -8
- data/docs/GettingStarted.md +438 -92
- data/docs/ProfilingDevelopment.md +107 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +86 -0
- data/ext/ddtrace_profiling_native_extension/clock_id.h +4 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +52 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +14 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +166 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +35 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +22 -0
- data/lib/datadog/ci/configuration/components.rb +31 -0
- data/lib/datadog/ci/configuration/settings.rb +37 -0
- data/lib/datadog/ci/context_flush.rb +29 -0
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +31 -0
- data/lib/datadog/ci/contrib/cucumber/ext.rb +20 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +99 -0
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +27 -0
- data/lib/datadog/ci/contrib/cucumber/integration.rb +48 -0
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +26 -0
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +31 -0
- data/lib/datadog/ci/contrib/rspec/example.rb +75 -0
- data/lib/datadog/ci/contrib/rspec/ext.rb +19 -0
- data/lib/datadog/ci/contrib/rspec/integration.rb +49 -0
- data/lib/datadog/ci/contrib/rspec/patcher.rb +26 -0
- data/lib/datadog/ci/ext/app_types.rb +10 -0
- data/lib/datadog/ci/ext/environment.rb +485 -0
- data/lib/datadog/ci/ext/settings.rb +11 -0
- data/lib/datadog/ci/ext/test.rb +36 -0
- data/lib/datadog/ci/extensions.rb +18 -0
- data/lib/datadog/ci/test.rb +81 -0
- data/lib/datadog/ci.rb +17 -0
- data/lib/datadog/contrib.rb +71 -0
- data/lib/datadog/core/environment/cgroup.rb +52 -0
- data/lib/datadog/core/environment/class_count.rb +20 -0
- data/lib/datadog/core/environment/container.rb +91 -0
- data/lib/datadog/core/environment/ext.rb +27 -0
- data/lib/datadog/core/environment/gc.rb +19 -0
- data/lib/datadog/core/environment/identity.rb +51 -0
- data/lib/datadog/core/environment/socket.rb +17 -0
- data/lib/datadog/core/environment/thread_count.rb +19 -0
- data/lib/datadog/core/environment/variable_helpers.rb +42 -0
- data/lib/datadog/core/environment/vm_cache.rb +46 -0
- data/lib/ddtrace/analytics.rb +3 -0
- data/lib/ddtrace/auto_instrument.rb +5 -0
- data/lib/ddtrace/auto_instrument_base.rb +7 -0
- data/lib/ddtrace/buffer.rb +278 -57
- data/lib/ddtrace/chunker.rb +1 -0
- data/lib/ddtrace/configuration/agent_settings_resolver.rb +309 -0
- data/lib/ddtrace/configuration/base.rb +9 -11
- data/lib/ddtrace/configuration/components.rb +167 -26
- data/lib/ddtrace/configuration/dependency_resolver.rb +1 -0
- data/lib/ddtrace/configuration/option.rb +1 -0
- data/lib/ddtrace/configuration/option_definition.rb +2 -3
- data/lib/ddtrace/configuration/option_definition_set.rb +1 -0
- data/lib/ddtrace/configuration/option_set.rb +1 -0
- data/lib/ddtrace/configuration/options.rb +10 -10
- data/lib/ddtrace/configuration/pin_setup.rb +1 -0
- data/lib/ddtrace/configuration/settings.rb +147 -13
- data/lib/ddtrace/configuration.rb +133 -22
- data/lib/ddtrace/context.rb +51 -22
- data/lib/ddtrace/context_flush.rb +15 -2
- data/lib/ddtrace/context_provider.rb +17 -5
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/event.rb +6 -4
- data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/events/transmit.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/events.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/ext.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +47 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +8 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +2 -0
- data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/event.rb +50 -0
- data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +54 -0
- data/lib/ddtrace/contrib/action_mailer/events/process.rb +41 -0
- data/lib/ddtrace/contrib/action_mailer/events.rb +31 -0
- data/lib/ddtrace/contrib/action_mailer/ext.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/integration.rb +45 -0
- data/lib/ddtrace/contrib/action_mailer/patcher.rb +27 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +22 -13
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +2 -1
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/action_pack/ext.rb +1 -0
- data/lib/ddtrace/contrib/action_pack/integration.rb +8 -0
- data/lib/ddtrace/contrib/action_pack/patcher.rb +1 -0
- data/lib/ddtrace/contrib/action_pack/utils.rb +2 -1
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/action_view/event.rb +4 -7
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +2 -0
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +2 -0
- data/lib/ddtrace/contrib/action_view/events.rb +1 -0
- data/lib/ddtrace/contrib/action_view/ext.rb +1 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +1 -0
- data/lib/ddtrace/contrib/action_view/integration.rb +8 -0
- data/lib/ddtrace/contrib/action_view/patcher.rb +5 -4
- data/lib/ddtrace/contrib/action_view/utils.rb +2 -1
- data/lib/ddtrace/contrib/active_job/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/active_job/event.rb +54 -0
- data/lib/ddtrace/contrib/active_job/events/discard.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +47 -0
- data/lib/ddtrace/contrib/active_job/events/perform.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events.rb +39 -0
- data/lib/ddtrace/contrib/active_job/ext.rb +32 -0
- data/lib/ddtrace/contrib/active_job/integration.rb +46 -0
- data/lib/ddtrace/contrib/active_job/log_injection.rb +21 -0
- data/lib/ddtrace/contrib/active_job/patcher.rb +33 -0
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -2
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/events.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +1 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +1 -0
- data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +31 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +108 -18
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/active_record/event.rb +3 -2
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -0
- data/lib/ddtrace/contrib/active_record/events/sql.rb +5 -0
- data/lib/ddtrace/contrib/active_record/events.rb +1 -0
- data/lib/ddtrace/contrib/active_record/ext.rb +1 -0
- data/lib/ddtrace/contrib/active_record/integration.rb +8 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +69 -21
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +105 -3
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +26 -4
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +2 -5
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/active_support/ext.rb +4 -0
- data/lib/ddtrace/contrib/active_support/integration.rb +8 -1
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +15 -3
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -1
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +12 -7
- data/lib/ddtrace/contrib/active_support/patcher.rb +1 -0
- data/lib/ddtrace/contrib/analytics.rb +1 -0
- data/lib/ddtrace/contrib/auto_instrument.rb +48 -0
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/aws/ext.rb +1 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +36 -1
- data/lib/ddtrace/contrib/aws/integration.rb +1 -0
- data/lib/ddtrace/contrib/aws/parsed_context.rb +1 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +6 -1
- data/lib/ddtrace/contrib/aws/services.rb +4 -0
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +1 -0
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +3 -1
- data/lib/ddtrace/contrib/configurable.rb +65 -38
- data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +21 -20
- data/lib/ddtrace/contrib/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/dalli/ext.rb +1 -0
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +6 -1
- data/lib/ddtrace/contrib/dalli/integration.rb +1 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +2 -39
- data/lib/ddtrace/contrib/dalli/quantize.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +3 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +3 -0
- data/lib/ddtrace/contrib/delayed_job/integration.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +1 -0
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +40 -16
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +6 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +6 -2
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +15 -11
- data/lib/ddtrace/contrib/ethon/ext.rb +2 -0
- data/lib/ddtrace/contrib/ethon/integration.rb +1 -0
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +6 -1
- data/lib/ddtrace/contrib/ethon/patcher.rb +4 -2
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/excon/ext.rb +1 -0
- data/lib/ddtrace/contrib/excon/integration.rb +1 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +14 -7
- data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
- data/lib/ddtrace/contrib/extensions.rb +90 -14
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/faraday/connection.rb +1 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +1 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +1 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +6 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +3 -38
- data/lib/ddtrace/contrib/faraday/rack_builder.rb +1 -0
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +73 -35
- data/lib/ddtrace/contrib/grape/ext.rb +2 -0
- data/lib/ddtrace/contrib/grape/instrumentation.rb +4 -3
- data/lib/ddtrace/contrib/grape/integration.rb +1 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +2 -43
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/graphql/ext.rb +1 -0
- data/lib/ddtrace/contrib/graphql/integration.rb +1 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +1 -0
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +6 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +13 -8
- data/lib/ddtrace/contrib/grpc/ext.rb +1 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +1 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +1 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +3 -37
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +2 -3
- data/lib/ddtrace/contrib/http/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/http/ext.rb +1 -0
- data/lib/ddtrace/contrib/http/instrumentation.rb +13 -8
- data/lib/ddtrace/contrib/http/integration.rb +1 -0
- data/lib/ddtrace/contrib/http/patcher.rb +2 -1
- data/lib/ddtrace/contrib/http_annotation_helper.rb +1 -0
- data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/httpclient/ext.rb +18 -0
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +148 -0
- data/lib/ddtrace/contrib/httpclient/integration.rb +44 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +39 -0
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +1 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +20 -22
- data/lib/ddtrace/contrib/httprb/integration.rb +1 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +8 -4
- data/lib/ddtrace/contrib/integration.rb +4 -3
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/kafka/consumer_event.rb +1 -0
- data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +1 -0
- data/lib/ddtrace/contrib/kafka/event.rb +4 -3
- data/lib/ddtrace/contrib/kafka/events/connection/request.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +1 -0
- data/lib/ddtrace/contrib/kafka/events.rb +1 -0
- data/lib/ddtrace/contrib/kafka/ext.rb +1 -0
- data/lib/ddtrace/contrib/kafka/integration.rb +1 -0
- data/lib/ddtrace/contrib/kafka/patcher.rb +1 -0
- data/lib/ddtrace/contrib/lograge/configuration/settings.rb +19 -0
- data/lib/ddtrace/contrib/lograge/ext.rb +11 -0
- data/lib/ddtrace/contrib/lograge/instrumentation.rb +39 -0
- data/lib/ddtrace/contrib/lograge/integration.rb +46 -0
- data/lib/ddtrace/contrib/lograge/patcher.rb +26 -0
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/mongodb/ext.rb +1 -0
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +6 -3
- data/lib/ddtrace/contrib/mongodb/integration.rb +6 -0
- data/lib/ddtrace/contrib/mongodb/parsers.rb +1 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -2
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +7 -3
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/mysql2/ext.rb +1 -0
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +6 -1
- data/lib/ddtrace/contrib/mysql2/integration.rb +1 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -1
- data/lib/ddtrace/contrib/patchable.rb +21 -9
- data/lib/ddtrace/contrib/patcher.rb +12 -8
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/presto/ext.rb +1 -0
- data/lib/ddtrace/contrib/presto/instrumentation.rb +5 -1
- data/lib/ddtrace/contrib/presto/integration.rb +1 -0
- data/lib/ddtrace/contrib/presto/patcher.rb +7 -3
- data/lib/ddtrace/contrib/qless/configuration/settings.rb +36 -0
- data/lib/ddtrace/contrib/qless/ext.rb +21 -0
- data/lib/ddtrace/contrib/qless/integration.rb +39 -0
- data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
- data/lib/ddtrace/contrib/qless/qless_job.rb +74 -0
- data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +34 -0
- data/lib/ddtrace/contrib/que/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/que/ext.rb +20 -19
- data/lib/ddtrace/contrib/que/integration.rb +1 -0
- data/lib/ddtrace/contrib/que/patcher.rb +1 -0
- data/lib/ddtrace/contrib/que/tracer.rb +4 -2
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/racecar/event.rb +8 -2
- data/lib/ddtrace/contrib/racecar/events/batch.rb +1 -0
- data/lib/ddtrace/contrib/racecar/events/consume.rb +1 -0
- data/lib/ddtrace/contrib/racecar/events/message.rb +1 -0
- data/lib/ddtrace/contrib/racecar/events.rb +1 -0
- data/lib/ddtrace/contrib/racecar/ext.rb +1 -0
- data/lib/ddtrace/contrib/racecar/integration.rb +1 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +1 -0
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +4 -3
- data/lib/ddtrace/contrib/rack/ext.rb +1 -0
- data/lib/ddtrace/contrib/rack/integration.rb +8 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +8 -12
- data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
- data/lib/ddtrace/contrib/rack/request_queue.rb +7 -1
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +8 -0
- data/lib/ddtrace/contrib/rails/ext.rb +1 -0
- data/lib/ddtrace/contrib/rails/framework.rb +50 -2
- data/lib/ddtrace/contrib/rails/integration.rb +1 -0
- data/lib/ddtrace/contrib/rails/log_injection.rb +1 -40
- data/lib/ddtrace/contrib/rails/middlewares.rb +1 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +47 -17
- data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
- data/lib/ddtrace/contrib/rails/utils.rb +5 -0
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/rake/ext.rb +1 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -3
- data/lib/ddtrace/contrib/rake/integration.rb +2 -1
- data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +15 -5
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +6 -0
- data/lib/ddtrace/contrib/redis/ext.rb +2 -0
- data/lib/ddtrace/contrib/redis/instrumentation.rb +90 -0
- data/lib/ddtrace/contrib/redis/integration.rb +1 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +3 -67
- data/lib/ddtrace/contrib/redis/quantize.rb +29 -0
- data/lib/ddtrace/contrib/redis/tags.rb +10 -1
- data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +7 -7
- data/lib/ddtrace/contrib/registerable.rb +4 -4
- data/lib/ddtrace/contrib/registry.rb +3 -2
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +19 -1
- data/lib/ddtrace/contrib/resque/ext.rb +1 -0
- data/lib/ddtrace/contrib/resque/integration.rb +2 -5
- data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
- data/lib/ddtrace/contrib/resque/resque_job.rb +26 -2
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/rest_client/ext.rb +1 -0
- data/lib/ddtrace/contrib/rest_client/integration.rb +1 -0
- data/lib/ddtrace/contrib/rest_client/patcher.rb +3 -1
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +7 -4
- data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +19 -0
- data/lib/ddtrace/contrib/semantic_logger/ext.rb +11 -0
- data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +43 -0
- data/lib/ddtrace/contrib/semantic_logger/integration.rb +48 -0
- data/lib/ddtrace/contrib/semantic_logger/patcher.rb +26 -0
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sequel/database.rb +5 -2
- data/lib/ddtrace/contrib/sequel/dataset.rb +5 -3
- data/lib/ddtrace/contrib/sequel/ext.rb +2 -0
- data/lib/ddtrace/contrib/sequel/integration.rb +1 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +3 -2
- data/lib/ddtrace/contrib/sequel/utils.rb +16 -5
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +3 -0
- data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/integration.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +9 -2
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +4 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +11 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +27 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +29 -0
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +6 -7
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +4 -4
- data/lib/ddtrace/contrib/sinatra/ext.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +2 -3
- data/lib/ddtrace/contrib/sinatra/integration.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +3 -1
- data/lib/ddtrace/contrib/sinatra/tracer.rb +28 -7
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +13 -6
- data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/sneakers/ext.rb +12 -11
- data/lib/ddtrace/contrib/sneakers/integration.rb +1 -0
- data/lib/ddtrace/contrib/sneakers/patcher.rb +1 -0
- data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -21
- data/lib/ddtrace/contrib/status_code_matcher.rb +70 -0
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +5 -6
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -0
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +5 -0
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +1 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +2 -0
- data/lib/ddtrace/correlation.rb +3 -1
- data/lib/ddtrace/diagnostics/environment_logger.rb +9 -7
- data/lib/ddtrace/diagnostics/health.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/b3.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +2 -3
- data/lib/ddtrace/encoding.rb +3 -0
- data/lib/ddtrace/error.rb +78 -8
- data/lib/ddtrace/event.rb +1 -0
- data/lib/ddtrace/ext/analytics.rb +1 -0
- data/lib/ddtrace/ext/app_types.rb +1 -0
- data/lib/ddtrace/ext/correlation.rb +1 -0
- data/lib/ddtrace/ext/diagnostics.rb +1 -0
- data/lib/ddtrace/ext/distributed.rb +9 -2
- data/lib/ddtrace/ext/environment.rb +8 -0
- data/lib/ddtrace/ext/errors.rb +1 -0
- data/lib/ddtrace/ext/forced_tracing.rb +1 -0
- data/lib/ddtrace/ext/git.rb +32 -0
- data/lib/ddtrace/ext/http.rb +2 -1
- data/lib/ddtrace/ext/integration.rb +9 -0
- data/lib/ddtrace/ext/manual_tracing.rb +1 -0
- data/lib/ddtrace/ext/metrics.rb +1 -0
- data/lib/ddtrace/ext/net.rb +1 -0
- data/lib/ddtrace/ext/priority.rb +7 -4
- data/lib/ddtrace/ext/profiling.rb +57 -0
- data/lib/ddtrace/ext/runtime.rb +5 -6
- data/lib/ddtrace/ext/sampling.rb +1 -0
- data/lib/ddtrace/ext/sql.rb +1 -0
- data/lib/ddtrace/ext/test.rb +9 -0
- data/lib/ddtrace/ext/transport.rb +14 -0
- data/lib/ddtrace/forced_tracing.rb +3 -0
- data/lib/ddtrace/logger.rb +2 -1
- data/lib/ddtrace/metrics.rb +84 -24
- data/lib/ddtrace/opentelemetry/extensions.rb +2 -1
- data/lib/ddtrace/opentelemetry/span.rb +1 -0
- data/lib/ddtrace/opentracer/binary_propagator.rb +1 -0
- data/lib/ddtrace/opentracer/carrier.rb +1 -0
- data/lib/ddtrace/opentracer/distributed_headers.rb +5 -1
- data/lib/ddtrace/opentracer/global_tracer.rb +1 -0
- data/lib/ddtrace/opentracer/propagator.rb +1 -0
- data/lib/ddtrace/opentracer/rack_propagator.rb +1 -0
- data/lib/ddtrace/opentracer/scope.rb +1 -0
- data/lib/ddtrace/opentracer/scope_manager.rb +1 -0
- data/lib/ddtrace/opentracer/span.rb +3 -6
- data/lib/ddtrace/opentracer/span_context.rb +1 -0
- data/lib/ddtrace/opentracer/span_context_factory.rb +1 -0
- data/lib/ddtrace/opentracer/text_map_propagator.rb +1 -0
- data/lib/ddtrace/opentracer/thread_local_scope.rb +2 -0
- data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +1 -0
- data/lib/ddtrace/opentracer/tracer.rb +1 -0
- data/lib/ddtrace/opentracer.rb +21 -39
- data/lib/ddtrace/patcher.rb +28 -6
- data/lib/ddtrace/pin.rb +9 -61
- data/lib/ddtrace/pipeline/span_filter.rb +2 -1
- data/lib/ddtrace/pipeline/span_processor.rb +1 -0
- data/lib/ddtrace/pipeline.rb +1 -0
- data/lib/ddtrace/profiling/backtrace_location.rb +33 -0
- data/lib/ddtrace/profiling/buffer.rb +42 -0
- data/lib/ddtrace/profiling/collectors/stack.rb +301 -0
- data/lib/ddtrace/profiling/encoding/profile.rb +46 -0
- data/lib/ddtrace/profiling/event.rb +14 -0
- data/lib/ddtrace/profiling/events/stack.rb +81 -0
- data/lib/ddtrace/profiling/exporter.rb +24 -0
- data/lib/ddtrace/profiling/ext/forking.rb +98 -0
- data/lib/ddtrace/profiling/flush.rb +44 -0
- data/lib/ddtrace/profiling/native_extension.rb +40 -0
- data/lib/ddtrace/profiling/pprof/builder.rb +126 -0
- data/lib/ddtrace/profiling/pprof/converter.rb +103 -0
- data/lib/ddtrace/profiling/pprof/message_set.rb +15 -0
- data/lib/ddtrace/profiling/pprof/payload.rb +19 -0
- data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
- data/lib/ddtrace/profiling/pprof/pprof_pb.rb +82 -0
- data/lib/ddtrace/profiling/pprof/stack_sample.rb +140 -0
- data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
- data/lib/ddtrace/profiling/pprof/template.rb +119 -0
- data/lib/ddtrace/profiling/preload.rb +4 -0
- data/lib/ddtrace/profiling/profiler.rb +31 -0
- data/lib/ddtrace/profiling/recorder.rb +96 -0
- data/lib/ddtrace/profiling/scheduler.rb +134 -0
- data/lib/ddtrace/profiling/tasks/setup.rb +90 -0
- data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +42 -0
- data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
- data/lib/ddtrace/profiling/transport/client.rb +15 -0
- data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +101 -0
- data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
- data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
- data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
- data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
- data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
- data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
- data/lib/ddtrace/profiling/transport/http.rb +111 -0
- data/lib/ddtrace/profiling/transport/io/client.rb +28 -0
- data/lib/ddtrace/profiling/transport/io/response.rb +17 -0
- data/lib/ddtrace/profiling/transport/io.rb +31 -0
- data/lib/ddtrace/profiling/transport/parcel.rb +18 -0
- data/lib/ddtrace/profiling/transport/request.rb +16 -0
- data/lib/ddtrace/profiling/transport/response.rb +9 -0
- data/lib/ddtrace/profiling.rb +149 -0
- data/lib/ddtrace/propagation/grpc_propagator.rb +20 -6
- data/lib/ddtrace/propagation/http_propagator.rb +18 -2
- data/lib/ddtrace/quantization/hash.rb +1 -0
- data/lib/ddtrace/quantization/http.rb +4 -0
- data/lib/ddtrace/runtime/metrics.rb +40 -15
- data/lib/ddtrace/sampler.rb +22 -11
- data/lib/ddtrace/sampling/matcher.rb +1 -0
- data/lib/ddtrace/sampling/rate_limiter.rb +66 -16
- data/lib/ddtrace/sampling/rule.rb +2 -1
- data/lib/ddtrace/sampling/rule_sampler.rb +19 -11
- data/lib/ddtrace/sampling.rb +1 -0
- data/lib/ddtrace/span.rb +174 -36
- data/lib/ddtrace/sync_writer.rb +17 -15
- data/lib/ddtrace/tasks/exec.rb +47 -0
- data/lib/ddtrace/tasks/help.rb +15 -0
- data/lib/ddtrace/tracer.rb +72 -62
- data/lib/ddtrace/transport/http/adapters/net.rb +48 -12
- data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +5 -2
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +26 -16
- data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
- data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
- data/lib/ddtrace/transport/http/api/instance.rb +1 -0
- data/lib/ddtrace/transport/http/api/map.rb +1 -0
- data/lib/ddtrace/transport/http/api/spec.rb +1 -0
- data/lib/ddtrace/transport/http/api.rb +1 -0
- data/lib/ddtrace/transport/http/builder.rb +21 -7
- data/lib/ddtrace/transport/http/client.rb +3 -1
- data/lib/ddtrace/transport/http/env.rb +9 -0
- data/lib/ddtrace/transport/http/response.rb +1 -0
- data/lib/ddtrace/transport/http/statistics.rb +17 -3
- data/lib/ddtrace/transport/http/traces.rb +6 -6
- data/lib/ddtrace/transport/http.rb +48 -41
- data/lib/ddtrace/transport/io/client.rb +17 -9
- data/lib/ddtrace/transport/io/response.rb +2 -3
- data/lib/ddtrace/transport/io/traces.rb +10 -1
- data/lib/ddtrace/transport/io.rb +2 -1
- data/lib/ddtrace/transport/parcel.rb +7 -0
- data/lib/ddtrace/transport/request.rb +1 -0
- data/lib/ddtrace/transport/response.rb +1 -0
- data/lib/ddtrace/transport/statistics.rb +1 -0
- data/lib/ddtrace/transport/traces.rb +28 -5
- data/lib/ddtrace/utils/compression.rb +28 -0
- data/lib/ddtrace/utils/database.rb +1 -0
- data/lib/ddtrace/utils/forking.rb +53 -0
- data/lib/ddtrace/utils/object_set.rb +40 -0
- data/lib/ddtrace/utils/only_once.rb +41 -0
- data/lib/ddtrace/utils/sequence.rb +18 -0
- data/lib/ddtrace/utils/string_table.rb +46 -0
- data/lib/ddtrace/utils/time.rb +40 -3
- data/lib/ddtrace/utils.rb +29 -14
- data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
- data/lib/ddtrace/vendor/active_record/connection_specification.rb +1 -0
- data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +117 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +58 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +136 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +10 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +9 -0
- data/lib/ddtrace/vendor/multipart-post/multipart.rb +13 -0
- data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +33 -0
- data/lib/ddtrace/version.rb +16 -3
- data/lib/ddtrace/worker.rb +1 -0
- data/lib/ddtrace/workers/async.rb +15 -5
- data/lib/ddtrace/workers/loop.rb +32 -5
- data/lib/ddtrace/workers/polling.rb +13 -5
- data/lib/ddtrace/workers/queue.rb +3 -1
- data/lib/ddtrace/workers/runtime_metrics.rb +22 -4
- data/lib/ddtrace/workers/trace_writer.rb +14 -16
- data/lib/ddtrace/workers.rb +8 -2
- data/lib/ddtrace/writer.rb +33 -8
- data/lib/ddtrace.rb +22 -48
- metadata +180 -374
- data/.circleci/config.yml +0 -548
- data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
- data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
- data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
- data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
- data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
- data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
- data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
- data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
- data/.dockerignore +0 -1
- data/.env +0 -26
- data/.github/CODEOWNERS +0 -1
- data/.gitlab-ci.yml +0 -27
- data/.rspec +0 -1
- data/.rubocop.yml +0 -85
- data/.simplecov +0 -38
- data/Appraisals +0 -1071
- data/Gemfile +0 -7
- data/Rakefile +0 -791
- data/benchmarks/postgres_database.yml +0 -9
- data/benchmarks/sidekiq_test.rb +0 -154
- data/docker-compose.yml +0 -370
- data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
- data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
- data/lib/ddtrace/augmentation/shim.rb +0 -102
- data/lib/ddtrace/augmentation.rb +0 -13
- data/lib/ddtrace/environment.rb +0 -41
- data/lib/ddtrace/monkey.rb +0 -58
- data/lib/ddtrace/runtime/cgroup.rb +0 -44
- data/lib/ddtrace/runtime/class_count.rb +0 -17
- data/lib/ddtrace/runtime/container.rb +0 -73
- data/lib/ddtrace/runtime/gc.rb +0 -16
- data/lib/ddtrace/runtime/identity.rb +0 -41
- data/lib/ddtrace/runtime/object_space.rb +0 -19
- data/lib/ddtrace/runtime/socket.rb +0 -14
- data/lib/ddtrace/runtime/thread_count.rb +0 -16
- data/tasks/release_gem.rake +0 -28
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/ext/profiling'
|
|
3
|
+
require 'ddtrace/profiling/events/stack'
|
|
4
|
+
require 'ddtrace/profiling/pprof/builder'
|
|
5
|
+
require 'ddtrace/profiling/pprof/converter'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Profiling
|
|
9
|
+
module Pprof
|
|
10
|
+
# Builds a profile from a StackSample
|
|
11
|
+
#
|
|
12
|
+
# NOTE: This class may appear stateless but is in fact stateful; a new instance should be created for every
|
|
13
|
+
# encoded profile.
|
|
14
|
+
class StackSample < Converter
|
|
15
|
+
SAMPLE_TYPES = {
|
|
16
|
+
cpu_time_ns: [
|
|
17
|
+
Datadog::Ext::Profiling::Pprof::VALUE_TYPE_CPU,
|
|
18
|
+
Datadog::Ext::Profiling::Pprof::VALUE_UNIT_NANOSECONDS
|
|
19
|
+
],
|
|
20
|
+
wall_time_ns: [
|
|
21
|
+
Datadog::Ext::Profiling::Pprof::VALUE_TYPE_WALL,
|
|
22
|
+
Datadog::Ext::Profiling::Pprof::VALUE_UNIT_NANOSECONDS
|
|
23
|
+
]
|
|
24
|
+
}.freeze
|
|
25
|
+
|
|
26
|
+
def self.sample_value_types
|
|
27
|
+
SAMPLE_TYPES
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def initialize(*_)
|
|
31
|
+
super
|
|
32
|
+
|
|
33
|
+
@most_recent_trace_samples = {}
|
|
34
|
+
@processed_unique_stacks = 0
|
|
35
|
+
@processed_with_trace = 0
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def add_events!(stack_samples)
|
|
39
|
+
new_samples = build_samples(stack_samples)
|
|
40
|
+
builder.samples.concat(new_samples)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def stack_sample_group_key(stack_sample)
|
|
44
|
+
# We want to make sure we have the most recent sample for any trace.
|
|
45
|
+
# (This is done here to save an iteration over all samples.)
|
|
46
|
+
update_most_recent_trace_sample(stack_sample)
|
|
47
|
+
|
|
48
|
+
stack_sample.hash
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Track the most recent sample for each trace (identified by root span id)
|
|
52
|
+
def update_most_recent_trace_sample(stack_sample)
|
|
53
|
+
return unless stack_sample.root_span_id && stack_sample.trace_resource
|
|
54
|
+
|
|
55
|
+
# Update trace resource with most recent value
|
|
56
|
+
if (most_recent_trace_sample = @most_recent_trace_samples[stack_sample.root_span_id])
|
|
57
|
+
if most_recent_trace_sample.timestamp < stack_sample.timestamp
|
|
58
|
+
@most_recent_trace_samples[stack_sample.root_span_id] = stack_sample
|
|
59
|
+
end
|
|
60
|
+
else
|
|
61
|
+
# Add trace resource
|
|
62
|
+
@most_recent_trace_samples[stack_sample.root_span_id] = stack_sample
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def build_samples(stack_samples)
|
|
67
|
+
groups = group_events(stack_samples, &method(:stack_sample_group_key))
|
|
68
|
+
groups.collect do |_group_key, group|
|
|
69
|
+
@processed_unique_stacks += 1
|
|
70
|
+
build_sample(group.sample, group.values)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def build_sample(stack_sample, values)
|
|
75
|
+
locations = builder.build_locations(
|
|
76
|
+
stack_sample.frames,
|
|
77
|
+
stack_sample.total_frame_count
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
Perftools::Profiles::Sample.new(
|
|
81
|
+
location_id: locations.collect { |location| location['id'.freeze] },
|
|
82
|
+
value: values,
|
|
83
|
+
label: build_sample_labels(stack_sample)
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def build_event_values(stack_sample)
|
|
88
|
+
no_value = Datadog::Ext::Profiling::Pprof::SAMPLE_VALUE_NO_VALUE
|
|
89
|
+
values = super(stack_sample)
|
|
90
|
+
values[sample_value_index(:cpu_time_ns)] = stack_sample.cpu_time_interval_ns || no_value
|
|
91
|
+
values[sample_value_index(:wall_time_ns)] = stack_sample.wall_time_interval_ns || no_value
|
|
92
|
+
values
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def build_sample_labels(stack_sample)
|
|
96
|
+
labels = [
|
|
97
|
+
Perftools::Profiles::Label.new(
|
|
98
|
+
key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_THREAD_ID),
|
|
99
|
+
str: builder.string_table.fetch(stack_sample.thread_id.to_s)
|
|
100
|
+
)
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
root_span_id = stack_sample.root_span_id || 0
|
|
104
|
+
span_id = stack_sample.span_id || 0
|
|
105
|
+
|
|
106
|
+
if root_span_id != 0 && span_id != 0
|
|
107
|
+
@processed_with_trace += 1
|
|
108
|
+
|
|
109
|
+
labels << Perftools::Profiles::Label.new(
|
|
110
|
+
key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_LOCAL_ROOT_SPAN_ID),
|
|
111
|
+
str: builder.string_table.fetch(root_span_id.to_s)
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
labels << Perftools::Profiles::Label.new(
|
|
115
|
+
key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_SPAN_ID),
|
|
116
|
+
str: builder.string_table.fetch(span_id.to_s)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Use most up-to-date trace resource, if available.
|
|
120
|
+
# Otherwise, use the trace resource provided.
|
|
121
|
+
trace_resource = @most_recent_trace_samples.fetch(stack_sample.root_span_id, stack_sample).trace_resource
|
|
122
|
+
|
|
123
|
+
if trace_resource && !trace_resource.empty?
|
|
124
|
+
labels << Perftools::Profiles::Label.new(
|
|
125
|
+
key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_TRACE_ENDPOINT),
|
|
126
|
+
str: builder.string_table.fetch(trace_resource)
|
|
127
|
+
)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
labels
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def debug_statistics
|
|
135
|
+
"unique stacks: #{@processed_unique_stacks}, of which had active traces: #{@processed_with_trace}"
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/profiling/pprof/payload'
|
|
3
|
+
require 'ddtrace/profiling/pprof/message_set'
|
|
4
|
+
require 'ddtrace/profiling/pprof/builder'
|
|
5
|
+
|
|
6
|
+
require 'ddtrace/profiling/events/stack'
|
|
7
|
+
require 'ddtrace/profiling/pprof/stack_sample'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Profiling
|
|
11
|
+
module Pprof
|
|
12
|
+
# Converts a collection of profiling events into a Perftools::Profiles::Profile
|
|
13
|
+
class Template
|
|
14
|
+
DEFAULT_MAPPINGS = {
|
|
15
|
+
Events::StackSample => Pprof::StackSample
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
attr_reader \
|
|
19
|
+
:builder,
|
|
20
|
+
:converters,
|
|
21
|
+
:sample_type_mappings
|
|
22
|
+
|
|
23
|
+
def self.for_event_classes(event_classes)
|
|
24
|
+
# Build a map of event class --> converter class
|
|
25
|
+
mappings = event_classes.each_with_object({}) do |event_class, m|
|
|
26
|
+
converter_class = DEFAULT_MAPPINGS[event_class]
|
|
27
|
+
raise NoProfilingEventConversionError, event_class unless converter_class
|
|
28
|
+
|
|
29
|
+
m[event_class] = converter_class
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
new(mappings)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def initialize(mappings)
|
|
36
|
+
@builder = Builder.new
|
|
37
|
+
@converters = Hash.new { |_h, event_class| raise NoProfilingEventConversionError, event_class }
|
|
38
|
+
@sample_type_mappings = Hash.new { |_h, type| raise UnknownSampleTypeMappingError, type }
|
|
39
|
+
|
|
40
|
+
# Add default mapping
|
|
41
|
+
builder.mappings.fetch($PROGRAM_NAME, &builder.method(:build_mapping))
|
|
42
|
+
|
|
43
|
+
# Combine all sample types from each converter class
|
|
44
|
+
types = mappings.values.each_with_object({}) do |converter_class, t|
|
|
45
|
+
t.merge!(converter_class.sample_value_types)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Build the sample types into sample type objects
|
|
49
|
+
types.each do |type_name, type_args|
|
|
50
|
+
index = nil
|
|
51
|
+
|
|
52
|
+
sample_type = builder.sample_types.fetch(*type_args) do |id, type, unit|
|
|
53
|
+
index = id
|
|
54
|
+
builder.build_value_type(type, unit)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Create mapping between the type and index to which its assigned.
|
|
58
|
+
# Do this for faster lookup while building profile sample values.
|
|
59
|
+
sample_type_mappings[type_name] = index || builder.sample_types.messages.index(sample_type)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Freeze them so they can't be modified.
|
|
63
|
+
# We don't want the number of sample types to vary between samples within the same profile.
|
|
64
|
+
builder.sample_types.freeze
|
|
65
|
+
sample_type_mappings.freeze
|
|
66
|
+
|
|
67
|
+
# Add converters
|
|
68
|
+
mappings.each do |event_class, converter_class|
|
|
69
|
+
converters[event_class] = converter_class.new(builder, sample_type_mappings)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
converters.freeze
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def add_events!(event_class, events)
|
|
76
|
+
converters[event_class].add_events!(events)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def debug_statistics
|
|
80
|
+
converters.values.map(&:debug_statistics).join(', ')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def to_pprof(start:, finish:)
|
|
84
|
+
profile = builder.build_profile(start: start, finish: finish)
|
|
85
|
+
data = builder.encode_profile(profile)
|
|
86
|
+
types = sample_type_mappings.keys
|
|
87
|
+
|
|
88
|
+
Payload.new(data, types)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Error when an unknown event type is given to be converted
|
|
92
|
+
class NoProfilingEventConversionError < ArgumentError
|
|
93
|
+
attr_reader :type
|
|
94
|
+
|
|
95
|
+
def initialize(type)
|
|
96
|
+
@type = type
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def message
|
|
100
|
+
"Profiling event type '#{type}' cannot be converted to pprof."
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Error when the mapping of a sample type to value index is unknown
|
|
105
|
+
class UnknownSampleTypeMappingError < ArgumentError
|
|
106
|
+
attr_reader :type
|
|
107
|
+
|
|
108
|
+
def initialize(type)
|
|
109
|
+
@type = type
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def message
|
|
113
|
+
"Mapping for sample value type '#{type}' is unknown."
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
module Datadog
|
|
3
|
+
# Profiling entry point, which coordinates collectors and a scheduler
|
|
4
|
+
class Profiler
|
|
5
|
+
attr_reader \
|
|
6
|
+
:collectors,
|
|
7
|
+
:scheduler
|
|
8
|
+
|
|
9
|
+
def initialize(collectors, scheduler)
|
|
10
|
+
@collectors = collectors
|
|
11
|
+
@scheduler = scheduler
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def start
|
|
15
|
+
collectors.each(&:start)
|
|
16
|
+
scheduler.start
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def shutdown!
|
|
20
|
+
Datadog.logger.debug('Shutting down profiler')
|
|
21
|
+
|
|
22
|
+
collectors.each do |collector|
|
|
23
|
+
collector.enabled = false
|
|
24
|
+
collector.stop(true)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
scheduler.enabled = false
|
|
28
|
+
scheduler.stop(true)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/profiling/buffer'
|
|
3
|
+
require 'ddtrace/profiling/flush'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Profiling
|
|
7
|
+
# Stores profiling events gathered by `Collector`s
|
|
8
|
+
class Recorder
|
|
9
|
+
attr_reader :max_size
|
|
10
|
+
|
|
11
|
+
def initialize(event_classes, max_size, last_flush_time: Time.now.utc)
|
|
12
|
+
@buffers = {}
|
|
13
|
+
@last_flush_time = last_flush_time
|
|
14
|
+
@max_size = max_size
|
|
15
|
+
|
|
16
|
+
# Add a buffer for each class
|
|
17
|
+
event_classes.each do |event_class|
|
|
18
|
+
@buffers[event_class] = Profiling::Buffer.new(max_size)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Event classes can only be added ahead of time
|
|
22
|
+
@buffers.freeze
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def [](event_class)
|
|
26
|
+
@buffers[event_class]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def push(events)
|
|
30
|
+
if events.is_a?(Array)
|
|
31
|
+
# Push multiple events
|
|
32
|
+
event_class = events.first.class
|
|
33
|
+
raise UnknownEventError, event_class unless @buffers.key?(event_class)
|
|
34
|
+
|
|
35
|
+
@buffers[event_class].concat(events)
|
|
36
|
+
else
|
|
37
|
+
# Push single event
|
|
38
|
+
event_class = events.class
|
|
39
|
+
raise UnknownEventError, event_class unless @buffers.key?(event_class)
|
|
40
|
+
|
|
41
|
+
@buffers[event_class].push(events)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def flush
|
|
46
|
+
event_count = 0
|
|
47
|
+
|
|
48
|
+
event_groups, start, finish = update_time do
|
|
49
|
+
@buffers.collect do |event_class, buffer|
|
|
50
|
+
events = buffer.pop
|
|
51
|
+
next if events.empty?
|
|
52
|
+
|
|
53
|
+
event_count += events.length
|
|
54
|
+
EventGroup.new(event_class, events)
|
|
55
|
+
end.compact
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
Flush.new(
|
|
59
|
+
start,
|
|
60
|
+
finish,
|
|
61
|
+
event_groups,
|
|
62
|
+
event_count
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# NOTE: Remember that if the recorder is being accessed by multiple threads, this is an inherently racy operation.
|
|
67
|
+
def empty?
|
|
68
|
+
@buffers.values.all?(&:empty?)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Error when event of an unknown type is used with the Recorder
|
|
72
|
+
class UnknownEventError < StandardError
|
|
73
|
+
attr_reader :event_class
|
|
74
|
+
|
|
75
|
+
def initialize(event_class)
|
|
76
|
+
@event_class = event_class
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def message
|
|
80
|
+
@message ||= "Unknown event class '#{event_class}' for profiling recorder."
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def update_time
|
|
87
|
+
start = @last_flush_time
|
|
88
|
+
result = yield
|
|
89
|
+
@last_flush_time = Time.now.utc
|
|
90
|
+
|
|
91
|
+
# Return event groups, start time, finish time
|
|
92
|
+
[result, start, @last_flush_time]
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
require 'ddtrace/utils/time'
|
|
3
|
+
|
|
4
|
+
require 'ddtrace/worker'
|
|
5
|
+
require 'ddtrace/workers/polling'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Profiling
|
|
9
|
+
# Periodically (every DEFAULT_INTERVAL_SECONDS) takes data from the `Recorder` and pushes them to all configured
|
|
10
|
+
# `Exporter`s. Runs on its own background thread.
|
|
11
|
+
class Scheduler < Worker
|
|
12
|
+
include Workers::Polling
|
|
13
|
+
|
|
14
|
+
DEFAULT_INTERVAL_SECONDS = 60
|
|
15
|
+
MINIMUM_INTERVAL_SECONDS = 0
|
|
16
|
+
|
|
17
|
+
# Profiles with duration less than this will not be reported
|
|
18
|
+
PROFILE_DURATION_THRESHOLD_SECONDS = 1
|
|
19
|
+
|
|
20
|
+
private_constant :DEFAULT_INTERVAL_SECONDS, :MINIMUM_INTERVAL_SECONDS, :PROFILE_DURATION_THRESHOLD_SECONDS
|
|
21
|
+
|
|
22
|
+
attr_reader \
|
|
23
|
+
:exporters,
|
|
24
|
+
:recorder
|
|
25
|
+
|
|
26
|
+
def initialize(
|
|
27
|
+
recorder,
|
|
28
|
+
exporters,
|
|
29
|
+
fork_policy: Workers::Async::Thread::FORK_POLICY_RESTART, # Restart in forks by default
|
|
30
|
+
interval: DEFAULT_INTERVAL_SECONDS,
|
|
31
|
+
enabled: true
|
|
32
|
+
)
|
|
33
|
+
@recorder = recorder
|
|
34
|
+
@exporters = [exporters].flatten
|
|
35
|
+
|
|
36
|
+
# Workers::Async::Thread settings
|
|
37
|
+
self.fork_policy = fork_policy
|
|
38
|
+
|
|
39
|
+
# Workers::IntervalLoop settings
|
|
40
|
+
self.loop_base_interval = interval
|
|
41
|
+
|
|
42
|
+
# Workers::Polling settings
|
|
43
|
+
self.enabled = enabled
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def start
|
|
47
|
+
perform
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def perform
|
|
51
|
+
# A profiling flush may be called while the VM is shutting down, to report the last profile. When we do so,
|
|
52
|
+
# we impose a strict timeout. This means this last profile may or may not be sent, depending on if the flush can
|
|
53
|
+
# successfully finish in the strict timeout.
|
|
54
|
+
# This can be somewhat confusing (why did it not get reported?), so let's at least log what happened.
|
|
55
|
+
interrupted = true
|
|
56
|
+
|
|
57
|
+
begin
|
|
58
|
+
flush_and_wait
|
|
59
|
+
interrupted = false
|
|
60
|
+
ensure
|
|
61
|
+
Datadog.logger.debug('#flush was interrupted or failed before it could complete') if interrupted
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def loop_back_off?
|
|
66
|
+
false
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def after_fork
|
|
70
|
+
# Clear recorder's buffers by flushing events.
|
|
71
|
+
# Objects from parent process will copy-on-write,
|
|
72
|
+
# and we don't want to send events for the wrong process.
|
|
73
|
+
recorder.flush
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Configure Workers::IntervalLoop to not report immediately when scheduler starts
|
|
77
|
+
#
|
|
78
|
+
# When a scheduler gets created (or reset), we don't want it to immediately try to flush; we want it to wait for
|
|
79
|
+
# the loop wait time first. This avoids an issue where the scheduler reported a mostly-empty profile if the
|
|
80
|
+
# application just started but this thread took a bit longer so there's already samples in the recorder.
|
|
81
|
+
def loop_wait_before_first_iteration?
|
|
82
|
+
true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def work_pending?
|
|
86
|
+
!recorder.empty?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def flush_and_wait
|
|
92
|
+
run_time = Datadog::Utils::Time.measure do
|
|
93
|
+
flush_events
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Update wait time to try to wake consistently on time.
|
|
97
|
+
# Don't drop below the minimum interval.
|
|
98
|
+
self.loop_wait_time = [loop_base_interval - run_time, MINIMUM_INTERVAL_SECONDS].max
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def flush_events
|
|
102
|
+
# Get events from recorder
|
|
103
|
+
flush = recorder.flush
|
|
104
|
+
|
|
105
|
+
if duration_below_threshold?(flush)
|
|
106
|
+
Datadog.logger.debug do
|
|
107
|
+
"Skipped exporting profiling events as profile duration is below minimum (#{flush.event_count} events skipped)"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
return flush
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Send events to each exporter
|
|
114
|
+
if flush.event_count > 0
|
|
115
|
+
exporters.each do |exporter|
|
|
116
|
+
begin
|
|
117
|
+
exporter.export(flush)
|
|
118
|
+
rescue StandardError => e
|
|
119
|
+
Datadog.logger.error(
|
|
120
|
+
"Unable to export #{flush.event_count} profiling events. Cause: #{e} Location: #{Array(e.backtrace).first}"
|
|
121
|
+
)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
flush
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def duration_below_threshold?(flush)
|
|
130
|
+
(flush.finish - flush.start) < PROFILE_DURATION_THRESHOLD_SECONDS
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
require 'ddtrace/utils/only_once'
|
|
3
|
+
require 'ddtrace/profiling'
|
|
4
|
+
require 'ddtrace/profiling/ext/forking'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Profiling
|
|
8
|
+
module Tasks
|
|
9
|
+
# Takes care of loading our extensions/monkey patches to handle fork() and validating if CPU-time profiling is usable
|
|
10
|
+
class Setup
|
|
11
|
+
ACTIVATE_EXTENSIONS_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
|
|
12
|
+
|
|
13
|
+
def run
|
|
14
|
+
ACTIVATE_EXTENSIONS_ONLY_ONCE.run do
|
|
15
|
+
begin
|
|
16
|
+
check_if_cpu_time_profiling_is_supported
|
|
17
|
+
activate_forking_extensions
|
|
18
|
+
setup_at_fork_hooks
|
|
19
|
+
rescue StandardError, ScriptError => e
|
|
20
|
+
Datadog.logger.warn do
|
|
21
|
+
"Profiler extensions unavailable. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def activate_forking_extensions
|
|
30
|
+
if Ext::Forking.supported?
|
|
31
|
+
Ext::Forking.apply!
|
|
32
|
+
elsif Datadog.configuration.profiling.enabled
|
|
33
|
+
Datadog.logger.debug('Profiler forking extensions skipped; forking not supported.')
|
|
34
|
+
end
|
|
35
|
+
rescue StandardError, ScriptError => e
|
|
36
|
+
Datadog.logger.warn do
|
|
37
|
+
"Profiler forking extensions unavailable. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def check_if_cpu_time_profiling_is_supported
|
|
42
|
+
unsupported = cpu_time_profiling_unsupported_reason
|
|
43
|
+
|
|
44
|
+
if unsupported
|
|
45
|
+
Datadog.logger.info do
|
|
46
|
+
'CPU time profiling skipped because native CPU time is not supported: ' \
|
|
47
|
+
"#{unsupported}. Profiles containing 'Wall time' data will still be reported."
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def setup_at_fork_hooks
|
|
53
|
+
if Process.respond_to?(:at_fork)
|
|
54
|
+
Process.at_fork(:child) do
|
|
55
|
+
begin
|
|
56
|
+
# When Ruby forks, clock IDs for each of the threads
|
|
57
|
+
# will change. We can only update these IDs from the
|
|
58
|
+
# execution context of the thread that owns it.
|
|
59
|
+
# This hook will update the IDs for the main thread
|
|
60
|
+
# after a fork occurs.
|
|
61
|
+
Thread.current.send(:update_native_ids) if Thread.current.respond_to?(:update_native_ids, true)
|
|
62
|
+
|
|
63
|
+
# Restart profiler, if enabled
|
|
64
|
+
Datadog.profiler.start if Datadog.profiler
|
|
65
|
+
rescue StandardError => e
|
|
66
|
+
Datadog.logger.warn do
|
|
67
|
+
"Error during post-fork hooks. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def cpu_time_profiling_unsupported_reason
|
|
75
|
+
# NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons
|
|
76
|
+
|
|
77
|
+
if RUBY_ENGINE == 'jruby'
|
|
78
|
+
'JRuby is not supported'
|
|
79
|
+
elsif RUBY_PLATFORM.include?('darwin')
|
|
80
|
+
'Feature requires Linux; macOS is not supported'
|
|
81
|
+
elsif RUBY_PLATFORM =~ /(mswin|mingw)/
|
|
82
|
+
'Feature requires Linux; Windows is not supported'
|
|
83
|
+
elsif !RUBY_PLATFORM.include?('linux')
|
|
84
|
+
"Feature requires Linux; #{RUBY_PLATFORM} is not supported"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require 'ddtrace/ext/http'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Profiling
|
|
8
|
+
module TraceIdentifiers
|
|
9
|
+
# Used by Datadog::Profiling::TraceIdentifiers::Helper to get the trace identifiers (root span id and span id)
|
|
10
|
+
# for a given thread, if there is an active trace for that thread in the supplied tracer object.
|
|
11
|
+
class Ddtrace
|
|
12
|
+
def initialize(tracer:)
|
|
13
|
+
@tracer = (tracer if tracer.respond_to?(:call_context))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def trace_identifiers_for(thread)
|
|
17
|
+
return unless @tracer
|
|
18
|
+
|
|
19
|
+
context = @tracer.call_context(thread)
|
|
20
|
+
return unless context
|
|
21
|
+
|
|
22
|
+
span, root_span = context.current_span_and_root_span
|
|
23
|
+
return unless span && root_span
|
|
24
|
+
|
|
25
|
+
root_span_id = root_span.span_id || 0
|
|
26
|
+
span_id = span.span_id || 0
|
|
27
|
+
|
|
28
|
+
[root_span_id, span_id, maybe_extract_resource(root_span)] if root_span_id != 0 && span_id != 0
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# NOTE: Currently we're only interested in HTTP service endpoints. Over time, this list may be expanded.
|
|
34
|
+
# Resources MUST NOT include personal identifiable information (PII); this should not be the case with
|
|
35
|
+
# ddtrace integrations, but worth mentioning just in case :)
|
|
36
|
+
def maybe_extract_resource(root_span)
|
|
37
|
+
root_span.resource if root_span.span_type == Datadog::Ext::HTTP::TYPE_INBOUND
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|