datadog 2.17.0 → 2.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +686 -1
- data/README.md +0 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
- data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
- data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
- data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +344 -126
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -4
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +18 -4
- data/ext/datadog_profiling_native_extension/collectors_stack.c +314 -91
- data/ext/datadog_profiling_native_extension/collectors_stack.h +26 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +680 -352
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +18 -5
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +65 -1
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +40 -1
- data/ext/datadog_profiling_native_extension/encoded_profile.c +2 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +48 -34
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
- data/ext/datadog_profiling_native_extension/heap_recorder.c +455 -430
- data/ext/datadog_profiling_native_extension/heap_recorder.h +16 -7
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +18 -15
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -10
- data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +73 -69
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -4
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +64 -59
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +20 -16
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +32 -10
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +2 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +253 -131
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +1 -0
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +2 -1
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +9 -4
- data/ext/libdatadog_api/crashtracker.c +16 -15
- data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +65 -1
- data/ext/libdatadog_api/datadog_ruby_common.h +40 -1
- data/ext/libdatadog_api/ddsketch.c +102 -0
- data/ext/libdatadog_api/di.c +203 -0
- data/ext/libdatadog_api/extconf.rb +21 -25
- data/ext/libdatadog_api/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/helpers.h +27 -0
- data/ext/libdatadog_api/init.c +13 -1
- data/ext/libdatadog_api/library_config.c +88 -37
- data/ext/libdatadog_api/library_config.h +6 -0
- data/ext/libdatadog_api/process_discovery.c +25 -24
- data/ext/libdatadog_extconf_helpers.rb +107 -14
- data/lib/datadog/ai_guard/api_client.rb +84 -0
- data/lib/datadog/ai_guard/autoload.rb +10 -0
- data/lib/datadog/ai_guard/component.rb +44 -0
- data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
- data/lib/datadog/ai_guard/configuration.rb +115 -0
- data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
- data/lib/datadog/ai_guard/contrib/integration.rb +37 -0
- data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
- data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
- data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
- data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +80 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +30 -0
- data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
- data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +86 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +45 -0
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
- data/lib/datadog/ai_guard/evaluation.rb +108 -0
- data/lib/datadog/ai_guard/ext.rb +29 -0
- data/lib/datadog/ai_guard.rb +181 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +66 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +36 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +104 -0
- data/lib/datadog/appsec/api_security/sampler.rb +62 -0
- data/lib/datadog/appsec/api_security.rb +14 -0
- data/lib/datadog/appsec/assets/blocked.html +10 -1
- data/lib/datadog/appsec/assets/blocked.json +1 -1
- data/lib/datadog/appsec/assets/blocked.text +3 -1
- data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
- data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +2 -2
- data/lib/datadog/appsec/component.rb +37 -64
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +77 -16
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
- data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -1
- data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
- data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
- data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +144 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +4 -2
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +152 -13
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +138 -13
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +74 -24
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +4 -2
- data/lib/datadog/appsec/contrib/graphql/integration.rb +2 -1
- data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +47 -13
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +40 -19
- data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +80 -62
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +35 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +47 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +52 -26
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +29 -0
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +167 -12
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +63 -10
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -21
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
- data/lib/datadog/appsec/counter_sampler.rb +25 -0
- data/lib/datadog/appsec/default_header_tags.rb +52 -0
- data/lib/datadog/appsec/event.rb +14 -47
- data/lib/datadog/appsec/ext.rb +3 -0
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +17 -1
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
- data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
- data/lib/datadog/appsec/metrics/collector.rb +47 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +21 -4
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +47 -0
- data/lib/datadog/appsec/metrics.rb +5 -4
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/processor/rule_loader.rb +5 -6
- data/lib/datadog/appsec/remote.rb +51 -76
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
- data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
- data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
- data/lib/datadog/appsec/route_normalizer.rb +80 -0
- data/lib/datadog/appsec/security_engine/engine.rb +197 -0
- data/lib/datadog/appsec/security_engine/result.rb +45 -9
- data/lib/datadog/appsec/security_engine/runner.rb +44 -21
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
- data/lib/datadog/appsec/trace_keeper.rb +36 -0
- data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
- data/lib/datadog/appsec/utils/http/body.rb +38 -0
- data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +2 -1
- data/lib/datadog/appsec/utils/http/media_type.rb +32 -26
- data/lib/datadog/appsec/utils/http/url_encoded.rb +52 -0
- data/lib/datadog/appsec.rb +10 -17
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -47
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +192 -20
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +109 -0
- data/lib/datadog/core/configuration/deprecations.rb +36 -0
- data/lib/datadog/core/configuration/ext.rb +0 -1
- data/lib/datadog/core/configuration/option.rb +95 -65
- data/lib/datadog/core/configuration/option_definition.rb +42 -23
- data/lib/datadog/core/configuration/options.rb +57 -18
- data/lib/datadog/core/configuration/settings.rb +160 -25
- data/lib/datadog/core/configuration/stable_config.rb +11 -2
- data/lib/datadog/core/configuration/supported_configurations.rb +413 -0
- data/lib/datadog/core/configuration.rb +4 -4
- data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
- data/lib/datadog/core/contrib/rails/utils.rb +7 -3
- data/lib/datadog/core/crashtracking/component.rb +73 -21
- data/lib/datadog/core/crashtracking/tag_builder.rb +9 -21
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
- data/lib/datadog/core/environment/agent_info.rb +65 -1
- data/lib/datadog/core/environment/cgroup.rb +52 -25
- data/lib/datadog/core/environment/container.rb +140 -46
- data/lib/datadog/core/environment/ext.rb +13 -2
- data/lib/datadog/core/environment/git.rb +2 -2
- data/lib/datadog/core/environment/identity.rb +40 -4
- data/lib/datadog/core/environment/process.rb +122 -0
- data/lib/datadog/core/environment/socket.rb +13 -0
- data/lib/datadog/core/environment/variable_helpers.rb +3 -3
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +6 -6
- data/lib/datadog/core/evp.rb +11 -0
- data/lib/datadog/core/feature_flags.rb +61 -0
- data/lib/datadog/core/knuth_sampler.rb +57 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +7 -7
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
- data/lib/datadog/core/process_discovery.rb +51 -21
- data/lib/datadog/core/rate_limiter.rb +11 -1
- data/lib/datadog/core/remote/client/capabilities.rb +49 -6
- data/lib/datadog/core/remote/client.rb +15 -7
- data/lib/datadog/core/remote/component.rb +64 -36
- data/lib/datadog/core/remote/configuration/content.rb +15 -2
- data/lib/datadog/core/remote/configuration/digest.rb +14 -7
- data/lib/datadog/core/remote/configuration/repository.rb +13 -1
- data/lib/datadog/core/remote/configuration/target.rb +13 -6
- data/lib/datadog/core/remote/transport/config.rb +9 -36
- data/lib/datadog/core/remote/transport/http/config.rb +15 -55
- data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
- data/lib/datadog/core/remote/transport/http.rb +15 -24
- data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
- data/lib/datadog/core/remote/worker.rb +25 -37
- data/lib/datadog/core/runtime/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +52 -0
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +65 -17
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -3
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +203 -89
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/event.rb +2 -7
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/logger.rb +5 -2
- data/lib/datadog/core/telemetry/logging.rb +22 -4
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -5
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +8 -34
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +8 -17
- data/lib/datadog/core/telemetry/worker.rb +108 -32
- data/lib/datadog/core/transport/ext.rb +3 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
- data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +11 -7
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/transport/http/response.rb +4 -0
- data/lib/datadog/core/transport/http.rb +24 -19
- data/lib/datadog/core/transport/parcel.rb +61 -9
- data/lib/datadog/core/transport/response.rb +16 -2
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +1 -1
- data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +4 -3
- data/lib/datadog/core/utils/enumerable_compat.rb +29 -0
- data/lib/datadog/core/utils/fnv.rb +26 -0
- data/lib/datadog/core/utils/forking.rb +3 -1
- data/lib/datadog/core/utils/hash.rb +0 -23
- data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -14
- data/lib/datadog/core/utils/network.rb +22 -1
- data/lib/datadog/core/utils/only_once.rb +1 -1
- data/lib/datadog/core/utils/only_once_successful.rb +8 -2
- data/lib/datadog/core/utils/safe_dup.rb +2 -2
- data/lib/datadog/core/utils/sequence.rb +2 -0
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
- data/lib/datadog/core/utils/time.rb +1 -1
- data/lib/datadog/core/utils.rb +10 -1
- data/lib/datadog/core/workers/async.rb +11 -2
- data/lib/datadog/core/workers/interval_loop.rb +51 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +96 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
- data/lib/datadog/core.rb +11 -2
- data/lib/datadog/data_streams/configuration.rb +50 -0
- data/lib/datadog/data_streams/ext.rb +11 -0
- data/lib/datadog/data_streams/extensions.rb +16 -0
- data/lib/datadog/data_streams/pathway_context.rb +169 -0
- data/lib/datadog/data_streams/processor.rb +511 -0
- data/lib/datadog/data_streams/transport/http/stats.rb +58 -0
- data/lib/datadog/data_streams/transport/http.rb +36 -0
- data/lib/datadog/data_streams/transport/stats.rb +39 -0
- data/lib/datadog/data_streams.rb +100 -0
- data/lib/datadog/di/base.rb +15 -7
- data/lib/datadog/di/boot.rb +11 -1
- data/lib/datadog/di/code_tracker.rb +217 -15
- data/lib/datadog/di/component.rb +143 -48
- data/lib/datadog/di/configuration.rb +235 -2
- data/lib/datadog/di/context.rb +76 -0
- data/lib/datadog/di/contrib/active_record.rb +34 -5
- data/lib/datadog/di/el/compiler.rb +168 -0
- data/lib/datadog/di/el/evaluator.rb +159 -0
- data/lib/datadog/di/el/expression.rb +42 -0
- data/lib/datadog/di/el.rb +5 -0
- data/lib/datadog/di/error.rb +44 -0
- data/lib/datadog/di/fatal_exceptions.rb +26 -0
- data/lib/datadog/di/instrumenter.rb +620 -132
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +78 -15
- data/lib/datadog/di/probe_builder.rb +42 -3
- data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
- data/lib/datadog/di/probe_file_loader.rb +87 -0
- data/lib/datadog/di/probe_manager.rb +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +285 -100
- data/lib/datadog/di/probe_notifier_worker.rb +120 -36
- data/lib/datadog/di/probe_repository.rb +198 -0
- data/lib/datadog/di/proc_responder.rb +36 -0
- data/lib/datadog/di/redactor.rb +24 -2
- data/lib/datadog/di/remote.rb +258 -95
- data/lib/datadog/di/serializer.rb +297 -20
- data/lib/datadog/di/transport/diagnostics.rb +12 -42
- data/lib/datadog/di/transport/http/diagnostics.rb +4 -34
- data/lib/datadog/di/transport/http/input.rb +12 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +121 -39
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +203 -10
- data/lib/datadog/error_tracking/collector.rb +2 -1
- data/lib/datadog/error_tracking/component.rb +2 -2
- data/lib/datadog/error_tracking/configuration.rb +55 -2
- data/lib/datadog/error_tracking/filters.rb +2 -2
- data/lib/datadog/kit/appsec/events/v2.rb +253 -0
- data/lib/datadog/kit/appsec/events.rb +11 -10
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/kit/identity.rb +17 -11
- data/lib/datadog/kit/tracing/method_tracer.rb +135 -0
- data/lib/datadog/open_feature/component.rb +100 -0
- data/lib/datadog/open_feature/configuration.rb +37 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
- data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
- data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
- data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
- data/lib/datadog/open_feature/exposures/event.rb +60 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
- data/lib/datadog/open_feature/exposures/worker.rb +116 -0
- data/lib/datadog/open_feature/ext.rb +16 -0
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
- data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +101 -0
- data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +49 -0
- data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
- data/lib/datadog/open_feature/native_evaluator.rb +60 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +191 -0
- data/lib/datadog/open_feature/remote.rb +67 -0
- data/lib/datadog/open_feature/resolution_details.rb +35 -0
- data/lib/datadog/open_feature/transport.rb +121 -0
- data/lib/datadog/open_feature.rb +19 -0
- data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
- data/lib/datadog/opentelemetry/api/context.rb +10 -9
- data/lib/datadog/opentelemetry/configuration/settings.rb +226 -0
- data/lib/datadog/opentelemetry/ext.rb +9 -0
- data/lib/datadog/opentelemetry/logs.rb +98 -0
- data/lib/datadog/opentelemetry/metrics.rb +90 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +66 -2
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
- data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +28 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +13 -7
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +12 -9
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +83 -15
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -3
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -4
- data/lib/datadog/profiling/collectors/info.rb +59 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -5
- data/lib/datadog/profiling/component.rb +73 -49
- data/lib/datadog/profiling/exporter.rb +48 -13
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +24 -5
- data/lib/datadog/profiling/ext/exec_monkey_patch.rb +32 -0
- data/lib/datadog/profiling/ext.rb +2 -15
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +24 -11
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -12
- data/lib/datadog/profiling/scheduler.rb +12 -10
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +5 -13
- data/lib/datadog/profiling/tag_builder.rb +42 -38
- data/lib/datadog/profiling/tasks/exec.rb +10 -5
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +4 -2
- data/lib/datadog/profiling.rb +8 -11
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +10 -1
- data/lib/datadog/symbol_database/component.rb +734 -0
- data/lib/datadog/symbol_database/configuration.rb +73 -0
- data/lib/datadog/symbol_database/extensions.rb +19 -0
- data/lib/datadog/symbol_database/extractor.rb +1110 -0
- data/lib/datadog/symbol_database/file_hash.rb +48 -0
- data/lib/datadog/symbol_database/logger.rb +43 -0
- data/lib/datadog/symbol_database/remote.rb +180 -0
- data/lib/datadog/symbol_database/scope.rb +102 -0
- data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
- data/lib/datadog/symbol_database/service_version.rb +66 -0
- data/lib/datadog/symbol_database/symbol.rb +69 -0
- data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
- data/lib/datadog/symbol_database/transport/http.rb +45 -0
- data/lib/datadog/symbol_database/transport.rb +54 -0
- data/lib/datadog/symbol_database/uploader.rb +230 -0
- data/lib/datadog/symbol_database.rb +71 -0
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +10 -10
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
- data/lib/datadog/tracing/configuration/ext.rb +25 -5
- data/lib/datadog/tracing/configuration/settings.rb +125 -11
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +29 -11
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +47 -12
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +7 -10
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +16 -16
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +15 -12
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +8 -10
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +8 -10
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
- data/lib/datadog/tracing/contrib/component.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +22 -7
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +47 -53
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +7 -8
- data/lib/datadog/tracing/contrib/ethon/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/excon/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -9
- data/lib/datadog/tracing/contrib/ext.rb +6 -4
- data/lib/datadog/tracing/contrib/extensions.rb +28 -11
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +7 -9
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +18 -15
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +105 -63
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -15
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -10
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +2 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +10 -11
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +9 -13
- data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/http.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +10 -10
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +8 -12
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +24 -13
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +39 -8
- data/lib/datadog/tracing/contrib/karafka.rb +1 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +6 -6
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +11 -14
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +64 -70
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/patcher.rb +7 -9
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +9 -11
- data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +13 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +6 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +25 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +2 -6
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +55 -32
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +83 -44
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +126 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/rails/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/rails/runner.rb +64 -40
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +10 -8
- data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/tags.rb +2 -7
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +6 -4
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -9
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +8 -3
- data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +6 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +2 -1
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -6
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +8 -4
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +40 -39
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +15 -4
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +15 -13
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +31 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +18 -0
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop.rb +42 -0
- data/lib/datadog/tracing/contrib.rb +9 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +12 -4
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +133 -12
- data/lib/datadog/tracing/distributed/datadog.rb +17 -16
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -26
- data/lib/datadog/tracing/distributed/helpers.rb +1 -1
- data/lib/datadog/tracing/distributed/none.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +39 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
- data/lib/datadog/tracing/distributed/trace_context.rb +107 -78
- data/lib/datadog/tracing/event.rb +5 -7
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +6 -6
- data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
- data/lib/datadog/tracing/pipeline.rb +2 -2
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -2
- data/lib/datadog/tracing/sampling/priority_sampler.rb +16 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +8 -19
- data/lib/datadog/tracing/sampling/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +77 -48
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +3 -3
- data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
- data/lib/datadog/tracing/span.rb +2 -2
- data/lib/datadog/tracing/span_event.rb +12 -12
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +63 -19
- data/lib/datadog/tracing/sync_writer.rb +1 -2
- data/lib/datadog/tracing/trace_digest.rb +28 -23
- data/lib/datadog/tracing/trace_operation.rb +209 -98
- data/lib/datadog/tracing/trace_segment.rb +2 -2
- data/lib/datadog/tracing/tracer.rb +113 -52
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +4 -52
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +11 -14
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +14 -82
- data/lib/datadog/tracing/workers.rb +4 -3
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/tracing.rb +2 -2
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +14 -0
- metadata +201 -40
- data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -321
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -1023
- data/lib/datadog/appsec/configuration/settings.rb +0 -342
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -171
- data/lib/datadog/appsec/processor.rb +0 -107
- data/lib/datadog/core/remote/transport/http/api.rb +0 -53
- data/lib/datadog/core/remote/transport/http/client.rb +0 -49
- data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
- data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
- data/lib/datadog/core/transport/http/api/spec.rb +0 -36
- data/lib/datadog/di/configuration/settings.rb +0 -212
- data/lib/datadog/di/transport/http/api.rb +0 -42
- data/lib/datadog/di/transport/http/client.rb +0 -47
- data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -199
|
@@ -76,6 +76,18 @@ rb_nativethread_id_t pthread_id_for(VALUE thread) {
|
|
|
76
76
|
#endif
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
size_t sizeof_rb_iseq_t(void) {
|
|
80
|
+
return sizeof(rb_iseq_t);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
VALUE ddtrace_iseq_base_label(const void *iseq) {
|
|
84
|
+
return rb_iseq_base_label((const rb_iseq_t *)iseq);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
VALUE ddtrace_iseq_path(const void *iseq) {
|
|
88
|
+
return rb_iseq_path((const rb_iseq_t *)iseq);
|
|
89
|
+
}
|
|
90
|
+
|
|
79
91
|
// Queries if the current thread is the owner of the global VM lock.
|
|
80
92
|
//
|
|
81
93
|
// @ivoanjo: Ruby has a similarly-named `ruby_thread_has_gvl_p` but that API is insufficient for our needs because it can
|
|
@@ -212,21 +224,6 @@ uint64_t native_thread_id_for(VALUE thread) {
|
|
|
212
224
|
#endif
|
|
213
225
|
}
|
|
214
226
|
|
|
215
|
-
// Returns the stack depth by using the same approach as rb_profile_frames and backtrace_each: get the positions
|
|
216
|
-
// of the end and current frame pointers and subtracting them.
|
|
217
|
-
ptrdiff_t stack_depth_for(VALUE thread) {
|
|
218
|
-
const rb_execution_context_t *ec = thread_struct_from_object(thread)->ec;
|
|
219
|
-
const rb_control_frame_t *cfp = ec->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
|
|
220
|
-
|
|
221
|
-
if (end_cfp == NULL) return 0;
|
|
222
|
-
|
|
223
|
-
// Skip dummy frame, as seen in `backtrace_each` (`vm_backtrace.c`) and our custom rb_profile_frames
|
|
224
|
-
// ( https://github.com/ruby/ruby/blob/4bd38e8120f2fdfdd47a34211720e048502377f1/vm_backtrace.c#L890-L914 )
|
|
225
|
-
end_cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
|
|
226
|
-
|
|
227
|
-
return end_cfp <= cfp ? 0 : end_cfp - cfp - 1;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
227
|
// This was renamed in Ruby 3.2
|
|
231
228
|
#if !defined(ccan_list_for_each) && defined(list_for_each)
|
|
232
229
|
#define ccan_list_for_each list_for_each
|
|
@@ -360,11 +357,16 @@ calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
|
|
|
360
357
|
}
|
|
361
358
|
#endif
|
|
362
359
|
|
|
363
|
-
// In PROF-11475 we spotted a crash when calling `rb_iseq_line_no` from this method.
|
|
364
|
-
//
|
|
365
|
-
//
|
|
366
|
-
//
|
|
367
|
-
|
|
360
|
+
// In PROF-11475 we spotted a crash when calling `rb_iseq_line_no` from this method.
|
|
361
|
+
// We were only able to reproduce this issue on Ruby 2.6 and 2.7, not 2.5 or the 3.x series (tried 3.0, 3.2 and 3.4).
|
|
362
|
+
// Note that going out of bounds doesn't crash every time, as usual with C we may just read garbage or get lucky.
|
|
363
|
+
//
|
|
364
|
+
// For those problematic Rubies, we observed that when we try to take a sample in the middle of processing the
|
|
365
|
+
// VM `LEAVE` instruction, the value of `n` can violate the documented assumptions above and be
|
|
366
|
+
// `n > ISEQ_BODY(iseq)->iseq_size)`.
|
|
367
|
+
//
|
|
368
|
+
// To work around this and any other potential issues, we validate here that the bytecode position is sane.
|
|
369
|
+
if (RB_UNLIKELY(n < 0 || n > ISEQ_BODY(iseq)->iseq_size)) return 0;
|
|
368
370
|
|
|
369
371
|
if (lineno) *lineno = rb_iseq_line_no(iseq, pos);
|
|
370
372
|
#ifdef USE_ISEQ_NODE_ID
|
|
@@ -410,6 +412,9 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
|
|
|
410
412
|
// * Add frame_flags.same_frame and logic to skip redoing work if the buffer already contains the same data we're collecting
|
|
411
413
|
// * Skipped use of rb_callable_method_entry_t (cme) for Ruby frames as it doesn't impact us.
|
|
412
414
|
// * Imported fix from https://github.com/ruby/ruby/pull/8280 to keep us closer to upstream
|
|
415
|
+
// * Added potential fix for https://github.com/ruby/ruby/pull/13643 (this one is a just-in-case, unclear if it happens
|
|
416
|
+
// for ddtrace)
|
|
417
|
+
// * Reversed order of iteration to better enable caching
|
|
413
418
|
//
|
|
414
419
|
// What is rb_profile_frames?
|
|
415
420
|
// `rb_profile_frames` is a Ruby VM debug API added for use by profilers for sampling the stack trace of a Ruby thread.
|
|
@@ -445,28 +450,34 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *st
|
|
|
445
450
|
// support sampling any thread (including the current) passed as an argument
|
|
446
451
|
rb_thread_t *th = thread_struct_from_object(thread);
|
|
447
452
|
const rb_execution_context_t *ec = th->ec;
|
|
448
|
-
|
|
453
|
+
|
|
454
|
+
// As of this writing, we don't support profiling with MN enabled, and this only happens in that mode, but as we
|
|
455
|
+
// probably want to experiment with it in the future, I've decided to import https://github.com/ruby/ruby/pull/9310
|
|
456
|
+
// here.
|
|
457
|
+
if (ec == NULL) return 0;
|
|
458
|
+
|
|
459
|
+
// Avoid sampling dead threads
|
|
460
|
+
if (th->status == THREAD_KILLED) return 0;
|
|
461
|
+
|
|
462
|
+
const rb_control_frame_t *cfp = ec->cfp;
|
|
463
|
+
|
|
464
|
+
// This happens on newly-created threads (we even had a flaky test because of it)
|
|
465
|
+
if (cfp == NULL) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
|
|
466
|
+
|
|
467
|
+
// I suspect this won't happen for ddtrace, but just-in-case we've imported a potential fix for
|
|
468
|
+
// https://github.com/ruby/ruby/pull/13643 by assuming that these can be NULL/zero with the cfp being non-NULL yet.
|
|
469
|
+
if (ec->vm_stack == NULL || ec->vm_stack_size == 0) return 0;
|
|
470
|
+
|
|
471
|
+
const rb_control_frame_t *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
|
|
449
472
|
#ifndef NO_JIT_RETURN
|
|
450
473
|
const rb_control_frame_t *top = cfp;
|
|
451
474
|
#endif
|
|
452
475
|
const rb_callable_method_entry_t *cme;
|
|
453
476
|
|
|
454
|
-
// Avoid sampling dead threads
|
|
455
|
-
if (th->status == THREAD_KILLED) return 0;
|
|
456
|
-
|
|
457
477
|
// `vm_backtrace.c` includes this check in several methods. This happens on newly-created threads, and may
|
|
458
478
|
// also (not entirely sure) happen on dead threads
|
|
459
479
|
if (end_cfp == NULL) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
|
|
460
480
|
|
|
461
|
-
// This should not happen for ddtrace (it can only happen when a thread is still being created), but I've imported
|
|
462
|
-
// it from https://github.com/ruby/ruby/pull/7116 in a "just in case" kind of mindset.
|
|
463
|
-
if (cfp == NULL) return 0;
|
|
464
|
-
|
|
465
|
-
// As of this writing, we don't support profiling with MN enabled, and this only happens in that mode, but as we
|
|
466
|
-
// probably want to experiment with it in the future, I've decided to import https://github.com/ruby/ruby/pull/9310
|
|
467
|
-
// here.
|
|
468
|
-
if (ec == NULL) return 0;
|
|
469
|
-
|
|
470
481
|
// Fix: Skip dummy frame that shows up in main thread.
|
|
471
482
|
//
|
|
472
483
|
// According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore
|
|
@@ -483,7 +494,20 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *st
|
|
|
483
494
|
// 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)
|
|
484
495
|
if (end_cfp <= cfp) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
|
|
485
496
|
|
|
486
|
-
|
|
497
|
+
// This is the position just after the top of the stack -- e.g. where a new frame pushed on the stack would end up.
|
|
498
|
+
const rb_control_frame_t *top_sentinel = RUBY_VM_NEXT_CONTROL_FRAME(cfp);
|
|
499
|
+
|
|
500
|
+
// We iterate the stack from bottom (beginning of thread) to the top (currently-active frame). This is different
|
|
501
|
+
// from upstream rb_profile_frames, but actually matches what `backtrace_each` does (yes, different Ruby VM APIs
|
|
502
|
+
// iterate in different directions).
|
|
503
|
+
// We do this to better take advantage of the `same_frame` caching mechanism: By starting from the bottom of the
|
|
504
|
+
// stack towards the top, we can usually keep most of the stack intact when the code is only going up and down
|
|
505
|
+
// a few methods at the top. Before this change, the cache was really only useful if between samples the app had
|
|
506
|
+
// not moved from the current stack, as adding or removing one frame would invalidate the existing cache (because
|
|
507
|
+
// every position would shift).
|
|
508
|
+
cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
|
|
509
|
+
|
|
510
|
+
for (i=0; i<limit && cfp != top_sentinel; cfp = RUBY_VM_NEXT_CONTROL_FRAME(cfp)) {
|
|
487
511
|
if (cfp->iseq && !cfp->pc) {
|
|
488
512
|
// Fix: Do nothing -- this frame should not be used
|
|
489
513
|
//
|
|
@@ -569,6 +593,7 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *st
|
|
|
569
593
|
|
|
570
594
|
stack_buffer[i].as.native_frame.caching_cme = (VALUE)cme;
|
|
571
595
|
stack_buffer[i].as.native_frame.method_id = cme->def->original_id;
|
|
596
|
+
stack_buffer[i].as.native_frame.function = cme->def->body.cfunc.func;
|
|
572
597
|
stack_buffer[i].is_ruby_frame = false;
|
|
573
598
|
i++;
|
|
574
599
|
}
|
|
@@ -765,15 +790,11 @@ static inline int ddtrace_imemo_type(VALUE imemo) {
|
|
|
765
790
|
}
|
|
766
791
|
#endif
|
|
767
792
|
|
|
768
|
-
#
|
|
793
|
+
#ifndef HAVE_RUBY_THREAD_STORAGE_API
|
|
769
794
|
#include "gvl_profiling_helper.h"
|
|
770
795
|
|
|
771
|
-
gvl_profiling_thread thread_from_thread_object(VALUE thread) {
|
|
772
|
-
return (gvl_profiling_thread) {.thread = thread_struct_from_object(thread)};
|
|
773
|
-
}
|
|
774
|
-
|
|
775
796
|
// Hack: In Ruby 3.3+ we attach gvl profiling state to Ruby threads using the
|
|
776
|
-
// rb_internal_thread_specific_* APIs. These APIs did not exist on Ruby 3.2. On Ruby 3.2 we instead store the
|
|
797
|
+
// rb_internal_thread_specific_* APIs. These APIs did not exist on Ruby <= 3.2. On Ruby <= 3.2 we instead store the
|
|
777
798
|
// needed data inside the `rb_thread_t` structure, specifically in `stat_insn_usage` as a Ruby FIXNUM.
|
|
778
799
|
//
|
|
779
800
|
// Why `stat_insn_usage`? We needed some per-thread storage, and while looking at the Ruby VM sources I noticed
|
|
@@ -781,38 +802,21 @@ static inline int ddtrace_imemo_type(VALUE imemo) {
|
|
|
781
802
|
// code. There's a comment attached to it "/* statistics data for profiler */" but other than marking this
|
|
782
803
|
// field for GC, I could not find any place in the VM commit history or on GitHub where this has ever been used.
|
|
783
804
|
//
|
|
784
|
-
// Thus, since this hack is only for 3.2, which presumably will never see this field either removed or used
|
|
785
|
-
//
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
return
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
void gvl_profiling_state_set(gvl_profiling_thread thread, intptr_t value) {
|
|
795
|
-
if (thread.thread == NULL) return;
|
|
796
|
-
((rb_thread_t *)thread.thread)->stat_insn_usage = LONG2FIX(value);
|
|
805
|
+
// Thus, since this hack is only for Ruby <= 3.2, which presumably will never see this field either removed or used
|
|
806
|
+
// we... kinda take it for our own usage. It's ugly, I know...
|
|
807
|
+
//
|
|
808
|
+
// 64-bit pointers actually use 48-bit virtual addresses (https://muxup.com/2023q4/storing-data-in-pointers),
|
|
809
|
+
// so we are sure the addresses fit in Fixnums.
|
|
810
|
+
per_thread_context *get_per_thread_context(VALUE thread) {
|
|
811
|
+
VALUE current_value = thread_struct_from_object(thread)->stat_insn_usage;
|
|
812
|
+
return RB_FIXNUM_P(current_value) ? (per_thread_context *) FIX2LONG(current_value) : NULL;
|
|
797
813
|
}
|
|
798
814
|
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
// Specifically, this method was created to be called from a RUBY_INTERNAL_THREAD_EVENT_RESUMED callback --
|
|
803
|
-
// when it's triggered, we know the thread the code gets executed on is holding the GVL, so we use this
|
|
804
|
-
// opportunity to initialize our thread-local value.
|
|
805
|
-
gvl_profiling_thread gvl_profiling_state_maybe_initialize(void) {
|
|
806
|
-
gvl_profiling_thread current_thread = gvl_waiting_tls;
|
|
807
|
-
|
|
808
|
-
if (current_thread.thread == NULL) {
|
|
809
|
-
// threads.sched.running is the thread currently holding the GVL, which when this gets executed is the
|
|
810
|
-
// current thread!
|
|
811
|
-
current_thread = (gvl_profiling_thread) {.thread = (void *) rb_current_ractor()->threads.sched.running};
|
|
812
|
-
gvl_waiting_tls = current_thread;
|
|
815
|
+
void set_per_thread_context(VALUE thread, per_thread_context *value) {
|
|
816
|
+
if (!RB_FIXABLE((intptr_t) value)) {
|
|
817
|
+
rb_bug("per_thread_context pointer does not fit in a Fixnum: %p", value);
|
|
813
818
|
}
|
|
814
|
-
|
|
815
|
-
return current_thread;
|
|
819
|
+
thread_struct_from_object(thread)->stat_insn_usage = value ? LONG2FIX((intptr_t) value) : Qfalse;
|
|
816
820
|
}
|
|
817
821
|
#endif
|
|
818
822
|
|
|
@@ -18,16 +18,19 @@ typedef struct {
|
|
|
18
18
|
rb_nativethread_id_t owner;
|
|
19
19
|
} current_gvl_owner;
|
|
20
20
|
|
|
21
|
+
// If a sample is kept around for later use, some of its fields need marking. Remember to
|
|
22
|
+
// update the marking code in `sampling_buffer_mark` if new fields are added.
|
|
21
23
|
typedef struct {
|
|
22
24
|
union {
|
|
23
25
|
struct {
|
|
24
|
-
VALUE iseq;
|
|
25
|
-
void *caching_pc; // For caching only
|
|
26
|
+
VALUE iseq; // Needs marking if kept around
|
|
27
|
+
void *caching_pc; // For caching validation/invalidation only (does not need marking)
|
|
26
28
|
int line;
|
|
27
29
|
} ruby_frame;
|
|
28
30
|
struct {
|
|
29
|
-
VALUE caching_cme; // For caching only
|
|
31
|
+
VALUE caching_cme; // For caching validation/invalidation only (does not need marking)
|
|
30
32
|
ID method_id;
|
|
33
|
+
void *function;
|
|
31
34
|
} native_frame;
|
|
32
35
|
} as;
|
|
33
36
|
bool is_ruby_frame : 1;
|
|
@@ -38,13 +41,16 @@ rb_nativethread_id_t pthread_id_for(VALUE thread);
|
|
|
38
41
|
bool is_current_thread_holding_the_gvl(void);
|
|
39
42
|
current_gvl_owner gvl_owner(void);
|
|
40
43
|
uint64_t native_thread_id_for(VALUE thread);
|
|
41
|
-
ptrdiff_t stack_depth_for(VALUE thread);
|
|
42
44
|
void ddtrace_thread_list(VALUE result_array);
|
|
43
45
|
bool is_thread_alive(VALUE thread);
|
|
44
46
|
VALUE thread_name_for(VALUE thread);
|
|
45
47
|
|
|
46
48
|
int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, frame_info *stack_buffer);
|
|
47
49
|
|
|
50
|
+
size_t sizeof_rb_iseq_t(void);
|
|
51
|
+
VALUE ddtrace_iseq_base_label(const void *iseq);
|
|
52
|
+
VALUE ddtrace_iseq_path(const void *iseq);
|
|
53
|
+
|
|
48
54
|
// Returns true if the current thread belongs to the main Ractor or if Ruby has no Ractor support
|
|
49
55
|
bool ddtrace_rb_ractor_main_p(void);
|
|
50
56
|
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#include "clock_id.h"
|
|
9
9
|
#include "helpers.h"
|
|
10
10
|
#include "private_vm_api_access.h"
|
|
11
|
+
#include "datadog_ruby_common.h"
|
|
11
12
|
#include "ruby_helpers.h"
|
|
12
13
|
#include "setup_signal_handler.h"
|
|
13
14
|
#include "time_helpers.h"
|
|
@@ -23,10 +24,15 @@ void collectors_thread_context_init(VALUE profiling_module);
|
|
|
23
24
|
void encoded_profile_init(VALUE profiling_module);
|
|
24
25
|
void http_transport_init(VALUE profiling_module);
|
|
25
26
|
void stack_recorder_init(VALUE profiling_module);
|
|
27
|
+
void crashtracking_runtime_stacks_init(void);
|
|
28
|
+
void setup_signal_handler_init(VALUE profiling_module);
|
|
26
29
|
|
|
27
30
|
static VALUE native_working_p(VALUE self);
|
|
28
|
-
static VALUE
|
|
31
|
+
static VALUE _native_raise_error_value_arg(DDTRACE_UNUSED VALUE _self, VALUE exception_class, VALUE test_message_value_arg);
|
|
32
|
+
static VALUE _native_grab_gvl_and_raise_cstr_arg(DDTRACE_UNUSED VALUE _self, VALUE exception_class, VALUE test_message, VALUE test_message_arg, VALUE release_gvl);
|
|
29
33
|
static void *trigger_grab_gvl_and_raise(void *trigger_args);
|
|
34
|
+
static VALUE _native_grab_gvl_and_raise_value_arg(DDTRACE_UNUSED VALUE _self, VALUE exception_class, VALUE test_message_value_arg, VALUE release_gvl);
|
|
35
|
+
static void *trigger_grab_gvl_and_raise_value_arg(void *trigger_args);
|
|
30
36
|
static VALUE _native_grab_gvl_and_raise_syserr(DDTRACE_UNUSED VALUE _self, VALUE syserr_errno, VALUE test_message, VALUE test_message_arg, VALUE release_gvl);
|
|
31
37
|
static void *trigger_grab_gvl_and_raise_syserr(void *trigger_args);
|
|
32
38
|
static VALUE _native_ddtrace_rb_ractor_main_p(DDTRACE_UNUSED VALUE _self);
|
|
@@ -49,6 +55,10 @@ void DDTRACE_EXPORT Init_datadog_profiling_native_extension(void) {
|
|
|
49
55
|
#endif
|
|
50
56
|
|
|
51
57
|
VALUE datadog_module = rb_define_module("Datadog");
|
|
58
|
+
|
|
59
|
+
// MUST be called before all other initialization
|
|
60
|
+
datadog_ruby_common_init();
|
|
61
|
+
|
|
52
62
|
VALUE profiling_module = rb_define_module_under(datadog_module, "Profiling");
|
|
53
63
|
VALUE native_extension_module = rb_define_module_under(profiling_module, "NativeExtension");
|
|
54
64
|
|
|
@@ -56,6 +66,7 @@ void DDTRACE_EXPORT Init_datadog_profiling_native_extension(void) {
|
|
|
56
66
|
rb_funcall(native_extension_module, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("native_working?")));
|
|
57
67
|
|
|
58
68
|
ruby_helpers_init();
|
|
69
|
+
setup_signal_handler_init(profiling_module);
|
|
59
70
|
collectors_cpu_and_wall_time_worker_init(profiling_module);
|
|
60
71
|
collectors_discrete_dynamic_sampler_init(profiling_module);
|
|
61
72
|
collectors_dynamic_sampling_rate_init(profiling_module);
|
|
@@ -65,11 +76,14 @@ void DDTRACE_EXPORT Init_datadog_profiling_native_extension(void) {
|
|
|
65
76
|
encoded_profile_init(profiling_module);
|
|
66
77
|
http_transport_init(profiling_module);
|
|
67
78
|
stack_recorder_init(profiling_module);
|
|
79
|
+
crashtracking_runtime_stacks_init();
|
|
68
80
|
unsafe_api_calls_check_init();
|
|
69
81
|
|
|
70
82
|
// Hosts methods used for testing the native code using RSpec
|
|
71
83
|
VALUE testing_module = rb_define_module_under(native_extension_module, "Testing");
|
|
72
|
-
rb_define_singleton_method(testing_module, "
|
|
84
|
+
rb_define_singleton_method(testing_module, "_native_raise_error_value_arg", _native_raise_error_value_arg, 2);
|
|
85
|
+
rb_define_singleton_method(testing_module, "_native_grab_gvl_and_raise_cstr_arg", _native_grab_gvl_and_raise_cstr_arg, 4);
|
|
86
|
+
rb_define_singleton_method(testing_module, "_native_grab_gvl_and_raise_value_arg", _native_grab_gvl_and_raise_value_arg, 3);
|
|
73
87
|
rb_define_singleton_method(testing_module, "_native_grab_gvl_and_raise_syserr", _native_grab_gvl_and_raise_syserr, 4);
|
|
74
88
|
rb_define_singleton_method(testing_module, "_native_ddtrace_rb_ractor_main_p", _native_ddtrace_rb_ractor_main_p, 0);
|
|
75
89
|
rb_define_singleton_method(testing_module, "_native_is_current_thread_holding_the_gvl", _native_is_current_thread_holding_the_gvl, 0);
|
|
@@ -94,46 +108,78 @@ static VALUE native_working_p(DDTRACE_UNUSED VALUE _self) {
|
|
|
94
108
|
return Qtrue;
|
|
95
109
|
}
|
|
96
110
|
|
|
111
|
+
static VALUE _native_raise_error_value_arg(DDTRACE_UNUSED VALUE _self, VALUE exception_class, VALUE test_message_value_arg) {
|
|
112
|
+
raise_error(exception_class, ">%"PRIsVALUE"<", test_message_value_arg);
|
|
113
|
+
}
|
|
114
|
+
|
|
97
115
|
typedef struct {
|
|
98
116
|
VALUE exception_class;
|
|
99
117
|
char *test_message;
|
|
100
|
-
|
|
118
|
+
char *test_message_arg;
|
|
101
119
|
} trigger_grab_gvl_and_raise_arguments;
|
|
102
120
|
|
|
103
|
-
static VALUE
|
|
121
|
+
static VALUE _native_grab_gvl_and_raise_cstr_arg(DDTRACE_UNUSED VALUE _self, VALUE exception_class, VALUE test_message, VALUE test_message_arg, VALUE release_gvl) {
|
|
104
122
|
ENFORCE_TYPE(test_message, T_STRING);
|
|
105
123
|
|
|
106
124
|
trigger_grab_gvl_and_raise_arguments args;
|
|
107
125
|
|
|
108
126
|
args.exception_class = exception_class;
|
|
109
127
|
args.test_message = StringValueCStr(test_message);
|
|
110
|
-
args.test_message_arg = test_message_arg != Qnil ?
|
|
128
|
+
args.test_message_arg = test_message_arg != Qnil ? StringValueCStr(test_message_arg) : NULL;
|
|
111
129
|
|
|
112
130
|
if (RTEST(release_gvl)) {
|
|
113
131
|
rb_thread_call_without_gvl(trigger_grab_gvl_and_raise, &args, NULL, NULL);
|
|
114
132
|
} else {
|
|
115
|
-
|
|
133
|
+
private_grab_gvl_and_raise(args.exception_class, 0, args.test_message, args.test_message_arg);
|
|
116
134
|
}
|
|
117
135
|
|
|
118
|
-
|
|
136
|
+
raise_error(rb_eRuntimeError, "Failed to raise exception in _native_grab_gvl_and_raise_cstr_arg; this should never happen");
|
|
119
137
|
}
|
|
120
138
|
|
|
121
139
|
static void *trigger_grab_gvl_and_raise(void *trigger_args) {
|
|
122
140
|
trigger_grab_gvl_and_raise_arguments *args = (trigger_grab_gvl_and_raise_arguments *) trigger_args;
|
|
123
141
|
|
|
124
|
-
if (args->test_message_arg
|
|
125
|
-
|
|
142
|
+
if (args->test_message_arg != NULL) {
|
|
143
|
+
private_grab_gvl_and_raise(args->exception_class, 0, args->test_message, args->test_message_arg);
|
|
126
144
|
} else {
|
|
127
|
-
|
|
145
|
+
private_grab_gvl_and_raise(args->exception_class, 0, args->test_message, NULL);
|
|
128
146
|
}
|
|
129
147
|
|
|
130
148
|
return NULL;
|
|
131
149
|
}
|
|
132
150
|
|
|
151
|
+
typedef struct {
|
|
152
|
+
VALUE exception_class;
|
|
153
|
+
VALUE test_message_value_arg;
|
|
154
|
+
} trigger_grab_gvl_and_raise_value_arguments;
|
|
155
|
+
|
|
156
|
+
static VALUE _native_grab_gvl_and_raise_value_arg(DDTRACE_UNUSED VALUE _self, VALUE exception_class, VALUE test_message_value_arg, VALUE release_gvl) {
|
|
157
|
+
trigger_grab_gvl_and_raise_value_arguments args;
|
|
158
|
+
|
|
159
|
+
args.exception_class = exception_class;
|
|
160
|
+
args.test_message_value_arg = test_message_value_arg;
|
|
161
|
+
|
|
162
|
+
if (RTEST(release_gvl)) {
|
|
163
|
+
rb_thread_call_without_gvl(trigger_grab_gvl_and_raise_value_arg, &args, NULL, NULL);
|
|
164
|
+
} else {
|
|
165
|
+
private_grab_gvl_and_raise(args.exception_class, 0, ">%"PRIsVALUE"<", args.test_message_value_arg);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
raise_error(rb_eRuntimeError, "Failed to raise exception in _native_grab_gvl_and_raise_value_arg; this should never happen");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static void *trigger_grab_gvl_and_raise_value_arg(void *trigger_args) {
|
|
172
|
+
trigger_grab_gvl_and_raise_value_arguments *args = (trigger_grab_gvl_and_raise_value_arguments *) trigger_args;
|
|
173
|
+
|
|
174
|
+
private_grab_gvl_and_raise(args->exception_class, 0, ">%"PRIsVALUE"<", args->test_message_value_arg);
|
|
175
|
+
|
|
176
|
+
return NULL;
|
|
177
|
+
}
|
|
178
|
+
|
|
133
179
|
typedef struct {
|
|
134
180
|
int syserr_errno;
|
|
135
181
|
char *test_message;
|
|
136
|
-
|
|
182
|
+
char *test_message_arg;
|
|
137
183
|
} trigger_grab_gvl_and_raise_syserr_arguments;
|
|
138
184
|
|
|
139
185
|
static VALUE _native_grab_gvl_and_raise_syserr(DDTRACE_UNUSED VALUE _self, VALUE syserr_errno, VALUE test_message, VALUE test_message_arg, VALUE release_gvl) {
|
|
@@ -143,24 +189,24 @@ static VALUE _native_grab_gvl_and_raise_syserr(DDTRACE_UNUSED VALUE _self, VALUE
|
|
|
143
189
|
|
|
144
190
|
args.syserr_errno = NUM2INT(syserr_errno);
|
|
145
191
|
args.test_message = StringValueCStr(test_message);
|
|
146
|
-
args.test_message_arg = test_message_arg != Qnil ?
|
|
192
|
+
args.test_message_arg = test_message_arg != Qnil ? StringValueCStr(test_message_arg) : NULL;
|
|
147
193
|
|
|
148
194
|
if (RTEST(release_gvl)) {
|
|
149
195
|
rb_thread_call_without_gvl(trigger_grab_gvl_and_raise_syserr, &args, NULL, NULL);
|
|
150
196
|
} else {
|
|
151
|
-
|
|
197
|
+
private_grab_gvl_and_raise(Qnil, args.syserr_errno, args.test_message, args.test_message_arg);
|
|
152
198
|
}
|
|
153
199
|
|
|
154
|
-
|
|
200
|
+
raise_error(rb_eRuntimeError, "Failed to raise exception in _native_grab_gvl_and_raise_syserr; this should never happen");
|
|
155
201
|
}
|
|
156
202
|
|
|
157
203
|
static void *trigger_grab_gvl_and_raise_syserr(void *trigger_args) {
|
|
158
204
|
trigger_grab_gvl_and_raise_syserr_arguments *args = (trigger_grab_gvl_and_raise_syserr_arguments *) trigger_args;
|
|
159
205
|
|
|
160
|
-
if (args->test_message_arg
|
|
161
|
-
|
|
206
|
+
if (args->test_message_arg != NULL) {
|
|
207
|
+
private_grab_gvl_and_raise(Qnil, args->syserr_errno, args->test_message, args->test_message_arg);
|
|
162
208
|
} else {
|
|
163
|
-
|
|
209
|
+
private_grab_gvl_and_raise(Qnil, args->syserr_errno, args->test_message, NULL);
|
|
164
210
|
}
|
|
165
211
|
|
|
166
212
|
return NULL;
|
|
@@ -244,9 +290,9 @@ static VALUE _native_trigger_holding_the_gvl_signal_handler_on(DDTRACE_UNUSED VA
|
|
|
244
290
|
|
|
245
291
|
ENFORCE_SUCCESS_GVL(pthread_mutex_unlock(&holding_the_gvl_signal_handler_mutex));
|
|
246
292
|
|
|
247
|
-
replace_sigprof_signal_handler_with_empty_handler(holding_the_gvl_signal_handler);
|
|
293
|
+
replace_sigprof_signal_handler_with_empty_handler(holding_the_gvl_signal_handler, true);
|
|
248
294
|
|
|
249
|
-
if (holding_the_gvl_signal_handler_result[0] == Qfalse)
|
|
295
|
+
if (holding_the_gvl_signal_handler_result[0] == Qfalse) raise_error(rb_eRuntimeError, "Could not signal background_thread");
|
|
250
296
|
|
|
251
297
|
VALUE result = rb_hash_new();
|
|
252
298
|
rb_hash_aset(result, ID2SYM(rb_intern("ruby_thread_has_gvl_p")), holding_the_gvl_signal_handler_result[1]);
|
|
@@ -21,74 +21,83 @@ void ruby_helpers_init(void) {
|
|
|
21
21
|
to_s_id = rb_intern("to_s");
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
// Use `raise_syserr` the macro instead, as it provides additional argument checks.
|
|
25
|
+
void private_raise_syserr(int syserr_errno, const char *fmt, ...) {
|
|
26
|
+
va_list args;
|
|
27
|
+
va_start(args, fmt);
|
|
28
|
+
VALUE detailed_message = rb_vsprintf(fmt, args);
|
|
29
|
+
va_end(args);
|
|
30
|
+
|
|
31
|
+
VALUE exception = rb_syserr_new_str(syserr_errno, detailed_message);
|
|
32
|
+
private_raise_exception(exception, fmt);
|
|
33
|
+
}
|
|
25
34
|
|
|
26
35
|
typedef struct {
|
|
27
36
|
VALUE exception_class;
|
|
28
|
-
|
|
37
|
+
int syserr_errno;
|
|
38
|
+
const char *format_string;
|
|
39
|
+
va_list va_args;
|
|
29
40
|
} raise_args;
|
|
30
41
|
|
|
42
|
+
// Called via rb_thread_call_with_gvl from private_grab_gvl_and_raise.
|
|
43
|
+
// Formats the message with rb_vsprintf (which requires the GVL) and raises.
|
|
31
44
|
static void *trigger_raise(void *raise_arguments) {
|
|
32
45
|
raise_args *args = (raise_args *) raise_arguments;
|
|
33
|
-
rb_raise(args->exception_class, "%s", args->exception_message);
|
|
34
|
-
}
|
|
35
46
|
|
|
36
|
-
|
|
37
|
-
raise_args args;
|
|
47
|
+
VALUE detailed_message = rb_vsprintf(args->format_string, args->va_args);
|
|
38
48
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (is_current_thread_holding_the_gvl()) {
|
|
46
|
-
rb_raise(
|
|
47
|
-
rb_eRuntimeError,
|
|
48
|
-
"grab_gvl_and_raise called by thread holding the global VM lock. exception_message: '%s'",
|
|
49
|
-
args.exception_message
|
|
50
|
-
);
|
|
49
|
+
VALUE exception;
|
|
50
|
+
if (args->syserr_errno) {
|
|
51
|
+
exception = rb_syserr_new_str(args->syserr_errno, detailed_message);
|
|
52
|
+
} else {
|
|
53
|
+
exception = rb_exc_new_str(args->exception_class, detailed_message);
|
|
51
54
|
}
|
|
52
55
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
rb_bug("[ddtrace] Unexpected: Reached the end of grab_gvl_and_raise while raising '%s'\n", args.exception_message);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
typedef struct {
|
|
59
|
-
int syserr_errno;
|
|
60
|
-
char exception_message[MAX_RAISE_MESSAGE_SIZE];
|
|
61
|
-
} syserr_raise_args;
|
|
56
|
+
private_raise_exception(exception, args->format_string);
|
|
62
57
|
|
|
63
|
-
|
|
64
|
-
syserr_raise_args *args = (syserr_raise_args *) syserr_raise_arguments;
|
|
65
|
-
rb_syserr_fail(args->syserr_errno, args->exception_message);
|
|
58
|
+
return NULL;
|
|
66
59
|
}
|
|
67
60
|
|
|
68
|
-
void
|
|
69
|
-
|
|
61
|
+
void private_grab_gvl_and_raise(VALUE exception_class, int syserr_errno, const char *format_string, ...) {
|
|
62
|
+
raise_args args;
|
|
70
63
|
|
|
71
|
-
|
|
64
|
+
if (syserr_errno != 0) {
|
|
65
|
+
args.exception_class = Qnil;
|
|
66
|
+
args.syserr_errno = syserr_errno;
|
|
67
|
+
} else {
|
|
68
|
+
args.exception_class = exception_class;
|
|
69
|
+
args.syserr_errno = 0;
|
|
70
|
+
}
|
|
72
71
|
|
|
73
|
-
|
|
74
|
-
va_start(
|
|
75
|
-
vsnprintf(args.exception_message, MAX_RAISE_MESSAGE_SIZE, format_string, format_string_arguments);
|
|
72
|
+
args.format_string = format_string;
|
|
73
|
+
va_start(args.va_args, format_string);
|
|
76
74
|
|
|
77
75
|
if (is_current_thread_holding_the_gvl()) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
76
|
+
VALUE detailed_message = rb_vsprintf(format_string, args.va_args);
|
|
77
|
+
va_end(args.va_args);
|
|
78
|
+
|
|
79
|
+
VALUE wrapped_message = rb_sprintf(
|
|
80
|
+
"grab_gvl_and_raise called by thread holding the global VM lock: %"PRIsVALUE,
|
|
81
|
+
detailed_message
|
|
82
|
+
);
|
|
83
|
+
char telemetry_message[MAX_RAISE_MESSAGE_SIZE];
|
|
84
|
+
snprintf(
|
|
85
|
+
telemetry_message,
|
|
86
|
+
MAX_RAISE_MESSAGE_SIZE,
|
|
87
|
+
"grab_gvl_and_raise called by thread holding the global VM lock: %s",
|
|
88
|
+
format_string
|
|
83
89
|
);
|
|
90
|
+
VALUE exception = rb_exc_new_str(rb_eRuntimeError, wrapped_message);
|
|
91
|
+
private_raise_exception(exception, telemetry_message);
|
|
84
92
|
}
|
|
85
93
|
|
|
86
|
-
rb_thread_call_with_gvl(
|
|
94
|
+
rb_thread_call_with_gvl(trigger_raise, &args);
|
|
87
95
|
|
|
88
|
-
|
|
96
|
+
va_end(args.va_args);
|
|
97
|
+
rb_bug("[ddtrace] Unexpected: Reached the end of grab_gvl_and_raise while raising '%s'\n", format_string);
|
|
89
98
|
}
|
|
90
99
|
|
|
91
|
-
void
|
|
100
|
+
void private_raise_enforce_syserr(
|
|
92
101
|
int syserr_errno,
|
|
93
102
|
bool have_gvl,
|
|
94
103
|
const char *expression,
|
|
@@ -96,23 +105,14 @@ void raise_syserr(
|
|
|
96
105
|
int line,
|
|
97
106
|
const char *function_name
|
|
98
107
|
) {
|
|
108
|
+
const char *format = "Failure returned by '%s' at %s:%d:in `%s'";
|
|
99
109
|
if (have_gvl) {
|
|
100
|
-
|
|
110
|
+
private_raise_exception(rb_syserr_new_str(syserr_errno, rb_sprintf(format, expression, file, line, function_name)), format);
|
|
101
111
|
} else {
|
|
102
|
-
|
|
112
|
+
private_grab_gvl_and_raise(Qnil, syserr_errno, format, expression, file, line, function_name);
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
115
|
|
|
106
|
-
char* ruby_strndup(const char *str, size_t size) {
|
|
107
|
-
char *dup;
|
|
108
|
-
|
|
109
|
-
dup = xmalloc(size + 1);
|
|
110
|
-
memcpy(dup, str, size);
|
|
111
|
-
dup[size] = '\0';
|
|
112
|
-
|
|
113
|
-
return dup;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
116
|
static VALUE _id2ref(VALUE obj_id) {
|
|
117
117
|
// Call ::ObjectSpace._id2ref natively. It will raise if the id is no longer valid
|
|
118
118
|
return rb_funcall(module_object_space, _id2ref_id, 1, obj_id);
|
|
@@ -122,9 +122,7 @@ static VALUE _id2ref_failure(DDTRACE_UNUSED VALUE _unused1, DDTRACE_UNUSED VALUE
|
|
|
122
122
|
return Qfalse;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
//
|
|
126
|
-
// writes the ref to the value pointer parameter if !NULL. False if id doesn't
|
|
127
|
-
// reference a valid object (in which case value is not changed).
|
|
125
|
+
// See notes on header for important details
|
|
128
126
|
bool ruby_ref_from_id(VALUE obj_id, VALUE *value) {
|
|
129
127
|
// Call ::ObjectSpace._id2ref natively. It will raise if the id is no longer valid
|
|
130
128
|
// so we need to call it via rb_rescue2
|
|
@@ -164,9 +162,16 @@ size_t rb_obj_memsize_of(VALUE obj);
|
|
|
164
162
|
size_t ruby_obj_memsize_of(VALUE obj) {
|
|
165
163
|
switch (rb_type(obj)) {
|
|
166
164
|
case T_OBJECT:
|
|
165
|
+
// On Ruby 4.0, computing the size of a class/module/iclass seems to not be safe: `rb_obj_memsize_of` walks the
|
|
166
|
+
// per-namespace class extensions (`rb_class_classext_foreach` -> `classext_memsize` -> `rb_id_table_memsize`)
|
|
167
|
+
// and can crash the VM when called on objects tracked by heap profiling.
|
|
168
|
+
// See https://github.com/DataDog/dd-trace-rb/issues/5936. Class objects contribute negligibly to heap size,
|
|
169
|
+
// so we skip them (fall through to the `default` branch, returning 0) rather than risk a SIGSEGV.
|
|
170
|
+
#ifndef NO_SAFE_CLASS_MEMSIZE
|
|
167
171
|
case T_MODULE:
|
|
168
172
|
case T_CLASS:
|
|
169
173
|
case T_ICLASS:
|
|
174
|
+
#endif
|
|
170
175
|
case T_STRING:
|
|
171
176
|
case T_ARRAY:
|
|
172
177
|
case T_HASH:
|