ddtrace 1.2.0 → 1.3.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/CHANGELOG.md +47 -1
- data/LICENSE-3rdparty.csv +2 -0
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +1 -1
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +9 -2
- data/ext/ddtrace_profiling_native_extension/clock_id.h +20 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +30 -1
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +10 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +148 -28
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +6 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -7
- data/ext/ddtrace_profiling_native_extension/extconf.rb +24 -19
- data/ext/ddtrace_profiling_native_extension/helpers.h +12 -0
- data/ext/ddtrace_profiling_native_extension/http_transport.c +40 -47
- data/ext/ddtrace_profiling_native_extension/{libddprof_helpers.h → libdatadog_helpers.h} +2 -1
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +36 -20
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +30 -29
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +2 -5
- data/ext/ddtrace_profiling_native_extension/profiling.c +2 -3
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +25 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +33 -1
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +292 -18
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +1 -1
- data/lib/datadog/appsec/autoload.rb +4 -2
- data/lib/datadog/appsec/configuration.rb +1 -1
- data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
- data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +6 -6
- data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
- data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -2
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +4 -4
- data/lib/datadog/appsec/contrib/rails/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/rails/patcher.rb +16 -12
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -2
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +5 -5
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +16 -12
- data/lib/datadog/appsec/event.rb +3 -3
- data/lib/datadog/appsec/extensions.rb +1 -1
- data/lib/datadog/appsec/processor.rb +1 -1
- data/lib/datadog/appsec/reactive/engine.rb +2 -2
- data/lib/datadog/appsec/reactive/operation.rb +3 -3
- data/lib/datadog/appsec.rb +5 -5
- data/lib/datadog/ci/configuration/components.rb +1 -1
- data/lib/datadog/ci/configuration/settings.rb +1 -1
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
- data/lib/datadog/ci/contrib/cucumber/integration.rb +3 -3
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
- data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
- data/lib/datadog/ci/contrib/rspec/integration.rb +3 -3
- data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
- data/lib/datadog/ci/ext/environment.rb +8 -6
- data/lib/datadog/ci/extensions.rb +4 -4
- data/lib/datadog/ci/flush.rb +2 -2
- data/lib/datadog/ci/test.rb +3 -3
- data/lib/datadog/ci.rb +6 -6
- data/lib/datadog/core/buffer/cruby.rb +1 -1
- data/lib/datadog/core/buffer/thread_safe.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
- data/lib/datadog/core/configuration/base.rb +2 -2
- data/lib/datadog/core/configuration/components.rb +26 -43
- data/lib/datadog/core/configuration/option_definition.rb +1 -1
- data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +9 -7
- data/lib/datadog/core/configuration.rb +4 -4
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/diagnostics/health.rb +2 -2
- data/lib/datadog/core/environment/cgroup.rb +1 -1
- data/lib/datadog/core/environment/container.rb +1 -1
- data/lib/datadog/core/environment/ext.rb +1 -1
- data/lib/datadog/core/environment/identity.rb +2 -2
- data/lib/datadog/core/environment/platform.rb +1 -1
- data/lib/datadog/core/environment/socket.rb +1 -1
- data/lib/datadog/core/error.rb +1 -1
- data/lib/datadog/core/extensions.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +8 -8
- data/lib/datadog/core/metrics/options.rb +3 -3
- data/lib/datadog/core/runtime/metrics.rb +6 -6
- data/lib/datadog/core/utils/object_set.rb +1 -1
- data/lib/datadog/core/utils/string_table.rb +1 -1
- data/lib/datadog/core/utils/time.rb +3 -3
- data/lib/datadog/core/utils.rb +2 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
- data/lib/datadog/core/workers/async.rb +1 -1
- data/lib/datadog/core/workers/polling.rb +2 -2
- data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
- data/lib/datadog/core.rb +50 -50
- data/lib/datadog/kit.rb +1 -1
- data/lib/datadog/opentracer/distributed_headers.rb +2 -2
- data/lib/datadog/opentracer/rack_propagator.rb +11 -7
- data/lib/datadog/opentracer/span.rb +1 -1
- data/lib/datadog/opentracer/text_map_propagator.rb +9 -6
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +1 -1
- data/lib/datadog/opentracer/tracer.rb +19 -15
- data/lib/datadog/opentracer.rb +16 -16
- data/lib/datadog/profiling/buffer.rb +3 -3
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +4 -19
- data/lib/datadog/profiling/collectors/old_stack.rb +7 -7
- data/lib/datadog/profiling/collectors/stack.rb +3 -8
- data/lib/datadog/profiling/encoding/profile.rb +1 -1
- data/lib/datadog/profiling/events/stack.rb +1 -1
- data/lib/datadog/profiling/exporter.rb +17 -9
- data/lib/datadog/profiling/ext/forking.rb +36 -37
- data/lib/datadog/profiling/ext.rb +1 -0
- data/lib/datadog/profiling/flush.rb +0 -3
- data/lib/datadog/profiling/http_transport.rb +4 -3
- data/lib/datadog/profiling/old_recorder.rb +2 -7
- data/lib/datadog/profiling/pprof/builder.rb +4 -4
- data/lib/datadog/profiling/pprof/converter.rb +1 -1
- data/lib/datadog/profiling/pprof/message_set.rb +1 -1
- data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
- data/lib/datadog/profiling/pprof/string_table.rb +1 -1
- data/lib/datadog/profiling/pprof/template.rb +5 -5
- data/lib/datadog/profiling/preload.rb +1 -1
- data/lib/datadog/profiling/scheduler.rb +5 -4
- data/lib/datadog/profiling/stack_recorder.rb +14 -4
- data/lib/datadog/profiling/tag_builder.rb +6 -1
- data/lib/datadog/profiling/tasks/setup.rb +2 -2
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
- data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +5 -5
- data/lib/datadog/profiling/transport/http/api/instance.rb +2 -2
- data/lib/datadog/profiling/transport/http/api/spec.rb +1 -1
- data/lib/datadog/profiling/transport/http/api.rb +5 -5
- data/lib/datadog/profiling/transport/http/builder.rb +3 -3
- data/lib/datadog/profiling/transport/http/client.rb +2 -2
- data/lib/datadog/profiling/transport/http/response.rb +1 -1
- data/lib/datadog/profiling/transport/http.rb +21 -15
- data/lib/datadog/profiling.rb +20 -20
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +5 -5
- data/lib/datadog/tracing/context.rb +1 -1
- data/lib/datadog/tracing/context_provider.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +6 -6
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
- data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
- data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
- data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
- data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/analytics.rb +1 -1
- data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/configurable.rb +2 -2
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +3 -4
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -7
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
- data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -4
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/excon/middleware.rb +6 -7
- data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/extensions.rb +3 -3
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -6
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -5
- data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +4 -4
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -6
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +3 -4
- data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +4 -5
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -5
- data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
- data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
- data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -4
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/pg/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
- data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -20
- data/lib/datadog/tracing/contrib/rack/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/framework.rb +16 -21
- data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
- data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -7
- data/lib/datadog/tracing/contrib/redis/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/redis/patcher.rb +6 -6
- data/lib/datadog/tracing/contrib/redis/tags.rb +3 -4
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +3 -4
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -5
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
- data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +4 -5
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -6
- data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/env.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +7 -8
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +6 -7
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -3
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
- data/lib/datadog/tracing/contrib.rb +48 -48
- data/lib/datadog/tracing/correlation.rb +1 -1
- data/lib/datadog/tracing/distributed/headers/b3.rb +4 -4
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +4 -4
- data/lib/datadog/tracing/distributed/headers/datadog.rb +3 -3
- data/lib/datadog/tracing/distributed/headers/parser.rb +1 -1
- data/lib/datadog/tracing/distributed/helpers.rb +2 -2
- data/lib/datadog/tracing/distributed/metadata/b3.rb +4 -4
- data/lib/datadog/tracing/distributed/metadata/b3_single.rb +4 -4
- data/lib/datadog/tracing/distributed/metadata/datadog.rb +2 -2
- data/lib/datadog/tracing/distributed/metadata/parser.rb +1 -1
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +2 -2
- data/lib/datadog/tracing/metadata/errors.rb +2 -2
- data/lib/datadog/tracing/metadata/tagging.rb +2 -2
- data/lib/datadog/tracing/metadata.rb +3 -3
- data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
- data/lib/datadog/tracing/pipeline.rb +3 -3
- data/lib/datadog/tracing/propagation/grpc.rb +6 -6
- data/lib/datadog/tracing/propagation/http.rb +8 -8
- data/lib/datadog/tracing/runtime/metrics.rb +1 -1
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/priority_sampler.rb +5 -5
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +2 -2
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +3 -3
- data/lib/datadog/tracing/sampling/rate_limiter.rb +1 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +5 -5
- data/lib/datadog/tracing/sampling/rule.rb +3 -3
- data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -4
- data/lib/datadog/tracing/span.rb +4 -4
- data/lib/datadog/tracing/span_operation.rb +9 -9
- data/lib/datadog/tracing/sync_writer.rb +5 -5
- data/lib/datadog/tracing/trace_operation.rb +16 -9
- data/lib/datadog/tracing/trace_segment.rb +5 -5
- data/lib/datadog/tracing/tracer.rb +15 -15
- data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
- data/lib/datadog/tracing/workers.rb +3 -3
- data/lib/datadog/tracing/writer.rb +5 -5
- data/lib/datadog/tracing.rb +8 -8
- data/lib/ddtrace/auto_instrument.rb +2 -2
- data/lib/ddtrace/transport/ext.rb +7 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +2 -2
- data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
- data/lib/ddtrace/transport/http/api/map.rb +1 -1
- data/lib/ddtrace/transport/http/api.rb +4 -4
- data/lib/ddtrace/transport/http/builder.rb +5 -5
- data/lib/ddtrace/transport/http/client.rb +2 -2
- data/lib/ddtrace/transport/http/response.rb +1 -1
- data/lib/ddtrace/transport/http/statistics.rb +1 -1
- data/lib/ddtrace/transport/http/traces.rb +5 -5
- data/lib/ddtrace/transport/http.rb +12 -9
- data/lib/ddtrace/transport/io/client.rb +2 -2
- data/lib/ddtrace/transport/io/response.rb +1 -1
- data/lib/ddtrace/transport/io/traces.rb +3 -3
- data/lib/ddtrace/transport/io.rb +3 -3
- data/lib/ddtrace/transport/statistics.rb +2 -2
- data/lib/ddtrace/transport/trace_formatter.rb +5 -5
- data/lib/ddtrace/transport/traces.rb +5 -5
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace.rb +6 -6
- metadata +14 -22
- data/.editorconfig +0 -22
- data/.gitignore +0 -58
- data/CONTRIBUTING.md +0 -81
- data/ddtrace.gemspec +0 -71
- data/docs/0.x-trace.png +0 -0
- data/docs/1.0-trace.png +0 -0
- data/docs/AutoInstrumentation.md +0 -36
- data/docs/Deprecation.md +0 -8
- data/docs/DevelopmentGuide.md +0 -259
- data/docs/GettingStarted.md +0 -2712
- data/docs/ProfilingDevelopment.md +0 -109
- data/docs/PublicApi.md +0 -14
- data/docs/UpgradeGuide.md +0 -736
|
@@ -42,7 +42,8 @@ unless Datadog::Profiling::NativeExtensionHelpers::Supported.supported?
|
|
|
42
42
|
skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported.unsupported_reason)
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
$stderr.puts(
|
|
45
|
+
$stderr.puts(
|
|
46
|
+
%(
|
|
46
47
|
+------------------------------------------------------------------------------+
|
|
47
48
|
| ** Preparing to build the ddtrace profiling native extension... ** |
|
|
48
49
|
| |
|
|
@@ -59,7 +60,8 @@ $stderr.puts(%(
|
|
|
59
60
|
| Thanks for using ddtrace! You rock! |
|
|
60
61
|
+------------------------------------------------------------------------------+
|
|
61
62
|
|
|
62
|
-
)
|
|
63
|
+
)
|
|
64
|
+
)
|
|
63
65
|
|
|
64
66
|
# NOTE: we MUST NOT require 'mkmf' before we check the #skip_building_extension? because the require triggers checks
|
|
65
67
|
# that may fail on an environment not properly setup for building Ruby extensions.
|
|
@@ -91,6 +93,9 @@ add_compiler_flag '-Wno-declaration-after-statement'
|
|
|
91
93
|
# cause a segfault later. Let's ensure that never happens.
|
|
92
94
|
add_compiler_flag '-Werror-implicit-function-declaration'
|
|
93
95
|
|
|
96
|
+
# Warn on unused parameters to functions. Use `DDTRACE_UNUSED` to mark things as known-to-not-be-used.
|
|
97
|
+
add_compiler_flag '-Wunused-parameter'
|
|
98
|
+
|
|
94
99
|
# The native extension is not intended to expose any symbols/functions for other native libraries to use;
|
|
95
100
|
# the sole exception being `Init_ddtrace_profiling_native_extension` which needs to be visible for Ruby to call it when
|
|
96
101
|
# it `dlopen`s the library.
|
|
@@ -99,13 +104,17 @@ add_compiler_flag '-Werror-implicit-function-declaration'
|
|
|
99
104
|
# For more details see https://gcc.gnu.org/wiki/Visibility
|
|
100
105
|
add_compiler_flag '-fvisibility=hidden'
|
|
101
106
|
|
|
107
|
+
# Enable all other compiler warnings
|
|
108
|
+
add_compiler_flag '-Wall'
|
|
109
|
+
add_compiler_flag '-Wextra'
|
|
110
|
+
|
|
102
111
|
if RUBY_PLATFORM.include?('linux')
|
|
103
112
|
# Supposedly, the correct way to do this is
|
|
104
113
|
# ```
|
|
105
114
|
# have_library 'pthread'
|
|
106
115
|
# have_func 'pthread_getcpuclockid'
|
|
107
116
|
# ```
|
|
108
|
-
# but it broke the build on Windows and on older Ruby versions (2.
|
|
117
|
+
# but it broke the build on Windows and on older Ruby versions (2.2)
|
|
109
118
|
# so instead we just assume that we have the function we need on Linux, and nowhere else
|
|
110
119
|
$defs << '-DHAVE_PTHREAD_GETCPUCLOCKID'
|
|
111
120
|
end
|
|
@@ -133,13 +142,12 @@ if RUBY_VERSION < '2.3'
|
|
|
133
142
|
$defs << '-DNO_RB_TIME_TIMESPEC_NEW'
|
|
134
143
|
# ...the VM changed enough that we need an alternative legacy rb_profile_frames
|
|
135
144
|
$defs << '-DUSE_LEGACY_RB_PROFILE_FRAMES'
|
|
145
|
+
# ... you couldn't name threads
|
|
146
|
+
$defs << '-DNO_THREAD_NAMES'
|
|
136
147
|
end
|
|
137
148
|
|
|
138
|
-
#
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
# If we got here, libddprof is available and loaded
|
|
142
|
-
ENV['PKG_CONFIG_PATH'] = "#{ENV['PKG_CONFIG_PATH']}:#{Libddprof.pkgconfig_folder}"
|
|
149
|
+
# If we got here, libdatadog is available and loaded
|
|
150
|
+
ENV['PKG_CONFIG_PATH'] = "#{ENV['PKG_CONFIG_PATH']}:#{Libdatadog.pkgconfig_folder}"
|
|
143
151
|
Logging.message(" [ddtrace] PKG_CONFIG_PATH set to #{ENV['PKG_CONFIG_PATH'].inspect}\n")
|
|
144
152
|
|
|
145
153
|
unless pkg_config('ddprof_ffi_with_rpath')
|
|
@@ -148,19 +156,23 @@ unless pkg_config('ddprof_ffi_with_rpath')
|
|
|
148
156
|
Datadog::Profiling::NativeExtensionHelpers::Supported::PKG_CONFIG_IS_MISSING
|
|
149
157
|
else
|
|
150
158
|
# Less specific error message
|
|
151
|
-
Datadog::Profiling::NativeExtensionHelpers::Supported::
|
|
159
|
+
Datadog::Profiling::NativeExtensionHelpers::Supported::FAILED_TO_CONFIGURE_LIBDATADOG
|
|
152
160
|
end
|
|
153
161
|
)
|
|
154
162
|
end
|
|
155
163
|
|
|
156
|
-
# See comments on the helper method being used for why we need to additionally set this
|
|
164
|
+
# See comments on the helper method being used for why we need to additionally set this.
|
|
157
165
|
# The extremely excessive escaping around ORIGIN below seems to be correct and was determined after a lot of
|
|
158
166
|
# experimentation. We need to get these special characters across a lot of tools untouched...
|
|
159
167
|
$LDFLAGS += \
|
|
160
168
|
' -Wl,-rpath,$$$\\\\{ORIGIN\\}/' \
|
|
161
|
-
"#{Datadog::Profiling::NativeExtensionHelpers.
|
|
169
|
+
"#{Datadog::Profiling::NativeExtensionHelpers.libdatadog_folder_relative_to_native_lib_folder}"
|
|
162
170
|
Logging.message(" [ddtrace] After pkg-config $LDFLAGS were set to: #{$LDFLAGS.inspect}\n")
|
|
163
171
|
|
|
172
|
+
Logging.message(" [ddtrace] Using compiler:\n")
|
|
173
|
+
xsystem("#{CONFIG['CC']} --version")
|
|
174
|
+
Logging.message(" [ddtrace] End of compiler information\n")
|
|
175
|
+
|
|
164
176
|
# Tag the native extension library with the Ruby version and Ruby platform.
|
|
165
177
|
# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
|
|
166
178
|
# the wrong library is never loaded.
|
|
@@ -194,13 +206,6 @@ else
|
|
|
194
206
|
# This gem ships source code copies of these VM headers for the different Ruby VM versions;
|
|
195
207
|
# see https://github.com/ruby-debug/debase-ruby_core_source for details
|
|
196
208
|
|
|
197
|
-
thread_native_for_ruby_2_1 = proc { true }
|
|
198
|
-
if RUBY_VERSION < '2.2'
|
|
199
|
-
# This header became public in Ruby 2.2, but we need to pull it from the private headers folder for 2.1
|
|
200
|
-
thread_native_for_ruby_2_1 = proc { have_header('thread_native.h') }
|
|
201
|
-
$defs << '-DRUBY_2_1_WORKAROUND'
|
|
202
|
-
end
|
|
203
|
-
|
|
204
209
|
create_header
|
|
205
210
|
|
|
206
211
|
require 'debase/ruby_core_source'
|
|
@@ -208,7 +213,7 @@ else
|
|
|
208
213
|
|
|
209
214
|
Debase::RubyCoreSource
|
|
210
215
|
.create_makefile_with_core(
|
|
211
|
-
proc { have_header('vm_core.h') && have_header('iseq.h')
|
|
216
|
+
proc { have_header('vm_core.h') && have_header('iseq.h') },
|
|
212
217
|
EXTENSION_NAME,
|
|
213
218
|
)
|
|
214
219
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
// Used to mark symbols to be exported to the outside of the extension.
|
|
4
|
+
// Consider very carefully before tagging a function with this.
|
|
5
|
+
#define DDTRACE_EXPORT __attribute__ ((visibility ("default")))
|
|
6
|
+
|
|
7
|
+
// Used to mark function arguments that are deliberately left unused
|
|
8
|
+
#ifdef __GNUC__
|
|
9
|
+
#define DDTRACE_UNUSED __attribute__((unused))
|
|
10
|
+
#else
|
|
11
|
+
#define DDTRACE_UNUSED
|
|
12
|
+
#endif
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#include <ruby.h>
|
|
2
2
|
#include <ruby/thread.h>
|
|
3
3
|
#include <ddprof/ffi.h>
|
|
4
|
-
#include "
|
|
4
|
+
#include "helpers.h"
|
|
5
|
+
#include "libdatadog_helpers.h"
|
|
5
6
|
#include "ruby_helpers.h"
|
|
6
7
|
|
|
7
8
|
// Used to report profiling data to Datadog.
|
|
@@ -63,13 +64,13 @@ void http_transport_init(VALUE profiling_module) {
|
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
inline static ddprof_ffi_ByteSlice byte_slice_from_ruby_string(VALUE string) {
|
|
66
|
-
|
|
67
|
+
ENFORCE_TYPE(string, T_STRING);
|
|
67
68
|
ddprof_ffi_ByteSlice byte_slice = {.ptr = (uint8_t *) StringValuePtr(string), .len = RSTRING_LEN(string)};
|
|
68
69
|
return byte_slice;
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
static VALUE _native_validate_exporter(VALUE
|
|
72
|
-
|
|
72
|
+
static VALUE _native_validate_exporter(DDTRACE_UNUSED VALUE _self, VALUE exporter_configuration) {
|
|
73
|
+
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
73
74
|
ddprof_ffi_NewProfileExporterV3Result exporter_result = create_exporter(exporter_configuration, rb_ary_new());
|
|
74
75
|
|
|
75
76
|
VALUE failure_tuple = handle_exporter_failure(exporter_result);
|
|
@@ -83,8 +84,8 @@ static VALUE _native_validate_exporter(VALUE self, VALUE exporter_configuration)
|
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
static ddprof_ffi_NewProfileExporterV3Result create_exporter(VALUE exporter_configuration, VALUE tags_as_array) {
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
88
|
+
ENFORCE_TYPE(tags_as_array, T_ARRAY);
|
|
88
89
|
|
|
89
90
|
// This needs to be called BEFORE convert_tags since it can raise an exception and thus cause the ddprof_ffi_Vec_tag
|
|
90
91
|
// to be leaked.
|
|
@@ -111,7 +112,7 @@ static VALUE handle_exporter_failure(ddprof_ffi_NewProfileExporterV3Result expor
|
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration) {
|
|
114
|
-
|
|
115
|
+
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
115
116
|
|
|
116
117
|
ID working_mode = SYM2ID(rb_ary_entry(exporter_configuration, 0)); // SYM2ID verifies its input so we can do this safely
|
|
117
118
|
|
|
@@ -122,13 +123,13 @@ static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration) {
|
|
|
122
123
|
if (working_mode == agentless_id) {
|
|
123
124
|
VALUE site = rb_ary_entry(exporter_configuration, 1);
|
|
124
125
|
VALUE api_key = rb_ary_entry(exporter_configuration, 2);
|
|
125
|
-
|
|
126
|
-
|
|
126
|
+
ENFORCE_TYPE(site, T_STRING);
|
|
127
|
+
ENFORCE_TYPE(api_key, T_STRING);
|
|
127
128
|
|
|
128
129
|
return ddprof_ffi_EndpointV3_agentless(char_slice_from_ruby_string(site), char_slice_from_ruby_string(api_key));
|
|
129
130
|
} else { // agent_id
|
|
130
131
|
VALUE base_url = rb_ary_entry(exporter_configuration, 1);
|
|
131
|
-
|
|
132
|
+
ENFORCE_TYPE(base_url, T_STRING);
|
|
132
133
|
|
|
133
134
|
return ddprof_ffi_EndpointV3_agent(char_slice_from_ruby_string(base_url));
|
|
134
135
|
}
|
|
@@ -136,7 +137,7 @@ static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration) {
|
|
|
136
137
|
|
|
137
138
|
__attribute__((warn_unused_result))
|
|
138
139
|
static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
|
|
139
|
-
|
|
140
|
+
ENFORCE_TYPE(tags_as_array, T_ARRAY);
|
|
140
141
|
|
|
141
142
|
long tags_count = RARRAY_LEN(tags_as_array);
|
|
142
143
|
ddprof_ffi_Vec_tag tags = ddprof_ffi_Vec_tag_new();
|
|
@@ -146,7 +147,7 @@ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
|
|
|
146
147
|
|
|
147
148
|
if (!RB_TYPE_P(name_value_pair, T_ARRAY)) {
|
|
148
149
|
ddprof_ffi_Vec_tag_drop(tags);
|
|
149
|
-
|
|
150
|
+
ENFORCE_TYPE(name_value_pair, T_ARRAY);
|
|
150
151
|
}
|
|
151
152
|
|
|
152
153
|
// Note: We can index the array without checking its size first because rb_ary_entry returns Qnil if out of bounds
|
|
@@ -155,8 +156,8 @@ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
|
|
|
155
156
|
|
|
156
157
|
if (!(RB_TYPE_P(tag_name, T_STRING) && RB_TYPE_P(tag_value, T_STRING))) {
|
|
157
158
|
ddprof_ffi_Vec_tag_drop(tags);
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
ENFORCE_TYPE(tag_name, T_STRING);
|
|
160
|
+
ENFORCE_TYPE(tag_value, T_STRING);
|
|
160
161
|
}
|
|
161
162
|
|
|
162
163
|
ddprof_ffi_PushTagResult push_result =
|
|
@@ -166,7 +167,7 @@ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
|
|
|
166
167
|
VALUE err_details = ruby_string_from_vec_u8(push_result.err);
|
|
167
168
|
ddprof_ffi_PushTagResult_drop(push_result);
|
|
168
169
|
|
|
169
|
-
//
|
|
170
|
+
// libdatadog validates tags and may catch invalid tags that ddtrace didn't actually catch.
|
|
170
171
|
// We warn users about such tags, and then just ignore them.
|
|
171
172
|
safely_log_failure_to_process_tag(tags, err_details);
|
|
172
173
|
} else {
|
|
@@ -193,7 +194,7 @@ static void safely_log_failure_to_process_tag(ddprof_ffi_Vec_tag tags, VALUE err
|
|
|
193
194
|
}
|
|
194
195
|
}
|
|
195
196
|
|
|
196
|
-
// Note: This function handles a bunch of
|
|
197
|
+
// Note: This function handles a bunch of libdatadog dynamically-allocated objects, so it MUST not use any Ruby APIs
|
|
197
198
|
// which can raise exceptions, otherwise the objects will be leaked.
|
|
198
199
|
static VALUE perform_export(
|
|
199
200
|
ddprof_ffi_NewProfileExporterV3Result valid_exporter_result, // Must be called with a valid exporter result
|
|
@@ -229,45 +230,37 @@ static VALUE perform_export(
|
|
|
229
230
|
|
|
230
231
|
while (!args.send_ran && !pending_exception) {
|
|
231
232
|
rb_thread_call_without_gvl2(call_exporter_without_gvl, &args, interrupt_exporter_call, cancel_token);
|
|
233
|
+
|
|
234
|
+
// To make sure we don't leak memory, we never check for pending exceptions if send ran
|
|
232
235
|
if (!args.send_ran) pending_exception = check_if_pending_exception();
|
|
233
236
|
}
|
|
234
237
|
|
|
235
|
-
|
|
236
|
-
|
|
238
|
+
// Cleanup exporter and token, no longer needed
|
|
239
|
+
ddprof_ffi_CancellationToken_drop(cancel_token);
|
|
240
|
+
ddprof_ffi_NewProfileExporterV3Result_drop(valid_exporter_result);
|
|
237
241
|
|
|
238
242
|
if (pending_exception) {
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
//
|
|
245
|
-
// As a workaround, we get libddprof to clean up the request by asking for the send to be cancelled, and then calling
|
|
246
|
-
// it anyway. This will make libddprof free the request and return immediately which gets us the expected effect.
|
|
247
|
-
interrupt_exporter_call((void *) cancel_token);
|
|
248
|
-
call_exporter_without_gvl((void *) &args);
|
|
243
|
+
// If we got here send did not run, so we need to explicitly dispose of the request
|
|
244
|
+
ddprof_ffi_Request_drop(request);
|
|
245
|
+
|
|
246
|
+
// Let Ruby propagate the exception. This will not return.
|
|
247
|
+
rb_jump_tag(pending_exception);
|
|
249
248
|
}
|
|
250
249
|
|
|
251
250
|
ddprof_ffi_SendResult result = args.result;
|
|
252
251
|
bool success = result.tag == DDPROF_FFI_SEND_RESULT_HTTP_RESPONSE;
|
|
253
252
|
|
|
254
|
-
ruby_status = success ? ok_symbol : error_symbol;
|
|
255
|
-
ruby_result = success ? UINT2NUM(result.http_response.code) : ruby_string_from_vec_u8(result.
|
|
253
|
+
VALUE ruby_status = success ? ok_symbol : error_symbol;
|
|
254
|
+
VALUE ruby_result = success ? UINT2NUM(result.http_response.code) : ruby_string_from_vec_u8(result.err);
|
|
256
255
|
|
|
257
|
-
// Clean up all dynamically-allocated things
|
|
258
256
|
ddprof_ffi_SendResult_drop(args.result);
|
|
259
|
-
|
|
260
|
-
ddprof_ffi_NewProfileExporterV3Result_drop(valid_exporter_result);
|
|
261
|
-
// The request itself does not need to be freed as libddprof takes care of it.
|
|
262
|
-
|
|
263
|
-
// We've cleaned up everything, so if there's an exception to be raised, let's have it
|
|
264
|
-
if (pending_exception) rb_jump_tag(pending_exception);
|
|
257
|
+
// The request itself does not need to be freed as libdatadog takes care of it as part of sending.
|
|
265
258
|
|
|
266
259
|
return rb_ary_new_from_args(2, ruby_status, ruby_result);
|
|
267
260
|
}
|
|
268
261
|
|
|
269
262
|
static VALUE _native_do_export(
|
|
270
|
-
VALUE
|
|
263
|
+
DDTRACE_UNUSED VALUE _self,
|
|
271
264
|
VALUE exporter_configuration,
|
|
272
265
|
VALUE upload_timeout_milliseconds,
|
|
273
266
|
VALUE start_timespec_seconds,
|
|
@@ -280,18 +273,18 @@ static VALUE _native_do_export(
|
|
|
280
273
|
VALUE code_provenance_data,
|
|
281
274
|
VALUE tags_as_array
|
|
282
275
|
) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
276
|
+
ENFORCE_TYPE(upload_timeout_milliseconds, T_FIXNUM);
|
|
277
|
+
ENFORCE_TYPE(start_timespec_seconds, T_FIXNUM);
|
|
278
|
+
ENFORCE_TYPE(start_timespec_nanoseconds, T_FIXNUM);
|
|
279
|
+
ENFORCE_TYPE(finish_timespec_seconds, T_FIXNUM);
|
|
280
|
+
ENFORCE_TYPE(finish_timespec_nanoseconds, T_FIXNUM);
|
|
281
|
+
ENFORCE_TYPE(pprof_file_name, T_STRING);
|
|
282
|
+
ENFORCE_TYPE(pprof_data, T_STRING);
|
|
283
|
+
ENFORCE_TYPE(code_provenance_file_name, T_STRING);
|
|
291
284
|
|
|
292
285
|
// Code provenance can be disabled and in that case will be set to nil
|
|
293
286
|
bool have_code_provenance = !NIL_P(code_provenance_data);
|
|
294
|
-
if (have_code_provenance)
|
|
287
|
+
if (have_code_provenance) ENFORCE_TYPE(code_provenance_data, T_STRING);
|
|
295
288
|
|
|
296
289
|
uint64_t timeout_milliseconds = NUM2ULONG(upload_timeout_milliseconds);
|
|
297
290
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <ddprof/ffi.h>
|
|
4
|
+
#include "ruby_helpers.h"
|
|
4
5
|
|
|
5
6
|
inline static ddprof_ffi_CharSlice char_slice_from_ruby_string(VALUE string) {
|
|
6
|
-
|
|
7
|
+
ENFORCE_TYPE(string, T_STRING);
|
|
7
8
|
ddprof_ffi_CharSlice char_slice = {.ptr = StringValuePtr(string), .len = RSTRING_LEN(string)};
|
|
8
9
|
return char_slice;
|
|
9
10
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# typed: ignore
|
|
4
4
|
|
|
5
|
-
require '
|
|
5
|
+
require 'libdatadog'
|
|
6
6
|
require 'pathname'
|
|
7
7
|
|
|
8
8
|
module Datadog
|
|
@@ -22,29 +22,29 @@ module Datadog
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
# Used as an workaround for a limitation with how dynamic linking works in environments where ddtrace and
|
|
25
|
-
#
|
|
25
|
+
# libdatadog are moved after the extension gets compiled.
|
|
26
26
|
#
|
|
27
27
|
# Because the libddpprof native library is installed on a non-standard system path, in order for it to be
|
|
28
28
|
# found by the system dynamic linker (e.g. what takes care of dlopen(), which is used to load the profiling
|
|
29
|
-
# native extension), we need to add a "runpath" -- a list of folders to search for
|
|
29
|
+
# native extension), we need to add a "runpath" -- a list of folders to search for libdatadog.
|
|
30
30
|
#
|
|
31
31
|
# This runpath gets hardcoded at native library linking time. You can look at it using the `readelf` tool in
|
|
32
32
|
# Linux: e.g. `readelf -d ddtrace_profiling_native_extension.2.7.3_x86_64-linux.so`.
|
|
33
33
|
#
|
|
34
|
-
# In ddtrace 1.1.0, we only set as runpath an absolute path to
|
|
35
|
-
# to `pkg_config('ddprof_ffi_with_rpath')` in `extconf.rb`). This worked fine as long as
|
|
34
|
+
# In ddtrace 1.1.0, we only set as runpath an absolute path to libdatadog. (This gets set automatically by the call
|
|
35
|
+
# to `pkg_config('ddprof_ffi_with_rpath')` in `extconf.rb`). This worked fine as long as libdatadog was **NOT**
|
|
36
36
|
# moved from the folder it was present at ddtrace installation/linking time.
|
|
37
37
|
#
|
|
38
38
|
# Unfortunately, environments such as Heroku and AWS Elastic Beanstalk move gems around in the filesystem after
|
|
39
39
|
# installation. Thus, the profiling native extension could not be loaded in these environments
|
|
40
|
-
# (see https://github.com/DataDog/dd-trace-rb/issues/2067) because
|
|
40
|
+
# (see https://github.com/DataDog/dd-trace-rb/issues/2067) because libdatadog could not be found.
|
|
41
41
|
#
|
|
42
42
|
# To workaround this issue, this method computes the **relative** path between the folder where the profiling
|
|
43
|
-
# native extension is going to be installed and the folder where
|
|
43
|
+
# native extension is going to be installed and the folder where libdatadog is installed, and returns it
|
|
44
44
|
# to be set as an additional runpath. (Yes, you can set multiple runpath folders to be searched).
|
|
45
45
|
#
|
|
46
46
|
# This way, if both gems are moved together (and it turns out that they are in these environments),
|
|
47
|
-
# the relative path can still be traversed to find
|
|
47
|
+
# the relative path can still be traversed to find libdatadog.
|
|
48
48
|
#
|
|
49
49
|
# This is incredibly awful, and it's kinda bizarre how it's not possible to just find these paths at runtime
|
|
50
50
|
# and set them correctly; rather than needing to set stuff at linking-time and then praying to $deity that
|
|
@@ -54,16 +54,16 @@ module Datadog
|
|
|
54
54
|
# SET DYNAMICALLY**, e.g. it needs to be set at the start of the process (Ruby VM) and thus it's not something
|
|
55
55
|
# we could setup when doing a `require`.
|
|
56
56
|
#
|
|
57
|
-
def self.
|
|
57
|
+
def self.libdatadog_folder_relative_to_native_lib_folder(
|
|
58
58
|
current_folder: __dir__,
|
|
59
|
-
|
|
59
|
+
libdatadog_pkgconfig_folder: Libdatadog.pkgconfig_folder
|
|
60
60
|
)
|
|
61
|
-
return unless
|
|
61
|
+
return unless libdatadog_pkgconfig_folder
|
|
62
62
|
|
|
63
63
|
profiling_native_lib_folder = "#{current_folder}/../../lib/"
|
|
64
|
-
|
|
64
|
+
libdatadog_lib_folder = "#{libdatadog_pkgconfig_folder}/../"
|
|
65
65
|
|
|
66
|
-
Pathname.new(
|
|
66
|
+
Pathname.new(libdatadog_lib_folder).relative_path_from(Pathname.new(profiling_native_lib_folder)).to_s
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
# Used to check if profiler is supported, including user-visible clear messages explaining why their
|
|
@@ -86,8 +86,9 @@ module Datadog
|
|
|
86
86
|
on_macos? ||
|
|
87
87
|
on_unknown_os? ||
|
|
88
88
|
not_on_amd64_or_arm64? ||
|
|
89
|
+
on_ruby_2_1? ||
|
|
89
90
|
expected_to_use_mjit_but_mjit_is_disabled? ||
|
|
90
|
-
|
|
91
|
+
libdatadog_not_usable?
|
|
91
92
|
end
|
|
92
93
|
|
|
93
94
|
# This banner will show up in the logs/terminal while compiling the native extension
|
|
@@ -137,6 +138,8 @@ module Datadog
|
|
|
137
138
|
CONTACT_SUPPORT = [
|
|
138
139
|
'For help solving this issue, please contact Datadog support at',
|
|
139
140
|
'<https://docs.datadoghq.com/help/>.',
|
|
141
|
+
'You can also check out the Continuous Profiler troubleshooting page at',
|
|
142
|
+
'<https://dtdg.co/ruby-profiler-troubleshooting>.'
|
|
140
143
|
].freeze
|
|
141
144
|
|
|
142
145
|
REPORT_ISSUE = [
|
|
@@ -148,9 +151,13 @@ module Datadog
|
|
|
148
151
|
"Get in touch with us if you're interested in profiling your app!"
|
|
149
152
|
].freeze
|
|
150
153
|
|
|
154
|
+
UPGRADE_RUBY = [
|
|
155
|
+
'Upgrade to a modern Ruby to enable profiling for your app.'
|
|
156
|
+
].freeze
|
|
157
|
+
|
|
151
158
|
# Validation for this check is done in extconf.rb because it relies on mkmf
|
|
152
|
-
|
|
153
|
-
'there was a problem in setting up the `
|
|
159
|
+
FAILED_TO_CONFIGURE_LIBDATADOG = explain_issue(
|
|
160
|
+
'there was a problem in setting up the `libdatadog` dependency.',
|
|
154
161
|
suggested: CONTACT_SUPPORT,
|
|
155
162
|
)
|
|
156
163
|
|
|
@@ -242,6 +249,15 @@ module Datadog
|
|
|
242
249
|
architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64')
|
|
243
250
|
end
|
|
244
251
|
|
|
252
|
+
private_class_method def self.on_ruby_2_1?
|
|
253
|
+
ruby_version_not_supported = explain_issue(
|
|
254
|
+
'the profiler only supports Ruby 2.2 or newer.',
|
|
255
|
+
suggested: UPGRADE_RUBY,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
ruby_version_not_supported if RUBY_VERSION.start_with?('2.1.')
|
|
259
|
+
end
|
|
260
|
+
|
|
245
261
|
# On some Rubies, we require the mjit header to be present. If Ruby was installed without MJIT support, we also skip
|
|
246
262
|
# building the extension.
|
|
247
263
|
private_class_method def self.expected_to_use_mjit_but_mjit_is_disabled?
|
|
@@ -255,17 +271,17 @@ module Datadog
|
|
|
255
271
|
ruby_without_mjit if CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
|
|
256
272
|
end
|
|
257
273
|
|
|
258
|
-
private_class_method def self.
|
|
274
|
+
private_class_method def self.libdatadog_not_usable?
|
|
259
275
|
no_binaries_for_current_platform = explain_issue(
|
|
260
|
-
'the `
|
|
276
|
+
'the `libdatadog` gem installed on your system is missing binaries for your',
|
|
261
277
|
'platform variant.',
|
|
262
278
|
"(Your platform: `#{Gem::Platform.local}`)",
|
|
263
279
|
'(Available binaries: ',
|
|
264
|
-
"`#{
|
|
280
|
+
"`#{Libdatadog.available_binaries.join('`, `')}`)",
|
|
265
281
|
suggested: CONTACT_SUPPORT,
|
|
266
282
|
)
|
|
267
283
|
|
|
268
|
-
no_binaries_for_current_platform unless
|
|
284
|
+
no_binaries_for_current_platform unless Libdatadog.pkgconfig_folder
|
|
269
285
|
end
|
|
270
286
|
end
|
|
271
287
|
# rubocop:enable Metrics/ModuleLength
|
|
@@ -13,7 +13,13 @@
|
|
|
13
13
|
#include RUBY_MJIT_HEADER
|
|
14
14
|
#else
|
|
15
15
|
// On older Rubies, use a copy of the VM internal headers shipped in the debase-ruby_core_source gem
|
|
16
|
-
|
|
16
|
+
|
|
17
|
+
// We can't do anything about warnings in VM headers, so we just use this technique to surpress them.
|
|
18
|
+
// See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
|
|
19
|
+
#pragma GCC diagnostic push
|
|
20
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
21
|
+
#include <vm_core.h>
|
|
22
|
+
#pragma GCC diagnostic pop
|
|
17
23
|
#include <iseq.h>
|
|
18
24
|
#endif
|
|
19
25
|
|
|
@@ -68,7 +74,6 @@ ptrdiff_t stack_depth_for(VALUE thread) {
|
|
|
68
74
|
#define ccan_list_for_each list_for_each
|
|
69
75
|
#endif
|
|
70
76
|
|
|
71
|
-
#ifndef USE_LEGACY_LIVING_THREADS_ST // Ruby > 2.1
|
|
72
77
|
// Tries to match rb_thread_list() but that method isn't accessible to extensions
|
|
73
78
|
VALUE ddtrace_thread_list(void) {
|
|
74
79
|
VALUE result = rb_ary_new();
|
|
@@ -103,36 +108,25 @@ VALUE ddtrace_thread_list(void) {
|
|
|
103
108
|
|
|
104
109
|
return result;
|
|
105
110
|
}
|
|
106
|
-
#else // USE_LEGACY_LIVING_THREADS_ST
|
|
107
|
-
static int ddtrace_thread_list_each(st_data_t thread_object, st_data_t _value, void *result_object);
|
|
108
|
-
|
|
109
|
-
// Alternative ddtrace_thread_list implementation for Ruby 2.1. In this Ruby version, living threads were stored in a
|
|
110
|
-
// hashmap (st) instead of a list.
|
|
111
|
-
VALUE ddtrace_thread_list() {
|
|
112
|
-
VALUE result = rb_ary_new();
|
|
113
|
-
st_foreach(thread_struct_from_object(rb_thread_current())->vm->living_threads, ddtrace_thread_list_each, result);
|
|
114
|
-
return result;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
static int ddtrace_thread_list_each(st_data_t thread_object, st_data_t _value, void *result_object) {
|
|
118
|
-
VALUE result = (VALUE) result_object;
|
|
119
|
-
rb_thread_t *thread = thread_struct_from_object((VALUE) thread_object);
|
|
120
|
-
switch (thread->status) {
|
|
121
|
-
case THREAD_RUNNABLE:
|
|
122
|
-
case THREAD_STOPPED:
|
|
123
|
-
case THREAD_STOPPED_FOREVER:
|
|
124
|
-
rb_ary_push(result, thread->self);
|
|
125
|
-
default:
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
return ST_CONTINUE;
|
|
129
|
-
}
|
|
130
|
-
#endif // USE_LEGACY_LIVING_THREADS_ST
|
|
131
111
|
|
|
132
112
|
bool is_thread_alive(VALUE thread) {
|
|
133
113
|
return thread_struct_from_object(thread)->status != THREAD_KILLED;
|
|
134
114
|
}
|
|
135
115
|
|
|
116
|
+
// `thread` gets used on all Rubies except 2.2
|
|
117
|
+
// To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
|
|
118
|
+
// with diagnostic stuff. See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
|
|
119
|
+
#pragma GCC diagnostic push
|
|
120
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
121
|
+
VALUE thread_name_for(VALUE thread) {
|
|
122
|
+
#ifdef NO_THREAD_NAMES
|
|
123
|
+
return Qnil;
|
|
124
|
+
#else
|
|
125
|
+
return thread_struct_from_object(thread)->name;
|
|
126
|
+
#endif
|
|
127
|
+
}
|
|
128
|
+
#pragma GCC diagnostic pop
|
|
129
|
+
|
|
136
130
|
// -----------------------------------------------------------------------------
|
|
137
131
|
// The sources below are modified versions of code extracted from the Ruby project.
|
|
138
132
|
// Each function is annotated with its origin, why we imported it, and the changes made.
|
|
@@ -174,6 +168,12 @@ bool is_thread_alive(VALUE thread) {
|
|
|
174
168
|
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
|
175
169
|
// to support our custom rb_profile_frames (see below)
|
|
176
170
|
// Modifications: None
|
|
171
|
+
//
|
|
172
|
+
// `node_id` gets used depending on Ruby VM compilation settings (USE_ISEQ_NODE_ID being defined).
|
|
173
|
+
// To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
|
|
174
|
+
// with diagnostic stuff. See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
|
|
175
|
+
#pragma GCC diagnostic push
|
|
176
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
177
177
|
inline static int
|
|
178
178
|
calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
|
|
179
179
|
{
|
|
@@ -217,6 +217,7 @@ calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
|
|
|
217
217
|
return 1;
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
+
#pragma GCC diagnostic pop
|
|
220
221
|
|
|
221
222
|
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
|
222
223
|
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
|
@@ -620,11 +621,11 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
|
|
|
620
621
|
// * Check thread status and do not sample if thread has been killed.
|
|
621
622
|
//
|
|
622
623
|
// The `rb_profile_frames` function changed quite a bit between Ruby 2.2 and 2.3. Since the change was quite complex
|
|
623
|
-
// I opted not to try to extend support to Ruby 2.2
|
|
624
|
+
// I opted not to try to extend support to Ruby 2.2 using the same custom function, and instead I started
|
|
624
625
|
// anew from the Ruby 2.2 version of the function, applying some of the same fixes that we have for the modern version.
|
|
625
626
|
int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame)
|
|
626
627
|
{
|
|
627
|
-
// **IMPORTANT: THIS IS A CUSTOM RB_PROFILE_FRAMES JUST FOR RUBY 2.2
|
|
628
|
+
// **IMPORTANT: THIS IS A CUSTOM RB_PROFILE_FRAMES JUST FOR RUBY 2.2;
|
|
628
629
|
// SEE ABOVE FOR THE FUNCTION THAT GETS USED FOR MODERN RUBIES**
|
|
629
630
|
|
|
630
631
|
int i;
|
|
@@ -6,11 +6,7 @@
|
|
|
6
6
|
// so we use PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES to be able to include private_vm_api_access.h on that file
|
|
7
7
|
// without also dragging the incompatible includes
|
|
8
8
|
#ifndef PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
|
|
9
|
-
#
|
|
10
|
-
#include <thread_native.h>
|
|
11
|
-
#else
|
|
12
|
-
#include <ruby/thread_native.h>
|
|
13
|
-
#endif
|
|
9
|
+
#include <ruby/thread_native.h>
|
|
14
10
|
#endif
|
|
15
11
|
|
|
16
12
|
#include "extconf.h"
|
|
@@ -19,6 +15,7 @@ rb_nativethread_id_t pthread_id_for(VALUE thread);
|
|
|
19
15
|
ptrdiff_t stack_depth_for(VALUE thread);
|
|
20
16
|
VALUE ddtrace_thread_list(void);
|
|
21
17
|
bool is_thread_alive(VALUE thread);
|
|
18
|
+
VALUE thread_name_for(VALUE thread);
|
|
22
19
|
|
|
23
20
|
int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame);
|
|
24
21
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include <ruby.h>
|
|
2
2
|
|
|
3
3
|
#include "clock_id.h"
|
|
4
|
+
#include "helpers.h"
|
|
4
5
|
|
|
5
6
|
// Each class/module here is implemented in their separate file
|
|
6
7
|
void collectors_cpu_and_wall_time_init(VALUE profiling_module);
|
|
@@ -10,8 +11,6 @@ void stack_recorder_init(VALUE profiling_module);
|
|
|
10
11
|
|
|
11
12
|
static VALUE native_working_p(VALUE self);
|
|
12
13
|
|
|
13
|
-
#define DDTRACE_EXPORT __attribute__ ((visibility ("default")))
|
|
14
|
-
|
|
15
14
|
void DDTRACE_EXPORT Init_ddtrace_profiling_native_extension(void) {
|
|
16
15
|
VALUE datadog_module = rb_define_module("Datadog");
|
|
17
16
|
VALUE profiling_module = rb_define_module_under(datadog_module, "Profiling");
|
|
@@ -28,7 +27,7 @@ void DDTRACE_EXPORT Init_ddtrace_profiling_native_extension(void) {
|
|
|
28
27
|
stack_recorder_init(profiling_module);
|
|
29
28
|
}
|
|
30
29
|
|
|
31
|
-
static VALUE native_working_p(VALUE
|
|
30
|
+
static VALUE native_working_p(DDTRACE_UNUSED VALUE _self) {
|
|
32
31
|
self_test_clock_id();
|
|
33
32
|
|
|
34
33
|
return Qtrue;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#include "ruby_helpers.h"
|
|
2
|
+
|
|
3
|
+
void raise_unexpected_type(
|
|
4
|
+
VALUE value,
|
|
5
|
+
DDTRACE_UNUSED enum ruby_value_type _type,
|
|
6
|
+
const char *value_name,
|
|
7
|
+
const char *type_name,
|
|
8
|
+
const char *file,
|
|
9
|
+
int line,
|
|
10
|
+
const char* function_name
|
|
11
|
+
) {
|
|
12
|
+
rb_exc_raise(
|
|
13
|
+
rb_exc_new_str(
|
|
14
|
+
rb_eTypeError,
|
|
15
|
+
rb_sprintf("wrong argument %"PRIsVALUE" for '%s' (expected a %s) at %s:%d:in `%s'",
|
|
16
|
+
rb_inspect(value),
|
|
17
|
+
value_name,
|
|
18
|
+
type_name,
|
|
19
|
+
file,
|
|
20
|
+
line,
|
|
21
|
+
function_name
|
|
22
|
+
)
|
|
23
|
+
)
|
|
24
|
+
);
|
|
25
|
+
}
|