datadog 2.21.0 → 2.38.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 +574 -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 +301 -82
- 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 +63 -32
- data/ext/datadog_profiling_native_extension/collectors_stack.h +7 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +728 -436
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +19 -6
- 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 +41 -37
- 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 +252 -103
- data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +3 -22
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +0 -5
- 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 +40 -43
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -0
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +63 -46
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +17 -5
- 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 +110 -85
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +13 -7
- 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 +18 -24
- 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 +34 -25
- data/ext/libdatadog_api/process_discovery.c +19 -13
- data/ext/libdatadog_extconf_helpers.rb +94 -11
- 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 +38 -9
- data/lib/datadog/appsec/api_security/sampler.rb +7 -4
- 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 +359 -4
- data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +16 -9
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +51 -13
- 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 +2 -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 -12
- 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 -12
- 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 +52 -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 +48 -33
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +40 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +26 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +38 -0
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -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 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +43 -13
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +4 -4
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +1 -1
- 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 +13 -31
- data/lib/datadog/appsec/ext.rb +3 -0
- 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 +43 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +20 -3
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +20 -1
- data/lib/datadog/appsec/metrics.rb +5 -5
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/remote.rb +44 -29
- 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 +26 -5
- data/lib/datadog/appsec/security_engine/result.rb +29 -9
- data/lib/datadog/appsec/security_engine/runner.rb +20 -10
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/trace_keeper.rb +18 -6
- 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 +6 -3
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +185 -17
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +11 -2
- data/lib/datadog/core/configuration/deprecations.rb +2 -2
- data/lib/datadog/core/configuration/option.rb +32 -6
- data/lib/datadog/core/configuration/option_definition.rb +42 -14
- data/lib/datadog/core/configuration/options.rb +49 -12
- data/lib/datadog/core/configuration/settings.rb +115 -16
- data/lib/datadog/core/configuration/stable_config.rb +10 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +379 -300
- data/lib/datadog/core/configuration.rb +3 -3
- 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 +6 -0
- data/lib/datadog/core/ddsketch.rb +19 -0
- 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 -0
- 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/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 +59 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +6 -6
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery.rb +21 -18
- 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 +1 -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/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +0 -4
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +59 -15
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -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 +177 -171
- 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 +4 -2
- data/lib/datadog/core/telemetry/logging.rb +17 -5
- 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/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +10 -6
- data/lib/datadog/core/transport/http/client.rb +80 -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 +2 -2
- 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 -21
- 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 +6 -2
- data/lib/datadog/core/utils.rb +3 -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 +10 -3
- 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 +7 -2
- data/lib/datadog/di/capture_expression.rb +21 -0
- data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
- data/lib/datadog/di/capture_limits.rb +41 -0
- data/lib/datadog/di/code_tracker.rb +217 -15
- data/lib/datadog/di/component.rb +139 -51
- data/lib/datadog/di/configuration.rb +241 -2
- data/lib/datadog/di/context.rb +82 -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 +623 -147
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +122 -14
- data/lib/datadog/di/probe_builder.rb +124 -3
- data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
- data/lib/datadog/di/probe_file_loader.rb +12 -7
- data/lib/datadog/di/probe_manager.rb +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +321 -90
- data/lib/datadog/di/probe_notifier_worker.rb +112 -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 -93
- data/lib/datadog/di/serializer.rb +310 -29
- 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 +2 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +112 -38
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +204 -4
- 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 +60 -3
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- 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 +1 -1
- 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 +65 -1
- 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 +9 -3
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +4 -1
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +71 -12
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -4
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -5
- data/lib/datadog/profiling/collectors/info.rb +18 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +10 -5
- data/lib/datadog/profiling/component.rb +82 -40
- data/lib/datadog/profiling/exporter.rb +41 -12
- 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 +0 -2
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +21 -8
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -14
- data/lib/datadog/profiling/scheduler.rb +10 -9
- data/lib/datadog/profiling/stack_recorder.rb +0 -8
- data/lib/datadog/profiling/tag_builder.rb +37 -3
- data/lib/datadog/profiling/tasks/exec.rb +8 -3
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +2 -2
- data/lib/datadog/profiling.rb +1 -3
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +2 -2
- 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/buffer.rb +3 -3
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
- data/lib/datadog/tracing/configuration/ext.rb +22 -0
- data/lib/datadog/tracing/configuration/settings.rb +96 -4
- 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_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -7
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +28 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -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 +5 -2
- data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -5
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -5
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +6 -8
- data/lib/datadog/tracing/contrib/component.rb +3 -3
- data/lib/datadog/tracing/contrib/configurable.rb +18 -3
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
- data/lib/datadog/tracing/contrib/dalli/quantize.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/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- 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 +1 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/extensions.rb +19 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +10 -7
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- 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/unified_trace.rb +75 -44
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +3 -7
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -7
- 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.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +4 -8
- 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 +1 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +7 -7
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -8
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
- 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/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 +11 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
- data/lib/datadog/tracing/contrib/karafka.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +5 -8
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +15 -18
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +6 -8
- 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 +24 -0
- 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/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
- 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_tagging.rb +23 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +62 -27
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +119 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +3 -1
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +6 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -6
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +7 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -7
- 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 +1 -0
- 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 +3 -2
- 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/framework.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +4 -1
- 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/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +4 -2
- 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 +4 -2
- data/lib/datadog/tracing/distributed/baggage.rb +64 -8
- data/lib/datadog/tracing/distributed/datadog.rb +13 -11
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -14
- data/lib/datadog/tracing/distributed/propagation.rb +35 -3
- data/lib/datadog/tracing/distributed/trace_context.rb +85 -62
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +2 -2
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -0
- 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 +54 -25
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +34 -10
- data/lib/datadog/tracing/sync_writer.rb +0 -1
- data/lib/datadog/tracing/trace_digest.rb +7 -0
- data/lib/datadog/tracing/trace_operation.rb +123 -16
- data/lib/datadog/tracing/tracer.rb +82 -23
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +2 -50
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +6 -9
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +13 -81
- data/lib/datadog/tracing/workers.rb +2 -1
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +8 -1
- metadata +185 -36
- 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/configuration/settings.rb +0 -400
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- 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
|
@@ -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
|
-
|
|
36
|
-
void grab_gvl_and_raise(VALUE exception_class, const char *format_string, ...) {
|
|
37
|
-
raise_args args;
|
|
38
|
-
|
|
39
|
-
args.exception_class = exception_class;
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
va_start(format_string_arguments, format_string);
|
|
43
|
-
vsnprintf(args.exception_message, MAX_RAISE_MESSAGE_SIZE, format_string, format_string_arguments);
|
|
47
|
+
VALUE detailed_message = rb_vsprintf(args->format_string, args->va_args);
|
|
44
48
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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,10 +105,11 @@ 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
|
|
|
@@ -152,9 +162,16 @@ size_t rb_obj_memsize_of(VALUE obj);
|
|
|
152
162
|
size_t ruby_obj_memsize_of(VALUE obj) {
|
|
153
163
|
switch (rb_type(obj)) {
|
|
154
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
|
|
155
171
|
case T_MODULE:
|
|
156
172
|
case T_CLASS:
|
|
157
173
|
case T_ICLASS:
|
|
174
|
+
#endif
|
|
158
175
|
case T_STRING:
|
|
159
176
|
case T_ARRAY:
|
|
160
177
|
case T_HASH:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <stdbool.h>
|
|
4
|
+
#include <stdarg.h>
|
|
4
5
|
#include "datadog_ruby_common.h"
|
|
5
6
|
|
|
6
7
|
// Initialize internal data needed by some ruby helpers. Should be called during start, before any actual
|
|
@@ -39,26 +40,37 @@ static inline int check_if_pending_exception(void) {
|
|
|
39
40
|
|
|
40
41
|
#define VALUE_COUNT(array) (sizeof(array) / sizeof(VALUE))
|
|
41
42
|
|
|
43
|
+
// Raises a SysErr exception with the formatted string as its message.
|
|
44
|
+
// See `raise_error` for details about telemetry messages.
|
|
45
|
+
#define raise_syserr(syserr_errno, fmt, ...) \
|
|
46
|
+
private_raise_syserr(syserr_errno, "" fmt, ##__VA_ARGS__)
|
|
47
|
+
|
|
48
|
+
#define grab_gvl_and_raise(exception_class, fmt, ...) \
|
|
49
|
+
private_grab_gvl_and_raise(exception_class, 0, "" fmt, ##__VA_ARGS__)
|
|
50
|
+
|
|
42
51
|
NORETURN(
|
|
43
|
-
void
|
|
52
|
+
void private_raise_syserr(int syserr_errno, const char *fmt, ...)
|
|
44
53
|
__attribute__ ((format (printf, 2, 3)));
|
|
45
54
|
);
|
|
55
|
+
|
|
46
56
|
NORETURN(
|
|
47
|
-
void
|
|
48
|
-
__attribute__ ((format (printf,
|
|
57
|
+
void private_grab_gvl_and_raise(VALUE exception_class, int syserr_errno, const char *format_string, ...)
|
|
58
|
+
__attribute__ ((format (printf, 3, 4)));
|
|
49
59
|
);
|
|
50
60
|
|
|
61
|
+
|
|
62
|
+
|
|
51
63
|
#define ENFORCE_SUCCESS_GVL(expression) ENFORCE_SUCCESS_HELPER(expression, true)
|
|
52
64
|
#define ENFORCE_SUCCESS_NO_GVL(expression) ENFORCE_SUCCESS_HELPER(expression, false)
|
|
53
65
|
|
|
54
66
|
#define ENFORCE_SUCCESS_HELPER(expression, have_gvl) \
|
|
55
|
-
{ int result_syserr_errno = expression; if (RB_UNLIKELY(result_syserr_errno))
|
|
67
|
+
{ int result_syserr_errno = expression; if (RB_UNLIKELY(result_syserr_errno)) private_raise_enforce_syserr(result_syserr_errno, have_gvl, ADD_QUOTES(expression), __FILE__, __LINE__, __func__); }
|
|
56
68
|
|
|
57
69
|
#define RUBY_NUM_OR_NIL(val, condition, conv) ((val condition) ? conv(val) : Qnil)
|
|
58
70
|
#define RUBY_AVG_OR_NIL(total, count) ((count == 0) ? Qnil : DBL2NUM(((double) total) / count))
|
|
59
71
|
|
|
60
72
|
// Called by ENFORCE_SUCCESS_HELPER; should not be used directly
|
|
61
|
-
NORETURN(void
|
|
73
|
+
NORETURN(void private_raise_enforce_syserr(
|
|
62
74
|
int syserr_errno,
|
|
63
75
|
bool have_gvl,
|
|
64
76
|
const char *expression,
|
|
@@ -9,26 +9,30 @@
|
|
|
9
9
|
|
|
10
10
|
// Used by Collectors::CpuAndWallTimeWorker to setup SIGPROF signal handlers used for cpu/wall-time profiling.
|
|
11
11
|
|
|
12
|
+
static VALUE existing_signal_handler_exception_class = Qnil;
|
|
13
|
+
|
|
12
14
|
static void install_sigprof_signal_handler_internal(
|
|
13
15
|
void (*signal_handler_function)(int, siginfo_t *, void *),
|
|
14
16
|
const char *handler_pretty_name,
|
|
15
|
-
void (*signal_handler_to_replace)(int, siginfo_t *, void *)
|
|
17
|
+
void (*signal_handler_to_replace)(int, siginfo_t *, void *),
|
|
18
|
+
bool should_raise_on_failure
|
|
16
19
|
);
|
|
17
20
|
|
|
18
21
|
void empty_signal_handler(DDTRACE_UNUSED int _signal, DDTRACE_UNUSED siginfo_t *_info, DDTRACE_UNUSED void *_ucontext) { }
|
|
19
22
|
|
|
20
23
|
void install_sigprof_signal_handler(void (*signal_handler_function)(int, siginfo_t *, void *), const char *handler_pretty_name) {
|
|
21
|
-
install_sigprof_signal_handler_internal(signal_handler_function, handler_pretty_name, NULL);
|
|
24
|
+
install_sigprof_signal_handler_internal(signal_handler_function, handler_pretty_name, NULL, true);
|
|
22
25
|
}
|
|
23
26
|
|
|
24
|
-
void replace_sigprof_signal_handler_with_empty_handler(void (*expected_existing_handler)(int, siginfo_t *, void *)) {
|
|
25
|
-
install_sigprof_signal_handler_internal(empty_signal_handler, "empty_signal_handler", expected_existing_handler);
|
|
27
|
+
void replace_sigprof_signal_handler_with_empty_handler(void (*expected_existing_handler)(int, siginfo_t *, void *), bool should_raise_on_failure) {
|
|
28
|
+
install_sigprof_signal_handler_internal(empty_signal_handler, "empty_signal_handler", expected_existing_handler, should_raise_on_failure);
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
static void install_sigprof_signal_handler_internal(
|
|
29
32
|
void (*signal_handler_function)(int, siginfo_t *, void *),
|
|
30
33
|
const char *handler_pretty_name,
|
|
31
|
-
void (*signal_handler_to_replace)(int, siginfo_t *, void *)
|
|
34
|
+
void (*signal_handler_to_replace)(int, siginfo_t *, void *),
|
|
35
|
+
bool should_raise_on_failure
|
|
32
36
|
) {
|
|
33
37
|
struct sigaction existing_signal_handler_config = {.sa_sigaction = NULL};
|
|
34
38
|
struct sigaction signal_handler_config = {
|
|
@@ -52,8 +56,7 @@ static void install_sigprof_signal_handler_internal(
|
|
|
52
56
|
) { return; }
|
|
53
57
|
|
|
54
58
|
if (existing_signal_handler_config.sa_handler != NULL || existing_signal_handler_config.sa_sigaction != NULL) {
|
|
55
|
-
// An unexpected/unknown signal handler already existed.
|
|
56
|
-
// of the installation.
|
|
59
|
+
// An unexpected/unknown signal handler already existed.
|
|
57
60
|
|
|
58
61
|
if (sigaction(SIGPROF, &existing_signal_handler_config, NULL) != 0) {
|
|
59
62
|
rb_exc_raise(
|
|
@@ -71,8 +74,12 @@ static void install_sigprof_signal_handler_internal(
|
|
|
71
74
|
);
|
|
72
75
|
}
|
|
73
76
|
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
// If should_raise_on_failure is false (e.g., during cleanup), just return silently.
|
|
78
|
+
// This can happen if we failed to install our handler earlier due to a pre-existing handler.
|
|
79
|
+
if (!should_raise_on_failure) return;
|
|
80
|
+
|
|
81
|
+
raise_error(
|
|
82
|
+
existing_signal_handler_exception_class,
|
|
76
83
|
"Could not install profiling signal handler (%s): There's a pre-existing SIGPROF signal handler",
|
|
77
84
|
handler_pretty_name
|
|
78
85
|
);
|
|
@@ -95,8 +102,14 @@ static inline void toggle_sigprof_signal_handler_for_current_thread(int action)
|
|
|
95
102
|
sigset_t signals_to_toggle;
|
|
96
103
|
sigemptyset(&signals_to_toggle);
|
|
97
104
|
sigaddset(&signals_to_toggle, SIGPROF);
|
|
105
|
+
|
|
98
106
|
int error = pthread_sigmask(action, &signals_to_toggle, NULL);
|
|
99
|
-
if (error)
|
|
107
|
+
if (error) {
|
|
108
|
+
const char *message = (action == SIG_BLOCK) ?
|
|
109
|
+
"Unexpected failure in pthread_sigmask: action SIG_BLOCK" :
|
|
110
|
+
"Unexpected failure in pthread_sigmask: action SIG_UNBLOCK";
|
|
111
|
+
private_raise_syserr(error, message, message);
|
|
112
|
+
}
|
|
100
113
|
}
|
|
101
114
|
|
|
102
115
|
void block_sigprof_signal_handler_from_running_in_current_thread(void) {
|
|
@@ -113,3 +126,12 @@ VALUE is_sigprof_blocked_in_current_thread(void) {
|
|
|
113
126
|
ENFORCE_SUCCESS_GVL(pthread_sigmask(0, NULL, ¤t_signals));
|
|
114
127
|
return sigismember(¤t_signals, SIGPROF) ? Qtrue : Qfalse;
|
|
115
128
|
}
|
|
129
|
+
|
|
130
|
+
void setup_signal_handler_init(VALUE profiling_module) {
|
|
131
|
+
existing_signal_handler_exception_class = rb_define_class_under(
|
|
132
|
+
profiling_module,
|
|
133
|
+
"ExistingSignalHandler",
|
|
134
|
+
rb_eRuntimeError
|
|
135
|
+
);
|
|
136
|
+
rb_gc_register_mark_object(existing_signal_handler_exception_class);
|
|
137
|
+
}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
#include "datadog_ruby_common.h"
|
|
5
5
|
|
|
6
6
|
void empty_signal_handler(DDTRACE_UNUSED int _signal, DDTRACE_UNUSED siginfo_t *_info, DDTRACE_UNUSED void *_ucontext);
|
|
7
|
+
|
|
7
8
|
void install_sigprof_signal_handler(void (*signal_handler_function)(int, siginfo_t *, void *), const char *handler_pretty_name);
|
|
8
|
-
void replace_sigprof_signal_handler_with_empty_handler(void (*expected_existing_handler)(int, siginfo_t *, void *));
|
|
9
|
+
void replace_sigprof_signal_handler_with_empty_handler(void (*expected_existing_handler)(int, siginfo_t *, void *), bool should_raise_on_failure);
|
|
9
10
|
void remove_sigprof_signal_handler(void);
|
|
10
11
|
void block_sigprof_signal_handler_from_running_in_current_thread(void);
|
|
11
12
|
void unblock_sigprof_signal_handler_from_running_in_current_thread(void);
|