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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d512b6ba74cbbe3c0b879a8efd29a513680dfd1ce9864c785887717ababf7880
|
|
4
|
+
data.tar.gz: 637d702bc35996f24d28904f20d77e4c6dece600c98eec6bbc47ba72ba7a96e2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bee0a447195f79d8a551f1c5076f283601c4ea14ec049f6dc077213ae578d0bdd5a0456f5b6d741a719d7543cc161b3da79970a5d696d0e2cd1e068166d9954d
|
|
7
|
+
data.tar.gz: da1801a3e6cdf5b559bca925126e68add53293b0a581666302020fdeb6dea3a27e7a4d70ead568f24a9158184f957cd25e6c3ae3b3c267b4d467ff96114e3c8a
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.3.0] - 2022-08-04
|
|
6
|
+
|
|
7
|
+
Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v1.3.0
|
|
8
|
+
|
|
9
|
+
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v1.2.0...v1.3.0
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
* Top-level span being tagged to avoid duplicate computation ([#2138][])
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
* ActiveSupport: Optionally disable tracing with Rails ([@marcotc][])
|
|
18
|
+
* Rack: Resource overwritten by nested application ([#2180][])
|
|
19
|
+
* Rake: Explicit task instrumentation to prevent memory bloat ([#2174][])
|
|
20
|
+
* Sidekiq and DelayedJob: Add spans to improve tracing ([#2170][])
|
|
21
|
+
* Drop Profiling support for Ruby 2.1 ([#2140][])
|
|
22
|
+
* Migrate `libddprof` dependency to `libdatadog` ([#2061][])
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
* Fix OpenTracing propagation with TraceDigest ([#2201][])
|
|
27
|
+
* Fix SpanFilter dropping descendant spans ([#2074][])
|
|
28
|
+
* Redis: Fix Empty pipelined span being dropped ([#757][]) ([@sponomarev][])
|
|
29
|
+
* Fix profiler not restarting on `Process.daemon` ([#2150][])
|
|
30
|
+
* Fix setting service from Rails configuration ([#2118][]) ([@agrobbin][])
|
|
31
|
+
* Some document and development improvement ([@marocchino][]) ([@yukimurasawa][])
|
|
32
|
+
|
|
5
33
|
## [1.2.0] - 2022-07-11
|
|
6
34
|
|
|
7
35
|
Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v1.2.0
|
|
@@ -2354,6 +2382,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
2354
2382
|
[#753]: https://github.com/DataDog/dd-trace-rb/issues/753
|
|
2355
2383
|
[#754]: https://github.com/DataDog/dd-trace-rb/issues/754
|
|
2356
2384
|
[#756]: https://github.com/DataDog/dd-trace-rb/issues/756
|
|
2385
|
+
[#757]: https://github.com/DataDog/dd-trace-rb/issues/757
|
|
2357
2386
|
[#760]: https://github.com/DataDog/dd-trace-rb/issues/760
|
|
2358
2387
|
[#762]: https://github.com/DataDog/dd-trace-rb/issues/762
|
|
2359
2388
|
[#765]: https://github.com/DataDog/dd-trace-rb/issues/765
|
|
@@ -2892,9 +2921,11 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
2892
2921
|
[#2028]: https://github.com/DataDog/dd-trace-rb/issues/2028
|
|
2893
2922
|
[#2054]: https://github.com/DataDog/dd-trace-rb/issues/2054
|
|
2894
2923
|
[#2059]: https://github.com/DataDog/dd-trace-rb/issues/2059
|
|
2924
|
+
[#2061]: https://github.com/DataDog/dd-trace-rb/issues/2061
|
|
2895
2925
|
[#2066]: https://github.com/DataDog/dd-trace-rb/issues/2066
|
|
2896
2926
|
[#2069]: https://github.com/DataDog/dd-trace-rb/issues/2069
|
|
2897
2927
|
[#2070]: https://github.com/DataDog/dd-trace-rb/issues/2070
|
|
2928
|
+
[#2074]: https://github.com/DataDog/dd-trace-rb/issues/2074
|
|
2898
2929
|
[#2076]: https://github.com/DataDog/dd-trace-rb/issues/2076
|
|
2899
2930
|
[#2079]: https://github.com/DataDog/dd-trace-rb/issues/2079
|
|
2900
2931
|
[#2082]: https://github.com/DataDog/dd-trace-rb/issues/2082
|
|
@@ -2902,8 +2933,19 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
2902
2933
|
[#2097]: https://github.com/DataDog/dd-trace-rb/issues/2097
|
|
2903
2934
|
[#2110]: https://github.com/DataDog/dd-trace-rb/issues/2110
|
|
2904
2935
|
[#2113]: https://github.com/DataDog/dd-trace-rb/issues/2113
|
|
2936
|
+
[#2118]: https://github.com/DataDog/dd-trace-rb/issues/2118
|
|
2905
2937
|
[#2125]: https://github.com/DataDog/dd-trace-rb/issues/2125
|
|
2906
2938
|
[#2134]: https://github.com/DataDog/dd-trace-rb/issues/2134
|
|
2939
|
+
[#2138]: https://github.com/DataDog/dd-trace-rb/issues/2138
|
|
2940
|
+
[#2140]: https://github.com/DataDog/dd-trace-rb/issues/2140
|
|
2941
|
+
[#2150]: https://github.com/DataDog/dd-trace-rb/issues/2150
|
|
2942
|
+
[#2158]: https://github.com/DataDog/dd-trace-rb/issues/2158
|
|
2943
|
+
[#2162]: https://github.com/DataDog/dd-trace-rb/issues/2162
|
|
2944
|
+
[#2163]: https://github.com/DataDog/dd-trace-rb/issues/2163
|
|
2945
|
+
[#2173]: https://github.com/DataDog/dd-trace-rb/issues/2173
|
|
2946
|
+
[#2174]: https://github.com/DataDog/dd-trace-rb/issues/2174
|
|
2947
|
+
[#2180]: https://github.com/DataDog/dd-trace-rb/issues/2180
|
|
2948
|
+
[#2201]: https://github.com/DataDog/dd-trace-rb/issues/2201
|
|
2907
2949
|
[@AdrianLC]: https://github.com/AdrianLC
|
|
2908
2950
|
[@Azure7111]: https://github.com/Azure7111
|
|
2909
2951
|
[@BabyGroot]: https://github.com/BabyGroot
|
|
@@ -2996,6 +3038,8 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
2996
3038
|
[@link04]: https://github.com/link04
|
|
2997
3039
|
[@lloeki]: https://github.com/lloeki
|
|
2998
3040
|
[@mantrala]: https://github.com/mantrala
|
|
3041
|
+
[@marcotc]: https://github.com/marcotc
|
|
3042
|
+
[@marocchino]: https://github.com/marocchino
|
|
2999
3043
|
[@masato-hi]: https://github.com/masato-hi
|
|
3000
3044
|
[@matchbookmac]: https://github.com/matchbookmac
|
|
3001
3045
|
[@mberlanda]: https://github.com/mberlanda
|
|
@@ -3027,6 +3071,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3027
3071
|
[@sinsoku]: https://github.com/sinsoku
|
|
3028
3072
|
[@skcc321]: https://github.com/skcc321
|
|
3029
3073
|
[@soulcutter]: https://github.com/soulcutter
|
|
3074
|
+
[@sponomarev]: https://github.com/sponomarev
|
|
3030
3075
|
[@stefanahman]: https://github.com/stefanahman
|
|
3031
3076
|
[@steveh]: https://github.com/steveh
|
|
3032
3077
|
[@stormsilver]: https://github.com/stormsilver
|
|
@@ -3041,4 +3086,5 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3041
3086
|
[@vramaiah]: https://github.com/vramaiah
|
|
3042
3087
|
[@walterking]: https://github.com/walterking
|
|
3043
3088
|
[@y-yagi]: https://github.com/y-yagi
|
|
3044
|
-
[@
|
|
3089
|
+
[@yukimurasawa]: https://github.com/yukimurasawa
|
|
3090
|
+
[@zachmccormick]: https://github.com/zachmccormick
|
data/LICENSE-3rdparty.csv
CHANGED
|
@@ -2,3 +2,5 @@ Component,Origin,License,Copyright
|
|
|
2
2
|
lib/datadog/core/vendor/multipart-post,https://github.com/socketry/multipart-post,MIT,"Copyright (c) 2007-2013 Nick Sieger."
|
|
3
3
|
lib/datadog/tracing/contrib/active_record/vendor,https://github.com/rails/rails/,MIT,"Copyright (c) 2005-2018 David Heinemeier Hansson"
|
|
4
4
|
ext/ddtrace_profiling_native_extension/private_vm_api_access,https://github.com/ruby/ruby,BSD-2-Clause,"Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved."
|
|
5
|
+
msgpack,https://rubygems.org/gems/msgpack,Apache-2.0,"Copyright (c) 2008-2015 Sadayuki Furuhashi"
|
|
6
|
+
debase-ruby_core_source,https://rubygems.org/gems/debase-ruby_core_source,MIT for gem and BSD-2-Clause for Ruby sources,"Copyright (c) 2012 Gabriel Horner. Files from Ruby sources are Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved."
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// This idea was shamelessly stolen from @lloeki's work in https://github.com/rubyjs/mini_racer/pull/179, big thanks!
|
|
21
21
|
//
|
|
22
22
|
// Extra note: Currently (May 2022), that we know of, the profiling native extension only exposes one potentially
|
|
23
|
-
// problematic symbol: `rust_eh_personality` (coming from
|
|
23
|
+
// problematic symbol: `rust_eh_personality` (coming from libdatadog).
|
|
24
24
|
// Future versions of Rust have been patched not to expose this
|
|
25
25
|
// (see https://github.com/rust-lang/rust/pull/95604#issuecomment-1108563434) so we may want to revisit the need
|
|
26
26
|
// for this loader in the future, and perhaps delete it if we no longer require its services :)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The profiling native extension is used to:
|
|
4
4
|
1. Implement features which are expensive (in terms of resources) or otherwise impossible to implement using Ruby code.
|
|
5
|
-
2. Bridge between Ruby-specific profiling features and [`
|
|
5
|
+
2. Bridge between Ruby-specific profiling features and [`libdatadog`](https://github.com/DataDog/libdatadog), a Rust-based
|
|
6
6
|
library with common profiling functionality.
|
|
7
7
|
|
|
8
8
|
Due to (1), this extension is quite coupled with MRI Ruby ("C Ruby") internals, and is not intended to support other rubies such as
|
|
@@ -18,6 +18,11 @@ the gem. Setting `DD_PROFILING_NO_EXTENSION` at installation time skips compilat
|
|
|
18
18
|
In past releases, it was possible for the profiler to run without the native extension, but that's no longer the case,
|
|
19
19
|
and disabling the extension will disable profiling.
|
|
20
20
|
|
|
21
|
+
## Who is this page for?
|
|
22
|
+
|
|
23
|
+
This documentation is intended to be used by dd-trace-rb developers. Please see the `docs/` folder for user-level
|
|
24
|
+
documentation.
|
|
25
|
+
|
|
21
26
|
## Must not block or break users that cannot use it
|
|
22
27
|
|
|
23
28
|
The profiling native extension is (and must always be) designed to **not cause failures** during gem installation, even
|
|
@@ -49,7 +54,7 @@ We avoid issues using a combination of:
|
|
|
49
54
|
|
|
50
55
|
Non-exhaustive list of APIs that cause exceptions to be raised:
|
|
51
56
|
|
|
52
|
-
* `Check_TypedStruct`, `Check_Type`
|
|
57
|
+
* `Check_TypedStruct`, `Check_Type`, `ENFORCE_TYPE`
|
|
53
58
|
* `rb_funcall`
|
|
54
59
|
* `rb_thread_call_without_gvl`, `rb_thread_call_without_gvl2`
|
|
55
60
|
* [Numeric conversion APIs, e.g. `NUM2LONG`, `NUM2INT`, etc.](https://silverhammermba.github.io/emberb/c/?#translation)
|
|
@@ -67,6 +72,8 @@ Because these private header files are not included in regular Ruby installation
|
|
|
67
72
|
|
|
68
73
|
Functions which make use of these headers are defined in the <private_vm_api_acccess.c> file.
|
|
69
74
|
|
|
75
|
+
There is currently no way for disabling usage of the private MJIT header for Ruby 2.6+.
|
|
76
|
+
|
|
70
77
|
**Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
|
|
71
78
|
contribute upstream changes so that they become official public VM APIs.
|
|
72
79
|
|
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include <stdbool.h>
|
|
4
|
+
#include <time.h>
|
|
5
|
+
|
|
6
|
+
// Contains the operating-system specific identifier needed to fetch CPU-time, and a flag to indicate if we failed to fetch it
|
|
7
|
+
typedef struct thread_cpu_time_id {
|
|
8
|
+
bool valid;
|
|
9
|
+
clockid_t clock_id;
|
|
10
|
+
} thread_cpu_time_id;
|
|
11
|
+
|
|
12
|
+
// Contains the current cpu time, and a flag to indicate if we failed to fetch it
|
|
13
|
+
typedef struct thread_cpu_time {
|
|
14
|
+
bool valid;
|
|
15
|
+
long result_ns;
|
|
16
|
+
} thread_cpu_time;
|
|
17
|
+
|
|
3
18
|
void self_test_clock_id(void);
|
|
19
|
+
|
|
20
|
+
// TODO: Remove this after the OldStack profiler gets removed
|
|
4
21
|
VALUE clock_id_for(VALUE self, VALUE thread);
|
|
22
|
+
|
|
23
|
+
thread_cpu_time_id thread_cpu_time_id_for(VALUE thread);
|
|
24
|
+
thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id);
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
#include <errno.h>
|
|
10
10
|
|
|
11
11
|
#include <ruby.h>
|
|
12
|
+
#include "helpers.h"
|
|
12
13
|
#include "private_vm_api_access.h"
|
|
13
14
|
#include "clock_id.h"
|
|
14
15
|
|
|
@@ -20,7 +21,8 @@ void self_test_clock_id(void) {
|
|
|
20
21
|
if (expected_pthread_id != actual_pthread_id) rb_raise(rb_eRuntimeError, "pthread_id_for() self-test failed");
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
// TODO: Remove this after the OldStack profiler gets removed
|
|
25
|
+
VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, VALUE thread) {
|
|
24
26
|
rb_nativethread_id_t thread_id = pthread_id_for(thread);
|
|
25
27
|
|
|
26
28
|
clockid_t clock_id;
|
|
@@ -41,4 +43,31 @@ VALUE clock_id_for(VALUE self, VALUE thread) {
|
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
|
|
46
|
+
thread_cpu_time_id thread_cpu_time_id_for(VALUE thread) {
|
|
47
|
+
rb_nativethread_id_t thread_id = pthread_id_for(thread);
|
|
48
|
+
clockid_t clock_id;
|
|
49
|
+
|
|
50
|
+
int error = pthread_getcpuclockid(thread_id, &clock_id);
|
|
51
|
+
|
|
52
|
+
if (error == 0) {
|
|
53
|
+
return (thread_cpu_time_id) {.valid = true, .clock_id = clock_id};
|
|
54
|
+
} else {
|
|
55
|
+
// TODO: Include the error code in some way in the output?
|
|
56
|
+
return (thread_cpu_time_id) {.valid = false};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id) {
|
|
61
|
+
thread_cpu_time error = (thread_cpu_time) {.valid = false};
|
|
62
|
+
|
|
63
|
+
if (!time_id.valid) { return error; }
|
|
64
|
+
|
|
65
|
+
struct timespec current_cpu;
|
|
66
|
+
|
|
67
|
+
// TODO: Include the error code in some way in the output?
|
|
68
|
+
if (clock_gettime(time_id.clock_id, ¤t_cpu) != 0) return error;
|
|
69
|
+
|
|
70
|
+
return (thread_cpu_time) {.valid = true, .result_ns = current_cpu.tv_nsec + (current_cpu.tv_sec * 1000 * 1000 * 1000)};
|
|
71
|
+
}
|
|
72
|
+
|
|
44
73
|
#endif
|
|
@@ -7,8 +7,17 @@
|
|
|
7
7
|
#include <ruby.h>
|
|
8
8
|
|
|
9
9
|
#include "clock_id.h"
|
|
10
|
+
#include "helpers.h"
|
|
10
11
|
|
|
11
12
|
void self_test_clock_id(void) { } // Nothing to check
|
|
12
|
-
VALUE clock_id_for(VALUE
|
|
13
|
+
VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, DDTRACE_UNUSED VALUE _thread) { return Qnil; } // Nothing to return
|
|
14
|
+
|
|
15
|
+
thread_cpu_time_id thread_cpu_time_id_for(DDTRACE_UNUSED VALUE _thread) {
|
|
16
|
+
return (thread_cpu_time_id) {.valid = false};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
thread_cpu_time thread_cpu_time_for(DDTRACE_UNUSED thread_cpu_time_id _time_id) {
|
|
20
|
+
return (thread_cpu_time) {.valid = false};
|
|
21
|
+
}
|
|
13
22
|
|
|
14
23
|
#endif
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
#include <ruby.h>
|
|
2
|
+
#include "helpers.h"
|
|
3
|
+
#include "clock_id.h"
|
|
2
4
|
#include "collectors_stack.h"
|
|
3
|
-
#include "
|
|
5
|
+
#include "libdatadog_helpers.h"
|
|
4
6
|
#include "private_vm_api_access.h"
|
|
7
|
+
#include "stack_recorder.h"
|
|
8
|
+
#include "collectors_cpu_and_wall_time.h"
|
|
5
9
|
|
|
6
|
-
// Used to periodically
|
|
10
|
+
// Used to periodically sample threads, recording elapsed CPU-time and Wall-time between samples.
|
|
11
|
+
//
|
|
7
12
|
// This file implements the native bits of the Datadog::Profiling::Collectors::CpuAndWallTime class
|
|
13
|
+
//
|
|
14
|
+
// Triggering of this component (e.g. deciding when to take a sample) is implemented in Collectors::CpuAndWallTimeWorker.
|
|
8
15
|
|
|
9
|
-
|
|
16
|
+
#define INVALID_TIME -1
|
|
17
|
+
#define THREAD_ID_LIMIT_CHARS 20
|
|
10
18
|
|
|
11
19
|
// Contains state for a single CpuAndWallTime instance
|
|
12
20
|
struct cpu_and_wall_time_collector_state {
|
|
@@ -25,7 +33,11 @@ struct cpu_and_wall_time_collector_state {
|
|
|
25
33
|
|
|
26
34
|
// Tracks per-thread state
|
|
27
35
|
struct per_thread_context {
|
|
28
|
-
|
|
36
|
+
char thread_id[THREAD_ID_LIMIT_CHARS];
|
|
37
|
+
ddprof_ffi_CharSlice thread_id_char_slice;
|
|
38
|
+
thread_cpu_time_id thread_cpu_time_id;
|
|
39
|
+
long cpu_time_at_previous_sample_ns; // Can be INVALID_TIME until initialized or if getting it fails for another reason
|
|
40
|
+
long wall_time_at_previous_sample_ns; // Can be INVALID_TIME until initialized
|
|
29
41
|
};
|
|
30
42
|
|
|
31
43
|
static void cpu_and_wall_time_collector_typed_data_mark(void *state_ptr);
|
|
@@ -35,19 +47,25 @@ static int hash_map_per_thread_context_free_values(st_data_t _thread, st_data_t
|
|
|
35
47
|
static VALUE _native_new(VALUE klass);
|
|
36
48
|
static VALUE _native_initialize(VALUE self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames);
|
|
37
49
|
static VALUE _native_sample(VALUE self, VALUE collector_instance);
|
|
38
|
-
static void sample(VALUE collector_instance);
|
|
39
50
|
static VALUE _native_thread_list(VALUE self);
|
|
40
51
|
static struct per_thread_context *get_or_create_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state);
|
|
52
|
+
static void initialize_context(VALUE thread, struct per_thread_context *thread_context);
|
|
41
53
|
static VALUE _native_inspect(VALUE self, VALUE collector_instance);
|
|
42
54
|
static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_collector_state *state);
|
|
43
55
|
static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash);
|
|
44
56
|
static void remove_context_for_dead_threads(struct cpu_and_wall_time_collector_state *state);
|
|
45
57
|
static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, st_data_t _argument);
|
|
46
58
|
static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance);
|
|
59
|
+
static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns);
|
|
60
|
+
static long cpu_time_now_ns(struct per_thread_context *thread_context);
|
|
61
|
+
static long wall_time_now_ns();
|
|
62
|
+
static long thread_id_for(VALUE thread);
|
|
47
63
|
|
|
48
64
|
void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
|
|
49
65
|
VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
|
|
50
|
-
collectors_cpu_and_wall_time_class = rb_define_class_under(collectors_module, "CpuAndWallTime", rb_cObject);
|
|
66
|
+
VALUE collectors_cpu_and_wall_time_class = rb_define_class_under(collectors_module, "CpuAndWallTime", rb_cObject);
|
|
67
|
+
// Hosts methods used for testing the native code using RSpec
|
|
68
|
+
VALUE testing_module = rb_define_module_under(collectors_cpu_and_wall_time_class, "Testing");
|
|
51
69
|
|
|
52
70
|
// Instances of the CpuAndWallTime class are "TypedData" objects.
|
|
53
71
|
// "TypedData" objects are special objects in the Ruby VM that can wrap C structs.
|
|
@@ -60,10 +78,10 @@ void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
|
|
|
60
78
|
rb_define_alloc_func(collectors_cpu_and_wall_time_class, _native_new);
|
|
61
79
|
|
|
62
80
|
rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_initialize", _native_initialize, 3);
|
|
63
|
-
rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_sample", _native_sample, 1);
|
|
64
|
-
rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_thread_list", _native_thread_list, 0);
|
|
65
81
|
rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_inspect", _native_inspect, 1);
|
|
66
|
-
rb_define_singleton_method(
|
|
82
|
+
rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 1);
|
|
83
|
+
rb_define_singleton_method(testing_module, "_native_thread_list", _native_thread_list, 0);
|
|
84
|
+
rb_define_singleton_method(testing_module, "_native_per_thread_context", _native_per_thread_context, 1);
|
|
67
85
|
}
|
|
68
86
|
|
|
69
87
|
// This structure is used to define a Ruby object that stores a pointer to a struct cpu_and_wall_time_collector_state
|
|
@@ -107,14 +125,14 @@ static void cpu_and_wall_time_collector_typed_data_free(void *state_ptr) {
|
|
|
107
125
|
}
|
|
108
126
|
|
|
109
127
|
// Mark Ruby thread references we keep as keys in hash_map_per_thread_context
|
|
110
|
-
static int hash_map_per_thread_context_mark(st_data_t key_thread, st_data_t _value, st_data_t _argument) {
|
|
128
|
+
static int hash_map_per_thread_context_mark(st_data_t key_thread, DDTRACE_UNUSED st_data_t _value, DDTRACE_UNUSED st_data_t _argument) {
|
|
111
129
|
VALUE thread = (VALUE) key_thread;
|
|
112
130
|
rb_gc_mark(thread);
|
|
113
131
|
return ST_CONTINUE;
|
|
114
132
|
}
|
|
115
133
|
|
|
116
134
|
// Used to clear each of the per_thread_contexts inside the hash_map_per_thread_context
|
|
117
|
-
static int hash_map_per_thread_context_free_values(st_data_t _thread, st_data_t value_per_thread_context, st_data_t _argument) {
|
|
135
|
+
static int hash_map_per_thread_context_free_values(DDTRACE_UNUSED st_data_t _thread, st_data_t value_per_thread_context, DDTRACE_UNUSED st_data_t _argument) {
|
|
118
136
|
struct per_thread_context *per_thread_context = (struct per_thread_context*) value_per_thread_context;
|
|
119
137
|
ruby_xfree(per_thread_context);
|
|
120
138
|
return ST_CONTINUE;
|
|
@@ -131,10 +149,10 @@ static VALUE _native_new(VALUE klass) {
|
|
|
131
149
|
state->recorder_instance = Qnil;
|
|
132
150
|
state->sample_count = 0;
|
|
133
151
|
|
|
134
|
-
return TypedData_Wrap_Struct(
|
|
152
|
+
return TypedData_Wrap_Struct(klass, &cpu_and_wall_time_collector_typed_data, state);
|
|
135
153
|
}
|
|
136
154
|
|
|
137
|
-
static VALUE _native_initialize(VALUE
|
|
155
|
+
static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames) {
|
|
138
156
|
enforce_recorder_instance(recorder_instance);
|
|
139
157
|
|
|
140
158
|
struct cpu_and_wall_time_collector_state *state;
|
|
@@ -153,35 +171,60 @@ static VALUE _native_initialize(VALUE self, VALUE collector_instance, VALUE reco
|
|
|
153
171
|
|
|
154
172
|
// This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
|
|
155
173
|
// It SHOULD NOT be used for other purposes.
|
|
156
|
-
static VALUE _native_sample(VALUE
|
|
157
|
-
|
|
174
|
+
static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
175
|
+
cpu_and_wall_time_collector_sample(collector_instance);
|
|
158
176
|
return Qtrue;
|
|
159
177
|
}
|
|
160
178
|
|
|
161
|
-
|
|
179
|
+
// This function gets called from the Collectors::CpuAndWallTimeWorker to trigger the actual sampling.
|
|
180
|
+
//
|
|
181
|
+
// Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
|
|
182
|
+
// Assumption 2: This function is allowed to raise exceptions. Caller is responsible for handling them, if needed.
|
|
183
|
+
VALUE cpu_and_wall_time_collector_sample(VALUE self_instance) {
|
|
162
184
|
struct cpu_and_wall_time_collector_state *state;
|
|
163
|
-
TypedData_Get_Struct(
|
|
185
|
+
TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
|
|
164
186
|
|
|
165
187
|
VALUE threads = ddtrace_thread_list();
|
|
188
|
+
long current_wall_time_ns = wall_time_now_ns();
|
|
166
189
|
|
|
167
190
|
const long thread_count = RARRAY_LEN(threads);
|
|
168
191
|
for (long i = 0; i < thread_count; i++) {
|
|
169
192
|
VALUE thread = RARRAY_AREF(threads, i);
|
|
170
193
|
struct per_thread_context *thread_context = get_or_create_context_for(thread, state);
|
|
171
194
|
|
|
195
|
+
long current_cpu_time_ns = cpu_time_now_ns(thread_context);
|
|
196
|
+
|
|
197
|
+
long cpu_time_elapsed_ns =
|
|
198
|
+
update_time_since_previous_sample(&thread_context->cpu_time_at_previous_sample_ns, current_cpu_time_ns);
|
|
199
|
+
long wall_time_elapsed_ns =
|
|
200
|
+
update_time_since_previous_sample(&thread_context->wall_time_at_previous_sample_ns, current_wall_time_ns);
|
|
201
|
+
|
|
172
202
|
int64_t metric_values[ENABLED_VALUE_TYPES_COUNT] = {0};
|
|
173
203
|
|
|
174
|
-
|
|
175
|
-
metric_values[
|
|
176
|
-
metric_values[
|
|
177
|
-
|
|
204
|
+
metric_values[CPU_TIME_VALUE_POS] = cpu_time_elapsed_ns;
|
|
205
|
+
metric_values[CPU_SAMPLES_VALUE_POS] = 1;
|
|
206
|
+
metric_values[WALL_TIME_VALUE_POS] = wall_time_elapsed_ns;
|
|
207
|
+
|
|
208
|
+
VALUE thread_name = thread_name_for(thread);
|
|
209
|
+
bool have_thread_name = thread_name != Qnil;
|
|
210
|
+
|
|
211
|
+
int label_count = 1 + (have_thread_name ? 1 : 0);
|
|
212
|
+
ddprof_ffi_Label labels[label_count];
|
|
213
|
+
|
|
214
|
+
labels[0] = (ddprof_ffi_Label) {.key = DDPROF_FFI_CHARSLICE_C("thread id"), .str = thread_context->thread_id_char_slice};
|
|
215
|
+
if (have_thread_name) {
|
|
216
|
+
labels[1] = (ddprof_ffi_Label) {
|
|
217
|
+
.key = DDPROF_FFI_CHARSLICE_C("thread name"),
|
|
218
|
+
.str = char_slice_from_ruby_string(thread_name)
|
|
219
|
+
};
|
|
220
|
+
}
|
|
178
221
|
|
|
179
222
|
sample_thread(
|
|
180
223
|
thread,
|
|
181
224
|
state->sampling_buffer,
|
|
182
225
|
state->recorder_instance,
|
|
183
226
|
(ddprof_ffi_Slice_i64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
|
|
184
|
-
(ddprof_ffi_Slice_label) {.ptr =
|
|
227
|
+
(ddprof_ffi_Slice_label) {.ptr = labels, .len = label_count}
|
|
185
228
|
);
|
|
186
229
|
}
|
|
187
230
|
|
|
@@ -190,11 +233,14 @@ static void sample(VALUE collector_instance) {
|
|
|
190
233
|
// TODO: This seems somewhat overkill and inefficient to do often; right now we just doing every few samples
|
|
191
234
|
// but there's probably a better way to do this if we actually track when threads finish
|
|
192
235
|
if (state->sample_count % 100 == 0) remove_context_for_dead_threads(state);
|
|
236
|
+
|
|
237
|
+
// Return a VALUE to make it easier to call this function from Ruby APIs that expect a return value (such as rb_rescue2)
|
|
238
|
+
return Qnil;
|
|
193
239
|
}
|
|
194
240
|
|
|
195
241
|
// This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
|
|
196
242
|
// It SHOULD NOT be used for other purposes.
|
|
197
|
-
static VALUE _native_thread_list(VALUE
|
|
243
|
+
static VALUE _native_thread_list(DDTRACE_UNUSED VALUE _self) {
|
|
198
244
|
return ddtrace_thread_list();
|
|
199
245
|
}
|
|
200
246
|
|
|
@@ -206,13 +252,25 @@ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct
|
|
|
206
252
|
thread_context = (struct per_thread_context*) value_context;
|
|
207
253
|
} else {
|
|
208
254
|
thread_context = ruby_xcalloc(1, sizeof(struct per_thread_context));
|
|
255
|
+
initialize_context(thread, thread_context);
|
|
209
256
|
st_insert(state->hash_map_per_thread_context, (st_data_t) thread, (st_data_t) thread_context);
|
|
210
257
|
}
|
|
211
258
|
|
|
212
259
|
return thread_context;
|
|
213
260
|
}
|
|
214
261
|
|
|
215
|
-
static
|
|
262
|
+
static void initialize_context(VALUE thread, struct per_thread_context *thread_context) {
|
|
263
|
+
snprintf(thread_context->thread_id, THREAD_ID_LIMIT_CHARS, "%ld", thread_id_for(thread));
|
|
264
|
+
thread_context->thread_id_char_slice = (ddprof_ffi_CharSlice) {.ptr = thread_context->thread_id, .len = strlen(thread_context->thread_id)};
|
|
265
|
+
|
|
266
|
+
thread_context->thread_cpu_time_id = thread_cpu_time_id_for(thread);
|
|
267
|
+
|
|
268
|
+
// These will get initialized during actual sampling
|
|
269
|
+
thread_context->cpu_time_at_previous_sample_ns = INVALID_TIME;
|
|
270
|
+
thread_context->wall_time_at_previous_sample_ns = INVALID_TIME;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
216
274
|
struct cpu_and_wall_time_collector_state *state;
|
|
217
275
|
TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
|
|
218
276
|
|
|
@@ -236,11 +294,18 @@ static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_c
|
|
|
236
294
|
|
|
237
295
|
static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash) {
|
|
238
296
|
VALUE thread = (VALUE) key_thread;
|
|
297
|
+
struct per_thread_context *thread_context = (struct per_thread_context*) value_context;
|
|
239
298
|
VALUE result = (VALUE) result_hash;
|
|
240
299
|
VALUE context_as_hash = rb_hash_new();
|
|
241
300
|
rb_hash_aset(result, thread, context_as_hash);
|
|
242
301
|
|
|
243
|
-
VALUE arguments[] = {
|
|
302
|
+
VALUE arguments[] = {
|
|
303
|
+
ID2SYM(rb_intern("thread_id")), /* => */ rb_str_new2(thread_context->thread_id),
|
|
304
|
+
ID2SYM(rb_intern("thread_cpu_time_id_valid?")), /* => */ thread_context->thread_cpu_time_id.valid ? Qtrue : Qfalse,
|
|
305
|
+
ID2SYM(rb_intern("thread_cpu_time_id")), /* => */ CLOCKID2NUM(thread_context->thread_cpu_time_id.clock_id),
|
|
306
|
+
ID2SYM(rb_intern("cpu_time_at_previous_sample_ns")), /* => */ LONG2NUM(thread_context->cpu_time_at_previous_sample_ns),
|
|
307
|
+
ID2SYM(rb_intern("wall_time_at_previous_sample_ns")), /* => */ LONG2NUM(thread_context->wall_time_at_previous_sample_ns)
|
|
308
|
+
};
|
|
244
309
|
for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(context_as_hash, arguments[i], arguments[i+1]);
|
|
245
310
|
|
|
246
311
|
return ST_CONTINUE;
|
|
@@ -250,7 +315,7 @@ static void remove_context_for_dead_threads(struct cpu_and_wall_time_collector_s
|
|
|
250
315
|
st_foreach(state->hash_map_per_thread_context, remove_if_dead_thread, 0 /* unused */);
|
|
251
316
|
}
|
|
252
317
|
|
|
253
|
-
static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, st_data_t _argument) {
|
|
318
|
+
static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, DDTRACE_UNUSED st_data_t _argument) {
|
|
254
319
|
VALUE thread = (VALUE) key_thread;
|
|
255
320
|
struct per_thread_context* thread_context = (struct per_thread_context*) value_context;
|
|
256
321
|
|
|
@@ -260,10 +325,65 @@ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context,
|
|
|
260
325
|
return ST_DELETE;
|
|
261
326
|
}
|
|
262
327
|
|
|
263
|
-
//
|
|
264
|
-
|
|
328
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
|
|
329
|
+
// It SHOULD NOT be used for other purposes.
|
|
330
|
+
//
|
|
331
|
+
// Returns the whole contents of the per_thread_context structs being tracked.
|
|
332
|
+
static VALUE _native_per_thread_context(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
265
333
|
struct cpu_and_wall_time_collector_state *state;
|
|
266
334
|
TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
|
|
267
335
|
|
|
268
336
|
return per_thread_context_st_table_as_ruby_hash(state);
|
|
269
337
|
}
|
|
338
|
+
|
|
339
|
+
static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns) {
|
|
340
|
+
// If we didn't have a time for the previous sample, we use the current one
|
|
341
|
+
if (*time_at_previous_sample_ns == INVALID_TIME) *time_at_previous_sample_ns = current_time_ns;
|
|
342
|
+
|
|
343
|
+
long elapsed_time_ns = current_time_ns - *time_at_previous_sample_ns;
|
|
344
|
+
*time_at_previous_sample_ns = current_time_ns;
|
|
345
|
+
|
|
346
|
+
return elapsed_time_ns >= 0 ? elapsed_time_ns : 0 /* In case something really weird happened */;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
static long wall_time_now_ns() {
|
|
350
|
+
struct timespec current_monotonic;
|
|
351
|
+
|
|
352
|
+
if (clock_gettime(CLOCK_MONOTONIC, ¤t_monotonic) != 0) rb_sys_fail("Failed to read CLOCK_MONOTONIC");
|
|
353
|
+
|
|
354
|
+
return current_monotonic.tv_nsec + (current_monotonic.tv_sec * 1000 * 1000 * 1000);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
static long cpu_time_now_ns(struct per_thread_context *thread_context) {
|
|
358
|
+
thread_cpu_time cpu_time = thread_cpu_time_for(thread_context->thread_cpu_time_id);
|
|
359
|
+
|
|
360
|
+
if (!cpu_time.valid) {
|
|
361
|
+
// Invalidate previous state of the counter (if any), it's no longer accurate. We need to get two good reads
|
|
362
|
+
// in a row to have an accurate delta.
|
|
363
|
+
thread_context->cpu_time_at_previous_sample_ns = INVALID_TIME;
|
|
364
|
+
return 0;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return cpu_time.result_ns;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
static long thread_id_for(VALUE thread) {
|
|
371
|
+
VALUE object_id = rb_obj_id(thread);
|
|
372
|
+
|
|
373
|
+
// The API docs for Ruby state that `rb_obj_id` COULD be a BIGNUM and that if you want to be really sure you don't
|
|
374
|
+
// get a BIGNUM, then you should use `rb_memory_id`. But `rb_memory_id` is less interesting because it's less visible
|
|
375
|
+
// at the user level than the result of calling `#object_id`.
|
|
376
|
+
//
|
|
377
|
+
// It also seems uncommon to me that we'd ever get a BIGNUM; on old Ruby versions (pre-GC compaction), the object id
|
|
378
|
+
// was the pointer to the object, so that's not going to be a BIGNUM; on modern Ruby versions, Ruby keeps
|
|
379
|
+
// a counter, and only increments it for objects for which `#object_id`/`rb_obj_id` is called (e.g. most objects
|
|
380
|
+
// won't actually have an object id allocated).
|
|
381
|
+
//
|
|
382
|
+
// So, for now, let's simplify: we only support FIXNUMs, and we won't break if we get a BIGNUM; we just won't
|
|
383
|
+
// record the thread_id (but samples will still be collected).
|
|
384
|
+
return FIXNUM_P(object_id) ? FIX2LONG(object_id) : -1;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
void enforce_cpu_and_wall_time_collector_instance(VALUE object) {
|
|
388
|
+
Check_TypedStruct(object, &cpu_and_wall_time_collector_typed_data);
|
|
389
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
#include <ruby.h>
|
|
2
2
|
#include <ruby/debug.h>
|
|
3
3
|
#include "extconf.h"
|
|
4
|
-
#include "
|
|
4
|
+
#include "helpers.h"
|
|
5
|
+
#include "libdatadog_helpers.h"
|
|
6
|
+
#include "ruby_helpers.h"
|
|
5
7
|
#include "private_vm_api_access.h"
|
|
6
8
|
#include "stack_recorder.h"
|
|
7
9
|
#include "collectors_stack.h"
|
|
@@ -31,8 +33,10 @@ static void record_placeholder_stack_in_native_code(VALUE recorder_instance, ddp
|
|
|
31
33
|
void collectors_stack_init(VALUE profiling_module) {
|
|
32
34
|
VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
|
|
33
35
|
VALUE collectors_stack_class = rb_define_class_under(collectors_module, "Stack", rb_cObject);
|
|
36
|
+
// Hosts methods used for testing the native code using RSpec
|
|
37
|
+
VALUE testing_module = rb_define_module_under(collectors_stack_class, "Testing");
|
|
34
38
|
|
|
35
|
-
rb_define_singleton_method(
|
|
39
|
+
rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 5);
|
|
36
40
|
|
|
37
41
|
missing_string = rb_str_new2("");
|
|
38
42
|
rb_global_variable(&missing_string);
|
|
@@ -40,9 +44,9 @@ void collectors_stack_init(VALUE profiling_module) {
|
|
|
40
44
|
|
|
41
45
|
// This method exists only to enable testing Datadog::Profiling::Collectors::Stack behavior using RSpec.
|
|
42
46
|
// It SHOULD NOT be used for other purposes.
|
|
43
|
-
static VALUE _native_sample(VALUE
|
|
44
|
-
|
|
45
|
-
|
|
47
|
+
static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE thread, VALUE recorder_instance, VALUE metric_values_hash, VALUE labels_array, VALUE max_frames) {
|
|
48
|
+
ENFORCE_TYPE(metric_values_hash, T_HASH);
|
|
49
|
+
ENFORCE_TYPE(labels_array, T_ARRAY);
|
|
46
50
|
|
|
47
51
|
if (RHASH_SIZE(metric_values_hash) != ENABLED_VALUE_TYPES_COUNT) {
|
|
48
52
|
rb_raise(
|
|
@@ -137,8 +141,8 @@ void sample_thread(VALUE thread, sampling_buffer* buffer, VALUE recorder_instanc
|
|
|
137
141
|
// **IMPORTANT**: Be very careful when calling any `rb_profile_frame_...` API with a non-Ruby frame, as legacy
|
|
138
142
|
// Rubies may assume that what's in a buffer will lead to a Ruby frame.
|
|
139
143
|
//
|
|
140
|
-
// In particular for Ruby 2.2
|
|
141
|
-
// rb_profile_frames for Ruby 2.2
|
|
144
|
+
// In particular for Ruby 2.2 the buffer contains a Ruby string (see the notes on our custom
|
|
145
|
+
// rb_profile_frames for Ruby 2.2) and CALLING **ANY** OF THOSE APIs ON IT WILL CAUSE INSTANT VM CRASHES
|
|
142
146
|
|
|
143
147
|
#ifndef USE_LEGACY_RB_PROFILE_FRAMES // Modern Rubies
|
|
144
148
|
name = ddtrace_rb_profile_frame_method_name(buffer->stack_buffer[i]);
|