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
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'digest/sha1'
|
|
4
|
+
require_relative '../di/fatal_exceptions'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module SymbolDatabase
|
|
8
|
+
# Computes Git-style SHA-1 hashes of Ruby source files for backend commit inference.
|
|
9
|
+
#
|
|
10
|
+
# Uses Git's blob hash algorithm: SHA1("blob <size>\0<content>")
|
|
11
|
+
# Hashes enable the backend to correlate runtime code with Git repository history,
|
|
12
|
+
# identifying which commit is actually deployed.
|
|
13
|
+
#
|
|
14
|
+
# Called by: Extractor (when building MODULE scopes)
|
|
15
|
+
# Stores result in: Scope's language_specifics[:file_hash]
|
|
16
|
+
# Returns: 40-character hex string or nil if file unreadable
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
module FileHash
|
|
20
|
+
module_function
|
|
21
|
+
|
|
22
|
+
# Compute Git-style SHA-1 hash of a file.
|
|
23
|
+
# Uses Git's blob hash algorithm: SHA1("blob <size>\0<content>")
|
|
24
|
+
# Returns nil on any error (file not found, permission denied, etc.)
|
|
25
|
+
#
|
|
26
|
+
# @param file_path [String] Path to the file
|
|
27
|
+
# @param logger [#debug] Logger for error reporting
|
|
28
|
+
# @return [String, nil] 40-character hex-encoded SHA-1 hash, or nil if error
|
|
29
|
+
def compute(file_path, logger:)
|
|
30
|
+
return nil unless file_path
|
|
31
|
+
return nil unless File.exist?(file_path)
|
|
32
|
+
|
|
33
|
+
content = File.read(file_path, mode: 'rb')
|
|
34
|
+
size = content.bytesize
|
|
35
|
+
git_blob = "blob #{size}\0#{content}"
|
|
36
|
+
|
|
37
|
+
# SHA-1 is required here to match Git's blob hash format for commit inference.
|
|
38
|
+
# This is not a security vulnerability - we're computing file content hashes
|
|
39
|
+
# to match against Git objects, not using SHA-1 for authentication/integrity.
|
|
40
|
+
Digest::SHA1.hexdigest(git_blob) # nosemgrep: ruby.lang.security.weak-hashes-sha1.weak-hashes-sha1
|
|
41
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
42
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
43
|
+
logger.debug { "symdb: file hash failed for #{file_path}: #{e.class}: #{e.message}" }
|
|
44
|
+
nil
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
# Logger facade that adds a config-gated +trace+ method.
|
|
8
|
+
#
|
|
9
|
+
# Wraps any logger (customer-provided or default) and delegates
|
|
10
|
+
# standard methods. The +trace+ method is a sub-debug level that
|
|
11
|
+
# is a no-op unless DD_TRACE_DEBUG is set, avoiding overhead for
|
|
12
|
+
# high-frequency log sites (per-module filtering, dedup checks).
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
class Logger
|
|
16
|
+
extend Forwardable
|
|
17
|
+
|
|
18
|
+
# @param settings [Configuration::Settings] Tracer settings (reads trace_logging flag)
|
|
19
|
+
# @param target [::Logger] Underlying logger to delegate to
|
|
20
|
+
def initialize(settings, target)
|
|
21
|
+
@settings = settings
|
|
22
|
+
@target = target
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
attr_reader :settings
|
|
26
|
+
|
|
27
|
+
# Only debug and warn are delegated by design — symbol database
|
|
28
|
+
# extraction logs only at debug (high-volume diagnostics) and warn
|
|
29
|
+
# (user-actionable problems). Adding info/error would invite
|
|
30
|
+
# log-level drift; explicit additions can be made if needed.
|
|
31
|
+
def_delegators :@target, :debug, :warn
|
|
32
|
+
|
|
33
|
+
# Log at trace level (sub-debug). No-op unless DD_TRACE_DEBUG is set.
|
|
34
|
+
# @yield Block that returns the log message string
|
|
35
|
+
# @return [void]
|
|
36
|
+
def trace(&block)
|
|
37
|
+
if settings.symbol_database.internal.trace_logging
|
|
38
|
+
debug(&block)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../di/fatal_exceptions'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
# Provides remote configuration integration for symbol database.
|
|
8
|
+
#
|
|
9
|
+
# Responsibilities:
|
|
10
|
+
# - Registers with Core::Remote as a receiver for LIVE_DEBUGGING_SYMBOL_DB product
|
|
11
|
+
# - Processes remote config changes (insert/update/delete)
|
|
12
|
+
# - Calls Component.start_upload when upload_symbols: true
|
|
13
|
+
# - Calls Component.stop_upload when config deleted or upload_symbols: false
|
|
14
|
+
#
|
|
15
|
+
# Flow:
|
|
16
|
+
# 1. Remote config system calls receiver with repository and changes
|
|
17
|
+
# 2. For each change, process_change called
|
|
18
|
+
# 3. parse_config extracts upload_symbols flag
|
|
19
|
+
# 4. enable_upload or disable_upload called on component
|
|
20
|
+
#
|
|
21
|
+
# Created by: Symbol database initialization
|
|
22
|
+
# Accessed by: Core::Remote system when configurations change
|
|
23
|
+
# Requires: Component must exist (accessed via Datadog.send(:components).symbol_database)
|
|
24
|
+
#
|
|
25
|
+
# @api private
|
|
26
|
+
module Remote
|
|
27
|
+
PRODUCT = 'LIVE_DEBUGGING_SYMBOL_DB'
|
|
28
|
+
|
|
29
|
+
class << self
|
|
30
|
+
# Declare products this receiver handles.
|
|
31
|
+
# @return [Array<String>] Product names
|
|
32
|
+
def products
|
|
33
|
+
[PRODUCT]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Declare capabilities for this receiver.
|
|
37
|
+
# @return [Array] Capabilities (none for symbol database)
|
|
38
|
+
def capabilities
|
|
39
|
+
[]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Create receivers for remote configuration.
|
|
43
|
+
# @return [Array<Receiver>] Array of receivers
|
|
44
|
+
def receivers(_telemetry)
|
|
45
|
+
receiver do |repository, changes|
|
|
46
|
+
telemetry = lookup_telemetry
|
|
47
|
+
component = begin
|
|
48
|
+
Datadog.send(:components, allow_initialization: false)&.symbol_database
|
|
49
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
50
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
51
|
+
Datadog.logger.debug { "symdb: failed to look up component in RC receiver: #{e.class}: #{e.message}" }
|
|
52
|
+
telemetry&.report(e, description: 'symdb: failed to look up component in RC receiver')
|
|
53
|
+
nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
if component
|
|
57
|
+
changes.each do |change|
|
|
58
|
+
process_change(component, change, telemetry)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Create a single receiver for the product.
|
|
65
|
+
# @param products [Array<String>] Product names to match
|
|
66
|
+
# @return [Array<Receiver>] Receiver array
|
|
67
|
+
def receiver(products = [PRODUCT], &block)
|
|
68
|
+
matcher = Core::Remote::Dispatcher::Matcher::Product.new(products)
|
|
69
|
+
[Core::Remote::Dispatcher::Receiver.new(matcher, &block)]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
# Look up the telemetry component for error reporting. Returns nil if the
|
|
75
|
+
# component tree isn't built yet (very early boot) or the lookup raises.
|
|
76
|
+
# `allow_initialization: false` avoids triggering component-tree construction
|
|
77
|
+
# from inside an RC receiver callback.
|
|
78
|
+
# @return [Core::Telemetry::Component, nil]
|
|
79
|
+
# @api private
|
|
80
|
+
def lookup_telemetry
|
|
81
|
+
Datadog.send(:components, allow_initialization: false)&.telemetry
|
|
82
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
83
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
84
|
+
nil
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Process a single configuration change.
|
|
88
|
+
# @param component [Component] Symbol database component
|
|
89
|
+
# @param change [Change] Configuration change (:insert, :update, :delete)
|
|
90
|
+
# @param telemetry [Core::Telemetry::Component, nil] Telemetry for error reporting
|
|
91
|
+
# @return [void]
|
|
92
|
+
# @api private
|
|
93
|
+
def process_change(component, change, telemetry)
|
|
94
|
+
case change.type
|
|
95
|
+
when :insert
|
|
96
|
+
# @type var change: ::Datadog::Core::Remote::Configuration::Repository::Change::Inserted
|
|
97
|
+
enable_upload(component, change.content)
|
|
98
|
+
change.content.applied
|
|
99
|
+
when :update
|
|
100
|
+
# @type var change: ::Datadog::Core::Remote::Configuration::Repository::Change::Updated
|
|
101
|
+
disable_upload(component)
|
|
102
|
+
enable_upload(component, change.content)
|
|
103
|
+
change.content.applied
|
|
104
|
+
when :delete
|
|
105
|
+
# @type var change: ::Datadog::Core::Remote::Configuration::Repository::Change::Deleted
|
|
106
|
+
disable_upload(component)
|
|
107
|
+
change.previous&.applied
|
|
108
|
+
else
|
|
109
|
+
component.logger.debug { "symdb: unrecognized change type: #{change.type}" }
|
|
110
|
+
# Steep cannot narrow `change.content` from a respond_to? check — it sees
|
|
111
|
+
# the Repository::Change union type where `Deleted` lacks `content`.
|
|
112
|
+
change.content.errored("Unrecognized change type: #{change.type}") if change.respond_to?(:content) # steep:ignore NoMethod
|
|
113
|
+
end
|
|
114
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
115
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
116
|
+
component.logger.debug { "symdb: error processing remote config change: #{e.class}: #{e.message}" }
|
|
117
|
+
telemetry&.report(e, description: 'symdb: error processing remote config change')
|
|
118
|
+
# Rescue runs regardless of which branch raised — Steep cannot narrow the
|
|
119
|
+
# union type from a respond_to? check.
|
|
120
|
+
content_obj = change.respond_to?(:content) ? change.content : change.previous # steep:ignore NoMethod
|
|
121
|
+
content_obj&.errored(e.to_s)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Enable upload if config has upload_symbols: true.
|
|
125
|
+
# @param component [Component] Symbol database component
|
|
126
|
+
# @param content [Content] Remote config content
|
|
127
|
+
# @return [void]
|
|
128
|
+
# @api private
|
|
129
|
+
def enable_upload(component, content)
|
|
130
|
+
config = parse_config(content, component.logger)
|
|
131
|
+
|
|
132
|
+
unless config
|
|
133
|
+
return
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
if config['upload_symbols']
|
|
137
|
+
component.logger.debug { "symdb: upload enabled via remote config" }
|
|
138
|
+
component.start_upload
|
|
139
|
+
else
|
|
140
|
+
component.logger.debug { "symdb: upload disabled in config" }
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Disable upload.
|
|
145
|
+
# @param component [Component] Symbol database component
|
|
146
|
+
# @return [void]
|
|
147
|
+
# @api private
|
|
148
|
+
def disable_upload(component)
|
|
149
|
+
component.logger.debug { "symdb: upload disabled via remote config" }
|
|
150
|
+
component.stop_upload
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Parse and validate remote config content.
|
|
154
|
+
# @param content [Content] Remote config content
|
|
155
|
+
# @param logger [SymbolDatabase::Logger] Logger for invalid-config diagnostics
|
|
156
|
+
# @return [Hash, nil] Parsed config or nil if invalid
|
|
157
|
+
# @api private
|
|
158
|
+
#
|
|
159
|
+
# JSON::ParserError is intentionally NOT rescued here — it propagates to
|
|
160
|
+
# process_change's rescue, which logs and reports to telemetry. Catching
|
|
161
|
+
# it locally would swallow the error from telemetry observability.
|
|
162
|
+
def parse_config(content, logger)
|
|
163
|
+
config = JSON.parse(content.data)
|
|
164
|
+
|
|
165
|
+
unless config.is_a?(Hash)
|
|
166
|
+
logger.debug { "symdb: invalid config format: expected Hash, got #{config.class}" }
|
|
167
|
+
return nil
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
unless config.key?('upload_symbols')
|
|
171
|
+
logger.debug { "symdb: missing 'upload_symbols' key in config" }
|
|
172
|
+
return nil
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
config
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
# Represents a scope in the hierarchical symbol structure (FILE → MODULE/CLASS → METHOD).
|
|
8
|
+
#
|
|
9
|
+
# Scopes form a tree structure representing Ruby code organization. Each scope contains:
|
|
10
|
+
# - Metadata: name, source file, line range, scope type (MODULE/CLASS/METHOD/etc.)
|
|
11
|
+
# - Symbols: Variables, constants, parameters defined in this scope
|
|
12
|
+
# - Nested scopes: Child scopes (e.g., methods within a class)
|
|
13
|
+
#
|
|
14
|
+
# Created by: Extractor (during symbol extraction)
|
|
15
|
+
# Used by: ScopeBatcher (batching), ServiceVersion (wrapping for upload)
|
|
16
|
+
# Serialized to: JSON via to_h/to_json for upload to agent
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
class Scope
|
|
20
|
+
attr_reader :scope_type, :name, :source_file, :start_line, :end_line,
|
|
21
|
+
# Ranges of executable lines [{start:, end:}]. Three states:
|
|
22
|
+
# - nil: not computed (source unreadable, native/C-extension method)
|
|
23
|
+
# - []: computed but no executable lines found (comments/whitespace only)
|
|
24
|
+
# - non-empty: computed, contains executable line ranges
|
|
25
|
+
# nil and [] both serialize as has_injectible_lines: false on METHOD
|
|
26
|
+
# scopes. Key is absent on non-METHOD scopes. The wire format key
|
|
27
|
+
# name keeps the historical spelling +injectible+ for backend
|
|
28
|
+
# compatibility; the Ruby identifier is +targetable_lines+.
|
|
29
|
+
:targetable_lines,
|
|
30
|
+
:language_specifics, :symbols, :scopes
|
|
31
|
+
|
|
32
|
+
# Initialize a new Scope
|
|
33
|
+
# @param scope_type [String] Type of scope (FILE, MODULE, CLASS, METHOD)
|
|
34
|
+
# @param name [String, nil] Name of the scope (class name, method name, etc.)
|
|
35
|
+
# @param source_file [String, nil] Path to source file
|
|
36
|
+
# @param start_line [Integer, nil] Starting line number (UNKNOWN_MIN_LINE for unknown)
|
|
37
|
+
# @param end_line [Integer, nil] Ending line number (UNKNOWN_MAX_LINE for entire file)
|
|
38
|
+
# @param targetable_lines [Array<Hash>, nil] Ranges of executable lines [{start:, end:}]
|
|
39
|
+
# @param language_specifics [Hash, nil] Ruby-specific metadata
|
|
40
|
+
# @param symbols [Array<Symbol>, nil] Symbols defined in this scope
|
|
41
|
+
# @param scopes [Array<Scope>, nil] Nested child scopes
|
|
42
|
+
def initialize(
|
|
43
|
+
scope_type:,
|
|
44
|
+
name: nil,
|
|
45
|
+
source_file: nil,
|
|
46
|
+
start_line: nil,
|
|
47
|
+
end_line: nil,
|
|
48
|
+
targetable_lines: nil,
|
|
49
|
+
language_specifics: nil,
|
|
50
|
+
symbols: nil,
|
|
51
|
+
scopes: nil
|
|
52
|
+
)
|
|
53
|
+
@scope_type = scope_type
|
|
54
|
+
@name = name
|
|
55
|
+
@source_file = source_file
|
|
56
|
+
@start_line = start_line
|
|
57
|
+
@end_line = end_line
|
|
58
|
+
@targetable_lines = targetable_lines
|
|
59
|
+
@language_specifics = language_specifics || {}
|
|
60
|
+
@symbols = symbols || []
|
|
61
|
+
@scopes = scopes || []
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @return [Boolean] true when targetable_lines is non-nil and non-empty
|
|
65
|
+
def targetable_lines?
|
|
66
|
+
!targetable_lines.nil? && !targetable_lines.empty?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Convert scope to Hash for JSON serialization.
|
|
70
|
+
# Removes nil values to reduce payload size.
|
|
71
|
+
# @return [Hash] Scope as hash with symbol keys
|
|
72
|
+
def to_h
|
|
73
|
+
h = {
|
|
74
|
+
scope_type: scope_type,
|
|
75
|
+
name: name,
|
|
76
|
+
source_file: source_file,
|
|
77
|
+
start_line: start_line,
|
|
78
|
+
end_line: end_line,
|
|
79
|
+
language_specifics: language_specifics.empty? ? nil : language_specifics,
|
|
80
|
+
symbols: symbols.empty? ? nil : symbols.map(&:to_h),
|
|
81
|
+
scopes: scopes.empty? ? nil : scopes.map(&:to_h),
|
|
82
|
+
}
|
|
83
|
+
h.compact!
|
|
84
|
+
# Targetable lines only on METHOD scopes (per spec — not on CLASS/MODULE/FILE).
|
|
85
|
+
# Always emit has_injectible_lines (even when false) on METHOD scopes.
|
|
86
|
+
# Wire format keeps the historical spelling +injectible+; Ruby identifier
|
|
87
|
+
# is +targetable_lines+.
|
|
88
|
+
if scope_type == 'METHOD'
|
|
89
|
+
h[:has_injectible_lines] = targetable_lines? # steep:ignore ArgumentTypeMismatch
|
|
90
|
+
h[:injectible_lines] = targetable_lines if targetable_lines && !targetable_lines.empty?
|
|
91
|
+
end
|
|
92
|
+
h
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Serialize scope to JSON.
|
|
96
|
+
# @return [String] JSON string representation
|
|
97
|
+
def to_json(_state = nil)
|
|
98
|
+
JSON.generate(to_h)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'set'
|
|
4
|
+
require_relative '../di/fatal_exceptions'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module SymbolDatabase
|
|
8
|
+
# Batches extracted scopes and triggers uploads at appropriate times.
|
|
9
|
+
#
|
|
10
|
+
# Implements two upload triggers:
|
|
11
|
+
# 1. Size-based: Immediate upload when 400 scopes collected (MAX_SCOPES)
|
|
12
|
+
# 2. Time-based: Upload after 1 second of inactivity (debounce timer, not periodic)
|
|
13
|
+
#
|
|
14
|
+
# Also provides:
|
|
15
|
+
# - Deduplication: Tracks uploaded module names to prevent re-uploads
|
|
16
|
+
# - File limiting: Stops after 10,000 files to prevent runaway extraction
|
|
17
|
+
# - Thread safety: Mutex-protected state for concurrent access
|
|
18
|
+
#
|
|
19
|
+
# Timer implementation: A single long-lived thread waits on a ConditionVariable
|
|
20
|
+
# with a timeout. Each add_scope signals the CV to reset the deadline. When the
|
|
21
|
+
# timeout expires without a signal, the timer fires and flushes the batch.
|
|
22
|
+
# This avoids creating/destroying a thread per add_scope call.
|
|
23
|
+
#
|
|
24
|
+
# Flow: Extractor → add_scope → (batch or timer) → Uploader
|
|
25
|
+
# Created by: Component (during initialization)
|
|
26
|
+
# Calls: Uploader.upload_scopes when batch full or timer fires
|
|
27
|
+
#
|
|
28
|
+
# @api private
|
|
29
|
+
class ScopeBatcher
|
|
30
|
+
# Maximum scopes per batch before triggering immediate upload.
|
|
31
|
+
# This matches the batch size used in Java and Python tracers to ensure
|
|
32
|
+
# consistent upload behavior across languages.
|
|
33
|
+
MAX_SCOPES = 400
|
|
34
|
+
INACTIVITY_TIMEOUT = 1.0 # seconds
|
|
35
|
+
# Maximum unique files to track before stopping extraction.
|
|
36
|
+
# This prevents runaway memory usage in applications with very large
|
|
37
|
+
# numbers of loaded classes (e.g., heavily modularized Rails apps).
|
|
38
|
+
MAX_FILES = 10_000
|
|
39
|
+
# Seconds to wait for the timer thread to exit when joining during
|
|
40
|
+
# shutdown or reset. Bounded so a misbehaving thread cannot hang the
|
|
41
|
+
# caller indefinitely.
|
|
42
|
+
TIMER_JOIN_TIMEOUT = 5
|
|
43
|
+
|
|
44
|
+
# Initialize batching context.
|
|
45
|
+
# @param uploader [Uploader] Uploader instance for triggering uploads
|
|
46
|
+
# @param logger [Logger] Logger for diagnostics
|
|
47
|
+
# @param on_upload [Proc, nil] Optional callback called after upload (for testing)
|
|
48
|
+
# @param timer_enabled [Boolean] Enable async timer (default true, false for tests)
|
|
49
|
+
def initialize(uploader, logger:, on_upload: nil, timer_enabled: true)
|
|
50
|
+
@uploader = uploader
|
|
51
|
+
@logger = logger
|
|
52
|
+
@on_upload = on_upload
|
|
53
|
+
@timer_enabled = timer_enabled
|
|
54
|
+
@scopes = []
|
|
55
|
+
@mutex = Mutex.new
|
|
56
|
+
@file_count = 0
|
|
57
|
+
@uploaded_modules = Set.new
|
|
58
|
+
|
|
59
|
+
# Timer state: single long-lived thread + ConditionVariable for debounce.
|
|
60
|
+
# @timer_signaled is set to true on each add_scope and cleared by the timer
|
|
61
|
+
# thread after waking. This flag is needed because ConditionVariable#wait
|
|
62
|
+
# does not distinguish signal vs timeout on Ruby < 3.2 (returns self in both
|
|
63
|
+
# cases). The flag gives a portable way to detect whether the wakeup was a
|
|
64
|
+
# signal (reset deadline) or a timeout (fire the timer).
|
|
65
|
+
@timer_cv = ConditionVariable.new
|
|
66
|
+
@timer_thread = nil
|
|
67
|
+
@timer_stopped = false
|
|
68
|
+
@timer_signaled = false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Add a scope to the batch.
|
|
72
|
+
# Triggers immediate upload if batch reaches 400 scopes.
|
|
73
|
+
# Resets inactivity timer if batch not full.
|
|
74
|
+
# @param scope [Scope] The scope to add
|
|
75
|
+
# @return [void]
|
|
76
|
+
def add_scope(scope)
|
|
77
|
+
# @type var scopes_to_upload: ::Array[Scope]?
|
|
78
|
+
scopes_to_upload = nil
|
|
79
|
+
|
|
80
|
+
@mutex.synchronize do
|
|
81
|
+
# Check file limit (counts only unique accepted files; duplicates are
|
|
82
|
+
# filtered by the dedup check below and do not consume the budget).
|
|
83
|
+
if @file_count >= MAX_FILES
|
|
84
|
+
@logger.debug { "symdb: file limit (#{MAX_FILES}) reached, ignoring scope: #{scope.name}" }
|
|
85
|
+
return
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Check if already uploaded — duplicates do not count toward MAX_FILES
|
|
89
|
+
# so a re-extraction scenario does not exhaust the budget for unique scopes.
|
|
90
|
+
if @uploaded_modules.include?(scope.name)
|
|
91
|
+
@logger.trace { "symdb: skipping #{scope.name}: already uploaded" }
|
|
92
|
+
return
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Marked uploaded before perform_upload runs. This is intentional:
|
|
96
|
+
# symdb extraction is a one-shot operation per process — extract_all
|
|
97
|
+
# walks ObjectSpace once and never revisits a module within the same
|
|
98
|
+
# process. The Set deduplicates within a single extraction run, not
|
|
99
|
+
# across upload attempts. Failed uploads are not retried; symbols
|
|
100
|
+
# from a failed batch are lost until the next process restart, by
|
|
101
|
+
# design (matches Python and Go; Java retries via OkHttp, .NET via
|
|
102
|
+
# exponential backoff — Ruby does neither).
|
|
103
|
+
@uploaded_modules.add(scope.name)
|
|
104
|
+
@file_count += 1
|
|
105
|
+
|
|
106
|
+
# Add the scope
|
|
107
|
+
@scopes << scope
|
|
108
|
+
|
|
109
|
+
# Check if batch size reached (AFTER adding)
|
|
110
|
+
if @scopes.size >= MAX_SCOPES
|
|
111
|
+
# Prepare for upload (clear within mutex)
|
|
112
|
+
scopes_to_upload = @scopes.dup
|
|
113
|
+
@scopes.clear
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Signal the timer thread to reset its inactivity deadline.
|
|
117
|
+
# If batch was full, this is harmless — the timer will just
|
|
118
|
+
# re-check and find an empty batch if it fires.
|
|
119
|
+
ensure_timer_running
|
|
120
|
+
@timer_signaled = true
|
|
121
|
+
@timer_cv.signal
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Upload outside mutex (if batch was full)
|
|
125
|
+
perform_upload(scopes_to_upload) if scopes_to_upload
|
|
126
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
127
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
128
|
+
@logger.debug { "symdb: failed to add scope: #{e.class}: #{e.message}" }
|
|
129
|
+
# Don't propagate, continue operation
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Force upload of current batch immediately.
|
|
133
|
+
# @return [void]
|
|
134
|
+
def flush
|
|
135
|
+
# @type var scopes_to_upload: ::Array[Scope]?
|
|
136
|
+
scopes_to_upload = nil
|
|
137
|
+
|
|
138
|
+
@mutex.synchronize do
|
|
139
|
+
return if @scopes.empty?
|
|
140
|
+
|
|
141
|
+
scopes_to_upload = @scopes.dup
|
|
142
|
+
@scopes.clear
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
perform_upload(scopes_to_upload)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Shutdown and upload remaining scopes.
|
|
149
|
+
# @return [void]
|
|
150
|
+
def shutdown
|
|
151
|
+
# @type var scopes_to_upload: ::Array[Scope]?
|
|
152
|
+
scopes_to_upload = nil
|
|
153
|
+
# @type var thread_to_join: ::Thread?
|
|
154
|
+
thread_to_join = nil
|
|
155
|
+
|
|
156
|
+
@mutex.synchronize do
|
|
157
|
+
@timer_stopped = true
|
|
158
|
+
@timer_cv.signal # Wake the timer thread so it exits
|
|
159
|
+
|
|
160
|
+
# Capture the timer thread under the mutex so a concurrent add_scope
|
|
161
|
+
# cannot create a new thread that we'd accidentally orphan when we
|
|
162
|
+
# nil the field below.
|
|
163
|
+
thread_to_join = @timer_thread
|
|
164
|
+
@timer_thread = nil
|
|
165
|
+
|
|
166
|
+
scopes_to_upload = @scopes.dup
|
|
167
|
+
@scopes.clear
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Join the timer thread outside the mutex.
|
|
171
|
+
# The thread checks @timer_stopped and exits when signaled.
|
|
172
|
+
thread_to_join&.join(TIMER_JOIN_TIMEOUT)
|
|
173
|
+
|
|
174
|
+
# Upload outside mutex
|
|
175
|
+
perform_upload(scopes_to_upload) unless scopes_to_upload.nil? || scopes_to_upload.empty?
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Check if scopes are pending upload.
|
|
179
|
+
# @return [Boolean] true if scopes waiting in batch
|
|
180
|
+
def scopes_pending?
|
|
181
|
+
@mutex.synchronize { @scopes.any? }
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Get current batch size.
|
|
185
|
+
# @return [Integer] Number of scopes in current batch
|
|
186
|
+
def size
|
|
187
|
+
@mutex.synchronize { @scopes.size }
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
private
|
|
191
|
+
|
|
192
|
+
# Reset state. Private so production code cannot accidentally invoke it;
|
|
193
|
+
# tests call via +send(:reset)+.
|
|
194
|
+
# @return [void]
|
|
195
|
+
def reset
|
|
196
|
+
# @type var thread_to_join: ::Thread?
|
|
197
|
+
thread_to_join = nil
|
|
198
|
+
|
|
199
|
+
@mutex.synchronize do
|
|
200
|
+
@scopes.clear
|
|
201
|
+
@timer_stopped = true
|
|
202
|
+
@timer_cv.signal
|
|
203
|
+
@file_count = 0
|
|
204
|
+
@uploaded_modules.clear
|
|
205
|
+
|
|
206
|
+
# Capture under the mutex (see shutdown for rationale).
|
|
207
|
+
thread_to_join = @timer_thread
|
|
208
|
+
@timer_thread = nil
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
thread_to_join&.join(TIMER_JOIN_TIMEOUT)
|
|
212
|
+
|
|
213
|
+
# Allow timer to be restarted after reset
|
|
214
|
+
@mutex.synchronize do
|
|
215
|
+
@timer_stopped = false
|
|
216
|
+
@timer_signaled = false
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Start the timer thread if not already running.
|
|
221
|
+
# Must be called from within @mutex.synchronize.
|
|
222
|
+
# @return [void]
|
|
223
|
+
def ensure_timer_running
|
|
224
|
+
return unless @timer_enabled
|
|
225
|
+
return if @timer_thread&.alive?
|
|
226
|
+
|
|
227
|
+
@timer_stopped = false
|
|
228
|
+
@timer_signaled = false
|
|
229
|
+
|
|
230
|
+
@timer_thread = Thread.new do
|
|
231
|
+
timer_loop
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Timer thread main loop. Waits on the ConditionVariable with a timeout.
|
|
236
|
+
# Each signal resets the deadline (debounce). When the wait times out
|
|
237
|
+
# (no signal within INACTIVITY_TIMEOUT), the batch is flushed.
|
|
238
|
+
#
|
|
239
|
+
# Uses @timer_signaled flag instead of ConditionVariable#wait return value
|
|
240
|
+
# because Ruby < 3.2 returns self for both signal and timeout (no way to
|
|
241
|
+
# distinguish). The flag is set by add_scope before signaling, and cleared
|
|
242
|
+
# by the timer thread after waking.
|
|
243
|
+
# @return [void]
|
|
244
|
+
def timer_loop
|
|
245
|
+
loop do
|
|
246
|
+
should_flush = false
|
|
247
|
+
|
|
248
|
+
@mutex.synchronize do
|
|
249
|
+
return if @timer_stopped
|
|
250
|
+
|
|
251
|
+
@timer_signaled = false
|
|
252
|
+
@timer_cv.wait(@mutex, INACTIVITY_TIMEOUT)
|
|
253
|
+
|
|
254
|
+
return if @timer_stopped
|
|
255
|
+
|
|
256
|
+
if @timer_signaled
|
|
257
|
+
# Woke up because add_scope signaled — loop back to re-wait with
|
|
258
|
+
# a fresh timeout. This implements the debounce: the timeout resets
|
|
259
|
+
# on every scope addition.
|
|
260
|
+
next # steep:ignore BreakTypeMismatch
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Timed out (no signal within INACTIVITY_TIMEOUT). If there are
|
|
264
|
+
# scopes pending, flush them. Otherwise, loop back and wait again.
|
|
265
|
+
should_flush = !@scopes.empty?
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
if should_flush
|
|
269
|
+
flush
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
273
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
274
|
+
@logger.debug { "symdb: timer thread error: #{e.class}: #{e.message}" }
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Perform upload via uploader.
|
|
278
|
+
# @param scopes [Array<Scope>] Scopes to upload
|
|
279
|
+
# @return [void]
|
|
280
|
+
def perform_upload(scopes)
|
|
281
|
+
return if scopes.nil? || scopes.empty?
|
|
282
|
+
|
|
283
|
+
@uploader.upload_scopes(scopes)
|
|
284
|
+
@on_upload&.call(scopes) # Notify tests after upload
|
|
285
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
286
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
287
|
+
@logger.debug { "symdb: upload failed: #{e.class}: #{e.message}" }
|
|
288
|
+
# Don't propagate, uploader handles retries
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
end
|