datadog 2.0.0.beta1
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 +7 -0
- data/CHANGELOG.md +4236 -0
- data/LICENSE +6 -0
- data/LICENSE-3rdparty.csv +7 -0
- data/LICENSE.Apache +200 -0
- data/LICENSE.BSD3 +24 -0
- data/NOTICE +4 -0
- data/README.md +25 -0
- data/bin/ddprofrb +15 -0
- data/ext/datadog_profiling_loader/datadog_profiling_loader.c +134 -0
- data/ext/datadog_profiling_loader/extconf.rb +72 -0
- data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +156 -0
- data/ext/datadog_profiling_native_extension/clock_id.h +22 -0
- data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +56 -0
- data/ext/datadog_profiling_native_extension/clock_id_noop.c +22 -0
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +1153 -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 +1391 -0
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +15 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +302 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +970 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.h +155 -0
- data/ext/datadog_profiling_native_extension/helpers.h +23 -0
- data/ext/datadog_profiling_native_extension/http_transport.c +375 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +62 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +42 -0
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +319 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +892 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +61 -0
- 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 +119 -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 +941 -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 +99 -0
- 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/README.md +7 -0
- data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +7703 -0
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
- data/lib/datadog/appsec/assets/waf_rules/strict.json +1635 -0
- data/lib/datadog/appsec/assets.rb +46 -0
- data/lib/datadog/appsec/autoload.rb +13 -0
- data/lib/datadog/appsec/component.rb +94 -0
- data/lib/datadog/appsec/configuration/settings.rb +202 -0
- data/lib/datadog/appsec/configuration.rb +11 -0
- data/lib/datadog/appsec/contrib/auto_instrument.rb +25 -0
- 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 +49 -0
- data/lib/datadog/appsec/contrib/integration.rb +37 -0
- data/lib/datadog/appsec/contrib/patcher.rb +12 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +13 -0
- 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 +162 -0
- data/lib/datadog/appsec/contrib/rack/integration.rb +44 -0
- data/lib/datadog/appsec/contrib/rack/patcher.rb +34 -0
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +81 -0
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +60 -0
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +66 -0
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +44 -0
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +196 -0
- data/lib/datadog/appsec/contrib/rails/ext.rb +13 -0
- data/lib/datadog/appsec/contrib/rails/framework.rb +16 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +71 -0
- data/lib/datadog/appsec/contrib/rails/integration.rb +43 -0
- data/lib/datadog/appsec/contrib/rails/patcher.rb +166 -0
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +66 -0
- data/lib/datadog/appsec/contrib/rails/request.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +20 -0
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +14 -0
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +20 -0
- 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 +117 -0
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +43 -0
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +168 -0
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +61 -0
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +20 -0
- data/lib/datadog/appsec/event.rb +171 -0
- data/lib/datadog/appsec/ext.rb +10 -0
- data/lib/datadog/appsec/extensions.rb +15 -0
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +22 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +64 -0
- 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 +171 -0
- data/lib/datadog/appsec/rate_limiter.rb +60 -0
- data/lib/datadog/appsec/reactive/address_hash.rb +22 -0
- data/lib/datadog/appsec/reactive/engine.rb +47 -0
- data/lib/datadog/appsec/reactive/operation.rb +68 -0
- data/lib/datadog/appsec/reactive/subscriber.rb +19 -0
- 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 +201 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
- data/lib/datadog/appsec/utils/http.rb +11 -0
- data/lib/datadog/appsec/utils.rb +9 -0
- data/lib/datadog/appsec.rb +60 -0
- data/lib/datadog/auto_instrument.rb +16 -0
- data/lib/datadog/auto_instrument_base.rb +8 -0
- data/lib/datadog/core/buffer/cruby.rb +55 -0
- data/lib/datadog/core/buffer/random.rb +134 -0
- data/lib/datadog/core/buffer/thread_safe.rb +58 -0
- data/lib/datadog/core/chunker.rb +35 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +352 -0
- data/lib/datadog/core/configuration/base.rb +91 -0
- data/lib/datadog/core/configuration/components.rb +177 -0
- data/lib/datadog/core/configuration/ext.rb +45 -0
- data/lib/datadog/core/configuration/option.rb +319 -0
- data/lib/datadog/core/configuration/option_definition.rb +165 -0
- data/lib/datadog/core/configuration/options.rb +128 -0
- data/lib/datadog/core/configuration/settings.rb +786 -0
- data/lib/datadog/core/configuration.rb +296 -0
- data/lib/datadog/core/diagnostics/environment_logger.rb +173 -0
- data/lib/datadog/core/diagnostics/health.rb +19 -0
- data/lib/datadog/core/encoding.rb +74 -0
- data/lib/datadog/core/environment/cgroup.rb +53 -0
- data/lib/datadog/core/environment/class_count.rb +21 -0
- data/lib/datadog/core/environment/container.rb +91 -0
- data/lib/datadog/core/environment/execution.rb +103 -0
- data/lib/datadog/core/environment/ext.rb +45 -0
- data/lib/datadog/core/environment/gc.rb +20 -0
- data/lib/datadog/core/environment/git.rb +25 -0
- data/lib/datadog/core/environment/identity.rb +84 -0
- data/lib/datadog/core/environment/platform.rb +40 -0
- data/lib/datadog/core/environment/socket.rb +24 -0
- data/lib/datadog/core/environment/thread_count.rb +20 -0
- data/lib/datadog/core/environment/variable_helpers.rb +53 -0
- data/lib/datadog/core/environment/vm_cache.rb +64 -0
- data/lib/datadog/core/environment/yjit.rb +58 -0
- data/lib/datadog/core/error.rb +100 -0
- data/lib/datadog/core/extensions.rb +16 -0
- data/lib/datadog/core/git/ext.rb +16 -0
- data/lib/datadog/core/header_collection.rb +43 -0
- data/lib/datadog/core/logger.rb +45 -0
- data/lib/datadog/core/logging/ext.rb +13 -0
- data/lib/datadog/core/metrics/client.rb +199 -0
- data/lib/datadog/core/metrics/ext.rb +18 -0
- data/lib/datadog/core/metrics/helpers.rb +25 -0
- data/lib/datadog/core/metrics/logging.rb +44 -0
- data/lib/datadog/core/metrics/metric.rb +14 -0
- data/lib/datadog/core/metrics/options.rb +52 -0
- data/lib/datadog/core/pin.rb +75 -0
- data/lib/datadog/core/remote/client/capabilities.rb +62 -0
- data/lib/datadog/core/remote/client.rb +234 -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 +147 -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 +38 -0
- data/lib/datadog/core/runtime/metrics.rb +185 -0
- data/lib/datadog/core/telemetry/client.rb +87 -0
- data/lib/datadog/core/telemetry/collector.rb +248 -0
- data/lib/datadog/core/telemetry/emitter.rb +50 -0
- data/lib/datadog/core/telemetry/event.rb +83 -0
- data/lib/datadog/core/telemetry/ext.rb +15 -0
- data/lib/datadog/core/telemetry/heartbeat.rb +35 -0
- data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
- data/lib/datadog/core/telemetry/http/env.rb +20 -0
- data/lib/datadog/core/telemetry/http/ext.rb +22 -0
- data/lib/datadog/core/telemetry/http/response.rb +66 -0
- data/lib/datadog/core/telemetry/http/transport.rb +56 -0
- data/lib/datadog/core/telemetry/v1/app_event.rb +59 -0
- data/lib/datadog/core/telemetry/v1/application.rb +94 -0
- data/lib/datadog/core/telemetry/v1/configuration.rb +27 -0
- data/lib/datadog/core/telemetry/v1/dependency.rb +45 -0
- data/lib/datadog/core/telemetry/v1/host.rb +59 -0
- data/lib/datadog/core/telemetry/v1/install_signature.rb +38 -0
- data/lib/datadog/core/telemetry/v1/integration.rb +66 -0
- data/lib/datadog/core/telemetry/v1/product.rb +36 -0
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +108 -0
- data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
- data/lib/datadog/core/telemetry/v2/request.rb +29 -0
- data/lib/datadog/core/transport/ext.rb +43 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +159 -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/duration.rb +52 -0
- data/lib/datadog/core/utils/forking.rb +63 -0
- data/lib/datadog/core/utils/hash.rb +79 -0
- data/lib/datadog/core/utils/network.rb +121 -0
- data/lib/datadog/core/utils/only_once.rb +42 -0
- data/lib/datadog/core/utils/safe_dup.rb +40 -0
- data/lib/datadog/core/utils/sequence.rb +26 -0
- data/lib/datadog/core/utils/time.rb +52 -0
- data/lib/datadog/core/utils/url.rb +25 -0
- data/lib/datadog/core/utils.rb +94 -0
- data/lib/datadog/core/vendor/multipart-post/LICENSE +11 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +118 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +59 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +137 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +11 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +10 -0
- data/lib/datadog/core/vendor/multipart-post/multipart.rb +14 -0
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +34 -0
- data/lib/datadog/core/worker.rb +24 -0
- data/lib/datadog/core/workers/async.rb +185 -0
- data/lib/datadog/core/workers/interval_loop.rb +123 -0
- data/lib/datadog/core/workers/polling.rb +59 -0
- data/lib/datadog/core/workers/queue.rb +44 -0
- data/lib/datadog/core/workers/runtime_metrics.rb +62 -0
- data/lib/datadog/core.rb +45 -0
- data/lib/datadog/kit/appsec/events.rb +169 -0
- data/lib/datadog/kit/enable_core_dumps.rb +49 -0
- data/lib/datadog/kit/identity.rb +104 -0
- data/lib/datadog/kit.rb +11 -0
- 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 +59 -0
- data/lib/datadog/opentelemetry.rb +51 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +113 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +114 -0
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +70 -0
- data/lib/datadog/profiling/collectors/info.rb +103 -0
- data/lib/datadog/profiling/collectors/stack.rb +13 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +61 -0
- data/lib/datadog/profiling/component.rb +418 -0
- data/lib/datadog/profiling/exporter.rb +103 -0
- data/lib/datadog/profiling/ext/forking.rb +98 -0
- data/lib/datadog/profiling/ext.rb +35 -0
- data/lib/datadog/profiling/flush.rb +43 -0
- data/lib/datadog/profiling/http_transport.rb +143 -0
- data/lib/datadog/profiling/load_native_extension.rb +28 -0
- data/lib/datadog/profiling/native_extension.rb +20 -0
- data/lib/datadog/profiling/preload.rb +5 -0
- data/lib/datadog/profiling/profiler.rb +64 -0
- data/lib/datadog/profiling/scheduler.rb +137 -0
- data/lib/datadog/profiling/stack_recorder.rb +69 -0
- data/lib/datadog/profiling/tag_builder.rb +60 -0
- data/lib/datadog/profiling/tasks/exec.rb +50 -0
- data/lib/datadog/profiling/tasks/help.rb +18 -0
- data/lib/datadog/profiling/tasks/setup.rb +60 -0
- data/lib/datadog/profiling.rb +152 -0
- data/lib/datadog/tracing/analytics.rb +25 -0
- data/lib/datadog/tracing/buffer.rb +129 -0
- data/lib/datadog/tracing/client_ip.rb +61 -0
- data/lib/datadog/tracing/component.rb +206 -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 +98 -0
- data/lib/datadog/tracing/configuration/http.rb +74 -0
- data/lib/datadog/tracing/configuration/settings.rb +421 -0
- data/lib/datadog/tracing/context.rb +68 -0
- data/lib/datadog/tracing/context_provider.rb +82 -0
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +39 -0
- data/lib/datadog/tracing/contrib/action_cable/event.rb +71 -0
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +58 -0
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +63 -0
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +59 -0
- data/lib/datadog/tracing/contrib/action_cable/events.rb +37 -0
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +90 -0
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +43 -0
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +52 -0
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +60 -0
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +47 -0
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +34 -0
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +34 -0
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +138 -0
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +40 -0
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +23 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +51 -0
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +27 -0
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +40 -0
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +43 -0
- data/lib/datadog/tracing/contrib/action_view/event.rb +35 -0
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +54 -0
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +57 -0
- data/lib/datadog/tracing/contrib/action_view/events.rb +34 -0
- data/lib/datadog/tracing/contrib/action_view/ext.rb +25 -0
- data/lib/datadog/tracing/contrib/action_view/integration.rb +58 -0
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +34 -0
- data/lib/datadog/tracing/contrib/action_view/utils.rb +36 -0
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +39 -0
- data/lib/datadog/tracing/contrib/active_job/event.rb +58 -0
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +50 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +49 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +49 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +51 -0
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +49 -0
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +50 -0
- data/lib/datadog/tracing/contrib/active_job/events.rb +42 -0
- data/lib/datadog/tracing/contrib/active_job/ext.rb +40 -0
- data/lib/datadog/tracing/contrib/active_job/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +24 -0
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +36 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +68 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +45 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +47 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +34 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +25 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +32 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +36 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +147 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +48 -0
- data/lib/datadog/tracing/contrib/active_record/event.rb +30 -0
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +58 -0
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +77 -0
- data/lib/datadog/tracing/contrib/active_record/events.rb +34 -0
- data/lib/datadog/tracing/contrib/active_record/ext.rb +30 -0
- data/lib/datadog/tracing/contrib/active_record/integration.rb +57 -0
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +27 -0
- data/lib/datadog/tracing/contrib/active_record/utils.rb +128 -0
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +186 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +76 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +47 -0
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +47 -0
- data/lib/datadog/tracing/contrib/active_support/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +52 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +71 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +71 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +164 -0
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +27 -0
- data/lib/datadog/tracing/contrib/analytics.rb +28 -0
- data/lib/datadog/tracing/contrib/auto_instrument.rb +53 -0
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +53 -0
- data/lib/datadog/tracing/contrib/aws/ext.rb +50 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +119 -0
- data/lib/datadog/tracing/contrib/aws/integration.rb +47 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +64 -0
- data/lib/datadog/tracing/contrib/aws/patcher.rb +57 -0
- 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 +139 -0
- data/lib/datadog/tracing/contrib/component.rb +41 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +20 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +24 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +53 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +16 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +20 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +49 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
- data/lib/datadog/tracing/contrib/configurable.rb +102 -0
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +85 -0
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +43 -0
- data/lib/datadog/tracing/contrib/configuration/settings.rb +43 -0
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +58 -0
- data/lib/datadog/tracing/contrib/dalli/ext.rb +40 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +75 -0
- data/lib/datadog/tracing/contrib/dalli/integration.rb +52 -0
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +26 -0
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +49 -0
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +29 -0
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +37 -0
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +108 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +34 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +57 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +34 -0
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +164 -0
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +87 -0
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +56 -0
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +223 -0
- data/lib/datadog/tracing/contrib/ethon/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/ethon/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +102 -0
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +30 -0
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +74 -0
- data/lib/datadog/tracing/contrib/excon/ext.rb +30 -0
- data/lib/datadog/tracing/contrib/excon/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +196 -0
- data/lib/datadog/tracing/contrib/excon/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/ext.rb +55 -0
- data/lib/datadog/tracing/contrib/extensions.rb +228 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +77 -0
- data/lib/datadog/tracing/contrib/faraday/connection.rb +22 -0
- data/lib/datadog/tracing/contrib/faraday/ext.rb +30 -0
- data/lib/datadog/tracing/contrib/faraday/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +112 -0
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +56 -0
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +22 -0
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +55 -0
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +256 -0
- data/lib/datadog/tracing/contrib/grape/ext.rb +30 -0
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +37 -0
- data/lib/datadog/tracing/contrib/grape/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/grape/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +50 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +20 -0
- data/lib/datadog/tracing/contrib/graphql/integration.rb +56 -0
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +55 -0
- data/lib/datadog/tracing/contrib/graphql/trace_patcher.rb +24 -0
- data/lib/datadog/tracing/contrib/graphql/tracing_patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +58 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +117 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +96 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +107 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +46 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +29 -0
- data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +53 -0
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +34 -0
- data/lib/datadog/tracing/contrib/grpc.rb +45 -0
- 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 +44 -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 +40 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +69 -0
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +45 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +29 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +144 -0
- data/lib/datadog/tracing/contrib/http/integration.rb +49 -0
- data/lib/datadog/tracing/contrib/http/patcher.rb +30 -0
- data/lib/datadog/tracing/contrib/http.rb +45 -0
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +17 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +68 -0
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +30 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +137 -0
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +42 -0
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +68 -0
- data/lib/datadog/tracing/contrib/httprb/ext.rb +29 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +145 -0
- data/lib/datadog/tracing/contrib/httprb/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +42 -0
- data/lib/datadog/tracing/contrib/integration.rb +78 -0
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +39 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +19 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +18 -0
- data/lib/datadog/tracing/contrib/kafka/event.rb +53 -0
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +42 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +49 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +47 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +47 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +37 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +37 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +37 -0
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +41 -0
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +44 -0
- data/lib/datadog/tracing/contrib/kafka/events.rb +48 -0
- data/lib/datadog/tracing/contrib/kafka/ext.rb +55 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +24 -0
- data/lib/datadog/tracing/contrib/lograge/ext.rb +15 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +31 -0
- data/lib/datadog/tracing/contrib/lograge/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +56 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +38 -0
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +47 -0
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +49 -0
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +34 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +141 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +64 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +95 -0
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +54 -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 +109 -0
- data/lib/datadog/tracing/contrib/patcher.rb +85 -0
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +64 -0
- data/lib/datadog/tracing/contrib/pg/ext.rb +35 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +211 -0
- data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +52 -0
- data/lib/datadog/tracing/contrib/presto/ext.rb +38 -0
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +138 -0
- data/lib/datadog/tracing/contrib/presto/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/presto/patcher.rb +37 -0
- 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 +55 -0
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +55 -0
- data/lib/datadog/tracing/contrib/que/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/que/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/que/patcher.rb +26 -0
- data/lib/datadog/tracing/contrib/que/tracer.rb +63 -0
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +47 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +81 -0
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +38 -0
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +35 -0
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +38 -0
- data/lib/datadog/tracing/contrib/racecar/events.rb +36 -0
- data/lib/datadog/tracing/contrib/racecar/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/racecar/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +59 -0
- data/lib/datadog/tracing/contrib/rack/ext.rb +30 -0
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +40 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +265 -0
- data/lib/datadog/tracing/contrib/rack/patcher.rb +119 -0
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +48 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +52 -0
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +10 -0
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +76 -0
- data/lib/datadog/tracing/contrib/rails/ext.rb +23 -0
- data/lib/datadog/tracing/contrib/rails/framework.rb +148 -0
- data/lib/datadog/tracing/contrib/rails/integration.rb +52 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +29 -0
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +46 -0
- data/lib/datadog/tracing/contrib/rails/patcher.rb +88 -0
- data/lib/datadog/tracing/contrib/rails/railtie.rb +19 -0
- data/lib/datadog/tracing/contrib/rails/utils.rb +26 -0
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +55 -0
- data/lib/datadog/tracing/contrib/rake/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +103 -0
- data/lib/datadog/tracing/contrib/rake/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/rake/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +49 -0
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +57 -0
- data/lib/datadog/tracing/contrib/redis/ext.rb +35 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +53 -0
- data/lib/datadog/tracing/contrib/redis/integration.rb +80 -0
- data/lib/datadog/tracing/contrib/redis/patcher.rb +92 -0
- data/lib/datadog/tracing/contrib/redis/quantize.rb +80 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +68 -0
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +85 -0
- data/lib/datadog/tracing/contrib/redis/vendor/LICENSE +20 -0
- data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +160 -0
- data/lib/datadog/tracing/contrib/registerable.rb +50 -0
- data/lib/datadog/tracing/contrib/registry.rb +52 -0
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +42 -0
- data/lib/datadog/tracing/contrib/resque/ext.rb +22 -0
- data/lib/datadog/tracing/contrib/resque/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/resque/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +106 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +55 -0
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +129 -0
- 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/tracing/contrib/roda/patcher.rb +30 -0
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +24 -0
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +15 -0
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +35 -0
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +52 -0
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/sequel/database.rb +62 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +67 -0
- data/lib/datadog/tracing/contrib/sequel/ext.rb +23 -0
- data/lib/datadog/tracing/contrib/sequel/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +37 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +90 -0
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +43 -0
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +65 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +62 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +47 -0
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +46 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +44 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +61 -0
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +90 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +61 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +36 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +34 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +57 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +34 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +88 -0
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +44 -0
- data/lib/datadog/tracing/contrib/sidekiq.rb +37 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +46 -0
- data/lib/datadog/tracing/contrib/sinatra/env.rb +38 -0
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +31 -0
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +116 -0
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +75 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +86 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +109 -0
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +43 -0
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +27 -0
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +60 -0
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +92 -0
- data/lib/datadog/tracing/contrib/status_range_env_parser.rb +33 -0
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +25 -0
- 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 +39 -0
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +28 -0
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +104 -0
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +35 -0
- 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 +31 -0
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +111 -0
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +179 -0
- data/lib/datadog/tracing/contrib.rb +81 -0
- data/lib/datadog/tracing/correlation.rb +103 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +159 -0
- data/lib/datadog/tracing/diagnostics/ext.rb +36 -0
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +73 -0
- data/lib/datadog/tracing/distributed/b3_single.rb +69 -0
- data/lib/datadog/tracing/distributed/datadog.rb +200 -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/helpers.rb +65 -0
- data/lib/datadog/tracing/distributed/none.rb +18 -0
- data/lib/datadog/tracing/distributed/propagation.rb +121 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +436 -0
- data/lib/datadog/tracing/event.rb +76 -0
- data/lib/datadog/tracing/flush.rb +96 -0
- data/lib/datadog/tracing/metadata/analytics.rb +26 -0
- data/lib/datadog/tracing/metadata/errors.rb +24 -0
- data/lib/datadog/tracing/metadata/ext.rb +193 -0
- data/lib/datadog/tracing/metadata/tagging.rb +131 -0
- data/lib/datadog/tracing/metadata.rb +20 -0
- data/lib/datadog/tracing/pipeline/span_filter.rb +46 -0
- data/lib/datadog/tracing/pipeline/span_processor.rb +39 -0
- data/lib/datadog/tracing/pipeline.rb +63 -0
- data/lib/datadog/tracing/remote.rb +78 -0
- data/lib/datadog/tracing/runtime/metrics.rb +17 -0
- data/lib/datadog/tracing/sampling/all_sampler.rb +24 -0
- data/lib/datadog/tracing/sampling/ext.rb +56 -0
- data/lib/datadog/tracing/sampling/matcher.rb +65 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +160 -0
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +87 -0
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +63 -0
- data/lib/datadog/tracing/sampling/rate_limiter.rb +185 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +58 -0
- data/lib/datadog/tracing/sampling/rule.rb +61 -0
- data/lib/datadog/tracing/sampling/rule_sampler.rb +148 -0
- data/lib/datadog/tracing/sampling/sampler.rb +32 -0
- data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
- data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
- data/lib/datadog/tracing/sampling/span/rule.rb +78 -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 +207 -0
- data/lib/datadog/tracing/span_operation.rb +498 -0
- data/lib/datadog/tracing/sync_writer.rb +67 -0
- data/lib/datadog/tracing/trace_digest.rb +185 -0
- data/lib/datadog/tracing/trace_operation.rb +492 -0
- data/lib/datadog/tracing/trace_segment.rb +222 -0
- data/lib/datadog/tracing/tracer.rb +531 -0
- 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 +97 -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 +196 -0
- data/lib/datadog/tracing/workers.rb +125 -0
- data/lib/datadog/tracing/writer.rb +188 -0
- data/lib/datadog/tracing.rb +169 -0
- data/lib/datadog/version.rb +26 -0
- data/lib/datadog.rb +10 -0
- metadata +886 -0
@@ -0,0 +1,892 @@
|
|
1
|
+
#include "extconf.h"
|
2
|
+
|
3
|
+
// This file exports functions used to access private Ruby VM APIs and internals.
|
4
|
+
// To do this, it imports a few VM internal (private) headers.
|
5
|
+
//
|
6
|
+
// **Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
|
7
|
+
// contribute upstream changes so that they become official public VM APIs.
|
8
|
+
//
|
9
|
+
// In the meanwhile, be very careful when changing things here :)
|
10
|
+
|
11
|
+
#ifdef RUBY_MJIT_HEADER
|
12
|
+
// Pick up internal structures from the private Ruby MJIT header file
|
13
|
+
#include RUBY_MJIT_HEADER
|
14
|
+
#else
|
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.
|
17
|
+
|
18
|
+
// We can't do anything about warnings in VM headers, so we just use this technique to suppress them.
|
19
|
+
// See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
|
20
|
+
#pragma GCC diagnostic push
|
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"
|
25
|
+
#include <vm_core.h>
|
26
|
+
#pragma GCC diagnostic pop
|
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
|
41
|
+
#endif
|
42
|
+
|
43
|
+
#define PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
|
44
|
+
#include "private_vm_api_access.h"
|
45
|
+
|
46
|
+
// MRI has a similar rb_thread_ptr() function which we can't call it directly
|
47
|
+
// because Ruby does not expose the thread_data_type publicly.
|
48
|
+
// Instead, we have our own version of that function, and we lazily initialize the thread_data_type pointer
|
49
|
+
// from a known-correct object: the current thread.
|
50
|
+
//
|
51
|
+
// Note that beyond returning the rb_thread_struct*, rb_check_typeddata() raises an exception
|
52
|
+
// if the argument passed in is not actually a `Thread` instance.
|
53
|
+
static inline rb_thread_t *thread_struct_from_object(VALUE thread) {
|
54
|
+
static const rb_data_type_t *thread_data_type = NULL;
|
55
|
+
if (UNLIKELY(thread_data_type == NULL)) thread_data_type = RTYPEDDATA_TYPE(rb_thread_current());
|
56
|
+
|
57
|
+
return (rb_thread_t *) rb_check_typeddata(thread, thread_data_type);
|
58
|
+
}
|
59
|
+
|
60
|
+
rb_nativethread_id_t pthread_id_for(VALUE thread) {
|
61
|
+
// struct rb_native_thread was introduced in Ruby 3.2: https://github.com/ruby/ruby/pull/5836
|
62
|
+
#ifndef NO_RB_NATIVE_THREAD
|
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;
|
67
|
+
#else
|
68
|
+
return thread_struct_from_object(thread)->thread_id;
|
69
|
+
#endif
|
70
|
+
}
|
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
|
+
|
213
|
+
// Returns the stack depth by using the same approach as rb_profile_frames and backtrace_each: get the positions
|
214
|
+
// of the end and current frame pointers and subtracting them.
|
215
|
+
ptrdiff_t stack_depth_for(VALUE thread) {
|
216
|
+
#ifndef USE_THREAD_INSTEAD_OF_EXECUTION_CONTEXT // Modern Rubies
|
217
|
+
const rb_execution_context_t *ec = thread_struct_from_object(thread)->ec;
|
218
|
+
#else // Ruby < 2.5
|
219
|
+
const rb_thread_t *ec = thread_struct_from_object(thread);
|
220
|
+
#endif
|
221
|
+
|
222
|
+
const rb_control_frame_t *cfp = ec->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
|
223
|
+
|
224
|
+
if (end_cfp == NULL) return 0;
|
225
|
+
|
226
|
+
// Skip dummy frame, as seen in `backtrace_each` (`vm_backtrace.c`) and our custom rb_profile_frames
|
227
|
+
// ( https://github.com/ruby/ruby/blob/4bd38e8120f2fdfdd47a34211720e048502377f1/vm_backtrace.c#L890-L914 )
|
228
|
+
end_cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
|
229
|
+
|
230
|
+
return end_cfp <= cfp ? 0 : end_cfp - cfp - 1;
|
231
|
+
}
|
232
|
+
|
233
|
+
// This was renamed in Ruby 3.2
|
234
|
+
#if !defined(ccan_list_for_each) && defined(list_for_each)
|
235
|
+
#define ccan_list_for_each list_for_each
|
236
|
+
#endif
|
237
|
+
|
238
|
+
// Tries to match rb_thread_list() but that method isn't accessible to extensions
|
239
|
+
void ddtrace_thread_list(VALUE result_array) {
|
240
|
+
rb_thread_t *thread = NULL;
|
241
|
+
|
242
|
+
// Ruby 3 Safety: Our implementation is inspired by `rb_ractor_thread_list` BUT that method wraps the operations below
|
243
|
+
// with `RACTOR_LOCK` and `RACTOR_UNLOCK`.
|
244
|
+
//
|
245
|
+
// This initially made me believe that one MUST grab the ractor lock (which is different from the ractor-scoped Global
|
246
|
+
// VM Lock) in able to iterate the `threads.set`. This turned out not to be the case: upon further study of the VM
|
247
|
+
// codebase in 3.2-master, 3.1 and 3.0, there's quite a few places where `threads.set` is accessed without grabbing
|
248
|
+
// the ractor lock: `ractor_mark` (ractor.c), `thgroup_list` (thread.c), `rb_check_deadlock` (thread.c), etc.
|
249
|
+
//
|
250
|
+
// I suspect the design in `rb_ractor_thread_list` may be done that way to perhaps in the future expose it to be
|
251
|
+
// called from a different Ractor, but I'm not sure...
|
252
|
+
#ifdef HAVE_RUBY_RACTOR_H
|
253
|
+
rb_ractor_t *current_ractor = ddtrace_get_ractor();
|
254
|
+
ccan_list_for_each(¤t_ractor->threads.set, thread, lt_node) {
|
255
|
+
#else
|
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
|
262
|
+
list_for_each(&vm->living_threads, thread, vmlt_node) {
|
263
|
+
#endif
|
264
|
+
switch (thread->status) {
|
265
|
+
case THREAD_RUNNABLE:
|
266
|
+
case THREAD_STOPPED:
|
267
|
+
case THREAD_STOPPED_FOREVER:
|
268
|
+
rb_ary_push(result_array, thread->self);
|
269
|
+
default:
|
270
|
+
break;
|
271
|
+
}
|
272
|
+
}
|
273
|
+
}
|
274
|
+
|
275
|
+
bool is_thread_alive(VALUE thread) {
|
276
|
+
return thread_struct_from_object(thread)->status != THREAD_KILLED;
|
277
|
+
}
|
278
|
+
|
279
|
+
VALUE thread_name_for(VALUE thread) {
|
280
|
+
return thread_struct_from_object(thread)->name;
|
281
|
+
}
|
282
|
+
|
283
|
+
// -----------------------------------------------------------------------------
|
284
|
+
// The sources below are modified versions of code extracted from the Ruby project.
|
285
|
+
// Each function is annotated with its origin, why we imported it, and the changes made.
|
286
|
+
//
|
287
|
+
// The Ruby project copyright and license follow:
|
288
|
+
// -----------------------------------------------------------------------------
|
289
|
+
// Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
|
290
|
+
//
|
291
|
+
// Redistribution and use in source and binary forms, with or without
|
292
|
+
// modification, are permitted provided that the following conditions
|
293
|
+
// are met:
|
294
|
+
// 1. Redistributions of source code must retain the above copyright
|
295
|
+
// notice, this list of conditions and the following disclaimer.
|
296
|
+
// 2. Redistributions in binary form must reproduce the above copyright
|
297
|
+
// notice, this list of conditions and the following disclaimer in the
|
298
|
+
// documentation and/or other materials provided with the distribution.
|
299
|
+
//
|
300
|
+
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
301
|
+
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
302
|
+
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
303
|
+
// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
304
|
+
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
305
|
+
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
306
|
+
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
307
|
+
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
308
|
+
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
309
|
+
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
310
|
+
// SUCH DAMAGE.
|
311
|
+
|
312
|
+
// Taken from upstream vm_core.h at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
313
|
+
// Copyright (C) 2004-2007 Koichi Sasada
|
314
|
+
// to support our custom rb_profile_frames (see below)
|
315
|
+
// Modifications: None
|
316
|
+
#define ISEQ_BODY(iseq) ((iseq)->body)
|
317
|
+
|
318
|
+
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
319
|
+
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
320
|
+
// to support our custom rb_profile_frames (see below)
|
321
|
+
// Modifications:
|
322
|
+
// * Support int first_lineno for Ruby 3.2.0+ (https://github.com/ruby/ruby/pull/6430)
|
323
|
+
//
|
324
|
+
// `node_id` gets used depending on Ruby VM compilation settings (USE_ISEQ_NODE_ID being defined).
|
325
|
+
// To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
|
326
|
+
// with diagnostic stuff. See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
|
327
|
+
#pragma GCC diagnostic push
|
328
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
329
|
+
inline static int
|
330
|
+
calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
|
331
|
+
{
|
332
|
+
VM_ASSERT(iseq);
|
333
|
+
VM_ASSERT(ISEQ_BODY(iseq));
|
334
|
+
VM_ASSERT(ISEQ_BODY(iseq)->iseq_encoded);
|
335
|
+
VM_ASSERT(ISEQ_BODY(iseq)->iseq_size);
|
336
|
+
if (! pc) {
|
337
|
+
if (ISEQ_BODY(iseq)->type == ISEQ_TYPE_TOP) {
|
338
|
+
VM_ASSERT(! ISEQ_BODY(iseq)->local_table);
|
339
|
+
VM_ASSERT(! ISEQ_BODY(iseq)->local_table_size);
|
340
|
+
return 0;
|
341
|
+
}
|
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
|
347
|
+
#ifdef USE_ISEQ_NODE_ID
|
348
|
+
if (node_id) *node_id = -1;
|
349
|
+
#endif
|
350
|
+
return 1;
|
351
|
+
}
|
352
|
+
else {
|
353
|
+
ptrdiff_t n = pc - ISEQ_BODY(iseq)->iseq_encoded;
|
354
|
+
VM_ASSERT(n <= ISEQ_BODY(iseq)->iseq_size);
|
355
|
+
VM_ASSERT(n >= 0);
|
356
|
+
ASSUME(n >= 0);
|
357
|
+
size_t pos = n; /* no overflow */
|
358
|
+
if (LIKELY(pos)) {
|
359
|
+
/* use pos-1 because PC points next instruction at the beginning of instruction */
|
360
|
+
pos--;
|
361
|
+
}
|
362
|
+
#if VMDEBUG && defined(HAVE_BUILTIN___BUILTIN_TRAP)
|
363
|
+
else {
|
364
|
+
/* SDR() is not possible; that causes infinite loop. */
|
365
|
+
rb_print_backtrace();
|
366
|
+
__builtin_trap();
|
367
|
+
}
|
368
|
+
#endif
|
369
|
+
if (lineno) *lineno = rb_iseq_line_no(iseq, pos);
|
370
|
+
#ifdef USE_ISEQ_NODE_ID
|
371
|
+
if (node_id) *node_id = rb_iseq_node_id(iseq, pos);
|
372
|
+
#endif
|
373
|
+
return 1;
|
374
|
+
}
|
375
|
+
}
|
376
|
+
#pragma GCC diagnostic pop
|
377
|
+
|
378
|
+
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
379
|
+
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
380
|
+
// to support our custom rb_profile_frames (see below)
|
381
|
+
// Modifications: None
|
382
|
+
inline static int
|
383
|
+
calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
|
384
|
+
{
|
385
|
+
int lineno;
|
386
|
+
if (calc_pos(iseq, pc, &lineno, NULL)) return lineno;
|
387
|
+
return 0;
|
388
|
+
}
|
389
|
+
|
390
|
+
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
391
|
+
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
392
|
+
// Modifications:
|
393
|
+
// * Renamed rb_profile_frames => ddtrace_rb_profile_frames
|
394
|
+
// * Add thread argument
|
395
|
+
// * Add is_ruby_frame argument
|
396
|
+
// * Removed `if (lines)` tests -- require/assume that like `buff`, `lines` is always specified
|
397
|
+
// * Support Ruby < 2.5 by using rb_thread_t instead of rb_execution_context_t (which did not exist and was just
|
398
|
+
// part of rb_thread_t)
|
399
|
+
// * Support Ruby < 2.4 by using `RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)` instead of `VM_FRAME_RUBYFRAME_P(cfp)`.
|
400
|
+
// Given that the Ruby 2.3 version of `rb_profile_frames` did not support native methods and thus did not need this
|
401
|
+
// check, how did I figure out what to replace it with? I did it by looking at other places in the VM code where the
|
402
|
+
// code looks exactly the same but Ruby 2.4 uses `VM_FRAME_RUBYFRAME_P` whereas Ruby 2.3 used `RUBY_VM_NORMAL_ISEQ_P`.
|
403
|
+
// Examples of these are `errinfo_place` in `eval.c`, `rb_vm_get_ruby_level_next_cfp` (among others) in `vm.c`, etc.
|
404
|
+
// * Skip dummy frame that shows up in main thread
|
405
|
+
// * Add `end_cfp == NULL` and `end_cfp <= cfp` safety checks. These are used in a bunch of places in
|
406
|
+
// `vm_backtrace.c` (`backtrace_each`, `backtrace_size`, `rb_ec_partial_backtrace_object`) but are conspicuously
|
407
|
+
// absent from `rb_profile_frames`. Oversight?
|
408
|
+
// * Skip frames where `cfp->iseq && !cfp->pc`. These seem to be internal and are skipped by `backtrace_each` in
|
409
|
+
// `vm_backtrace.c`.
|
410
|
+
// * Check thread status and do not sample if thread has been killed.
|
411
|
+
// * Match Ruby reference stack trace APIs that use the iseq instead of the callable method entry to get information
|
412
|
+
// for iseqs created from calls to `eval` and `instance_eval`. This makes it so that `rb_profile_frame_path` on
|
413
|
+
// the `VALUE` returned by rb_profile_frames returns `(eval)` instead of the path of the file where the `eval`
|
414
|
+
// was called from.
|
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.
|
417
|
+
//
|
418
|
+
// What is rb_profile_frames?
|
419
|
+
// `rb_profile_frames` is a Ruby VM debug API added for use by profilers for sampling the stack trace of a Ruby thread.
|
420
|
+
// Its main other user is the stackprof profiler: https://github.com/tmm1/stackprof .
|
421
|
+
//
|
422
|
+
// Why do we need a custom version of rb_profile_frames?
|
423
|
+
//
|
424
|
+
// There are a few reasons:
|
425
|
+
// 1. To backport improved behavior to older Rubies. Prior to Ruby 3.0 (https://github.com/ruby/ruby/pull/3299),
|
426
|
+
// rb_profile_frames skipped CFUNC frames, aka frames that are implemented with native code, and thus the resulting
|
427
|
+
// stacks were quite incomplete as a big part of the Ruby standard library is implemented with native code.
|
428
|
+
//
|
429
|
+
// 2. To extend this function to work with any thread. The upstream rb_profile_frames function only targets the current
|
430
|
+
// thread, and to support wall-clock profiling we require sampling other threads. This is only safe because of the
|
431
|
+
// Global VM Lock. (We don't yet support sampling Ractors beyond the main one; we'll need to find a way to do it
|
432
|
+
// safely first.)
|
433
|
+
//
|
434
|
+
// 3. To get more information out of the Ruby VM. The Ruby VM has a lot more information than is exposed through
|
435
|
+
// rb_profile_frames, and by making our own copy of this function we can extract more of this information.
|
436
|
+
// See for backtracie gem (https://github.com/ivoanjo/backtracie) for an exploration of what can potentially be done.
|
437
|
+
//
|
438
|
+
// 4. Because we haven't yet submitted patches to upstream Ruby. As with any changes on the `private_vm_api_access.c`,
|
439
|
+
// our medium/long-term plan is to contribute upstream changes and make it so that we don't need any of this
|
440
|
+
// on modern Rubies.
|
441
|
+
//
|
442
|
+
// 5. To make rb_profile_frames behave more like the Ruby-level reference stack trace APIs (`Thread#backtrace_locations`
|
443
|
+
// and friends). We've found quite a few situations where the data from rb_profile_frames and the reference APIs
|
444
|
+
// disagree, and quite a few of them seem oversights/bugs (speculation from my part) rather than deliberate
|
445
|
+
// decisions.
|
446
|
+
int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame)
|
447
|
+
{
|
448
|
+
int i;
|
449
|
+
// Modified from upstream: Instead of using `GET_EC` to collect info from the current thread,
|
450
|
+
// support sampling any thread (including the current) passed as an argument
|
451
|
+
rb_thread_t *th = thread_struct_from_object(thread);
|
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
|
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
|
461
|
+
const rb_callable_method_entry_t *cme;
|
462
|
+
|
463
|
+
// Avoid sampling dead threads
|
464
|
+
if (th->status == THREAD_KILLED) return 0;
|
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
|
+
|
479
|
+
// Fix: Skip dummy frame that shows up in main thread.
|
480
|
+
//
|
481
|
+
// According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore
|
482
|
+
// at the base of every thread's stack.
|
483
|
+
// (see https://github.com/ruby/ruby/blob/4bd38e8120f2fdfdd47a34211720e048502377f1/vm_backtrace.c#L890-L914 )
|
484
|
+
//
|
485
|
+
// One is being pointed to by `RUBY_VM_END_CONTROL_FRAME(ec)`, and so we need to advance to the next one, and
|
486
|
+
// reaching it will be used as a condition to break out of the loop below.
|
487
|
+
//
|
488
|
+
// Note that in `backtrace_each` there's two calls to `RUBY_VM_NEXT_CONTROL_FRAME`, but the loop bounds there
|
489
|
+
// are computed in a different way, so the two calls really are equivalent to one here.
|
490
|
+
end_cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
|
491
|
+
|
492
|
+
// 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)
|
493
|
+
if (end_cfp <= cfp) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
|
494
|
+
|
495
|
+
for (i=0; i<limit && cfp != end_cfp;) {
|
496
|
+
if (cfp->iseq && !cfp->pc) {
|
497
|
+
// Fix: Do nothing -- this frame should not be used
|
498
|
+
//
|
499
|
+
// rb_profile_frames does not do this check, but `backtrace_each` (`vm_backtrace.c`) does. This frame is not
|
500
|
+
// exposed by the Ruby backtrace APIs and for now we want to match its behavior 1:1
|
501
|
+
}
|
502
|
+
#ifndef USE_ISEQ_P_INSTEAD_OF_RUBYFRAME_P // Modern Rubies
|
503
|
+
else if (VM_FRAME_RUBYFRAME_P(cfp)) {
|
504
|
+
#else // Ruby < 2.4
|
505
|
+
else if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
|
506
|
+
#endif
|
507
|
+
if (start > 0) {
|
508
|
+
start--;
|
509
|
+
continue;
|
510
|
+
}
|
511
|
+
|
512
|
+
/* record frame info */
|
513
|
+
cme = rb_vm_frame_method_entry(cfp);
|
514
|
+
|
515
|
+
if (cme && cme->def->type == VM_METHOD_TYPE_ISEQ &&
|
516
|
+
// Fix: Do not use callable method entry when iseq is for an eval.
|
517
|
+
// TL;DR: This fix is needed for us to match the Ruby reference API information in the
|
518
|
+
// "when sampling an eval/instance eval inside an object" spec.
|
519
|
+
//
|
520
|
+
// Longer note:
|
521
|
+
// When a frame is a ruby frame (VM_FRAME_RUBYFRAME_P above), we can get information about it
|
522
|
+
// by introspecting both the callable method entry, as well as the iseq directly.
|
523
|
+
// Often they match... but sometimes they provide different info (as in the "iseq for an eval" situation
|
524
|
+
// here).
|
525
|
+
// If my reading of vm_backtrace.c is correct, the actual Ruby stack trace API **never** uses the
|
526
|
+
// callable method entry for Ruby frames, but only for VM_METHOD_TYPE_CFUNC (see `backtrace_each` method
|
527
|
+
// on that file).
|
528
|
+
// So... why does `rb_profile_frames` do something different? Is it a bug? Is it because it exposes
|
529
|
+
// more information than the Ruby stack frame API?
|
530
|
+
// As a final note, the `backtracie` gem (https://github.com/ivoanjo/backtracie) can be used to introspect
|
531
|
+
// the full metadata provided by both the callable method entry as well as the iseq, and is really useful
|
532
|
+
// to debug and learn more about these differences.
|
533
|
+
cfp->iseq->body->type != ISEQ_TYPE_EVAL) {
|
534
|
+
buff[i] = (VALUE)cme;
|
535
|
+
}
|
536
|
+
else {
|
537
|
+
buff[i] = (VALUE)cfp->iseq;
|
538
|
+
}
|
539
|
+
|
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
|
+
|
554
|
+
is_ruby_frame[i] = true;
|
555
|
+
i++;
|
556
|
+
}
|
557
|
+
else {
|
558
|
+
cme = rb_vm_frame_method_entry(cfp);
|
559
|
+
if (cme && cme->def->type == VM_METHOD_TYPE_CFUNC) {
|
560
|
+
buff[i] = (VALUE)cme;
|
561
|
+
lines[i] = 0;
|
562
|
+
is_ruby_frame[i] = false;
|
563
|
+
i++;
|
564
|
+
}
|
565
|
+
}
|
566
|
+
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
567
|
+
}
|
568
|
+
|
569
|
+
return i;
|
570
|
+
}
|
571
|
+
|
572
|
+
#ifdef USE_BACKPORTED_RB_PROFILE_FRAME_METHOD_NAME
|
573
|
+
|
574
|
+
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
575
|
+
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
576
|
+
// to support our custom rb_profile_frame_method_name (see below)
|
577
|
+
// Modifications: None
|
578
|
+
static VALUE
|
579
|
+
id2str(ID id)
|
580
|
+
{
|
581
|
+
VALUE str = rb_id2str(id);
|
582
|
+
if (!str) return Qnil;
|
583
|
+
return str;
|
584
|
+
}
|
585
|
+
#define rb_id2str(id) id2str(id)
|
586
|
+
|
587
|
+
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
588
|
+
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
589
|
+
// to support our custom rb_profile_frame_method_name (see below)
|
590
|
+
// Modifications: None
|
591
|
+
static const rb_iseq_t *
|
592
|
+
frame2iseq(VALUE frame)
|
593
|
+
{
|
594
|
+
if (NIL_P(frame)) return NULL;
|
595
|
+
|
596
|
+
if (RB_TYPE_P(frame, T_IMEMO)) {
|
597
|
+
switch (imemo_type(frame)) {
|
598
|
+
case imemo_iseq:
|
599
|
+
return (const rb_iseq_t *)frame;
|
600
|
+
case imemo_ment:
|
601
|
+
{
|
602
|
+
const rb_callable_method_entry_t *cme = (rb_callable_method_entry_t *)frame;
|
603
|
+
switch (cme->def->type) {
|
604
|
+
case VM_METHOD_TYPE_ISEQ:
|
605
|
+
return cme->def->body.iseq.iseqptr;
|
606
|
+
default:
|
607
|
+
return NULL;
|
608
|
+
}
|
609
|
+
}
|
610
|
+
default:
|
611
|
+
break;
|
612
|
+
}
|
613
|
+
}
|
614
|
+
rb_bug("frame2iseq: unreachable");
|
615
|
+
}
|
616
|
+
|
617
|
+
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
618
|
+
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
619
|
+
// to support our custom rb_profile_frame_method_name (see below)
|
620
|
+
// Modifications: None
|
621
|
+
static const rb_callable_method_entry_t *
|
622
|
+
cframe(VALUE frame)
|
623
|
+
{
|
624
|
+
if (NIL_P(frame)) return NULL;
|
625
|
+
|
626
|
+
if (RB_TYPE_P(frame, T_IMEMO)) {
|
627
|
+
switch (imemo_type(frame)) {
|
628
|
+
case imemo_ment:
|
629
|
+
{
|
630
|
+
const rb_callable_method_entry_t *cme = (rb_callable_method_entry_t *)frame;
|
631
|
+
switch (cme->def->type) {
|
632
|
+
case VM_METHOD_TYPE_CFUNC:
|
633
|
+
return cme;
|
634
|
+
default:
|
635
|
+
return NULL;
|
636
|
+
}
|
637
|
+
}
|
638
|
+
default:
|
639
|
+
return NULL;
|
640
|
+
}
|
641
|
+
}
|
642
|
+
|
643
|
+
return NULL;
|
644
|
+
}
|
645
|
+
|
646
|
+
// Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
647
|
+
// Copyright (C) 1993-2012 Yukihiro Matsumoto
|
648
|
+
//
|
649
|
+
// Ruby 3.0 finally added support for showing CFUNC frames (frames for methods written using native code)
|
650
|
+
// in stack traces gathered via `rb_profile_frames` (https://github.com/ruby/ruby/pull/3299).
|
651
|
+
// To access this information on older Rubies, beyond using our custom `ddtrace_rb_profile_frames` above, we also need
|
652
|
+
// to backport the Ruby 3.0+ version of `rb_profile_frame_method_name`.
|
653
|
+
//
|
654
|
+
// Modifications:
|
655
|
+
// * Renamed rb_profile_frame_method_name => ddtrace_rb_profile_frame_method_name
|
656
|
+
VALUE
|
657
|
+
ddtrace_rb_profile_frame_method_name(VALUE frame)
|
658
|
+
{
|
659
|
+
const rb_callable_method_entry_t *cme = cframe(frame);
|
660
|
+
if (cme) {
|
661
|
+
ID mid = cme->def->original_id;
|
662
|
+
return id2str(mid);
|
663
|
+
}
|
664
|
+
const rb_iseq_t *iseq = frame2iseq(frame);
|
665
|
+
return iseq ? rb_iseq_method_name(iseq) : Qnil;
|
666
|
+
}
|
667
|
+
|
668
|
+
#endif // USE_BACKPORTED_RB_PROFILE_FRAME_METHOD_NAME
|
669
|
+
|
670
|
+
// Support code for older Rubies that cannot use the MJIT header
|
671
|
+
#ifndef RUBY_MJIT_HEADER
|
672
|
+
|
673
|
+
#define MJIT_STATIC // No-op on older Rubies
|
674
|
+
|
675
|
+
// Taken from upstream include/ruby/backward/2/bool.h at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
676
|
+
// Copyright (C) Ruby developers <ruby-core@ruby-lang.org>
|
677
|
+
// to support our custom rb_profile_frames (see above)
|
678
|
+
// Modifications: None
|
679
|
+
#ifndef FALSE
|
680
|
+
# define FALSE false
|
681
|
+
#elif FALSE
|
682
|
+
# error FALSE must be false
|
683
|
+
#endif
|
684
|
+
|
685
|
+
#ifndef TRUE
|
686
|
+
# define TRUE true
|
687
|
+
#elif ! TRUE
|
688
|
+
# error TRUE must be true
|
689
|
+
#endif
|
690
|
+
|
691
|
+
// Taken from upstream vm_insnhelper.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
692
|
+
// Copyright (C) 2007 Koichi Sasada
|
693
|
+
// to support our custom rb_profile_frames (see above)
|
694
|
+
// Modifications: None
|
695
|
+
static rb_callable_method_entry_t *
|
696
|
+
check_method_entry(VALUE obj, int can_be_svar)
|
697
|
+
{
|
698
|
+
if (obj == Qfalse) return NULL;
|
699
|
+
|
700
|
+
#if VM_CHECK_MODE > 0
|
701
|
+
if (!RB_TYPE_P(obj, T_IMEMO)) rb_bug("check_method_entry: unknown type: %s", rb_obj_info(obj));
|
702
|
+
#endif
|
703
|
+
|
704
|
+
switch (imemo_type(obj)) {
|
705
|
+
case imemo_ment:
|
706
|
+
return (rb_callable_method_entry_t *)obj;
|
707
|
+
case imemo_cref:
|
708
|
+
return NULL;
|
709
|
+
case imemo_svar:
|
710
|
+
if (can_be_svar) {
|
711
|
+
return check_method_entry(((struct vm_svar *)obj)->cref_or_me, FALSE);
|
712
|
+
}
|
713
|
+
// fallthrough
|
714
|
+
default:
|
715
|
+
#if VM_CHECK_MODE > 0
|
716
|
+
rb_bug("check_method_entry: svar should not be there:");
|
717
|
+
#endif
|
718
|
+
return NULL;
|
719
|
+
}
|
720
|
+
}
|
721
|
+
|
722
|
+
#ifndef USE_LEGACY_RB_VM_FRAME_METHOD_ENTRY
|
723
|
+
// Taken from upstream vm_insnhelper.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
|
724
|
+
// Copyright (C) 2007 Koichi Sasada
|
725
|
+
// to support our custom rb_profile_frames (see above)
|
726
|
+
//
|
727
|
+
// While older Rubies may have this function, the symbol is not exported which leads to dynamic loader issues, e.g.
|
728
|
+
// `dyld: lazy symbol binding failed: Symbol not found: _rb_vm_frame_method_entry`.
|
729
|
+
//
|
730
|
+
// Modifications: None
|
731
|
+
MJIT_STATIC const rb_callable_method_entry_t *
|
732
|
+
rb_vm_frame_method_entry(const rb_control_frame_t *cfp)
|
733
|
+
{
|
734
|
+
const VALUE *ep = cfp->ep;
|
735
|
+
rb_callable_method_entry_t *me;
|
736
|
+
|
737
|
+
while (!VM_ENV_LOCAL_P(ep)) {
|
738
|
+
if ((me = check_method_entry(ep[VM_ENV_DATA_INDEX_ME_CREF], FALSE)) != NULL) return me;
|
739
|
+
ep = VM_ENV_PREV_EP(ep);
|
740
|
+
}
|
741
|
+
|
742
|
+
return check_method_entry(ep[VM_ENV_DATA_INDEX_ME_CREF], TRUE);
|
743
|
+
}
|
744
|
+
#else
|
745
|
+
// Taken from upstream vm_insnhelper.c at commit 556e9f726e2b80f6088982c6b43abfe68bfad591 (October 2018, ruby_2_3 branch)
|
746
|
+
// Copyright (C) 2007 Koichi Sasada
|
747
|
+
// to support our custom rb_profile_frames (see above)
|
748
|
+
//
|
749
|
+
// Quite a few macros in this function changed after Ruby 2.3. Rather than trying to fix the Ruby 3.2 version to work
|
750
|
+
// with 2.3 constants, I decided to import the Ruby 2.3 version.
|
751
|
+
//
|
752
|
+
// Modifications: None
|
753
|
+
const rb_callable_method_entry_t *
|
754
|
+
rb_vm_frame_method_entry(const rb_control_frame_t *cfp)
|
755
|
+
{
|
756
|
+
VALUE *ep = cfp->ep;
|
757
|
+
rb_callable_method_entry_t *me;
|
758
|
+
|
759
|
+
while (!VM_EP_LEP_P(ep)) {
|
760
|
+
if ((me = check_method_entry(ep[-1], FALSE)) != NULL) return me;
|
761
|
+
ep = VM_EP_PREV_EP(ep);
|
762
|
+
}
|
763
|
+
|
764
|
+
return check_method_entry(ep[-1], TRUE);
|
765
|
+
}
|
766
|
+
#endif // USE_LEGACY_RB_VM_FRAME_METHOD_ENTRY
|
767
|
+
#endif // RUBY_MJIT_HEADER
|
768
|
+
|
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;
|
785
|
+
|
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
|
789
|
+
|
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 .
|
811
|
+
//
|
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);
|
816
|
+
|
817
|
+
#ifndef NO_THREAD_INVOKE_ARG // Ruby 2.6+
|
818
|
+
if (thread->invoke_type != thread_invoke_type_proc) return NULL;
|
819
|
+
|
820
|
+
VALUE proc = thread->invoke_arg.proc.proc;
|
821
|
+
#else
|
822
|
+
if (thread->first_func || !thread->first_proc) return NULL;
|
823
|
+
|
824
|
+
VALUE proc = thread->first_proc;
|
825
|
+
#endif
|
826
|
+
|
827
|
+
const rb_iseq_t *iseq = rb_proc_get_iseq(proc, 0);
|
828
|
+
if (iseq == NULL) return NULL;
|
829
|
+
|
830
|
+
rb_iseq_check(iseq);
|
831
|
+
return iseq;
|
832
|
+
}
|
833
|
+
|
834
|
+
VALUE invoke_location_for(VALUE thread, int *line_location) {
|
835
|
+
const rb_iseq_t *iseq = maybe_thread_invoke_proc_iseq(thread);
|
836
|
+
|
837
|
+
if (iseq == NULL) return Qnil;
|
838
|
+
|
839
|
+
*line_location = NUM2INT(rb_iseq_first_lineno(iseq));
|
840
|
+
return rb_iseq_path(iseq);
|
841
|
+
}
|
842
|
+
|
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
|
+
}
|
852
|
+
|
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;
|
866
|
+
}
|
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
|