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
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative "../core/telemetry/logger"
|
|
4
|
+
|
|
3
5
|
module Datadog
|
|
4
6
|
module Profiling
|
|
5
7
|
# Responsible for wiring up the Profiler for execution
|
|
6
8
|
module Component
|
|
7
|
-
ALLOCATION_WITH_RACTORS_ONLY_ONCE = Datadog::Core::Utils::OnlyOnce.new
|
|
8
|
-
private_constant :ALLOCATION_WITH_RACTORS_ONLY_ONCE
|
|
9
|
-
|
|
10
9
|
# Passing in a `nil` tracer is supported and will disable the following profiling features:
|
|
11
10
|
# * Profiling in the trace viewer, as well as scoping a profile down to a span
|
|
12
11
|
# * Endpoint aggregation in the profiler UX, including normalization (resource per endpoint call)
|
|
13
12
|
def self.build_profiler_component(settings:, agent_settings:, optional_tracer:, logger:) # rubocop:disable Metrics/MethodLength
|
|
14
|
-
return [nil, {profiling_enabled: false}] unless settings.profiling.enabled
|
|
15
|
-
|
|
16
13
|
# Workaround for weird dependency direction: the Core::Configuration::Components class currently has a
|
|
17
14
|
# dependency on individual products, in this case the Profiler.
|
|
18
15
|
# (Note "currently": in the future we want to change this so core classes don't depend on specific products)
|
|
@@ -32,7 +29,7 @@ module Datadog
|
|
|
32
29
|
# no-op if profiling is already loaded).
|
|
33
30
|
require_relative "../profiling"
|
|
34
31
|
|
|
35
|
-
return [nil, {profiling_enabled: false}] unless Profiling.supported?
|
|
32
|
+
return [nil, {profiling_enabled: false}] unless settings.profiling.enabled && Profiling.supported?
|
|
36
33
|
|
|
37
34
|
# Activate forking extensions
|
|
38
35
|
Profiling::Tasks::Setup.new.run
|
|
@@ -40,7 +37,6 @@ module Datadog
|
|
|
40
37
|
# NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
|
|
41
38
|
|
|
42
39
|
no_signals_workaround_enabled = no_signals_workaround_enabled?(settings, logger)
|
|
43
|
-
timeline_enabled = settings.profiling.advanced.timeline_enabled
|
|
44
40
|
allocation_profiling_enabled = enable_allocation_profiling?(settings, logger)
|
|
45
41
|
heap_sample_every = get_heap_sample_every(settings)
|
|
46
42
|
heap_profiling_enabled = enable_heap_profiling?(settings, allocation_profiling_enabled, heap_sample_every, logger)
|
|
@@ -48,17 +44,17 @@ module Datadog
|
|
|
48
44
|
|
|
49
45
|
overhead_target_percentage = valid_overhead_target(settings.profiling.advanced.overhead_target_percentage, logger)
|
|
50
46
|
upload_period_seconds = [60, settings.profiling.advanced.upload_period_seconds].max
|
|
47
|
+
cpu_sampling_interval_ms =
|
|
48
|
+
valid_cpu_sampling_interval(settings.profiling.advanced.experimental_cpu_sampling_interval_ms, logger)
|
|
51
49
|
|
|
52
50
|
recorder = Datadog::Profiling::StackRecorder.new(
|
|
53
|
-
cpu_time_enabled: RUBY_PLATFORM.include?("linux"), # Only supported on Linux currently
|
|
54
51
|
alloc_samples_enabled: allocation_profiling_enabled,
|
|
55
52
|
heap_samples_enabled: heap_profiling_enabled,
|
|
56
53
|
heap_size_enabled: heap_size_profiling_enabled,
|
|
57
54
|
heap_sample_every: heap_sample_every,
|
|
58
|
-
timeline_enabled: timeline_enabled,
|
|
59
55
|
heap_clean_after_gc_enabled: settings.profiling.advanced.heap_clean_after_gc_enabled,
|
|
60
56
|
)
|
|
61
|
-
thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer
|
|
57
|
+
thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer)
|
|
62
58
|
worker = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
|
|
63
59
|
gc_profiling_enabled: enable_gc_profiling?(settings, logger),
|
|
64
60
|
no_signals_workaround_enabled: no_signals_workaround_enabled,
|
|
@@ -68,11 +64,11 @@ module Datadog
|
|
|
68
64
|
allocation_counting_enabled: settings.profiling.advanced.allocation_counting_enabled,
|
|
69
65
|
gvl_profiling_enabled: enable_gvl_profiling?(settings, logger),
|
|
70
66
|
sighandler_sampling_enabled: settings.profiling.advanced.sighandler_sampling_enabled,
|
|
67
|
+
cpu_sampling_interval_ms: cpu_sampling_interval_ms,
|
|
71
68
|
)
|
|
72
69
|
|
|
73
70
|
internal_metadata = {
|
|
74
71
|
no_signals_workaround_enabled: no_signals_workaround_enabled,
|
|
75
|
-
timeline_enabled: timeline_enabled,
|
|
76
72
|
heap_sample_every: heap_sample_every,
|
|
77
73
|
}.freeze
|
|
78
74
|
|
|
@@ -85,16 +81,27 @@ module Datadog
|
|
|
85
81
|
Datadog::Profiling::Ext::DirMonkeyPatches.apply!
|
|
86
82
|
end
|
|
87
83
|
|
|
84
|
+
if can_apply_exec_monkey_patch?(settings)
|
|
85
|
+
Datadog::Profiling::Ext::ExecMonkeyPatch.apply!
|
|
86
|
+
end
|
|
87
|
+
|
|
88
88
|
[profiler, {profiling_enabled: true}]
|
|
89
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
90
|
+
logger.warn do
|
|
91
|
+
"Failed to initialize profiling: #{e.class}: #{e.message} " \
|
|
92
|
+
"Location: #{Array(e.backtrace).first}"
|
|
93
|
+
end
|
|
94
|
+
Datadog::Core::Telemetry::Logger.report(e, description: "Failed to initialize profiling")
|
|
95
|
+
|
|
96
|
+
[nil, {profiling_enabled: false}]
|
|
89
97
|
end
|
|
90
98
|
|
|
91
|
-
private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer
|
|
99
|
+
private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer)
|
|
92
100
|
Datadog::Profiling::Collectors::ThreadContext.new(
|
|
93
101
|
recorder: recorder,
|
|
94
102
|
max_frames: settings.profiling.advanced.max_frames,
|
|
95
103
|
tracer: optional_tracer,
|
|
96
104
|
endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
|
|
97
|
-
timeline_enabled: timeline_enabled,
|
|
98
105
|
waiting_for_gvl_threshold_ns: settings.profiling.advanced.waiting_for_gvl_threshold_ns,
|
|
99
106
|
otel_context_enabled: settings.profiling.advanced.preview_otel_context_enabled,
|
|
100
107
|
native_filenames_enabled: settings.profiling.advanced.native_filenames_enabled,
|
|
@@ -122,6 +129,7 @@ module Datadog
|
|
|
122
129
|
site: settings.site,
|
|
123
130
|
api_key: settings.api_key,
|
|
124
131
|
upload_timeout_seconds: settings.profiling.upload.timeout_seconds,
|
|
132
|
+
use_system_dns: settings.profiling.advanced.experimental_use_system_dns,
|
|
125
133
|
)
|
|
126
134
|
end
|
|
127
135
|
|
|
@@ -133,19 +141,18 @@ module Datadog
|
|
|
133
141
|
# that causes a segmentation fault during garbage collection of Ractors
|
|
134
142
|
# (https://bugs.ruby-lang.org/issues/18464). We don't allow enabling gc profiling on such Rubies.
|
|
135
143
|
# This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
|
|
136
|
-
if
|
|
137
|
-
|
|
138
|
-
(RUBY_VERSION.start_with?("3.2.") && RUBY_VERSION < "3.2.3")
|
|
144
|
+
if RubyVersion.is?(">= 3", "< 3.1.4") ||
|
|
145
|
+
RubyVersion.is?(">= 3.2", "< 3.2.3")
|
|
139
146
|
logger.warn(
|
|
140
147
|
"Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling GC profiling would cause " \
|
|
141
148
|
"crashes (https://bugs.ruby-lang.org/issues/18464). GC profiling has been disabled."
|
|
142
149
|
)
|
|
143
150
|
return false
|
|
144
|
-
elsif
|
|
151
|
+
elsif RubyVersion.is?(">= 3", "< 4")
|
|
145
152
|
logger.debug(
|
|
146
153
|
"Using Ractors may result in GC profiling unexpectedly " \
|
|
147
154
|
"stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your " \
|
|
148
|
-
"application stability or performance. This
|
|
155
|
+
"application stability or performance. This issue is fixed on Ruby 4."
|
|
149
156
|
)
|
|
150
157
|
end
|
|
151
158
|
|
|
@@ -169,7 +176,7 @@ module Datadog
|
|
|
169
176
|
# Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482,
|
|
170
177
|
# https://github.com/ruby/ruby/pull/7464) that makes this crash in any configuration. This bug is
|
|
171
178
|
# fixed on Ruby versions 3.2.3 and 3.3.0.
|
|
172
|
-
if
|
|
179
|
+
if RubyVersion.is?(">= 3.2", "< 3.2.3")
|
|
173
180
|
logger.warn(
|
|
174
181
|
"Allocation profiling is not supported in Ruby versions 3.2.0, 3.2.1 and 3.2.2 and will be forcibly " \
|
|
175
182
|
"disabled. This is due to a VM bug that can lead to crashes (https://bugs.ruby-lang.org/issues/19482). " \
|
|
@@ -183,9 +190,8 @@ module Datadog
|
|
|
183
190
|
# that causes a segmentation fault during garbage collection of Ractors
|
|
184
191
|
# (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies.
|
|
185
192
|
# This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
|
|
186
|
-
if
|
|
187
|
-
|
|
188
|
-
(RUBY_VERSION.start_with?("3.2.") && RUBY_VERSION < "3.2.3")
|
|
193
|
+
if RubyVersion.is?(">= 3", "< 3.1.4") ||
|
|
194
|
+
RubyVersion.is?(">= 3.2", "< 3.2.3")
|
|
189
195
|
logger.warn(
|
|
190
196
|
"Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling allocation profiling while using " \
|
|
191
197
|
"Ractors may cause unexpected issues, including crashes (https://bugs.ruby-lang.org/issues/18464). " \
|
|
@@ -194,14 +200,12 @@ module Datadog
|
|
|
194
200
|
# ANNOYANCE - Only with Ractors
|
|
195
201
|
# On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets
|
|
196
202
|
# garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on.
|
|
197
|
-
elsif
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
)
|
|
204
|
-
end
|
|
203
|
+
elsif RubyVersion.is?(">= 3", "< 4")
|
|
204
|
+
logger.debug(
|
|
205
|
+
"Using Ractors may result in allocation profiling " \
|
|
206
|
+
"stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your " \
|
|
207
|
+
"application stability or performance. This issue is fixed on Ruby 4."
|
|
208
|
+
)
|
|
205
209
|
end
|
|
206
210
|
|
|
207
211
|
logger.debug("Enabled allocation profiling")
|
|
@@ -214,7 +218,7 @@ module Datadog
|
|
|
214
218
|
|
|
215
219
|
return false unless heap_profiling_enabled
|
|
216
220
|
|
|
217
|
-
if
|
|
221
|
+
if RubyVersion.is?("< 3.1")
|
|
218
222
|
logger.warn(
|
|
219
223
|
"Current Ruby version (#{RUBY_VERSION}) cannot support heap profiling due to VM limitations. " \
|
|
220
224
|
"Please upgrade to Ruby >= 3.1 in order to use this feature. Heap profiling has been disabled."
|
|
@@ -222,6 +226,15 @@ module Datadog
|
|
|
222
226
|
return false
|
|
223
227
|
end
|
|
224
228
|
|
|
229
|
+
# Heap profiling relies on `ObjectSpace._id2ref`, which was removed on Ruby 4.1
|
|
230
|
+
# (https://bugs.ruby-lang.org/issues/22135).
|
|
231
|
+
if RubyVersion.is?(">= 4.1")
|
|
232
|
+
logger.warn(
|
|
233
|
+
"Heap profiling is currently incompatible with Ruby 4.1+ and has been disabled."
|
|
234
|
+
)
|
|
235
|
+
return false
|
|
236
|
+
end
|
|
237
|
+
|
|
225
238
|
unless allocation_profiling_enabled
|
|
226
239
|
logger.warn(
|
|
227
240
|
"Heap profiling was requested but allocation profiling is not enabled. " \
|
|
@@ -240,6 +253,14 @@ module Datadog
|
|
|
240
253
|
|
|
241
254
|
return false unless heap_profiling_enabled && heap_size_profiling_enabled
|
|
242
255
|
|
|
256
|
+
if RubyVersion.is?(">= 4")
|
|
257
|
+
logger.info(
|
|
258
|
+
"Heap live size profiling is currently incompatible with Ruby 4 and has been disabled. " \
|
|
259
|
+
"Heap live objects is not affected and remains enabled."
|
|
260
|
+
)
|
|
261
|
+
return false
|
|
262
|
+
end
|
|
263
|
+
|
|
243
264
|
true
|
|
244
265
|
end
|
|
245
266
|
|
|
@@ -256,7 +277,7 @@ module Datadog
|
|
|
256
277
|
end
|
|
257
278
|
|
|
258
279
|
if setting_value == false
|
|
259
|
-
if
|
|
280
|
+
if RubyVersion.is?("< 2.6")
|
|
260
281
|
logger.warn(
|
|
261
282
|
'The profiling "no signals" workaround has been disabled via configuration on Ruby 2.5. ' \
|
|
262
283
|
"This is not recommended " \
|
|
@@ -282,7 +303,7 @@ module Datadog
|
|
|
282
303
|
# Setting is in auto mode. Let's probe to see if we should enable it:
|
|
283
304
|
|
|
284
305
|
# We don't warn users in this situation because "upgrade your Ruby" is not a great warning
|
|
285
|
-
return true if
|
|
306
|
+
return true if RubyVersion.is?("< 2.6")
|
|
286
307
|
|
|
287
308
|
if Gem.loaded_specs["mysql2"] && incompatible_libmysqlclient_version?(settings, logger)
|
|
288
309
|
logger.warn(
|
|
@@ -365,7 +386,7 @@ module Datadog
|
|
|
365
386
|
rescue StandardError, LoadError => e
|
|
366
387
|
logger.warn(
|
|
367
388
|
"Failed to probe `mysql2` gem information. " \
|
|
368
|
-
"Cause: #{e.class
|
|
389
|
+
"Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
369
390
|
)
|
|
370
391
|
|
|
371
392
|
true
|
|
@@ -398,6 +419,22 @@ module Datadog
|
|
|
398
419
|
end
|
|
399
420
|
end
|
|
400
421
|
|
|
422
|
+
private_class_method def self.valid_cpu_sampling_interval(cpu_sampling_interval_ms, logger)
|
|
423
|
+
if cpu_sampling_interval_ms > 10
|
|
424
|
+
logger.warn(
|
|
425
|
+
"Profiling cpu_sampling_interval_ms is set to #{cpu_sampling_interval_ms}ms, but values above 10ms are " \
|
|
426
|
+
"not supported. Using 10ms instead. To reduce profiler overhead, consider adjusting the " \
|
|
427
|
+
"overhead_target_percentage setting."
|
|
428
|
+
)
|
|
429
|
+
10
|
|
430
|
+
elsif cpu_sampling_interval_ms < 10
|
|
431
|
+
logger.debug { "Profiling cpu_sampling_interval_ms set to #{cpu_sampling_interval_ms}ms" }
|
|
432
|
+
cpu_sampling_interval_ms
|
|
433
|
+
else
|
|
434
|
+
cpu_sampling_interval_ms
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
|
|
401
438
|
# To add just a bit more complexity to our detection code, in https://github.com/DataDog/dd-trace-rb/issues/3334
|
|
402
439
|
# a user reported that our code was incorrectly flagging the mariadb variant of libmysqlclient as being
|
|
403
440
|
# incompatible. In fact we have no reports of the mariadb variant needing the "no signals" workaround,
|
|
@@ -428,17 +465,22 @@ module Datadog
|
|
|
428
465
|
end
|
|
429
466
|
|
|
430
467
|
private_class_method def self.dir_interruption_workaround_enabled?(settings, no_signals_workaround_enabled)
|
|
431
|
-
return false if no_signals_workaround_enabled ||
|
|
468
|
+
return false if no_signals_workaround_enabled || RubyVersion.is?(">= 3.4")
|
|
432
469
|
|
|
433
470
|
settings.profiling.advanced.dir_interruption_workaround_enabled
|
|
434
471
|
end
|
|
435
472
|
|
|
436
|
-
private_class_method def self.
|
|
437
|
-
return false if
|
|
473
|
+
private_class_method def self.can_apply_exec_monkey_patch?(settings)
|
|
474
|
+
return false if RubyVersion.is?("< 2.7")
|
|
438
475
|
|
|
439
|
-
#
|
|
440
|
-
|
|
441
|
-
|
|
476
|
+
# This file is 2.7+ only so we only require it here once we've checked the Ruby version
|
|
477
|
+
require "datadog/profiling/ext/exec_monkey_patch"
|
|
478
|
+
|
|
479
|
+
settings.profiling.advanced.shutdown_on_exec_enabled
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
private_class_method def self.enable_gvl_profiling?(settings, logger)
|
|
483
|
+
RubyVersion.is?(">= 3.2") && settings.profiling.advanced.gvl_enabled
|
|
442
484
|
end
|
|
443
485
|
end
|
|
444
486
|
end
|
|
@@ -13,24 +13,35 @@ module Datadog
|
|
|
13
13
|
# recorders, so I've decided to make it specific until we actually need to support more recorders.
|
|
14
14
|
#
|
|
15
15
|
class Exporter
|
|
16
|
+
# @rbs @worker: Datadog::Profiling::Collectors::CpuAndWallTimeWorker
|
|
17
|
+
|
|
16
18
|
# Profiles with duration less than this will not be reported
|
|
17
19
|
PROFILE_DURATION_THRESHOLD_SECONDS = 1
|
|
18
20
|
|
|
19
21
|
private
|
|
20
22
|
|
|
21
|
-
attr_reader
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
attr_reader :pprof_recorder #: Datadog::Profiling::StackRecorder
|
|
24
|
+
# The code provenance collector acts both as collector and as a recorder
|
|
25
|
+
attr_reader :code_provenance_collector #: Datadog::Profiling::Collectors::CodeProvenance?
|
|
26
|
+
attr_reader :minimum_duration_seconds #: ::Integer
|
|
27
|
+
attr_reader :time_provider #: singleton(::Time)
|
|
28
|
+
attr_reader :last_flush_finish_at #: ::Time?
|
|
29
|
+
attr_reader :created_at #: ::Time
|
|
30
|
+
attr_reader :internal_metadata #: ::Hash[::Symbol, untyped]
|
|
31
|
+
attr_reader :info_json #: ::String
|
|
32
|
+
attr_reader :sequence_tracker #: singleton(Datadog::Profiling::SequenceTracker)
|
|
31
33
|
|
|
32
34
|
public
|
|
33
35
|
|
|
36
|
+
# @rbs pprof_recorder: Datadog::Profiling::StackRecorder
|
|
37
|
+
# @rbs worker: Datadog::Profiling::Collectors::CpuAndWallTimeWorker
|
|
38
|
+
# @rbs info_collector: Datadog::Profiling::Collectors::Info
|
|
39
|
+
# @rbs code_provenance_collector: Datadog::Profiling::Collectors::CodeProvenance?
|
|
40
|
+
# @rbs internal_metadata: ::Hash[::Symbol, untyped]
|
|
41
|
+
# @rbs minimum_duration_seconds: ::Integer
|
|
42
|
+
# @rbs time_provider: singleton(::Time)
|
|
43
|
+
# @rbs sequence_tracker: singleton(Datadog::Profiling::SequenceTracker)
|
|
44
|
+
# @rbs return: void
|
|
34
45
|
def initialize(
|
|
35
46
|
pprof_recorder:,
|
|
36
47
|
worker:,
|
|
@@ -55,6 +66,7 @@ module Datadog
|
|
|
55
66
|
@sequence_tracker = sequence_tracker
|
|
56
67
|
end
|
|
57
68
|
|
|
69
|
+
#: () -> Datadog::Profiling::Flush?
|
|
58
70
|
def flush
|
|
59
71
|
worker_stats = @worker.stats_and_reset_not_thread_safe
|
|
60
72
|
serialization_result = pprof_recorder.serialize
|
|
@@ -68,18 +80,32 @@ module Datadog
|
|
|
68
80
|
return
|
|
69
81
|
end
|
|
70
82
|
|
|
71
|
-
uncompressed_code_provenance =
|
|
83
|
+
uncompressed_code_provenance =
|
|
84
|
+
if (collector = code_provenance_collector)
|
|
85
|
+
collector.refresh.generate_json
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
metrics = [] #: Array[[::String, ::Numeric]]
|
|
89
|
+
|
|
90
|
+
# The key is always there, but the value might be nil if GVL profiling is disabled.
|
|
91
|
+
# We delete it to avoid reporting the same data point twice.
|
|
92
|
+
gvl_waiting_time_ns_total = worker_stats.delete(:gvl_waiting_time_ns_total)
|
|
93
|
+
metrics << ["ruby_global_lock_wait_time_total", gvl_waiting_time_ns_total] if gvl_waiting_time_ns_total
|
|
94
|
+
|
|
95
|
+
process_tags = Datadog.configuration.experimental_propagate_process_tags_enabled ?
|
|
96
|
+
Core::Environment::Process.serialized : ''
|
|
72
97
|
|
|
73
98
|
Flush.new(
|
|
74
99
|
start: start,
|
|
75
100
|
finish: finish,
|
|
76
101
|
encoded_profile: encoded_profile,
|
|
77
|
-
code_provenance_file_name: Datadog::Profiling::Ext::Transport::HTTP::CODE_PROVENANCE_FILENAME,
|
|
78
102
|
code_provenance_data: uncompressed_code_provenance,
|
|
103
|
+
metrics: metrics,
|
|
79
104
|
tags_as_array: Datadog::Profiling::TagBuilder.call(
|
|
80
105
|
settings: Datadog.configuration,
|
|
81
106
|
profile_seq: sequence_tracker.get_next,
|
|
82
107
|
).to_a,
|
|
108
|
+
process_tags: process_tags,
|
|
83
109
|
internal_metadata: internal_metadata.merge(
|
|
84
110
|
{
|
|
85
111
|
worker_stats: worker_stats,
|
|
@@ -92,10 +118,12 @@ module Datadog
|
|
|
92
118
|
)
|
|
93
119
|
end
|
|
94
120
|
|
|
121
|
+
#: () -> bool
|
|
95
122
|
def can_flush?
|
|
96
123
|
!duration_below_threshold?(last_flush_finish_at || created_at, time_provider.now.utc)
|
|
97
124
|
end
|
|
98
125
|
|
|
126
|
+
#: () -> void
|
|
99
127
|
def reset_after_fork
|
|
100
128
|
@last_flush_finish_at = time_provider.now.utc
|
|
101
129
|
nil
|
|
@@ -103,6 +131,7 @@ module Datadog
|
|
|
103
131
|
|
|
104
132
|
private
|
|
105
133
|
|
|
134
|
+
#: (::Time, ::Time) -> bool
|
|
106
135
|
def duration_below_threshold?(start, finish)
|
|
107
136
|
(finish - start) < minimum_duration_seconds
|
|
108
137
|
end
|
|
@@ -4,9 +4,10 @@ module Datadog
|
|
|
4
4
|
module Profiling
|
|
5
5
|
# Monkey patches needed for profiler features and compatibility
|
|
6
6
|
module Ext
|
|
7
|
-
#
|
|
7
|
+
# Ruby versions before 3.4 have bugs in the `Dir` class implementation, causing issues such as
|
|
8
8
|
# https://github.com/DataDog/dd-trace-rb/issues/3450 .
|
|
9
|
-
#
|
|
9
|
+
# This was fixed upstream in https://bugs.ruby-lang.org/issues/20586 but we use this monkey patch to work around
|
|
10
|
+
# the issue on legacy versions (it gets applied by `Datadog::Profiling::Component`).
|
|
10
11
|
#
|
|
11
12
|
# This monkey patch for the Ruby `Dir` class works around these bugs for affected Ruby versions by temporarily
|
|
12
13
|
# blocking the profiler from interrupting system calls.
|
|
@@ -27,9 +28,13 @@ module Datadog
|
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
|
|
30
|
-
if
|
|
31
|
+
if RubyVersion.is?("< 3")
|
|
31
32
|
# Monkey patches for Dir.singleton_class (Ruby 2 version). See DirMonkeyPatches above for more details.
|
|
32
33
|
module DirClassMonkeyPatches
|
|
34
|
+
# Steep: Workaround that defines args and block only for Ruby 2.x.
|
|
35
|
+
# @type var args: ::Array[any]
|
|
36
|
+
# @type var block: ^(?) -> any | nil
|
|
37
|
+
|
|
33
38
|
def [](*args, &block)
|
|
34
39
|
Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_hold_signals
|
|
35
40
|
super
|
|
@@ -148,6 +153,11 @@ module Datadog
|
|
|
148
153
|
else
|
|
149
154
|
# Monkey patches for Dir.singleton_class (Ruby 3 version). See DirMonkeyPatches above for more details.
|
|
150
155
|
module DirClassMonkeyPatches
|
|
156
|
+
# Steep: Workaround that defines args, kwargs and block only for Ruby 3.x.
|
|
157
|
+
# @type var args: ::Array[any]
|
|
158
|
+
# @type var kwargs: ::Hash[::Symbol, any]
|
|
159
|
+
# @type var block: ^(?) -> any | nil
|
|
160
|
+
|
|
151
161
|
def [](*args, **kwargs, &block)
|
|
152
162
|
Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_hold_signals
|
|
153
163
|
super
|
|
@@ -260,9 +270,13 @@ module Datadog
|
|
|
260
270
|
end
|
|
261
271
|
end
|
|
262
272
|
|
|
263
|
-
if
|
|
273
|
+
if RubyVersion.is?("< 3")
|
|
264
274
|
# Monkey patches for Dir (Ruby 2 version). See DirMonkeyPatches above for more details.
|
|
265
275
|
module DirInstanceMonkeyPatches
|
|
276
|
+
# Steep: Workaround that defines args and block only for Ruby 2.x.
|
|
277
|
+
# @type var args: ::Array[any]
|
|
278
|
+
# @type var block: ^(?) -> any | nil
|
|
279
|
+
|
|
266
280
|
# See note on methods that yield above.
|
|
267
281
|
def each(*args, &block)
|
|
268
282
|
if block
|
|
@@ -286,7 +300,7 @@ module Datadog
|
|
|
286
300
|
end
|
|
287
301
|
end
|
|
288
302
|
|
|
289
|
-
|
|
303
|
+
if RubyVersion.is?(">= 2.6.0") # This method is Ruby 2.6+
|
|
290
304
|
# See note on methods that yield above.
|
|
291
305
|
def each_child(*args, &block)
|
|
292
306
|
if block
|
|
@@ -336,6 +350,11 @@ module Datadog
|
|
|
336
350
|
else
|
|
337
351
|
# Monkey patches for Dir (Ruby 3 version). See DirMonkeyPatches above for more details.
|
|
338
352
|
module DirInstanceMonkeyPatches
|
|
353
|
+
# Steep: Workaround that defines args, kwargs and block only for Ruby 3.x.
|
|
354
|
+
# @type var args: ::Array[any]
|
|
355
|
+
# @type var kwargs: ::Hash[::Symbol, any]
|
|
356
|
+
# @type var block: ^(?) -> any | nil
|
|
357
|
+
|
|
339
358
|
# See note on methods that yield above.
|
|
340
359
|
def each(*args, **kwargs, &block)
|
|
341
360
|
if block
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Profiling
|
|
5
|
+
module Ext
|
|
6
|
+
# The profiler gathers data by sending `SIGPROF` unix signals to Ruby application threads.
|
|
7
|
+
#
|
|
8
|
+
# When using `Kernel#exec` on Linux, it can happen that a signal sent before calling `exec` arrives after
|
|
9
|
+
# the new process is running, causing it to fail with the `Profiling timer expired` error message.
|
|
10
|
+
# To avoid this, the profiler installs a monkey patch on `Kernel#exec` to stop profiling before actually
|
|
11
|
+
# calling `exec`.
|
|
12
|
+
# This monkey patch is available for Ruby 2.7+; let us know if you need it on earlier Rubies.
|
|
13
|
+
# For more details see https://github.com/DataDog/dd-trace-rb/issues/5101 .
|
|
14
|
+
module ExecMonkeyPatch
|
|
15
|
+
def self.apply!
|
|
16
|
+
::Object.prepend(ObjectMonkeyPatch)
|
|
17
|
+
|
|
18
|
+
true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
module ObjectMonkeyPatch
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def exec(...)
|
|
25
|
+
Datadog.send(:components, allow_initialization: false)&.profiler&.shutdown!(report_last_profile: false)
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -6,32 +6,44 @@ module Datadog
|
|
|
6
6
|
module Profiling
|
|
7
7
|
# Entity class used to represent metadata for a given profile
|
|
8
8
|
class Flush
|
|
9
|
-
attr_reader
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
attr_reader :start #: ::Time
|
|
10
|
+
attr_reader :finish #: ::Time
|
|
11
|
+
attr_reader :encoded_profile #: Datadog::Profiling::EncodedProfile
|
|
12
|
+
attr_reader :code_provenance_data #: ::String?
|
|
13
|
+
attr_reader :metrics #: ::String
|
|
14
|
+
attr_reader :tags_as_array #: Array[[::String, ::String]]
|
|
15
|
+
attr_reader :process_tags #: ::String
|
|
16
|
+
attr_reader :internal_metadata_json #: ::String
|
|
17
|
+
attr_reader :info_json #: ::String
|
|
18
18
|
|
|
19
|
+
# @rbs start: ::Time
|
|
20
|
+
# @rbs finish: ::Time
|
|
21
|
+
# @rbs encoded_profile: Datadog::Profiling::EncodedProfile
|
|
22
|
+
# @rbs code_provenance_data: ::String?
|
|
23
|
+
# @rbs metrics: Array[[::String, ::Numeric]]
|
|
24
|
+
# @rbs tags_as_array: Array[[::String, ::String]]
|
|
25
|
+
# @rbs process_tags: ::String
|
|
26
|
+
# @rbs internal_metadata: ::Hash[::Symbol, ::String | bool | ::Numeric]
|
|
27
|
+
# @rbs info_json: ::String
|
|
28
|
+
# @rbs return: void
|
|
19
29
|
def initialize(
|
|
20
30
|
start:,
|
|
21
31
|
finish:,
|
|
22
32
|
encoded_profile:,
|
|
23
|
-
code_provenance_file_name:,
|
|
24
33
|
code_provenance_data:,
|
|
34
|
+
metrics:,
|
|
25
35
|
tags_as_array:,
|
|
36
|
+
process_tags:,
|
|
26
37
|
internal_metadata:,
|
|
27
38
|
info_json:
|
|
28
39
|
)
|
|
29
40
|
@start = start
|
|
30
41
|
@finish = finish
|
|
31
42
|
@encoded_profile = encoded_profile
|
|
32
|
-
@code_provenance_file_name = code_provenance_file_name
|
|
33
43
|
@code_provenance_data = code_provenance_data
|
|
44
|
+
@metrics = JSON.generate(metrics)
|
|
34
45
|
@tags_as_array = tags_as_array
|
|
46
|
+
@process_tags = process_tags
|
|
35
47
|
@internal_metadata_json = JSON.generate(internal_metadata)
|
|
36
48
|
@info_json = info_json
|
|
37
49
|
end
|
|
@@ -8,16 +8,27 @@ module Datadog
|
|
|
8
8
|
# Used to report profiling data to Datadog.
|
|
9
9
|
# Methods prefixed with _native_ are implemented in `http_transport.c`
|
|
10
10
|
class HttpTransport
|
|
11
|
-
|
|
11
|
+
# @rbs @exporter_configuration: exporter_configuration_array
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
@upload_timeout_milliseconds = (upload_timeout_seconds * 1_000).to_i
|
|
13
|
+
attr_reader :exporter_configuration #: exporter_configuration_array
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
# @rbs agent_settings: Datadog::Core::Configuration::AgentSettings
|
|
16
|
+
# @rbs site: ::String?
|
|
17
|
+
# @rbs api_key: ::String?
|
|
18
|
+
# @rbs upload_timeout_seconds: ::Integer
|
|
19
|
+
# @rbs use_system_dns: bool
|
|
20
|
+
# @rbs return: void
|
|
21
|
+
def initialize(agent_settings:, site:, api_key:, upload_timeout_seconds:, use_system_dns:)
|
|
22
|
+
timeout_milliseconds = (upload_timeout_seconds * 1_000).to_i
|
|
23
|
+
|
|
24
|
+
# Steep: multiple issues here
|
|
25
|
+
# first https://github.com/soutaro/steep/issues/363
|
|
26
|
+
# then https://github.com/soutaro/steep/issues/1603 (remove the .freeze to see it)
|
|
27
|
+
@exporter_configuration = # steep:ignore IncompatibleAssignment
|
|
17
28
|
if agentless?(site, api_key)
|
|
18
|
-
[:agentless, site, api_key].freeze
|
|
29
|
+
[:agentless, timeout_milliseconds, use_system_dns, site, api_key].freeze
|
|
19
30
|
else
|
|
20
|
-
[:agent, agent_settings.url].freeze
|
|
31
|
+
[:agent, timeout_milliseconds, use_system_dns, agent_settings.url].freeze
|
|
21
32
|
end
|
|
22
33
|
|
|
23
34
|
status, result = self.class._native_validate_exporter(exporter_configuration)
|
|
@@ -25,10 +36,10 @@ module Datadog
|
|
|
25
36
|
raise(ArgumentError, "Failed to initialize transport: #{result}") if status == :error
|
|
26
37
|
end
|
|
27
38
|
|
|
39
|
+
#: (Datadog::Profiling::Flush) -> bool
|
|
28
40
|
def export(flush)
|
|
29
41
|
status, result = self.class._native_do_export(
|
|
30
42
|
exporter_configuration,
|
|
31
|
-
@upload_timeout_milliseconds,
|
|
32
43
|
flush
|
|
33
44
|
)
|
|
34
45
|
|
|
@@ -55,12 +66,14 @@ module Datadog
|
|
|
55
66
|
|
|
56
67
|
private
|
|
57
68
|
|
|
69
|
+
#: (::String?, ::String?) -> bool?
|
|
58
70
|
def agentless?(site, api_key)
|
|
59
71
|
site && api_key && %w[1 true].include?(ENV[Profiling::Ext::ENV_AGENTLESS] || '') # rubocop:disable CustomCops/EnvUsageCop
|
|
60
72
|
end
|
|
61
73
|
|
|
74
|
+
#: () -> ::String
|
|
62
75
|
def config_without_api_key
|
|
63
|
-
"#{exporter_configuration[0]}: #{exporter_configuration[
|
|
76
|
+
"#{exporter_configuration[0]}: #{exporter_configuration[3]}"
|
|
64
77
|
end
|
|
65
78
|
end
|
|
66
79
|
end
|
|
@@ -4,6 +4,6 @@ begin
|
|
|
4
4
|
require "datadog_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}"
|
|
5
5
|
rescue LoadError => e
|
|
6
6
|
raise LoadError,
|
|
7
|
-
"Failed to load the profiling
|
|
8
|
-
"(Details: #{e.message})"
|
|
7
|
+
"Failed to load the profiling native extension. To fix this, please remove and then reinstall datadog " \
|
|
8
|
+
"(Details: #{e.class}: #{e.message})"
|
|
9
9
|
end
|