datadog 2.17.0 → 2.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +686 -1
- data/README.md +0 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
- data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
- data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
- data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +344 -126
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -4
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +18 -4
- data/ext/datadog_profiling_native_extension/collectors_stack.c +314 -91
- data/ext/datadog_profiling_native_extension/collectors_stack.h +26 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +680 -352
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +18 -5
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +65 -1
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +40 -1
- data/ext/datadog_profiling_native_extension/encoded_profile.c +2 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +48 -34
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
- data/ext/datadog_profiling_native_extension/heap_recorder.c +455 -430
- data/ext/datadog_profiling_native_extension/heap_recorder.h +16 -7
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +18 -15
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -10
- data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +73 -69
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -4
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +64 -59
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +20 -16
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +32 -10
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +2 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +253 -131
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +1 -0
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +2 -1
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +9 -4
- data/ext/libdatadog_api/crashtracker.c +16 -15
- data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +65 -1
- data/ext/libdatadog_api/datadog_ruby_common.h +40 -1
- data/ext/libdatadog_api/ddsketch.c +102 -0
- data/ext/libdatadog_api/di.c +203 -0
- data/ext/libdatadog_api/extconf.rb +21 -25
- data/ext/libdatadog_api/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/helpers.h +27 -0
- data/ext/libdatadog_api/init.c +13 -1
- data/ext/libdatadog_api/library_config.c +88 -37
- data/ext/libdatadog_api/library_config.h +6 -0
- data/ext/libdatadog_api/process_discovery.c +25 -24
- data/ext/libdatadog_extconf_helpers.rb +107 -14
- data/lib/datadog/ai_guard/api_client.rb +84 -0
- data/lib/datadog/ai_guard/autoload.rb +10 -0
- data/lib/datadog/ai_guard/component.rb +44 -0
- data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
- data/lib/datadog/ai_guard/configuration.rb +115 -0
- data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
- data/lib/datadog/ai_guard/contrib/integration.rb +37 -0
- data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
- data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
- data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
- data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +80 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +30 -0
- data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
- data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +86 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +45 -0
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
- data/lib/datadog/ai_guard/evaluation.rb +108 -0
- data/lib/datadog/ai_guard/ext.rb +29 -0
- data/lib/datadog/ai_guard.rb +181 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +66 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +36 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +104 -0
- data/lib/datadog/appsec/api_security/sampler.rb +62 -0
- data/lib/datadog/appsec/api_security.rb +14 -0
- data/lib/datadog/appsec/assets/blocked.html +10 -1
- data/lib/datadog/appsec/assets/blocked.json +1 -1
- data/lib/datadog/appsec/assets/blocked.text +3 -1
- data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
- data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +2 -2
- data/lib/datadog/appsec/component.rb +37 -64
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +77 -16
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
- data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -1
- data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
- data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
- data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +144 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +4 -2
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +152 -13
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +138 -13
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +74 -24
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +4 -2
- data/lib/datadog/appsec/contrib/graphql/integration.rb +2 -1
- data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +47 -13
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +40 -19
- data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +80 -62
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +35 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +47 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +52 -26
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +29 -0
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +167 -12
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +63 -10
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -21
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
- data/lib/datadog/appsec/counter_sampler.rb +25 -0
- data/lib/datadog/appsec/default_header_tags.rb +52 -0
- data/lib/datadog/appsec/event.rb +14 -47
- data/lib/datadog/appsec/ext.rb +3 -0
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +17 -1
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
- data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
- data/lib/datadog/appsec/metrics/collector.rb +47 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +21 -4
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +47 -0
- data/lib/datadog/appsec/metrics.rb +5 -4
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/processor/rule_loader.rb +5 -6
- data/lib/datadog/appsec/remote.rb +51 -76
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
- data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
- data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
- data/lib/datadog/appsec/route_normalizer.rb +80 -0
- data/lib/datadog/appsec/security_engine/engine.rb +197 -0
- data/lib/datadog/appsec/security_engine/result.rb +45 -9
- data/lib/datadog/appsec/security_engine/runner.rb +44 -21
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
- data/lib/datadog/appsec/trace_keeper.rb +36 -0
- data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
- data/lib/datadog/appsec/utils/http/body.rb +38 -0
- data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +2 -1
- data/lib/datadog/appsec/utils/http/media_type.rb +32 -26
- data/lib/datadog/appsec/utils/http/url_encoded.rb +52 -0
- data/lib/datadog/appsec.rb +10 -17
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -47
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +192 -20
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +109 -0
- data/lib/datadog/core/configuration/deprecations.rb +36 -0
- data/lib/datadog/core/configuration/ext.rb +0 -1
- data/lib/datadog/core/configuration/option.rb +95 -65
- data/lib/datadog/core/configuration/option_definition.rb +42 -23
- data/lib/datadog/core/configuration/options.rb +57 -18
- data/lib/datadog/core/configuration/settings.rb +160 -25
- data/lib/datadog/core/configuration/stable_config.rb +11 -2
- data/lib/datadog/core/configuration/supported_configurations.rb +413 -0
- data/lib/datadog/core/configuration.rb +4 -4
- data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
- data/lib/datadog/core/contrib/rails/utils.rb +7 -3
- data/lib/datadog/core/crashtracking/component.rb +73 -21
- data/lib/datadog/core/crashtracking/tag_builder.rb +9 -21
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
- data/lib/datadog/core/environment/agent_info.rb +65 -1
- data/lib/datadog/core/environment/cgroup.rb +52 -25
- data/lib/datadog/core/environment/container.rb +140 -46
- data/lib/datadog/core/environment/ext.rb +13 -2
- data/lib/datadog/core/environment/git.rb +2 -2
- data/lib/datadog/core/environment/identity.rb +40 -4
- data/lib/datadog/core/environment/process.rb +122 -0
- data/lib/datadog/core/environment/socket.rb +13 -0
- data/lib/datadog/core/environment/variable_helpers.rb +3 -3
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +6 -6
- data/lib/datadog/core/evp.rb +11 -0
- data/lib/datadog/core/feature_flags.rb +61 -0
- data/lib/datadog/core/knuth_sampler.rb +57 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +7 -7
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
- data/lib/datadog/core/process_discovery.rb +51 -21
- data/lib/datadog/core/rate_limiter.rb +11 -1
- data/lib/datadog/core/remote/client/capabilities.rb +49 -6
- data/lib/datadog/core/remote/client.rb +15 -7
- data/lib/datadog/core/remote/component.rb +64 -36
- data/lib/datadog/core/remote/configuration/content.rb +15 -2
- data/lib/datadog/core/remote/configuration/digest.rb +14 -7
- data/lib/datadog/core/remote/configuration/repository.rb +13 -1
- data/lib/datadog/core/remote/configuration/target.rb +13 -6
- data/lib/datadog/core/remote/transport/config.rb +9 -36
- data/lib/datadog/core/remote/transport/http/config.rb +15 -55
- data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
- data/lib/datadog/core/remote/transport/http.rb +15 -24
- data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
- data/lib/datadog/core/remote/worker.rb +25 -37
- data/lib/datadog/core/runtime/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +52 -0
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +65 -17
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -3
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +203 -89
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/event.rb +2 -7
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/logger.rb +5 -2
- data/lib/datadog/core/telemetry/logging.rb +22 -4
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -5
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +8 -34
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +8 -17
- data/lib/datadog/core/telemetry/worker.rb +108 -32
- data/lib/datadog/core/transport/ext.rb +3 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
- data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +11 -7
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/transport/http/response.rb +4 -0
- data/lib/datadog/core/transport/http.rb +24 -19
- data/lib/datadog/core/transport/parcel.rb +61 -9
- data/lib/datadog/core/transport/response.rb +16 -2
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +1 -1
- data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +4 -3
- data/lib/datadog/core/utils/enumerable_compat.rb +29 -0
- data/lib/datadog/core/utils/fnv.rb +26 -0
- data/lib/datadog/core/utils/forking.rb +3 -1
- data/lib/datadog/core/utils/hash.rb +0 -23
- data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -14
- data/lib/datadog/core/utils/network.rb +22 -1
- data/lib/datadog/core/utils/only_once.rb +1 -1
- data/lib/datadog/core/utils/only_once_successful.rb +8 -2
- data/lib/datadog/core/utils/safe_dup.rb +2 -2
- data/lib/datadog/core/utils/sequence.rb +2 -0
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
- data/lib/datadog/core/utils/time.rb +1 -1
- data/lib/datadog/core/utils.rb +10 -1
- data/lib/datadog/core/workers/async.rb +11 -2
- data/lib/datadog/core/workers/interval_loop.rb +51 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +96 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
- data/lib/datadog/core.rb +11 -2
- data/lib/datadog/data_streams/configuration.rb +50 -0
- data/lib/datadog/data_streams/ext.rb +11 -0
- data/lib/datadog/data_streams/extensions.rb +16 -0
- data/lib/datadog/data_streams/pathway_context.rb +169 -0
- data/lib/datadog/data_streams/processor.rb +511 -0
- data/lib/datadog/data_streams/transport/http/stats.rb +58 -0
- data/lib/datadog/data_streams/transport/http.rb +36 -0
- data/lib/datadog/data_streams/transport/stats.rb +39 -0
- data/lib/datadog/data_streams.rb +100 -0
- data/lib/datadog/di/base.rb +15 -7
- data/lib/datadog/di/boot.rb +11 -1
- data/lib/datadog/di/code_tracker.rb +217 -15
- data/lib/datadog/di/component.rb +143 -48
- data/lib/datadog/di/configuration.rb +235 -2
- data/lib/datadog/di/context.rb +76 -0
- data/lib/datadog/di/contrib/active_record.rb +34 -5
- data/lib/datadog/di/el/compiler.rb +168 -0
- data/lib/datadog/di/el/evaluator.rb +159 -0
- data/lib/datadog/di/el/expression.rb +42 -0
- data/lib/datadog/di/el.rb +5 -0
- data/lib/datadog/di/error.rb +44 -0
- data/lib/datadog/di/fatal_exceptions.rb +26 -0
- data/lib/datadog/di/instrumenter.rb +620 -132
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +78 -15
- data/lib/datadog/di/probe_builder.rb +42 -3
- data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
- data/lib/datadog/di/probe_file_loader.rb +87 -0
- data/lib/datadog/di/probe_manager.rb +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +285 -100
- data/lib/datadog/di/probe_notifier_worker.rb +120 -36
- data/lib/datadog/di/probe_repository.rb +198 -0
- data/lib/datadog/di/proc_responder.rb +36 -0
- data/lib/datadog/di/redactor.rb +24 -2
- data/lib/datadog/di/remote.rb +258 -95
- data/lib/datadog/di/serializer.rb +297 -20
- data/lib/datadog/di/transport/diagnostics.rb +12 -42
- data/lib/datadog/di/transport/http/diagnostics.rb +4 -34
- data/lib/datadog/di/transport/http/input.rb +12 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +121 -39
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +203 -10
- data/lib/datadog/error_tracking/collector.rb +2 -1
- data/lib/datadog/error_tracking/component.rb +2 -2
- data/lib/datadog/error_tracking/configuration.rb +55 -2
- data/lib/datadog/error_tracking/filters.rb +2 -2
- data/lib/datadog/kit/appsec/events/v2.rb +253 -0
- data/lib/datadog/kit/appsec/events.rb +11 -10
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/kit/identity.rb +17 -11
- data/lib/datadog/kit/tracing/method_tracer.rb +135 -0
- data/lib/datadog/open_feature/component.rb +100 -0
- data/lib/datadog/open_feature/configuration.rb +37 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
- data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
- data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
- data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
- data/lib/datadog/open_feature/exposures/event.rb +60 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
- data/lib/datadog/open_feature/exposures/worker.rb +116 -0
- data/lib/datadog/open_feature/ext.rb +16 -0
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
- data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +101 -0
- data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +49 -0
- data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
- data/lib/datadog/open_feature/native_evaluator.rb +60 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +191 -0
- data/lib/datadog/open_feature/remote.rb +67 -0
- data/lib/datadog/open_feature/resolution_details.rb +35 -0
- data/lib/datadog/open_feature/transport.rb +121 -0
- data/lib/datadog/open_feature.rb +19 -0
- data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
- data/lib/datadog/opentelemetry/api/context.rb +10 -9
- data/lib/datadog/opentelemetry/configuration/settings.rb +226 -0
- data/lib/datadog/opentelemetry/ext.rb +9 -0
- data/lib/datadog/opentelemetry/logs.rb +98 -0
- data/lib/datadog/opentelemetry/metrics.rb +90 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +66 -2
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
- data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +28 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +13 -7
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +12 -9
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +83 -15
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -3
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -4
- data/lib/datadog/profiling/collectors/info.rb +59 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -5
- data/lib/datadog/profiling/component.rb +73 -49
- data/lib/datadog/profiling/exporter.rb +48 -13
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +24 -5
- data/lib/datadog/profiling/ext/exec_monkey_patch.rb +32 -0
- data/lib/datadog/profiling/ext.rb +2 -15
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +24 -11
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -12
- data/lib/datadog/profiling/scheduler.rb +12 -10
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +5 -13
- data/lib/datadog/profiling/tag_builder.rb +42 -38
- data/lib/datadog/profiling/tasks/exec.rb +10 -5
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +4 -2
- data/lib/datadog/profiling.rb +8 -11
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +10 -1
- data/lib/datadog/symbol_database/component.rb +734 -0
- data/lib/datadog/symbol_database/configuration.rb +73 -0
- data/lib/datadog/symbol_database/extensions.rb +19 -0
- data/lib/datadog/symbol_database/extractor.rb +1110 -0
- data/lib/datadog/symbol_database/file_hash.rb +48 -0
- data/lib/datadog/symbol_database/logger.rb +43 -0
- data/lib/datadog/symbol_database/remote.rb +180 -0
- data/lib/datadog/symbol_database/scope.rb +102 -0
- data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
- data/lib/datadog/symbol_database/service_version.rb +66 -0
- data/lib/datadog/symbol_database/symbol.rb +69 -0
- data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
- data/lib/datadog/symbol_database/transport/http.rb +45 -0
- data/lib/datadog/symbol_database/transport.rb +54 -0
- data/lib/datadog/symbol_database/uploader.rb +230 -0
- data/lib/datadog/symbol_database.rb +71 -0
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +10 -10
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
- data/lib/datadog/tracing/configuration/ext.rb +25 -5
- data/lib/datadog/tracing/configuration/settings.rb +125 -11
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +29 -11
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +47 -12
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +7 -10
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +16 -16
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +15 -12
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +8 -10
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +8 -10
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
- data/lib/datadog/tracing/contrib/component.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +22 -7
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +47 -53
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +7 -8
- data/lib/datadog/tracing/contrib/ethon/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/excon/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -9
- data/lib/datadog/tracing/contrib/ext.rb +6 -4
- data/lib/datadog/tracing/contrib/extensions.rb +28 -11
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +7 -9
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +18 -15
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +105 -63
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -15
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -10
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +2 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +10 -11
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +9 -13
- data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/http.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +10 -10
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +8 -12
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +24 -13
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +39 -8
- data/lib/datadog/tracing/contrib/karafka.rb +1 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +6 -6
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +11 -14
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +64 -70
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/patcher.rb +7 -9
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +9 -11
- data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +13 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +6 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +25 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +2 -6
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +55 -32
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +83 -44
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +126 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/rails/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/rails/runner.rb +64 -40
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +10 -8
- data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/tags.rb +2 -7
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +6 -4
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -9
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +8 -3
- data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +6 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +2 -1
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -6
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +8 -4
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +40 -39
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +15 -4
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +15 -13
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +31 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +18 -0
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop.rb +42 -0
- data/lib/datadog/tracing/contrib.rb +9 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +12 -4
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +133 -12
- data/lib/datadog/tracing/distributed/datadog.rb +17 -16
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -26
- data/lib/datadog/tracing/distributed/helpers.rb +1 -1
- data/lib/datadog/tracing/distributed/none.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +39 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
- data/lib/datadog/tracing/distributed/trace_context.rb +107 -78
- data/lib/datadog/tracing/event.rb +5 -7
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +6 -6
- data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
- data/lib/datadog/tracing/pipeline.rb +2 -2
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -2
- data/lib/datadog/tracing/sampling/priority_sampler.rb +16 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +8 -19
- data/lib/datadog/tracing/sampling/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +77 -48
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +3 -3
- data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
- data/lib/datadog/tracing/span.rb +2 -2
- data/lib/datadog/tracing/span_event.rb +12 -12
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +63 -19
- data/lib/datadog/tracing/sync_writer.rb +1 -2
- data/lib/datadog/tracing/trace_digest.rb +28 -23
- data/lib/datadog/tracing/trace_operation.rb +209 -98
- data/lib/datadog/tracing/trace_segment.rb +2 -2
- data/lib/datadog/tracing/tracer.rb +113 -52
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +4 -52
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +11 -14
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +14 -82
- data/lib/datadog/tracing/workers.rb +4 -3
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/tracing.rb +2 -2
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +14 -0
- metadata +201 -40
- data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -321
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -1023
- data/lib/datadog/appsec/configuration/settings.rb +0 -342
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -171
- data/lib/datadog/appsec/processor.rb +0 -107
- data/lib/datadog/core/remote/transport/http/api.rb +0 -53
- data/lib/datadog/core/remote/transport/http/client.rb +0 -49
- data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
- data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
- data/lib/datadog/core/transport/http/api/spec.rb +0 -36
- data/lib/datadog/di/configuration/settings.rb +0 -212
- data/lib/datadog/di/transport/http/api.rb +0 -42
- data/lib/datadog/di/transport/http/client.rb +0 -47
- data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -199
|
@@ -14,8 +14,17 @@ module Datadog
|
|
|
14
14
|
# could be seen as overkill for this case but it allows us to centralize information
|
|
15
15
|
# gathering and easily support more flexible/dynamic info collection in the future.
|
|
16
16
|
class Info
|
|
17
|
+
# @rbs @info: ::Hash[::Symbol, ::Hash[::Symbol, untyped]]
|
|
18
|
+
# @rbs @platform_info: ::Hash[::Symbol, untyped]
|
|
19
|
+
# @rbs @runtime_info: ::Hash[::Symbol, untyped]
|
|
20
|
+
# @rbs @application_info: ::Hash[::Symbol, untyped]
|
|
21
|
+
# @rbs @profiler_info: ::Hash[::Symbol, untyped]?
|
|
22
|
+
# @rbs @gc_tuning_info: ::Hash[::Symbol, ::String]
|
|
23
|
+
|
|
24
|
+
#: (untyped) -> void
|
|
17
25
|
def initialize(settings)
|
|
18
26
|
@profiler_info = nil
|
|
27
|
+
|
|
19
28
|
@info = {
|
|
20
29
|
platform: collect_platform_info,
|
|
21
30
|
runtime: collect_runtime_info,
|
|
@@ -24,10 +33,41 @@ module Datadog
|
|
|
24
33
|
}.freeze
|
|
25
34
|
end
|
|
26
35
|
|
|
27
|
-
attr_reader :info
|
|
36
|
+
attr_reader :info #: ::Hash[::Symbol, ::Hash[::Symbol, untyped]]
|
|
28
37
|
|
|
29
38
|
private
|
|
30
39
|
|
|
40
|
+
# Ruby GC tuning environment variables
|
|
41
|
+
RUBY_GC_TUNING_ENV_VARS = [
|
|
42
|
+
"RUBY_GC_HEAP_FREE_SLOTS",
|
|
43
|
+
"RUBY_GC_HEAP_GROWTH_FACTOR",
|
|
44
|
+
"RUBY_GC_HEAP_GROWTH_MAX_SLOTS",
|
|
45
|
+
"RUBY_GC_HEAP_FREE_SLOTS_MIN_RATIO",
|
|
46
|
+
"RUBY_GC_HEAP_FREE_SLOTS_MAX_RATIO",
|
|
47
|
+
"RUBY_GC_HEAP_FREE_SLOTS_GOAL_RATIO",
|
|
48
|
+
"RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR",
|
|
49
|
+
"RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO",
|
|
50
|
+
"RUBY_GC_MALLOC_LIMIT",
|
|
51
|
+
"RUBY_GC_MALLOC_LIMIT_MAX",
|
|
52
|
+
"RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR",
|
|
53
|
+
"RUBY_GC_OLDMALLOC_LIMIT",
|
|
54
|
+
"RUBY_GC_OLDMALLOC_LIMIT_MAX",
|
|
55
|
+
"RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR",
|
|
56
|
+
# INIT_SLOTS changed for Ruby 3.3+:
|
|
57
|
+
# * https://bugs.ruby-lang.org/issues/19785
|
|
58
|
+
# * https://www.ruby-lang.org/en/news/2023/12/25/ruby-3-3-0-released/#:~:text=Removed%20environment%20variables
|
|
59
|
+
"RUBY_GC_HEAP_0_INIT_SLOTS",
|
|
60
|
+
"RUBY_GC_HEAP_1_INIT_SLOTS",
|
|
61
|
+
"RUBY_GC_HEAP_2_INIT_SLOTS",
|
|
62
|
+
"RUBY_GC_HEAP_3_INIT_SLOTS",
|
|
63
|
+
"RUBY_GC_HEAP_4_INIT_SLOTS",
|
|
64
|
+
# There was only one setting for older Rubies:
|
|
65
|
+
"RUBY_GC_HEAP_INIT_SLOTS",
|
|
66
|
+
# Ruby 2.x only, alias for others:
|
|
67
|
+
"RUBY_FREE_MIN",
|
|
68
|
+
"RUBY_HEAP_MIN_SLOTS",
|
|
69
|
+
].freeze
|
|
70
|
+
|
|
31
71
|
# Instead of trying to figure out real process start time by checking
|
|
32
72
|
# /proc or some other complex/non-portable way, approximate start time
|
|
33
73
|
# by time of requirement of this file.
|
|
@@ -36,6 +76,7 @@ module Datadog
|
|
|
36
76
|
# gets initialized before a user has a chance to configure the library.
|
|
37
77
|
START_TIME = Time.now.utc.freeze
|
|
38
78
|
|
|
79
|
+
#: () -> ::Hash[::Symbol, untyped]
|
|
39
80
|
def collect_platform_info
|
|
40
81
|
@platform_info ||= {
|
|
41
82
|
container_id: Datadog::Core::Environment::Container.container_id,
|
|
@@ -46,14 +87,17 @@ module Datadog
|
|
|
46
87
|
}.freeze
|
|
47
88
|
end
|
|
48
89
|
|
|
90
|
+
#: () -> ::Hash[::Symbol, untyped]
|
|
49
91
|
def collect_runtime_info
|
|
50
92
|
@runtime_info ||= {
|
|
51
93
|
engine: Datadog::Core::Environment::Identity.lang_engine,
|
|
52
94
|
version: Datadog::Core::Environment::Identity.lang_version,
|
|
53
95
|
platform: Datadog::Core::Environment::Identity.lang_platform,
|
|
96
|
+
gc_tuning: collect_gc_tuning_info,
|
|
54
97
|
}.freeze
|
|
55
98
|
end
|
|
56
99
|
|
|
100
|
+
#: (untyped) -> ::Hash[::Symbol, untyped]
|
|
57
101
|
def collect_application_info(settings)
|
|
58
102
|
@application_info ||= {
|
|
59
103
|
start_time: START_TIME.iso8601,
|
|
@@ -63,8 +107,9 @@ module Datadog
|
|
|
63
107
|
}.freeze
|
|
64
108
|
end
|
|
65
109
|
|
|
110
|
+
#: (untyped) -> ::Hash[::Symbol, untyped]
|
|
66
111
|
def collect_profiler_info(settings)
|
|
67
|
-
|
|
112
|
+
@profiler_info ||= begin
|
|
68
113
|
lib_datadog_gem = ::Gem.loaded_specs["libdatadog"]
|
|
69
114
|
|
|
70
115
|
libdatadog_version =
|
|
@@ -76,13 +121,12 @@ module Datadog
|
|
|
76
121
|
"#{Libdatadog::VERSION}-(unknown)"
|
|
77
122
|
end
|
|
78
123
|
|
|
79
|
-
|
|
124
|
+
{
|
|
80
125
|
version: Datadog::Core::Environment::Identity.gem_datadog_version,
|
|
81
126
|
libdatadog: libdatadog_version,
|
|
82
127
|
settings: collect_settings_recursively(settings.profiling),
|
|
83
128
|
}.freeze
|
|
84
129
|
end
|
|
85
|
-
@profiler_info
|
|
86
130
|
end
|
|
87
131
|
|
|
88
132
|
# The settings/option model isn't directly serializable because
|
|
@@ -90,6 +134,7 @@ module Datadog
|
|
|
90
134
|
# instances without proper serialization.
|
|
91
135
|
# This method navigates a settings object recursively, converting
|
|
92
136
|
# it into more basic types that are trivially convertible to JSON.
|
|
137
|
+
#: (untyped) -> untyped
|
|
93
138
|
def collect_settings_recursively(v)
|
|
94
139
|
v = v.options_hash if v.respond_to?(:options_hash)
|
|
95
140
|
|
|
@@ -109,6 +154,16 @@ module Datadog
|
|
|
109
154
|
v.inspect
|
|
110
155
|
end
|
|
111
156
|
end
|
|
157
|
+
|
|
158
|
+
#: () -> ::Hash[::Symbol, ::String]
|
|
159
|
+
def collect_gc_tuning_info
|
|
160
|
+
return @gc_tuning_info if defined?(@gc_tuning_info)
|
|
161
|
+
|
|
162
|
+
@gc_tuning_info = RUBY_GC_TUNING_ENV_VARS.each_with_object({}) do |var, hash|
|
|
163
|
+
current_value = DATADOG_ENV[var]
|
|
164
|
+
hash[var.to_sym] = current_value if current_value
|
|
165
|
+
end.freeze
|
|
166
|
+
end
|
|
112
167
|
end
|
|
113
168
|
end
|
|
114
169
|
end
|
|
@@ -19,9 +19,9 @@ module Datadog
|
|
|
19
19
|
max_frames:,
|
|
20
20
|
tracer:,
|
|
21
21
|
endpoint_collection_enabled:,
|
|
22
|
-
timeline_enabled:,
|
|
23
22
|
waiting_for_gvl_threshold_ns:,
|
|
24
|
-
otel_context_enabled
|
|
23
|
+
otel_context_enabled:,
|
|
24
|
+
native_filenames_enabled:
|
|
25
25
|
)
|
|
26
26
|
tracer_context_key = safely_extract_context_key_from(tracer)
|
|
27
27
|
self.class._native_initialize(
|
|
@@ -30,9 +30,10 @@ module Datadog
|
|
|
30
30
|
max_frames: max_frames,
|
|
31
31
|
tracer_context_key: tracer_context_key,
|
|
32
32
|
endpoint_collection_enabled: endpoint_collection_enabled,
|
|
33
|
-
timeline_enabled: timeline_enabled,
|
|
34
33
|
waiting_for_gvl_threshold_ns: waiting_for_gvl_threshold_ns,
|
|
35
34
|
otel_context_enabled: otel_context_enabled,
|
|
35
|
+
native_filenames_enabled: validate_native_filenames(native_filenames_enabled),
|
|
36
|
+
overhead_filename: __FILE__,
|
|
36
37
|
)
|
|
37
38
|
end
|
|
38
39
|
|
|
@@ -41,9 +42,9 @@ module Datadog
|
|
|
41
42
|
max_frames: 400,
|
|
42
43
|
tracer: nil,
|
|
43
44
|
endpoint_collection_enabled: false,
|
|
44
|
-
timeline_enabled: false,
|
|
45
45
|
waiting_for_gvl_threshold_ns: 10_000_000,
|
|
46
46
|
otel_context_enabled: false,
|
|
47
|
+
native_filenames_enabled: true,
|
|
47
48
|
**options
|
|
48
49
|
)
|
|
49
50
|
new(
|
|
@@ -51,9 +52,9 @@ module Datadog
|
|
|
51
52
|
max_frames: max_frames,
|
|
52
53
|
tracer: tracer,
|
|
53
54
|
endpoint_collection_enabled: endpoint_collection_enabled,
|
|
54
|
-
timeline_enabled: timeline_enabled,
|
|
55
55
|
waiting_for_gvl_threshold_ns: waiting_for_gvl_threshold_ns,
|
|
56
56
|
otel_context_enabled: otel_context_enabled,
|
|
57
|
+
native_filenames_enabled: native_filenames_enabled,
|
|
57
58
|
**options,
|
|
58
59
|
)
|
|
59
60
|
end
|
|
@@ -81,6 +82,17 @@ module Datadog
|
|
|
81
82
|
context = provider.instance_variable_get(:@context)
|
|
82
83
|
context&.instance_variable_get(:@key)
|
|
83
84
|
end
|
|
85
|
+
|
|
86
|
+
def validate_native_filenames(native_filenames_enabled)
|
|
87
|
+
if native_filenames_enabled && !Datadog::Profiling::Collectors::Stack._native_filenames_available?
|
|
88
|
+
Datadog.logger.debug(
|
|
89
|
+
"Native filenames are enabled, but the required dladdr API was not available. Disabling native filenames."
|
|
90
|
+
)
|
|
91
|
+
false
|
|
92
|
+
else
|
|
93
|
+
native_filenames_enabled
|
|
94
|
+
end
|
|
95
|
+
end
|
|
84
96
|
end
|
|
85
97
|
end
|
|
86
98
|
end
|
|
@@ -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,
|
|
@@ -67,11 +63,12 @@ module Datadog
|
|
|
67
63
|
allocation_profiling_enabled: allocation_profiling_enabled,
|
|
68
64
|
allocation_counting_enabled: settings.profiling.advanced.allocation_counting_enabled,
|
|
69
65
|
gvl_profiling_enabled: enable_gvl_profiling?(settings, logger),
|
|
66
|
+
sighandler_sampling_enabled: settings.profiling.advanced.sighandler_sampling_enabled,
|
|
67
|
+
cpu_sampling_interval_ms: cpu_sampling_interval_ms,
|
|
70
68
|
)
|
|
71
69
|
|
|
72
70
|
internal_metadata = {
|
|
73
71
|
no_signals_workaround_enabled: no_signals_workaround_enabled,
|
|
74
|
-
timeline_enabled: timeline_enabled,
|
|
75
72
|
heap_sample_every: heap_sample_every,
|
|
76
73
|
}.freeze
|
|
77
74
|
|
|
@@ -84,18 +81,30 @@ module Datadog
|
|
|
84
81
|
Datadog::Profiling::Ext::DirMonkeyPatches.apply!
|
|
85
82
|
end
|
|
86
83
|
|
|
84
|
+
if can_apply_exec_monkey_patch?(settings)
|
|
85
|
+
Datadog::Profiling::Ext::ExecMonkeyPatch.apply!
|
|
86
|
+
end
|
|
87
|
+
|
|
87
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}]
|
|
88
97
|
end
|
|
89
98
|
|
|
90
|
-
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)
|
|
91
100
|
Datadog::Profiling::Collectors::ThreadContext.new(
|
|
92
101
|
recorder: recorder,
|
|
93
102
|
max_frames: settings.profiling.advanced.max_frames,
|
|
94
103
|
tracer: optional_tracer,
|
|
95
104
|
endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
|
|
96
|
-
timeline_enabled: timeline_enabled,
|
|
97
105
|
waiting_for_gvl_threshold_ns: settings.profiling.advanced.waiting_for_gvl_threshold_ns,
|
|
98
106
|
otel_context_enabled: settings.profiling.advanced.preview_otel_context_enabled,
|
|
107
|
+
native_filenames_enabled: settings.profiling.advanced.native_filenames_enabled,
|
|
99
108
|
)
|
|
100
109
|
end
|
|
101
110
|
|
|
@@ -120,6 +129,7 @@ module Datadog
|
|
|
120
129
|
site: settings.site,
|
|
121
130
|
api_key: settings.api_key,
|
|
122
131
|
upload_timeout_seconds: settings.profiling.upload.timeout_seconds,
|
|
132
|
+
use_system_dns: settings.profiling.advanced.experimental_use_system_dns,
|
|
123
133
|
)
|
|
124
134
|
end
|
|
125
135
|
|
|
@@ -131,19 +141,18 @@ module Datadog
|
|
|
131
141
|
# that causes a segmentation fault during garbage collection of Ractors
|
|
132
142
|
# (https://bugs.ruby-lang.org/issues/18464). We don't allow enabling gc profiling on such Rubies.
|
|
133
143
|
# This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
|
|
134
|
-
if
|
|
135
|
-
|
|
136
|
-
(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")
|
|
137
146
|
logger.warn(
|
|
138
147
|
"Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling GC profiling would cause " \
|
|
139
148
|
"crashes (https://bugs.ruby-lang.org/issues/18464). GC profiling has been disabled."
|
|
140
149
|
)
|
|
141
150
|
return false
|
|
142
|
-
elsif
|
|
151
|
+
elsif RubyVersion.is?(">= 3", "< 4")
|
|
143
152
|
logger.debug(
|
|
144
153
|
"Using Ractors may result in GC profiling unexpectedly " \
|
|
145
154
|
"stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your " \
|
|
146
|
-
"application stability or performance. This
|
|
155
|
+
"application stability or performance. This issue is fixed on Ruby 4."
|
|
147
156
|
)
|
|
148
157
|
end
|
|
149
158
|
|
|
@@ -167,7 +176,7 @@ module Datadog
|
|
|
167
176
|
# Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482,
|
|
168
177
|
# https://github.com/ruby/ruby/pull/7464) that makes this crash in any configuration. This bug is
|
|
169
178
|
# fixed on Ruby versions 3.2.3 and 3.3.0.
|
|
170
|
-
if
|
|
179
|
+
if RubyVersion.is?(">= 3.2", "< 3.2.3")
|
|
171
180
|
logger.warn(
|
|
172
181
|
"Allocation profiling is not supported in Ruby versions 3.2.0, 3.2.1 and 3.2.2 and will be forcibly " \
|
|
173
182
|
"disabled. This is due to a VM bug that can lead to crashes (https://bugs.ruby-lang.org/issues/19482). " \
|
|
@@ -181,9 +190,8 @@ module Datadog
|
|
|
181
190
|
# that causes a segmentation fault during garbage collection of Ractors
|
|
182
191
|
# (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies.
|
|
183
192
|
# This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
|
|
184
|
-
if
|
|
185
|
-
|
|
186
|
-
(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")
|
|
187
195
|
logger.warn(
|
|
188
196
|
"Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling allocation profiling while using " \
|
|
189
197
|
"Ractors may cause unexpected issues, including crashes (https://bugs.ruby-lang.org/issues/18464). " \
|
|
@@ -192,14 +200,12 @@ module Datadog
|
|
|
192
200
|
# ANNOYANCE - Only with Ractors
|
|
193
201
|
# On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets
|
|
194
202
|
# garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on.
|
|
195
|
-
elsif
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
)
|
|
202
|
-
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
|
+
)
|
|
203
209
|
end
|
|
204
210
|
|
|
205
211
|
logger.debug("Enabled allocation profiling")
|
|
@@ -212,7 +218,7 @@ module Datadog
|
|
|
212
218
|
|
|
213
219
|
return false unless heap_profiling_enabled
|
|
214
220
|
|
|
215
|
-
if
|
|
221
|
+
if RubyVersion.is?("< 3.1")
|
|
216
222
|
logger.warn(
|
|
217
223
|
"Current Ruby version (#{RUBY_VERSION}) cannot support heap profiling due to VM limitations. " \
|
|
218
224
|
"Please upgrade to Ruby >= 3.1 in order to use this feature. Heap profiling has been disabled."
|
|
@@ -221,13 +227,14 @@ module Datadog
|
|
|
221
227
|
end
|
|
222
228
|
|
|
223
229
|
unless allocation_profiling_enabled
|
|
224
|
-
|
|
230
|
+
logger.warn(
|
|
231
|
+
"Heap profiling was requested but allocation profiling is not enabled. " \
|
|
232
|
+
"Heap profiling has been disabled."
|
|
233
|
+
)
|
|
234
|
+
return false
|
|
225
235
|
end
|
|
226
236
|
|
|
227
|
-
logger.
|
|
228
|
-
"Enabled experimental heap profiling: heap_sample_rate=#{heap_sample_rate}. This is experimental, not " \
|
|
229
|
-
"recommended, and will increase overhead!"
|
|
230
|
-
)
|
|
237
|
+
logger.debug("Enabled heap profiling: heap_sample_rate=#{heap_sample_rate}")
|
|
231
238
|
|
|
232
239
|
true
|
|
233
240
|
end
|
|
@@ -237,10 +244,6 @@ module Datadog
|
|
|
237
244
|
|
|
238
245
|
return false unless heap_profiling_enabled && heap_size_profiling_enabled
|
|
239
246
|
|
|
240
|
-
logger.warn(
|
|
241
|
-
"Enabled experimental heap size profiling. This is experimental, not recommended, and will increase overhead!"
|
|
242
|
-
)
|
|
243
|
-
|
|
244
247
|
true
|
|
245
248
|
end
|
|
246
249
|
|
|
@@ -257,7 +260,7 @@ module Datadog
|
|
|
257
260
|
end
|
|
258
261
|
|
|
259
262
|
if setting_value == false
|
|
260
|
-
if
|
|
263
|
+
if RubyVersion.is?("< 2.6")
|
|
261
264
|
logger.warn(
|
|
262
265
|
'The profiling "no signals" workaround has been disabled via configuration on Ruby 2.5. ' \
|
|
263
266
|
"This is not recommended " \
|
|
@@ -283,7 +286,7 @@ module Datadog
|
|
|
283
286
|
# Setting is in auto mode. Let's probe to see if we should enable it:
|
|
284
287
|
|
|
285
288
|
# We don't warn users in this situation because "upgrade your Ruby" is not a great warning
|
|
286
|
-
return true if
|
|
289
|
+
return true if RubyVersion.is?("< 2.6")
|
|
287
290
|
|
|
288
291
|
if Gem.loaded_specs["mysql2"] && incompatible_libmysqlclient_version?(settings, logger)
|
|
289
292
|
logger.warn(
|
|
@@ -366,7 +369,7 @@ module Datadog
|
|
|
366
369
|
rescue StandardError, LoadError => e
|
|
367
370
|
logger.warn(
|
|
368
371
|
"Failed to probe `mysql2` gem information. " \
|
|
369
|
-
"Cause: #{e.class
|
|
372
|
+
"Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
370
373
|
)
|
|
371
374
|
|
|
372
375
|
true
|
|
@@ -399,6 +402,22 @@ module Datadog
|
|
|
399
402
|
end
|
|
400
403
|
end
|
|
401
404
|
|
|
405
|
+
private_class_method def self.valid_cpu_sampling_interval(cpu_sampling_interval_ms, logger)
|
|
406
|
+
if cpu_sampling_interval_ms > 10
|
|
407
|
+
logger.warn(
|
|
408
|
+
"Profiling cpu_sampling_interval_ms is set to #{cpu_sampling_interval_ms}ms, but values above 10ms are " \
|
|
409
|
+
"not supported. Using 10ms instead. To reduce profiler overhead, consider adjusting the " \
|
|
410
|
+
"overhead_target_percentage setting."
|
|
411
|
+
)
|
|
412
|
+
10
|
|
413
|
+
elsif cpu_sampling_interval_ms < 10
|
|
414
|
+
logger.debug { "Profiling cpu_sampling_interval_ms set to #{cpu_sampling_interval_ms}ms" }
|
|
415
|
+
cpu_sampling_interval_ms
|
|
416
|
+
else
|
|
417
|
+
cpu_sampling_interval_ms
|
|
418
|
+
end
|
|
419
|
+
end
|
|
420
|
+
|
|
402
421
|
# To add just a bit more complexity to our detection code, in https://github.com/DataDog/dd-trace-rb/issues/3334
|
|
403
422
|
# a user reported that our code was incorrectly flagging the mariadb variant of libmysqlclient as being
|
|
404
423
|
# incompatible. In fact we have no reports of the mariadb variant needing the "no signals" workaround,
|
|
@@ -429,17 +448,22 @@ module Datadog
|
|
|
429
448
|
end
|
|
430
449
|
|
|
431
450
|
private_class_method def self.dir_interruption_workaround_enabled?(settings, no_signals_workaround_enabled)
|
|
432
|
-
return false if no_signals_workaround_enabled ||
|
|
451
|
+
return false if no_signals_workaround_enabled || RubyVersion.is?(">= 3.4")
|
|
433
452
|
|
|
434
453
|
settings.profiling.advanced.dir_interruption_workaround_enabled
|
|
435
454
|
end
|
|
436
455
|
|
|
437
|
-
private_class_method def self.
|
|
438
|
-
return false if
|
|
456
|
+
private_class_method def self.can_apply_exec_monkey_patch?(settings)
|
|
457
|
+
return false if RubyVersion.is?("< 2.7")
|
|
458
|
+
|
|
459
|
+
# This file is 2.7+ only so we only require it here once we've checked the Ruby version
|
|
460
|
+
require "datadog/profiling/ext/exec_monkey_patch"
|
|
439
461
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
462
|
+
settings.profiling.advanced.shutdown_on_exec_enabled
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
private_class_method def self.enable_gvl_profiling?(settings, logger)
|
|
466
|
+
RubyVersion.is?(">= 3.2") && settings.profiling.advanced.gvl_enabled
|
|
443
467
|
end
|
|
444
468
|
end
|
|
445
469
|
end
|
|
@@ -13,23 +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
|
-
|
|
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)
|
|
30
33
|
|
|
31
34
|
public
|
|
32
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
|
|
33
45
|
def initialize(
|
|
34
46
|
pprof_recorder:,
|
|
35
47
|
worker:,
|
|
@@ -37,7 +49,8 @@ module Datadog
|
|
|
37
49
|
code_provenance_collector:,
|
|
38
50
|
internal_metadata:,
|
|
39
51
|
minimum_duration_seconds: PROFILE_DURATION_THRESHOLD_SECONDS,
|
|
40
|
-
time_provider: Time
|
|
52
|
+
time_provider: Time,
|
|
53
|
+
sequence_tracker: Datadog::Profiling::SequenceTracker
|
|
41
54
|
)
|
|
42
55
|
@pprof_recorder = pprof_recorder
|
|
43
56
|
@worker = worker
|
|
@@ -50,8 +63,10 @@ module Datadog
|
|
|
50
63
|
# NOTE: At the time of this comment collected info does not change over time so we'll hardcode
|
|
51
64
|
# it on startup to prevent serializing the same info on every flush.
|
|
52
65
|
@info_json = JSON.generate(info_collector.info).freeze
|
|
66
|
+
@sequence_tracker = sequence_tracker
|
|
53
67
|
end
|
|
54
68
|
|
|
69
|
+
#: () -> Datadog::Profiling::Flush?
|
|
55
70
|
def flush
|
|
56
71
|
worker_stats = @worker.stats_and_reset_not_thread_safe
|
|
57
72
|
serialization_result = pprof_recorder.serialize
|
|
@@ -65,15 +80,32 @@ module Datadog
|
|
|
65
80
|
return
|
|
66
81
|
end
|
|
67
82
|
|
|
68
|
-
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 : ''
|
|
69
97
|
|
|
70
98
|
Flush.new(
|
|
71
99
|
start: start,
|
|
72
100
|
finish: finish,
|
|
73
101
|
encoded_profile: encoded_profile,
|
|
74
|
-
code_provenance_file_name: Datadog::Profiling::Ext::Transport::HTTP::CODE_PROVENANCE_FILENAME,
|
|
75
102
|
code_provenance_data: uncompressed_code_provenance,
|
|
76
|
-
|
|
103
|
+
metrics: metrics,
|
|
104
|
+
tags_as_array: Datadog::Profiling::TagBuilder.call(
|
|
105
|
+
settings: Datadog.configuration,
|
|
106
|
+
profile_seq: sequence_tracker.get_next,
|
|
107
|
+
).to_a,
|
|
108
|
+
process_tags: process_tags,
|
|
77
109
|
internal_metadata: internal_metadata.merge(
|
|
78
110
|
{
|
|
79
111
|
worker_stats: worker_stats,
|
|
@@ -86,10 +118,12 @@ module Datadog
|
|
|
86
118
|
)
|
|
87
119
|
end
|
|
88
120
|
|
|
121
|
+
#: () -> bool
|
|
89
122
|
def can_flush?
|
|
90
123
|
!duration_below_threshold?(last_flush_finish_at || created_at, time_provider.now.utc)
|
|
91
124
|
end
|
|
92
125
|
|
|
126
|
+
#: () -> void
|
|
93
127
|
def reset_after_fork
|
|
94
128
|
@last_flush_finish_at = time_provider.now.utc
|
|
95
129
|
nil
|
|
@@ -97,6 +131,7 @@ module Datadog
|
|
|
97
131
|
|
|
98
132
|
private
|
|
99
133
|
|
|
134
|
+
#: (::Time, ::Time) -> bool
|
|
100
135
|
def duration_below_threshold?(start, finish)
|
|
101
136
|
(finish - start) < minimum_duration_seconds
|
|
102
137
|
end
|