ddtrace 1.4.2 → 1.23.3
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 +1177 -3
- data/LICENSE-3rdparty.csv +3 -1
- data/README.md +10 -12
- data/bin/ddprofrb +15 -0
- data/bin/ddtracerb +3 -1
- data/ext/{ddtrace_profiling_loader/ddtrace_profiling_loader.c → datadog_profiling_loader/datadog_profiling_loader.c} +11 -4
- data/ext/{ddtrace_profiling_loader → datadog_profiling_loader}/extconf.rb +24 -6
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/NativeExtensionDesign.md +48 -12
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id.h +1 -3
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_from_pthread.c +6 -23
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_noop.c +0 -1
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +1161 -0
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +422 -0
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +101 -0
- data/ext/datadog_profiling_native_extension/collectors_dynamic_sampling_rate.c +150 -0
- data/ext/datadog_profiling_native_extension/collectors_dynamic_sampling_rate.h +18 -0
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +156 -0
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.h +5 -0
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +244 -0
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/datadog_profiling_native_extension/collectors_stack.c +372 -0
- data/ext/datadog_profiling_native_extension/collectors_stack.h +27 -0
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +1402 -0
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +15 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/extconf.rb +114 -34
- data/ext/datadog_profiling_native_extension/heap_recorder.c +1047 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.h +166 -0
- data/ext/datadog_profiling_native_extension/helpers.h +23 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/http_transport.c +129 -88
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +62 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +42 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/native_extension_helpers.rb +104 -29
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.c +331 -131
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.h +29 -1
- data/ext/datadog_profiling_native_extension/profiling.c +267 -0
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +267 -0
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +122 -0
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +115 -0
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +11 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.c +1040 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.h +27 -0
- data/ext/datadog_profiling_native_extension/time_helpers.c +53 -0
- data/ext/datadog_profiling_native_extension/time_helpers.h +26 -0
- data/lib/datadog/appsec/assets/blocked.html +98 -3
- data/lib/datadog/appsec/assets/blocked.json +1 -0
- data/lib/datadog/appsec/assets/blocked.text +5 -0
- data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +2861 -796
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
- data/lib/datadog/appsec/assets/waf_rules/strict.json +459 -122
- data/lib/datadog/appsec/assets.rb +10 -4
- data/lib/datadog/appsec/autoload.rb +4 -11
- data/lib/datadog/appsec/component.rb +94 -0
- data/lib/datadog/appsec/configuration/settings.rb +170 -162
- data/lib/datadog/appsec/configuration.rb +1 -70
- data/lib/datadog/appsec/contrib/auto_instrument.rb +3 -5
- data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
- data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
- data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
- data/lib/datadog/appsec/contrib/devise/tracking.rb +57 -0
- data/lib/datadog/appsec/contrib/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -3
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +104 -0
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +30 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +112 -121
- data/lib/datadog/appsec/contrib/rack/integration.rb +0 -7
- data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +33 -39
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +19 -23
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +25 -23
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +153 -41
- data/lib/datadog/appsec/contrib/rails/ext.rb +2 -4
- data/lib/datadog/appsec/contrib/rails/framework.rb +2 -16
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +40 -52
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -8
- data/lib/datadog/appsec/contrib/rails/patcher.rb +23 -20
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +21 -23
- data/lib/datadog/appsec/contrib/rails/request.rb +4 -1
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -3
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +2 -16
- data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +17 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +23 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +78 -87
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +0 -7
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +33 -15
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +19 -21
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
- data/lib/datadog/appsec/event.rb +98 -50
- data/lib/datadog/appsec/ext.rb +10 -0
- data/lib/datadog/appsec/extensions.rb +2 -105
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +22 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +26 -6
- data/lib/datadog/appsec/instrumentation.rb +9 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +67 -0
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +58 -0
- data/lib/datadog/appsec/monitor.rb +11 -0
- data/lib/datadog/appsec/processor/actions.rb +49 -0
- data/lib/datadog/appsec/processor/rule_loader.rb +123 -0
- data/lib/datadog/appsec/processor/rule_merger.rb +152 -0
- data/lib/datadog/appsec/processor.rb +68 -61
- data/lib/datadog/appsec/rate_limiter.rb +1 -3
- data/lib/datadog/appsec/reactive/address_hash.rb +6 -2
- data/lib/datadog/appsec/reactive/engine.rb +10 -7
- data/lib/datadog/appsec/reactive/operation.rb +19 -2
- data/lib/datadog/appsec/reactive/subscriber.rb +2 -1
- data/lib/datadog/appsec/remote.rb +129 -0
- data/lib/datadog/appsec/response.rb +151 -0
- data/lib/datadog/appsec/sample_rate.rb +21 -0
- data/lib/datadog/appsec/scope.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +199 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +85 -0
- data/lib/datadog/appsec/utils/http.rb +11 -0
- data/lib/datadog/appsec/utils.rb +9 -0
- data/lib/datadog/appsec.rb +41 -4
- data/lib/datadog/auto_instrument.rb +3 -0
- data/lib/datadog/core/backport.rb +51 -0
- data/lib/datadog/core/buffer/cruby.rb +1 -1
- data/lib/datadog/core/buffer/random.rb +1 -1
- data/lib/datadog/core/buffer/thread_safe.rb +1 -1
- data/lib/datadog/core/chunker.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +96 -56
- data/lib/datadog/core/configuration/base.rb +7 -16
- data/lib/datadog/core/configuration/components.rb +46 -300
- data/lib/datadog/core/configuration/ext.rb +47 -0
- data/lib/datadog/core/configuration/option.rb +272 -22
- data/lib/datadog/core/configuration/option_definition.rb +81 -31
- data/lib/datadog/core/configuration/options.rb +26 -16
- data/lib/datadog/core/configuration/settings.rb +498 -302
- data/lib/datadog/core/configuration.rb +16 -10
- data/lib/datadog/core/diagnostics/environment_logger.rb +131 -231
- data/lib/datadog/core/diagnostics/health.rb +4 -22
- data/lib/datadog/core/encoding.rb +0 -4
- data/lib/datadog/core/environment/cgroup.rb +0 -4
- data/lib/datadog/core/environment/class_count.rb +7 -7
- data/lib/datadog/core/environment/container.rb +0 -4
- data/lib/datadog/core/environment/execution.rb +103 -0
- data/lib/datadog/core/environment/ext.rb +12 -12
- data/lib/datadog/core/environment/gc.rb +1 -1
- data/lib/datadog/core/environment/git.rb +25 -0
- data/lib/datadog/core/environment/identity.rb +27 -1
- data/lib/datadog/core/environment/platform.rb +7 -3
- data/lib/datadog/core/environment/socket.rb +1 -1
- data/lib/datadog/core/environment/thread_count.rb +1 -1
- data/lib/datadog/core/environment/variable_helpers.rb +29 -44
- data/lib/datadog/core/environment/vm_cache.rb +18 -1
- data/lib/datadog/core/environment/yjit.rb +58 -0
- data/lib/datadog/core/error.rb +1 -2
- data/lib/datadog/core/extensions.rb +1 -1
- data/lib/datadog/core/git/ext.rb +5 -24
- data/lib/datadog/core/header_collection.rb +43 -0
- data/lib/datadog/core/logger.rb +0 -2
- data/lib/datadog/core/logging/ext.rb +3 -1
- data/lib/datadog/core/metrics/client.rb +3 -4
- data/lib/datadog/core/metrics/ext.rb +6 -8
- data/lib/datadog/core/metrics/helpers.rb +1 -1
- data/lib/datadog/core/metrics/logging.rb +0 -2
- data/lib/datadog/core/metrics/metric.rb +1 -1
- data/lib/datadog/core/metrics/options.rb +0 -2
- data/lib/datadog/core/pin.rb +0 -2
- data/lib/datadog/core/remote/client/capabilities.rb +62 -0
- data/lib/datadog/core/remote/client.rb +232 -0
- data/lib/datadog/core/remote/component.rb +162 -0
- data/lib/datadog/core/remote/configuration/content.rb +111 -0
- data/lib/datadog/core/remote/configuration/digest.rb +62 -0
- data/lib/datadog/core/remote/configuration/path.rb +90 -0
- data/lib/datadog/core/remote/configuration/repository.rb +294 -0
- data/lib/datadog/core/remote/configuration/target.rb +74 -0
- data/lib/datadog/core/remote/configuration.rb +18 -0
- data/lib/datadog/core/remote/dispatcher.rb +59 -0
- data/lib/datadog/core/remote/ext.rb +13 -0
- data/lib/datadog/core/remote/negotiation.rb +70 -0
- data/lib/datadog/core/remote/tie/tracing.rb +39 -0
- data/lib/datadog/core/remote/tie.rb +27 -0
- data/lib/datadog/core/remote/transport/config.rb +60 -0
- data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
- data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
- data/lib/datadog/core/remote/transport/http/api.rb +58 -0
- data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
- data/lib/datadog/core/remote/transport/http/client.rb +48 -0
- data/lib/datadog/core/remote/transport/http/config.rb +280 -0
- data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
- data/lib/datadog/core/remote/transport/http.rb +179 -0
- data/lib/datadog/core/remote/transport/negotiation.rb +62 -0
- data/lib/datadog/core/remote/worker.rb +102 -0
- data/lib/datadog/core/remote.rb +24 -0
- data/lib/datadog/core/runtime/ext.rb +21 -11
- data/lib/datadog/core/runtime/metrics.rb +64 -7
- data/lib/datadog/core/telemetry/component.rb +66 -0
- data/lib/datadog/core/telemetry/emitter.rb +9 -13
- data/lib/datadog/core/telemetry/event.rb +250 -47
- data/lib/datadog/core/telemetry/ext.rb +7 -2
- data/lib/datadog/core/telemetry/http/adapters/net.rb +1 -3
- data/lib/datadog/core/telemetry/http/env.rb +1 -1
- data/lib/datadog/core/telemetry/http/ext.rb +13 -8
- data/lib/datadog/core/telemetry/http/response.rb +4 -4
- data/lib/datadog/core/telemetry/http/transport.rb +12 -4
- data/lib/datadog/core/telemetry/request.rb +59 -0
- data/lib/datadog/core/telemetry/worker.rb +158 -0
- data/lib/datadog/core/transport/ext.rb +49 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
- data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
- data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
- data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
- data/lib/datadog/core/transport/http/api/map.rb +18 -0
- data/lib/datadog/core/transport/http/env.rb +62 -0
- data/lib/datadog/core/transport/http/response.rb +60 -0
- data/lib/datadog/core/transport/parcel.rb +22 -0
- data/lib/datadog/core/transport/request.rb +17 -0
- data/lib/datadog/core/transport/response.rb +64 -0
- data/lib/datadog/core/utils/compression.rb +6 -2
- data/lib/datadog/core/utils/duration.rb +52 -0
- data/lib/datadog/core/utils/forking.rb +0 -2
- data/lib/datadog/core/utils/hash.rb +79 -0
- data/lib/datadog/core/utils/network.rb +140 -0
- data/lib/datadog/core/utils/only_once.rb +0 -2
- data/lib/datadog/core/utils/only_once_successful.rb +76 -0
- data/lib/datadog/core/utils/safe_dup.rb +35 -12
- data/lib/datadog/core/utils/sequence.rb +1 -1
- data/lib/datadog/core/utils/time.rb +1 -3
- data/lib/datadog/core/utils/url.rb +25 -0
- data/lib/datadog/core/utils.rb +1 -24
- data/lib/datadog/core/vendor/ipaddr.rb +78 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +0 -2
- data/lib/datadog/core/worker.rb +1 -1
- data/lib/datadog/core/workers/async.rb +7 -6
- data/lib/datadog/core/workers/interval_loop.rb +6 -2
- data/lib/datadog/core/workers/polling.rb +2 -4
- data/lib/datadog/core/workers/queue.rb +1 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
- data/lib/datadog/core.rb +20 -55
- data/lib/datadog/kit/appsec/events.rb +169 -0
- data/lib/datadog/kit/enable_core_dumps.rb +8 -9
- data/lib/datadog/kit/identity.rb +90 -49
- data/lib/datadog/kit.rb +1 -1
- data/lib/datadog/opentelemetry/api/context.rb +193 -0
- data/lib/datadog/opentelemetry/api/trace/span.rb +14 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +37 -0
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +26 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +92 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +134 -0
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
- data/lib/datadog/opentelemetry/trace.rb +58 -0
- data/lib/datadog/opentelemetry.rb +51 -0
- data/lib/datadog/opentracer/binary_propagator.rb +1 -1
- data/lib/datadog/opentracer/carrier.rb +1 -1
- data/lib/datadog/opentracer/distributed_headers.rb +7 -11
- data/lib/datadog/opentracer/global_tracer.rb +1 -1
- data/lib/datadog/opentracer/propagator.rb +1 -1
- data/lib/datadog/opentracer/rack_propagator.rb +0 -5
- data/lib/datadog/opentracer/scope.rb +1 -1
- data/lib/datadog/opentracer/scope_manager.rb +1 -1
- data/lib/datadog/opentracer/span.rb +0 -2
- data/lib/datadog/opentracer/span_context.rb +1 -1
- data/lib/datadog/opentracer/span_context_factory.rb +1 -1
- data/lib/datadog/opentracer/text_map_propagator.rb +6 -9
- data/lib/datadog/opentracer/thread_local_scope.rb +1 -1
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +0 -2
- data/lib/datadog/opentracer/tracer.rb +0 -2
- data/lib/datadog/opentracer.rb +10 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +10 -6
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +82 -19
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
- data/lib/datadog/profiling/collectors/info.rb +101 -0
- data/lib/datadog/profiling/collectors/stack.rb +1 -1
- data/lib/datadog/profiling/collectors/thread_context.rb +61 -0
- data/lib/datadog/profiling/component.rb +426 -0
- data/lib/datadog/profiling/exporter.rb +32 -10
- data/lib/datadog/profiling/ext/forking.rb +0 -2
- data/lib/datadog/profiling/ext.rb +22 -32
- data/lib/datadog/profiling/flush.rb +11 -6
- data/lib/datadog/profiling/http_transport.rb +23 -8
- data/lib/datadog/profiling/load_native_extension.rb +25 -8
- data/lib/datadog/profiling/native_extension.rb +2 -23
- data/lib/datadog/profiling/preload.rb +1 -1
- data/lib/datadog/profiling/profiler.rb +42 -14
- data/lib/datadog/profiling/scheduler.rb +27 -25
- data/lib/datadog/profiling/stack_recorder.rb +36 -8
- data/lib/datadog/profiling/tag_builder.rb +6 -1
- data/lib/datadog/profiling/tasks/exec.rb +3 -5
- data/lib/datadog/profiling/tasks/help.rb +3 -5
- data/lib/datadog/profiling/tasks/setup.rb +0 -35
- data/lib/datadog/profiling.rb +65 -75
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +0 -5
- data/lib/datadog/tracing/client_ip.rb +61 -0
- data/lib/datadog/tracing/component.rb +235 -0
- data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
- data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
- data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
- data/lib/datadog/tracing/configuration/ext.rb +72 -15
- data/lib/datadog/tracing/configuration/http.rb +74 -0
- data/lib/datadog/tracing/configuration/settings.rb +502 -0
- data/lib/datadog/tracing/context.rb +1 -1
- data/lib/datadog/tracing/context_provider.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +20 -19
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +1 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +20 -19
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -26
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +23 -9
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -9
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +10 -8
- data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/ext.rb +12 -11
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +15 -8
- data/lib/datadog/tracing/contrib/active_job/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/ext.rb +25 -24
- data/lib/datadog/tracing/contrib/active_job/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +2 -2
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +12 -11
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +29 -17
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +17 -9
- data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +3 -6
- data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/ext.rb +17 -16
- data/lib/datadog/tracing/contrib/active_record/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -3
- data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +107 -201
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -1
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +19 -8
- data/lib/datadog/tracing/contrib/active_support/ext.rb +18 -17
- data/lib/datadog/tracing/contrib/active_support/integration.rb +0 -2
- 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/notifications/subscription.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/analytics.rb +1 -2
- data/lib/datadog/tracing/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +25 -8
- data/lib/datadog/tracing/contrib/aws/ext.rb +37 -14
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +28 -3
- data/lib/datadog/tracing/contrib/aws/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +4 -2
- data/lib/datadog/tracing/contrib/aws/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +16 -0
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +22 -0
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +22 -0
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +32 -0
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +22 -0
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +30 -0
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +27 -0
- data/lib/datadog/tracing/contrib/aws/service/states.rb +40 -0
- data/lib/datadog/tracing/contrib/aws/services.rb +17 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +20 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +4 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +15 -15
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +4 -11
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +20 -4
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
- data/lib/datadog/tracing/contrib/configurable.rb +2 -2
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +30 -8
- data/lib/datadog/tracing/contrib/dalli/ext.rb +26 -10
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +23 -7
- data/lib/datadog/tracing/contrib/dalli/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +15 -8
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +16 -15
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +9 -1
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +3 -1
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +25 -8
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +21 -13
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +105 -95
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +0 -4
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +28 -10
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +52 -7
- data/lib/datadog/tracing/contrib/ethon/ext.rb +19 -11
- data/lib/datadog/tracing/contrib/ethon/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +10 -3
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +30 -11
- data/lib/datadog/tracing/contrib/excon/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/excon/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/excon/middleware.rb +27 -4
- data/lib/datadog/tracing/contrib/excon/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/ext.rb +55 -0
- data/lib/datadog/tracing/contrib/extensions.rb +38 -4
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +37 -11
- data/lib/datadog/tracing/contrib/faraday/connection.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/faraday/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +25 -7
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +1 -1
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +0 -4
- data/lib/datadog/tracing/contrib/grape/ext.rb +16 -15
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -8
- data/lib/datadog/tracing/contrib/graphql/ext.rb +7 -6
- data/lib/datadog/tracing/contrib/graphql/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +51 -10
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +45 -19
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +43 -26
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -6
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +42 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +16 -11
- data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +8 -3
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +1 -4
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +42 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +6 -9
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +48 -10
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +37 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +32 -12
- data/lib/datadog/tracing/contrib/http/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/http/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +1 -1
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +48 -10
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +17 -8
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +27 -8
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +48 -10
- data/lib/datadog/tracing/contrib/httprb/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +27 -9
- data/lib/datadog/tracing/contrib/httprb/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -2
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -2
- data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/ext.rb +42 -39
- data/lib/datadog/tracing/contrib/kafka/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +4 -3
- data/lib/datadog/tracing/contrib/lograge/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +3 -18
- data/lib/datadog/tracing/contrib/lograge/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +25 -8
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +25 -14
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +22 -4
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +36 -8
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +15 -9
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +38 -4
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +53 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +38 -0
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
- data/lib/datadog/tracing/contrib/patchable.rb +1 -1
- data/lib/datadog/tracing/contrib/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +37 -8
- data/lib/datadog/tracing/contrib/pg/ext.rb +22 -18
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +122 -39
- data/lib/datadog/tracing/contrib/pg/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/pg/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +24 -8
- data/lib/datadog/tracing/contrib/presto/ext.rb +25 -19
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +17 -5
- data/lib/datadog/tracing/contrib/presto/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/presto/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +41 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +53 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +14 -9
- data/lib/datadog/tracing/contrib/qless/ext.rb +14 -13
- data/lib/datadog/tracing/contrib/qless/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +3 -2
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +1 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +22 -14
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/que/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/que/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/que/tracer.rb +4 -2
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +19 -8
- data/lib/datadog/tracing/contrib/racecar/event.rb +7 -4
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +4 -3
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +4 -3
- data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/ext.rb +20 -18
- data/lib/datadog/tracing/contrib/racecar/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +17 -14
- data/lib/datadog/tracing/contrib/rack/ext.rb +18 -12
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +38 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +138 -82
- data/lib/datadog/tracing/contrib/rack/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +0 -4
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +29 -19
- data/lib/datadog/tracing/contrib/rails/ext.rb +7 -6
- data/lib/datadog/tracing/contrib/rails/framework.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -12
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -43
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -5
- data/lib/datadog/tracing/contrib/rails/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +15 -11
- data/lib/datadog/tracing/contrib/rake/ext.rb +14 -13
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +27 -10
- data/lib/datadog/tracing/contrib/redis/ext.rb +22 -13
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +13 -39
- data/lib/datadog/tracing/contrib/redis/integration.rb +34 -3
- data/lib/datadog/tracing/contrib/redis/patcher.rb +66 -11
- data/lib/datadog/tracing/contrib/redis/quantize.rb +11 -10
- data/lib/datadog/tracing/contrib/redis/tags.rb +24 -9
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +83 -0
- data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/registerable.rb +1 -1
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +15 -8
- data/lib/datadog/tracing/contrib/resque/ext.rb +9 -8
- data/lib/datadog/tracing/contrib/resque/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +28 -10
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +15 -8
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +28 -3
- data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +38 -0
- data/lib/datadog/tracing/contrib/roda/ext.rb +19 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +76 -0
- data/lib/datadog/tracing/contrib/roda/integration.rb +45 -0
- data/lib/datadog/{ci/contrib/cucumber → tracing/contrib/roda}/patcher.rb +10 -7
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +4 -3
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +6 -21
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/sequel/database.rb +4 -3
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -2
- data/lib/datadog/tracing/contrib/sequel/ext.rb +10 -9
- data/lib/datadog/tracing/contrib/sequel/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -6
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +14 -12
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +18 -4
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +20 -11
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +38 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +32 -31
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +8 -2
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +15 -3
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +14 -5
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +3 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +3 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +34 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +24 -3
- data/lib/datadog/tracing/contrib/sidekiq/{tracing.rb → utils.rb} +2 -2
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +12 -11
- data/lib/datadog/tracing/contrib/sinatra/env.rb +11 -41
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +24 -19
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +2 -3
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +8 -82
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +14 -20
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +15 -10
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +5 -2
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +92 -0
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +0 -3
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/stripe/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +11 -7
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +15 -14
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +58 -0
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +94 -0
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/trilogy/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/utils/database.rb +4 -4
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +0 -2
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -14
- data/lib/datadog/tracing/contrib.rb +6 -1
- data/lib/datadog/tracing/correlation.rb +42 -14
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +21 -26
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +72 -0
- data/lib/datadog/tracing/distributed/b3_single.rb +68 -0
- data/lib/datadog/tracing/distributed/datadog.rb +199 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
- data/lib/datadog/tracing/distributed/fetcher.rb +21 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +19 -16
- data/lib/datadog/tracing/distributed/helpers.rb +26 -39
- data/lib/datadog/tracing/distributed/none.rb +18 -0
- data/lib/datadog/tracing/distributed/propagation.rb +127 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +415 -0
- data/lib/datadog/tracing/event.rb +0 -4
- data/lib/datadog/tracing/flush.rb +58 -36
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/errors.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +29 -14
- data/lib/datadog/tracing/metadata/tagging.rb +17 -4
- data/lib/datadog/tracing/metadata.rb +1 -1
- data/lib/datadog/tracing/pipeline/span_filter.rb +1 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +1 -1
- data/lib/datadog/tracing/pipeline.rb +0 -4
- data/lib/datadog/tracing/propagation/http.rb +4 -99
- data/lib/datadog/tracing/remote.rb +78 -0
- data/lib/datadog/tracing/runtime/metrics.rb +1 -3
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +30 -1
- data/lib/datadog/tracing/sampling/matcher.rb +24 -4
- data/lib/datadog/tracing/sampling/priority_sampler.rb +58 -5
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +8 -11
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +29 -8
- data/lib/datadog/tracing/sampling/rate_limiter.rb +3 -2
- data/lib/datadog/tracing/sampling/rate_sampler.rb +23 -10
- data/lib/datadog/tracing/sampling/rule.rb +7 -6
- data/lib/datadog/tracing/sampling/rule_sampler.rb +35 -7
- data/lib/datadog/tracing/sampling/sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
- data/lib/datadog/tracing/sampling/span/matcher.rb +9 -0
- data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
- data/lib/datadog/tracing/sampling/span/sampler.rb +77 -0
- data/lib/datadog/tracing/span.rb +3 -21
- data/lib/datadog/tracing/span_operation.rb +8 -24
- data/lib/datadog/tracing/sync_writer.rb +4 -6
- data/lib/datadog/tracing/trace_digest.rb +120 -3
- data/lib/datadog/tracing/trace_operation.rb +62 -15
- data/lib/datadog/tracing/trace_segment.rb +20 -7
- data/lib/datadog/tracing/tracer.rb +46 -10
- data/lib/datadog/tracing/transport/http/api/instance.rb +37 -0
- data/lib/datadog/tracing/transport/http/api/spec.rb +19 -0
- data/lib/datadog/tracing/transport/http/api.rb +43 -0
- data/lib/datadog/tracing/transport/http/builder.rb +162 -0
- data/lib/datadog/tracing/transport/http/client.rb +57 -0
- data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
- data/lib/datadog/tracing/transport/http/traces.rb +152 -0
- data/lib/datadog/tracing/transport/http.rb +125 -0
- data/lib/datadog/tracing/transport/io/client.rb +89 -0
- data/lib/datadog/tracing/transport/io/response.rb +27 -0
- data/lib/datadog/tracing/transport/io/traces.rb +101 -0
- data/lib/datadog/tracing/transport/io.rb +30 -0
- data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
- data/lib/datadog/tracing/transport/statistics.rb +77 -0
- data/lib/datadog/tracing/transport/trace_formatter.rb +240 -0
- data/lib/datadog/tracing/transport/traces.rb +224 -0
- data/lib/datadog/tracing/utils.rb +83 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +6 -7
- data/lib/datadog/tracing/workers.rb +4 -6
- data/lib/datadog/tracing/writer.rb +12 -6
- data/lib/datadog/tracing.rb +9 -3
- data/lib/ddtrace/auto_instrument.rb +1 -1
- data/lib/ddtrace/auto_instrument_base.rb +1 -1
- data/lib/ddtrace/profiling/preload.rb +0 -2
- data/lib/ddtrace/transport/ext.rb +21 -15
- data/lib/ddtrace/version.rb +14 -15
- data/lib/ddtrace.rb +3 -5
- metadata +278 -148
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +0 -390
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +0 -6
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +0 -391
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +0 -282
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +0 -9
- data/ext/ddtrace_profiling_native_extension/helpers.h +0 -12
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +0 -14
- data/ext/ddtrace_profiling_native_extension/profiling.c +0 -36
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +0 -25
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +0 -65
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +0 -422
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +0 -38
- data/lib/datadog/appsec/assets/waf_rules/risky.json +0 -1499
- data/lib/datadog/appsec/contrib/configuration/settings.rb +0 -20
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +0 -22
- data/lib/datadog/appsec/contrib/rack/request.rb +0 -58
- data/lib/datadog/appsec/contrib/rack/response.rb +0 -24
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +0 -22
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +0 -22
- data/lib/datadog/ci/configuration/components.rb +0 -32
- data/lib/datadog/ci/configuration/settings.rb +0 -53
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
- data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
- data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -49
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
- data/lib/datadog/ci/contrib/rspec/example.rb +0 -70
- data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
- data/lib/datadog/ci/contrib/rspec/integration.rb +0 -50
- data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
- data/lib/datadog/ci/ext/app_types.rb +0 -11
- data/lib/datadog/ci/ext/environment.rb +0 -505
- data/lib/datadog/ci/ext/settings.rb +0 -12
- data/lib/datadog/ci/ext/test.rb +0 -37
- data/lib/datadog/ci/extensions.rb +0 -19
- data/lib/datadog/ci/flush.rb +0 -38
- data/lib/datadog/ci/test.rb +0 -83
- data/lib/datadog/ci.rb +0 -20
- data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
- data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
- data/lib/datadog/core/configuration/option_set.rb +0 -10
- data/lib/datadog/core/telemetry/client.rb +0 -79
- data/lib/datadog/core/telemetry/collector.rb +0 -234
- data/lib/datadog/core/telemetry/heartbeat.rb +0 -37
- data/lib/datadog/core/telemetry/v1/app_event.rb +0 -52
- data/lib/datadog/core/telemetry/v1/application.rb +0 -86
- data/lib/datadog/core/telemetry/v1/configuration.rb +0 -25
- data/lib/datadog/core/telemetry/v1/dependency.rb +0 -36
- data/lib/datadog/core/telemetry/v1/host.rb +0 -51
- data/lib/datadog/core/telemetry/v1/integration.rb +0 -58
- data/lib/datadog/core/telemetry/v1/product.rb +0 -28
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +0 -100
- data/lib/datadog/core/utils/object_set.rb +0 -43
- data/lib/datadog/core/utils/string_table.rb +0 -49
- data/lib/datadog/profiling/backtrace_location.rb +0 -34
- data/lib/datadog/profiling/buffer.rb +0 -43
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +0 -27
- data/lib/datadog/profiling/collectors/old_stack.rb +0 -298
- data/lib/datadog/profiling/encoding/profile.rb +0 -43
- data/lib/datadog/profiling/event.rb +0 -15
- data/lib/datadog/profiling/events/stack.rb +0 -82
- data/lib/datadog/profiling/old_ext.rb +0 -42
- data/lib/datadog/profiling/old_recorder.rb +0 -101
- data/lib/datadog/profiling/pprof/builder.rb +0 -127
- data/lib/datadog/profiling/pprof/converter.rb +0 -104
- data/lib/datadog/profiling/pprof/message_set.rb +0 -16
- data/lib/datadog/profiling/pprof/payload.rb +0 -20
- data/lib/datadog/profiling/pprof/pprof.proto +0 -212
- data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -83
- data/lib/datadog/profiling/pprof/stack_sample.rb +0 -141
- data/lib/datadog/profiling/pprof/string_table.rb +0 -12
- data/lib/datadog/profiling/pprof/template.rb +0 -120
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -45
- data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -47
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -85
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -37
- data/lib/datadog/profiling/transport/http/response.rb +0 -21
- data/lib/datadog/profiling/transport/http.rb +0 -118
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
- data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
- data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
- data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
- data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
- data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
- data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
- data/lib/datadog/tracing/propagation/grpc.rb +0 -98
- data/lib/ddtrace/transport/http/adapters/net.rb +0 -158
- data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
- data/lib/ddtrace/transport/http/adapters/test.rb +0 -87
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -79
- data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
- data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
- data/lib/ddtrace/transport/http/api/instance.rb +0 -35
- data/lib/ddtrace/transport/http/api/map.rb +0 -16
- data/lib/ddtrace/transport/http/api/spec.rb +0 -17
- data/lib/ddtrace/transport/http/api.rb +0 -41
- data/lib/ddtrace/transport/http/builder.rb +0 -178
- data/lib/ddtrace/transport/http/client.rb +0 -54
- data/lib/ddtrace/transport/http/env.rb +0 -58
- data/lib/ddtrace/transport/http/response.rb +0 -58
- data/lib/ddtrace/transport/http/statistics.rb +0 -45
- data/lib/ddtrace/transport/http/traces.rb +0 -146
- data/lib/ddtrace/transport/http.rb +0 -121
- data/lib/ddtrace/transport/io/client.rb +0 -87
- data/lib/ddtrace/transport/io/response.rb +0 -25
- data/lib/ddtrace/transport/io/traces.rb +0 -101
- data/lib/ddtrace/transport/io.rb +0 -28
- data/lib/ddtrace/transport/parcel.rb +0 -22
- data/lib/ddtrace/transport/request.rb +0 -15
- data/lib/ddtrace/transport/response.rb +0 -62
- data/lib/ddtrace/transport/serializable_trace.rb +0 -118
- data/lib/ddtrace/transport/statistics.rb +0 -75
- data/lib/ddtrace/transport/trace_formatter.rb +0 -187
- data/lib/ddtrace/transport/traces.rb +0 -216
|
@@ -12,15 +12,32 @@
|
|
|
12
12
|
// Pick up internal structures from the private Ruby MJIT header file
|
|
13
13
|
#include RUBY_MJIT_HEADER
|
|
14
14
|
#else
|
|
15
|
-
//
|
|
15
|
+
// The MJIT header was introduced on 2.6 and removed on 3.3; for other Rubies we rely on
|
|
16
|
+
// the debase-ruby_core_source gem to get access to private VM headers.
|
|
16
17
|
|
|
17
|
-
// We can't do anything about warnings in VM headers, so we just use this technique to
|
|
18
|
+
// We can't do anything about warnings in VM headers, so we just use this technique to suppress them.
|
|
18
19
|
// See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
|
|
19
20
|
#pragma GCC diagnostic push
|
|
20
21
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
22
|
+
#pragma GCC diagnostic ignored "-Wattributes"
|
|
23
|
+
#pragma GCC diagnostic ignored "-Wpragmas"
|
|
24
|
+
#pragma GCC diagnostic ignored "-Wexpansion-to-defined"
|
|
21
25
|
#include <vm_core.h>
|
|
22
26
|
#pragma GCC diagnostic pop
|
|
23
|
-
|
|
27
|
+
|
|
28
|
+
#pragma GCC diagnostic push
|
|
29
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
30
|
+
#include <iseq.h>
|
|
31
|
+
#pragma GCC diagnostic pop
|
|
32
|
+
|
|
33
|
+
#include <ruby.h>
|
|
34
|
+
|
|
35
|
+
#ifndef NO_RACTOR_HEADER_INCLUDE
|
|
36
|
+
#pragma GCC diagnostic push
|
|
37
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
38
|
+
#include <ractor_core.h>
|
|
39
|
+
#pragma GCC diagnostic pop
|
|
40
|
+
#endif
|
|
24
41
|
#endif
|
|
25
42
|
|
|
26
43
|
#define PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
|
|
@@ -35,20 +52,164 @@
|
|
|
35
52
|
// if the argument passed in is not actually a `Thread` instance.
|
|
36
53
|
static inline rb_thread_t *thread_struct_from_object(VALUE thread) {
|
|
37
54
|
static const rb_data_type_t *thread_data_type = NULL;
|
|
38
|
-
if (thread_data_type == NULL) thread_data_type = RTYPEDDATA_TYPE(rb_thread_current());
|
|
55
|
+
if (UNLIKELY(thread_data_type == NULL)) thread_data_type = RTYPEDDATA_TYPE(rb_thread_current());
|
|
39
56
|
|
|
40
57
|
return (rb_thread_t *) rb_check_typeddata(thread, thread_data_type);
|
|
41
58
|
}
|
|
42
59
|
|
|
43
60
|
rb_nativethread_id_t pthread_id_for(VALUE thread) {
|
|
44
|
-
// struct rb_native_thread was introduced in Ruby 3.2
|
|
61
|
+
// struct rb_native_thread was introduced in Ruby 3.2: https://github.com/ruby/ruby/pull/5836
|
|
45
62
|
#ifndef NO_RB_NATIVE_THREAD
|
|
46
|
-
|
|
63
|
+
struct rb_native_thread* native_thread = thread_struct_from_object(thread)->nt;
|
|
64
|
+
// This can be NULL on Ruby 3.3 with MN threads (RUBY_MN_THREADS=1)
|
|
65
|
+
if (native_thread == NULL) return 0;
|
|
66
|
+
return native_thread->thread_id;
|
|
47
67
|
#else
|
|
48
68
|
return thread_struct_from_object(thread)->thread_id;
|
|
49
69
|
#endif
|
|
50
70
|
}
|
|
51
71
|
|
|
72
|
+
// Queries if the current thread is the owner of the global VM lock.
|
|
73
|
+
//
|
|
74
|
+
// @ivoanjo: Ruby has a similarly-named `ruby_thread_has_gvl_p` but that API is insufficient for our needs because it can
|
|
75
|
+
// still return `true` even when a thread DOES NOT HAVE the global VM lock.
|
|
76
|
+
// In particular, looking at the implementation, that API assumes that if a thread is not in a "blocking region" then it
|
|
77
|
+
// will have the GVL which is probably true for the situations that API was designed to be called from BUT this assumption
|
|
78
|
+
// does not hold true when calling `ruby_thread_has_gvl_p` from a signal handler. (Because the thread may have lost the
|
|
79
|
+
// GVL due to a scheduler decision, not because it decided to block.)
|
|
80
|
+
// I have also submitted https://bugs.ruby-lang.org/issues/19172 to discuss this with upstream Ruby developers.
|
|
81
|
+
//
|
|
82
|
+
// Thus we need our own gvl-checking method which actually looks at the gvl structure to determine if it is the owner.
|
|
83
|
+
bool is_current_thread_holding_the_gvl(void) {
|
|
84
|
+
current_gvl_owner owner = gvl_owner();
|
|
85
|
+
return owner.valid && pthread_equal(pthread_self(), owner.owner);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
#ifdef HAVE_RUBY_RACTOR_H
|
|
89
|
+
static inline rb_ractor_t *ddtrace_get_ractor(void) {
|
|
90
|
+
#ifndef USE_RACTOR_INTERNAL_APIS_DIRECTLY // Ruby >= 3.3
|
|
91
|
+
return thread_struct_from_object(rb_thread_current())->ractor;
|
|
92
|
+
#else
|
|
93
|
+
return GET_RACTOR();
|
|
94
|
+
#endif
|
|
95
|
+
}
|
|
96
|
+
#endif
|
|
97
|
+
|
|
98
|
+
#ifndef NO_GVL_OWNER // Ruby < 2.6 doesn't have the owner/running field
|
|
99
|
+
// NOTE: Reading the owner in this is a racy read, because we're not grabbing the lock that Ruby uses to protect it.
|
|
100
|
+
//
|
|
101
|
+
// While we could potentially grab this lock, I (@ivoanjo) think we actually don't need it because:
|
|
102
|
+
// * In the case where a thread owns the GVL and calls `gvl_owner`, it will always see the correct value. That's
|
|
103
|
+
// because every thread sets itself as the owner when it grabs the GVL and unsets itself at the end.
|
|
104
|
+
// That means that `is_current_thread_holding_the_gvl` is always accurate.
|
|
105
|
+
// * In a case where we observe a different thread, then this may change by the time we do something with this value
|
|
106
|
+
// anyway. So unless we want to prevent the Ruby scheduler from switching threads, we need to deal with races here.
|
|
107
|
+
current_gvl_owner gvl_owner(void) {
|
|
108
|
+
const rb_thread_t *current_owner =
|
|
109
|
+
#ifndef NO_RB_THREAD_SCHED // Introduced in Ruby 3.2 as a replacement for struct rb_global_vm_lock_struct
|
|
110
|
+
ddtrace_get_ractor()->threads.sched.running;
|
|
111
|
+
#elif HAVE_RUBY_RACTOR_H
|
|
112
|
+
ddtrace_get_ractor()->threads.gvl.owner;
|
|
113
|
+
#else
|
|
114
|
+
GET_VM()->gvl.owner;
|
|
115
|
+
#endif
|
|
116
|
+
|
|
117
|
+
if (current_owner == NULL) return (current_gvl_owner) {.valid = false};
|
|
118
|
+
|
|
119
|
+
#ifndef NO_RB_NATIVE_THREAD
|
|
120
|
+
struct rb_native_thread* current_owner_native_thread = current_owner->nt;
|
|
121
|
+
|
|
122
|
+
// This can be NULL on Ruby 3.3 with MN threads (RUBY_MN_THREADS=1)
|
|
123
|
+
if (current_owner_native_thread == NULL) return (current_gvl_owner) {.valid = false};
|
|
124
|
+
|
|
125
|
+
return (current_gvl_owner) {.valid = true, .owner = current_owner_native_thread->thread_id};
|
|
126
|
+
#else
|
|
127
|
+
return (current_gvl_owner) {.valid = true, .owner = current_owner->thread_id};
|
|
128
|
+
#endif
|
|
129
|
+
}
|
|
130
|
+
#else
|
|
131
|
+
current_gvl_owner gvl_owner(void) {
|
|
132
|
+
rb_vm_t *vm =
|
|
133
|
+
#ifndef NO_GET_VM
|
|
134
|
+
GET_VM();
|
|
135
|
+
#else
|
|
136
|
+
thread_struct_from_object(rb_thread_current())->vm;
|
|
137
|
+
#endif
|
|
138
|
+
|
|
139
|
+
// BIG Issue: Ruby < 2.6 did not have the owner field. The really nice thing about the owner field is that it's
|
|
140
|
+
// "atomic" -- when a thread sets it, it "declares" two things in a single step
|
|
141
|
+
// * Declaration 1: Someone has the GVL
|
|
142
|
+
// * Declaration 2: That someone is the specific thread
|
|
143
|
+
//
|
|
144
|
+
// Observation 1: On older versions of Ruby, this ownership concept is actually split. Specifically, `gvl.acquired`
|
|
145
|
+
// is a boolean that represents declaration 1 above, and `vm->running_thread` (or `ruby_current_thread`/
|
|
146
|
+
// `ruby_current_execution_context_ptr`) represents declaration 2.
|
|
147
|
+
//
|
|
148
|
+
// Observation 2: In addition, when a thread releases the GVL, it only sets `gvl.acquired` back to 0 **BUT CRUCIALLY
|
|
149
|
+
// DOES NOT CHANGE THE OTHER global variables**.
|
|
150
|
+
//
|
|
151
|
+
// Observation 1+2 above lead to the following possible race:
|
|
152
|
+
// * Thread A grabs the GVL (`gvl.acquired == 1`)
|
|
153
|
+
// * Thread A sets `running_thread` (`gvl.acquired == 1` + `running_thread == Thread A`)
|
|
154
|
+
// * Thread A releases the GVL (`gvl.acquired == 0` + `running_thread == Thread A`)
|
|
155
|
+
// * Thread B grabs the GVL (`gvl.acquired == 1` + `running_thread == Thread A`)
|
|
156
|
+
// * Thread A calls gvl_owner. Due to the current state (`gvl.acquired == 1` + `running_thread == Thread A`), this
|
|
157
|
+
// function returns an incorrect result.
|
|
158
|
+
// * Thread B finally sets `running_thread` (`gvl.acquired == 1` + `running_thread == Thread B`)
|
|
159
|
+
//
|
|
160
|
+
// This is especially problematic because we use `gvl_owner` to implement `is_current_thread_holding_the_gvl` which
|
|
161
|
+
// is called in a signal handler to decide "is it safe for me to call `rb_postponed_job_register_one` or not".
|
|
162
|
+
// (See constraints in `collectors_cpu_and_wall_time_worker.c` comments for why).
|
|
163
|
+
//
|
|
164
|
+
// Thus an incorrect `is_current_thread_holding_the_gvl` result may lead to issues inside `rb_postponed_job_register_one`.
|
|
165
|
+
//
|
|
166
|
+
// For this reason we currently do not enable the new Ruby profiler on Ruby 2.5 and below by default, and we print a
|
|
167
|
+
// warning when customers force-enable it.
|
|
168
|
+
bool gvl_acquired = vm->gvl.acquired != 0;
|
|
169
|
+
rb_thread_t *current_owner = vm->running_thread;
|
|
170
|
+
|
|
171
|
+
if (!gvl_acquired || current_owner == NULL) return (current_gvl_owner) {.valid = false};
|
|
172
|
+
|
|
173
|
+
return (current_gvl_owner) {.valid = true, .owner = current_owner->thread_id};
|
|
174
|
+
}
|
|
175
|
+
#endif // NO_GVL_OWNER
|
|
176
|
+
|
|
177
|
+
// Taken from upstream vm_core.h at commit d9cf0388599a3234b9f3c06ddd006cd59a58ab8b (November 2022, Ruby 3.2 trunk)
|
|
178
|
+
// Copyright (C) 2004-2007 Koichi Sasada
|
|
179
|
+
// to support tid_for (see below)
|
|
180
|
+
// Modifications: None
|
|
181
|
+
#if defined(__linux__) || defined(__FreeBSD__)
|
|
182
|
+
# define RB_THREAD_T_HAS_NATIVE_ID
|
|
183
|
+
#endif
|
|
184
|
+
|
|
185
|
+
uint64_t native_thread_id_for(VALUE thread) {
|
|
186
|
+
// The tid is only available on Ruby >= 3.1 + Linux (and FreeBSD). It's the same as `gettid()` aka the task id as seen in /proc
|
|
187
|
+
#if !defined(NO_THREAD_TID) && defined(RB_THREAD_T_HAS_NATIVE_ID)
|
|
188
|
+
#ifndef NO_RB_NATIVE_THREAD
|
|
189
|
+
struct rb_native_thread* native_thread = thread_struct_from_object(thread)->nt;
|
|
190
|
+
if (native_thread == NULL) rb_raise(rb_eRuntimeError, "BUG: rb_native_thread* is null. Is this Ruby running with RUBY_MN_THREADS=1?");
|
|
191
|
+
return native_thread->tid;
|
|
192
|
+
#else
|
|
193
|
+
return thread_struct_from_object(thread)->tid;
|
|
194
|
+
#endif
|
|
195
|
+
#else
|
|
196
|
+
rb_nativethread_id_t pthread_id = pthread_id_for(thread);
|
|
197
|
+
|
|
198
|
+
#ifdef __APPLE__
|
|
199
|
+
uint64_t result;
|
|
200
|
+
// On macOS, this gives us the same identifier that shows up in activity monitor
|
|
201
|
+
int error = pthread_threadid_np(pthread_id, &result);
|
|
202
|
+
if (error) rb_syserr_fail(error, "Unexpected failure in pthread_threadid_np");
|
|
203
|
+
return result;
|
|
204
|
+
#else
|
|
205
|
+
// Fallback, when we have nothing better (e.g. on Ruby < 3.1 on Linux)
|
|
206
|
+
// @ivoanjo: In the future we may want to explore some potential hacks to get the actual tid on linux
|
|
207
|
+
// (e.g. https://stackoverflow.com/questions/558469/how-do-i-get-a-thread-id-from-an-arbitrary-pthread-t )
|
|
208
|
+
return (uint64_t) pthread_id;
|
|
209
|
+
#endif
|
|
210
|
+
#endif
|
|
211
|
+
}
|
|
212
|
+
|
|
52
213
|
// Returns the stack depth by using the same approach as rb_profile_frames and backtrace_each: get the positions
|
|
53
214
|
// of the end and current frame pointers and subtracting them.
|
|
54
215
|
ptrdiff_t stack_depth_for(VALUE thread) {
|
|
@@ -75,8 +236,7 @@ ptrdiff_t stack_depth_for(VALUE thread) {
|
|
|
75
236
|
#endif
|
|
76
237
|
|
|
77
238
|
// Tries to match rb_thread_list() but that method isn't accessible to extensions
|
|
78
|
-
|
|
79
|
-
VALUE result = rb_ary_new();
|
|
239
|
+
void ddtrace_thread_list(VALUE result_array) {
|
|
80
240
|
rb_thread_t *thread = NULL;
|
|
81
241
|
|
|
82
242
|
// Ruby 3 Safety: Our implementation is inspired by `rb_ractor_thread_list` BUT that method wraps the operations below
|
|
@@ -90,42 +250,35 @@ VALUE ddtrace_thread_list(void) {
|
|
|
90
250
|
// I suspect the design in `rb_ractor_thread_list` may be done that way to perhaps in the future expose it to be
|
|
91
251
|
// called from a different Ractor, but I'm not sure...
|
|
92
252
|
#ifdef HAVE_RUBY_RACTOR_H
|
|
93
|
-
rb_ractor_t *current_ractor =
|
|
253
|
+
rb_ractor_t *current_ractor = ddtrace_get_ractor();
|
|
94
254
|
ccan_list_for_each(¤t_ractor->threads.set, thread, lt_node) {
|
|
95
255
|
#else
|
|
96
|
-
rb_vm_t *vm =
|
|
256
|
+
rb_vm_t *vm =
|
|
257
|
+
#ifndef NO_GET_VM
|
|
258
|
+
GET_VM();
|
|
259
|
+
#else
|
|
260
|
+
thread_struct_from_object(rb_thread_current())->vm;
|
|
261
|
+
#endif
|
|
97
262
|
list_for_each(&vm->living_threads, thread, vmlt_node) {
|
|
98
263
|
#endif
|
|
99
264
|
switch (thread->status) {
|
|
100
265
|
case THREAD_RUNNABLE:
|
|
101
266
|
case THREAD_STOPPED:
|
|
102
267
|
case THREAD_STOPPED_FOREVER:
|
|
103
|
-
rb_ary_push(
|
|
268
|
+
rb_ary_push(result_array, thread->self);
|
|
104
269
|
default:
|
|
105
270
|
break;
|
|
106
271
|
}
|
|
107
272
|
}
|
|
108
|
-
|
|
109
|
-
return result;
|
|
110
273
|
}
|
|
111
274
|
|
|
112
275
|
bool is_thread_alive(VALUE thread) {
|
|
113
276
|
return thread_struct_from_object(thread)->status != THREAD_KILLED;
|
|
114
277
|
}
|
|
115
278
|
|
|
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
279
|
VALUE thread_name_for(VALUE thread) {
|
|
122
|
-
|
|
123
|
-
return Qnil;
|
|
124
|
-
#else
|
|
125
|
-
return thread_struct_from_object(thread)->name;
|
|
126
|
-
#endif
|
|
280
|
+
return thread_struct_from_object(thread)->name;
|
|
127
281
|
}
|
|
128
|
-
#pragma GCC diagnostic pop
|
|
129
282
|
|
|
130
283
|
// -----------------------------------------------------------------------------
|
|
131
284
|
// The sources below are modified versions of code extracted from the Ruby project.
|
|
@@ -156,8 +309,6 @@ VALUE thread_name_for(VALUE thread) {
|
|
|
156
309
|
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
157
310
|
// SUCH DAMAGE.
|
|
158
311
|
|
|
159
|
-
#ifndef USE_LEGACY_RB_PROFILE_FRAMES // Modern Rubies
|
|
160
|
-
|
|
161
312
|
// Taken from upstream vm_core.h at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
|
162
313
|
// Copyright (C) 2004-2007 Koichi Sasada
|
|
163
314
|
// to support our custom rb_profile_frames (see below)
|
|
@@ -167,7 +318,8 @@ VALUE thread_name_for(VALUE thread) {
|
|
|
167
318
|
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
|
168
319
|
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
|
169
320
|
// to support our custom rb_profile_frames (see below)
|
|
170
|
-
// Modifications:
|
|
321
|
+
// Modifications:
|
|
322
|
+
// * Support int first_lineno for Ruby 3.2.0+ (https://github.com/ruby/ruby/pull/6430)
|
|
171
323
|
//
|
|
172
324
|
// `node_id` gets used depending on Ruby VM compilation settings (USE_ISEQ_NODE_ID being defined).
|
|
173
325
|
// To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
|
|
@@ -187,7 +339,11 @@ calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
|
|
|
187
339
|
VM_ASSERT(! ISEQ_BODY(iseq)->local_table_size);
|
|
188
340
|
return 0;
|
|
189
341
|
}
|
|
190
|
-
|
|
342
|
+
# ifndef NO_INT_FIRST_LINENO // Ruby 3.2+
|
|
343
|
+
if (lineno) *lineno = ISEQ_BODY(iseq)->location.first_lineno;
|
|
344
|
+
# else
|
|
345
|
+
if (lineno) *lineno = FIX2INT(ISEQ_BODY(iseq)->location.first_lineno);
|
|
346
|
+
#endif
|
|
191
347
|
#ifdef USE_ISEQ_NODE_ID
|
|
192
348
|
if (node_id) *node_id = -1;
|
|
193
349
|
#endif
|
|
@@ -249,9 +405,6 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
|
|
|
249
405
|
// * Add `end_cfp == NULL` and `end_cfp <= cfp` safety checks. These are used in a bunch of places in
|
|
250
406
|
// `vm_backtrace.c` (`backtrace_each`, `backtrace_size`, `rb_ec_partial_backtrace_object`) but are conspicuously
|
|
251
407
|
// absent from `rb_profile_frames`. Oversight?
|
|
252
|
-
// * Distinguish between `end_cfp == NULL` (dead thread or some other error, returns 0) and `end_cfp <= cfp`
|
|
253
|
-
// (alive thread which may just be executing native code and has not pushed anything on the Ruby stack, returns
|
|
254
|
-
// PLACEHOLDER_STACK_IN_NATIVE_CODE). See comments on `record_placeholder_stack_in_native_code` for more details.
|
|
255
408
|
// * Skip frames where `cfp->iseq && !cfp->pc`. These seem to be internal and are skipped by `backtrace_each` in
|
|
256
409
|
// `vm_backtrace.c`.
|
|
257
410
|
// * Check thread status and do not sample if thread has been killed.
|
|
@@ -259,9 +412,8 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
|
|
|
259
412
|
// for iseqs created from calls to `eval` and `instance_eval`. This makes it so that `rb_profile_frame_path` on
|
|
260
413
|
// the `VALUE` returned by rb_profile_frames returns `(eval)` instead of the path of the file where the `eval`
|
|
261
414
|
// was called from.
|
|
262
|
-
//
|
|
263
|
-
//
|
|
264
|
-
// RUBY 2.2 AND BELOW WHICH IS ALSO PRESENT ON THIS FILE**
|
|
415
|
+
// * Imported fix from https://github.com/ruby/ruby/pull/7116 to avoid sampling threads that are still being created
|
|
416
|
+
// * Imported fix from https://github.com/ruby/ruby/pull/8415 to avoid potential crash when using YJIT.
|
|
265
417
|
//
|
|
266
418
|
// What is rb_profile_frames?
|
|
267
419
|
// `rb_profile_frames` is a Ruby VM debug API added for use by profilers for sampling the stack trace of a Ruby thread.
|
|
@@ -297,21 +449,33 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, i
|
|
|
297
449
|
// Modified from upstream: Instead of using `GET_EC` to collect info from the current thread,
|
|
298
450
|
// support sampling any thread (including the current) passed as an argument
|
|
299
451
|
rb_thread_t *th = thread_struct_from_object(thread);
|
|
300
|
-
#ifndef USE_THREAD_INSTEAD_OF_EXECUTION_CONTEXT // Modern Rubies
|
|
301
|
-
|
|
302
|
-
#else // Ruby < 2.5
|
|
303
|
-
|
|
304
|
-
#endif
|
|
452
|
+
#ifndef USE_THREAD_INSTEAD_OF_EXECUTION_CONTEXT // Modern Rubies
|
|
453
|
+
const rb_execution_context_t *ec = th->ec;
|
|
454
|
+
#else // Ruby < 2.5
|
|
455
|
+
const rb_thread_t *ec = th;
|
|
456
|
+
#endif
|
|
305
457
|
const rb_control_frame_t *cfp = ec->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
|
|
458
|
+
#ifndef NO_JIT_RETURN
|
|
459
|
+
const rb_control_frame_t *top = cfp;
|
|
460
|
+
#endif
|
|
306
461
|
const rb_callable_method_entry_t *cme;
|
|
307
462
|
|
|
308
|
-
// `vm_backtrace.c` includes this check in several methods, and I think this happens on either dead or newly-created
|
|
309
|
-
// threads, but I'm not entirely sure
|
|
310
|
-
if (end_cfp == NULL) return 0;
|
|
311
|
-
|
|
312
463
|
// Avoid sampling dead threads
|
|
313
464
|
if (th->status == THREAD_KILLED) return 0;
|
|
314
465
|
|
|
466
|
+
// `vm_backtrace.c` includes this check in several methods. This happens on newly-created threads, and may
|
|
467
|
+
// also (not entirely sure) happen on dead threads
|
|
468
|
+
if (end_cfp == NULL) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
|
|
469
|
+
|
|
470
|
+
// This should not happen for ddtrace (it can only happen when a thread is still being created), but I've imported
|
|
471
|
+
// it from https://github.com/ruby/ruby/pull/7116 in a "just in case" kind of mindset.
|
|
472
|
+
if (cfp == NULL) return 0;
|
|
473
|
+
|
|
474
|
+
// As of this writing, we don't support profiling with MN enabled, and this only happens in that mode, but as we
|
|
475
|
+
// probably want to experiment with it in the future, I've decided to import https://github.com/ruby/ruby/pull/9310
|
|
476
|
+
// here.
|
|
477
|
+
if (ec == NULL) return 0;
|
|
478
|
+
|
|
315
479
|
// Fix: Skip dummy frame that shows up in main thread.
|
|
316
480
|
//
|
|
317
481
|
// According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore
|
|
@@ -373,7 +537,20 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, i
|
|
|
373
537
|
buff[i] = (VALUE)cfp->iseq;
|
|
374
538
|
}
|
|
375
539
|
|
|
376
|
-
|
|
540
|
+
// The topmost frame may not have an updated PC because the JIT
|
|
541
|
+
// may not have set one. The JIT compiler will update the PC
|
|
542
|
+
// before entering a new function (so that `caller` will work),
|
|
543
|
+
// so only the topmost frame could possibly have an out of date PC
|
|
544
|
+
#ifndef NO_JIT_RETURN
|
|
545
|
+
if (cfp == top && cfp->jit_return) {
|
|
546
|
+
lines[i] = 0;
|
|
547
|
+
} else {
|
|
548
|
+
lines[i] = calc_lineno(cfp->iseq, cfp->pc);
|
|
549
|
+
}
|
|
550
|
+
#else // Ruby < 3.1
|
|
551
|
+
lines[i] = calc_lineno(cfp->iseq, cfp->pc);
|
|
552
|
+
#endif
|
|
553
|
+
|
|
377
554
|
is_ruby_frame[i] = true;
|
|
378
555
|
i++;
|
|
379
556
|
}
|
|
@@ -533,6 +710,7 @@ check_method_entry(VALUE obj, int can_be_svar)
|
|
|
533
710
|
if (can_be_svar) {
|
|
534
711
|
return check_method_entry(((struct vm_svar *)obj)->cref_or_me, FALSE);
|
|
535
712
|
}
|
|
713
|
+
// fallthrough
|
|
536
714
|
default:
|
|
537
715
|
#if VM_CHECK_MODE > 0
|
|
538
716
|
rb_bug("check_method_entry: svar should not be there:");
|
|
@@ -586,107 +764,129 @@ check_method_entry(VALUE obj, int can_be_svar)
|
|
|
586
764
|
return check_method_entry(ep[-1], TRUE);
|
|
587
765
|
}
|
|
588
766
|
#endif // USE_LEGACY_RB_VM_FRAME_METHOD_ENTRY
|
|
589
|
-
|
|
590
767
|
#endif // RUBY_MJIT_HEADER
|
|
591
768
|
|
|
592
|
-
#
|
|
769
|
+
#ifndef NO_RACTORS
|
|
770
|
+
// This API and definition are exported as a public symbol by the VM BUT the function header is not defined in any public header, so we
|
|
771
|
+
// repeat it here to be able to use in our code.
|
|
772
|
+
#ifndef USE_RACTOR_INTERNAL_APIS_DIRECTLY
|
|
773
|
+
// Disable fast path for detecting multiple Ractors. Unfortunately this symbol is no longer visible on modern Ruby
|
|
774
|
+
// versions, so we need to do a bit more work.
|
|
775
|
+
struct rb_ractor_struct *ruby_single_main_ractor = NULL;
|
|
776
|
+
|
|
777
|
+
// Alternative implementation of rb_ractor_main_p_ that avoids relying on non-public symbols
|
|
778
|
+
bool rb_ractor_main_p_(void) {
|
|
779
|
+
// We need to get the main ractor in a bit of a roundabout way, since Ruby >= 3.3 hid `GET_VM()`
|
|
780
|
+
return ddtrace_get_ractor() == thread_struct_from_object(rb_thread_current())->vm->ractor.main_ractor;
|
|
781
|
+
}
|
|
782
|
+
#else
|
|
783
|
+
// Directly access Ruby internal fast path for detecting multiple Ractors.
|
|
784
|
+
extern struct rb_ractor_struct *ruby_single_main_ractor;
|
|
593
785
|
|
|
594
|
-
//
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
// Modifications: None
|
|
598
|
-
inline static int
|
|
599
|
-
calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
|
|
600
|
-
{
|
|
601
|
-
return rb_iseq_line_no(iseq, pc - iseq->iseq_encoded);
|
|
602
|
-
}
|
|
786
|
+
// Ruby 3.0 to 3.2 directly expose this symbol, we just need to tell the compiler it exists.
|
|
787
|
+
bool rb_ractor_main_p_(void);
|
|
788
|
+
#endif
|
|
603
789
|
|
|
604
|
-
// Taken from upstream
|
|
605
|
-
//
|
|
606
|
-
// Modifications:
|
|
607
|
-
// *
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
//
|
|
619
|
-
//
|
|
620
|
-
|
|
621
|
-
//
|
|
790
|
+
// Taken from upstream ractor_core.h at commit d9cf0388599a3234b9f3c06ddd006cd59a58ab8b (November 2022, Ruby 3.2 trunk)
|
|
791
|
+
// to allow us to ensure that we're always operating on the main ractor (if Ruby has ractors)
|
|
792
|
+
// Modifications:
|
|
793
|
+
// * None
|
|
794
|
+
bool ddtrace_rb_ractor_main_p(void)
|
|
795
|
+
{
|
|
796
|
+
if (ruby_single_main_ractor) {
|
|
797
|
+
return true;
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
return rb_ractor_main_p_();
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
#else
|
|
804
|
+
// Simplify callers on older Rubies, instead of having them probe if the VM supports Ractors we just tell them that yes
|
|
805
|
+
// they're always on the main Ractor
|
|
806
|
+
bool ddtrace_rb_ractor_main_p(void) { return true; }
|
|
807
|
+
#endif // NO_RACTORS
|
|
808
|
+
|
|
809
|
+
// This is a tweaked and inlined version of
|
|
810
|
+
// threadptr_invoke_proc_location + rb_proc_location + iseq_location .
|
|
622
811
|
//
|
|
623
|
-
//
|
|
624
|
-
//
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
{
|
|
628
|
-
// **IMPORTANT: THIS IS A CUSTOM RB_PROFILE_FRAMES JUST FOR RUBY 2.2;
|
|
629
|
-
// SEE ABOVE FOR THE FUNCTION THAT GETS USED FOR MODERN RUBIES**
|
|
812
|
+
// It's useful to have here because not all of the methods above are accessible to extensions + to avoid the
|
|
813
|
+
// array allocation that iseq_location did to contain its return value.
|
|
814
|
+
static const rb_iseq_t *maybe_thread_invoke_proc_iseq(VALUE thread_value) {
|
|
815
|
+
rb_thread_t *thread = thread_struct_from_object(thread_value);
|
|
630
816
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
rb_control_frame_t *cfp = th->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(th);
|
|
817
|
+
#ifndef NO_THREAD_INVOKE_ARG // Ruby 2.6+
|
|
818
|
+
if (thread->invoke_type != thread_invoke_type_proc) return NULL;
|
|
634
819
|
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
if (
|
|
820
|
+
VALUE proc = thread->invoke_arg.proc.proc;
|
|
821
|
+
#else
|
|
822
|
+
if (thread->first_func || !thread->first_proc) return NULL;
|
|
638
823
|
|
|
639
|
-
|
|
640
|
-
|
|
824
|
+
VALUE proc = thread->first_proc;
|
|
825
|
+
#endif
|
|
641
826
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
// According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore
|
|
645
|
-
// at the base of every thread's stack.
|
|
646
|
-
// (see https://github.com/ruby/ruby/blob/4bd38e8120f2fdfdd47a34211720e048502377f1/vm_backtrace.c#L890-L914 )
|
|
647
|
-
//
|
|
648
|
-
// One is being pointed to by `RUBY_VM_END_CONTROL_FRAME(ec)`, and so we need to advance to the next one, and
|
|
649
|
-
// reaching it will be used as a condition to break out of the loop below.
|
|
650
|
-
//
|
|
651
|
-
// Note that in `backtrace_each` there's two calls to `RUBY_VM_NEXT_CONTROL_FRAME`, but the loop bounds there
|
|
652
|
-
// are computed in a different way, so the two calls really are equivalent to one here.
|
|
653
|
-
end_cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
|
|
827
|
+
const rb_iseq_t *iseq = rb_proc_get_iseq(proc, 0);
|
|
828
|
+
if (iseq == NULL) return NULL;
|
|
654
829
|
|
|
655
|
-
|
|
656
|
-
|
|
830
|
+
rb_iseq_check(iseq);
|
|
831
|
+
return iseq;
|
|
832
|
+
}
|
|
657
833
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
if (start > 0) {
|
|
661
|
-
start--;
|
|
662
|
-
continue;
|
|
663
|
-
}
|
|
834
|
+
VALUE invoke_location_for(VALUE thread, int *line_location) {
|
|
835
|
+
const rb_iseq_t *iseq = maybe_thread_invoke_proc_iseq(thread);
|
|
664
836
|
|
|
665
|
-
|
|
666
|
-
buff[i] = cfp->iseq->self;
|
|
667
|
-
lines[i] = calc_lineno(cfp->iseq, cfp->pc);
|
|
668
|
-
is_ruby_frame[i] = true;
|
|
669
|
-
i++;
|
|
670
|
-
} else if (RUBYVM_CFUNC_FRAME_P(cfp)) {
|
|
671
|
-
ID mid = cfp->me->def ? cfp->me->def->original_id : cfp->me->called_id;
|
|
672
|
-
buff[i] = rb_id2str(mid);
|
|
673
|
-
lines[i] = 0;
|
|
674
|
-
is_ruby_frame[i] = false;
|
|
675
|
-
i++;
|
|
676
|
-
}
|
|
677
|
-
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
|
678
|
-
}
|
|
837
|
+
if (iseq == NULL) return Qnil;
|
|
679
838
|
|
|
680
|
-
|
|
839
|
+
*line_location = NUM2INT(rb_iseq_first_lineno(iseq));
|
|
840
|
+
return rb_iseq_path(iseq);
|
|
681
841
|
}
|
|
682
842
|
|
|
683
|
-
|
|
843
|
+
void self_test_mn_enabled(void) {
|
|
844
|
+
#ifdef NO_MN_THREADS_AVAILABLE
|
|
845
|
+
return;
|
|
846
|
+
#else
|
|
847
|
+
if (ddtrace_get_ractor()->threads.sched.enable_mn_threads == true) {
|
|
848
|
+
rb_raise(rb_eRuntimeError, "Ruby VM is running with RUBY_MN_THREADS=1. This is not yet supported");
|
|
849
|
+
}
|
|
850
|
+
#endif
|
|
851
|
+
}
|
|
684
852
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
853
|
+
// Taken from upstream imemo.h at commit 6ebcf25de2859b5b6402b7e8b181066c32d0e0bf (November 2023, master branch)
|
|
854
|
+
// (See the Ruby project copyright and license above)
|
|
855
|
+
// to enable calling rb_imemo_name
|
|
856
|
+
//
|
|
857
|
+
// Modifications:
|
|
858
|
+
// * Added IMEMO_MASK define
|
|
859
|
+
// * Changed return type to int to avoid having to define `enum imemo_type`
|
|
860
|
+
static inline int ddtrace_imemo_type(VALUE imemo) {
|
|
861
|
+
// This mask is the same between Ruby 2.5 and 3.3-preview3. Furthermore, the intention of this method is to be used
|
|
862
|
+
// to call `rb_imemo_name` which correctly handles invalid numbers so even if the mask changes in the future, at most
|
|
863
|
+
// we'll get incorrect results (and never a VM crash)
|
|
864
|
+
#define IMEMO_MASK 0x0f
|
|
865
|
+
return (RBASIC(imemo)->flags >> FL_USHIFT) & IMEMO_MASK;
|
|
691
866
|
}
|
|
692
|
-
|
|
867
|
+
|
|
868
|
+
// Safety: This function assumes the object passed in is of the imemo type. But in the worst case, you'll just get
|
|
869
|
+
// a string that doesn't make any sense.
|
|
870
|
+
#ifndef NO_IMEMO_NAME
|
|
871
|
+
const char *imemo_kind(VALUE imemo) {
|
|
872
|
+
return rb_imemo_name(ddtrace_imemo_type(imemo));
|
|
873
|
+
}
|
|
874
|
+
#else
|
|
875
|
+
const char *imemo_kind(__attribute__((unused)) VALUE imemo) {
|
|
876
|
+
return NULL;
|
|
877
|
+
}
|
|
878
|
+
#endif
|
|
879
|
+
|
|
880
|
+
// This is used to workaround a VM bug. See "handle_sampling_signal" in "collectors_cpu_and_wall_time_worker" for details.
|
|
881
|
+
#ifdef NO_POSTPONED_TRIGGER
|
|
882
|
+
void *objspace_ptr_for_gc_finalize_deferred_workaround(void) {
|
|
883
|
+
rb_vm_t *vm =
|
|
884
|
+
#ifndef NO_GET_VM // TODO: Inline GET_VM below once we drop support in dd-trace-rb 2.x for < Ruby 2.5
|
|
885
|
+
GET_VM();
|
|
886
|
+
#else
|
|
887
|
+
thread_struct_from_object(rb_thread_current())->vm;
|
|
888
|
+
#endif
|
|
889
|
+
|
|
890
|
+
return vm->objspace;
|
|
891
|
+
}
|
|
892
|
+
#endif
|
|
@@ -7,17 +7,29 @@
|
|
|
7
7
|
// without also dragging the incompatible includes
|
|
8
8
|
#ifndef PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
|
|
9
9
|
#include <ruby/thread_native.h>
|
|
10
|
+
#include <ruby/vm.h>
|
|
10
11
|
#endif
|
|
11
12
|
|
|
12
13
|
#include "extconf.h"
|
|
13
14
|
|
|
15
|
+
// Contains the current gvl owner, and a flag to indicate if it is valid
|
|
16
|
+
typedef struct {
|
|
17
|
+
bool valid;
|
|
18
|
+
rb_nativethread_id_t owner;
|
|
19
|
+
} current_gvl_owner;
|
|
20
|
+
|
|
14
21
|
rb_nativethread_id_t pthread_id_for(VALUE thread);
|
|
22
|
+
bool is_current_thread_holding_the_gvl(void);
|
|
23
|
+
current_gvl_owner gvl_owner(void);
|
|
24
|
+
uint64_t native_thread_id_for(VALUE thread);
|
|
15
25
|
ptrdiff_t stack_depth_for(VALUE thread);
|
|
16
|
-
|
|
26
|
+
void ddtrace_thread_list(VALUE result_array);
|
|
17
27
|
bool is_thread_alive(VALUE thread);
|
|
18
28
|
VALUE thread_name_for(VALUE thread);
|
|
19
29
|
|
|
20
30
|
int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame);
|
|
31
|
+
// Returns true if the current thread belongs to the main Ractor or if Ruby has no Ractor support
|
|
32
|
+
bool ddtrace_rb_ractor_main_p(void);
|
|
21
33
|
|
|
22
34
|
// Ruby 3.0 finally added support for showing CFUNC frames (frames for methods written using native code)
|
|
23
35
|
// in stack traces gathered via `rb_profile_frames` (https://github.com/ruby/ruby/pull/3299).
|
|
@@ -31,3 +43,19 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, i
|
|
|
31
43
|
|
|
32
44
|
// See comment on `record_placeholder_stack_in_native_code` for a full explanation of what this means (and why we don't just return 0)
|
|
33
45
|
#define PLACEHOLDER_STACK_IN_NATIVE_CODE -1
|
|
46
|
+
|
|
47
|
+
// This method provides the file and line of the "invoke location" of a thread (first file:line of the block used to
|
|
48
|
+
// start the thread), if any.
|
|
49
|
+
// This is what Ruby shows in `Thread#to_s`.
|
|
50
|
+
// The file is returned directly, and the line is recorded onto *line_location.
|
|
51
|
+
VALUE invoke_location_for(VALUE thread, int *line_location);
|
|
52
|
+
|
|
53
|
+
// Check if RUBY_MN_THREADS is enabled (aka main Ractor is not doing 1:1 threads)
|
|
54
|
+
void self_test_mn_enabled(void);
|
|
55
|
+
|
|
56
|
+
// Provides more specific information on what kind an imemo is
|
|
57
|
+
const char *imemo_kind(VALUE imemo);
|
|
58
|
+
|
|
59
|
+
#ifdef NO_POSTPONED_TRIGGER
|
|
60
|
+
void *objspace_ptr_for_gc_finalize_deferred_workaround(void);
|
|
61
|
+
#endif
|