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,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
# Top-level container wrapping scopes for upload to the agent.
|
|
8
|
+
#
|
|
9
|
+
# ServiceVersion is the root object serialized to JSON for symbol database uploads.
|
|
10
|
+
# Contains service metadata (name, env, version) and all extracted scopes.
|
|
11
|
+
# The language field identifies the tracer.
|
|
12
|
+
#
|
|
13
|
+
# Created by: Uploader (wraps scopes array before serialization)
|
|
14
|
+
# Contains: Array of top-level Scope objects (FILE scopes)
|
|
15
|
+
# Serialized to: JSON via to_json, then GZIP compressed for upload
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
class ServiceVersion
|
|
19
|
+
attr_reader :service, :env, :version, :language, :scopes, :upload_id, :batch_num, :final
|
|
20
|
+
|
|
21
|
+
# Initialize a new ServiceVersion
|
|
22
|
+
# @param service [String] Service name (required, from DD_SERVICE)
|
|
23
|
+
# @param env [String, nil] Environment (from DD_ENV, passed through unchanged)
|
|
24
|
+
# @param version [String, nil] Version (from DD_VERSION, passed through unchanged)
|
|
25
|
+
# @param scopes [Array<Scope>] Top-level scopes (required)
|
|
26
|
+
# @param upload_id [String, nil] UUID identifying the logical upload (shared by all batches)
|
|
27
|
+
# @param batch_num [Integer, nil] 1-indexed batch number within the upload
|
|
28
|
+
# @param final [Boolean, nil] true if this is the last batch of the upload
|
|
29
|
+
# @raise [ArgumentError] if service empty or scopes not an array
|
|
30
|
+
def initialize(service:, env:, version:, scopes:, upload_id: nil, batch_num: nil, final: nil)
|
|
31
|
+
raise ArgumentError, 'service is required' if service.nil? || service.empty?
|
|
32
|
+
raise ArgumentError, 'scopes must be an array' unless scopes.is_a?(Array)
|
|
33
|
+
|
|
34
|
+
@service = service
|
|
35
|
+
@env = env
|
|
36
|
+
@version = version
|
|
37
|
+
@language = 'ruby'
|
|
38
|
+
@scopes = scopes
|
|
39
|
+
@upload_id = upload_id
|
|
40
|
+
@batch_num = batch_num
|
|
41
|
+
@final = final
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Convert service version to Hash for JSON serialization.
|
|
45
|
+
# @return [Hash] ServiceVersion as hash with symbol keys
|
|
46
|
+
def to_h
|
|
47
|
+
{
|
|
48
|
+
service: service,
|
|
49
|
+
env: env,
|
|
50
|
+
version: version,
|
|
51
|
+
language: language,
|
|
52
|
+
scopes: scopes.map(&:to_h),
|
|
53
|
+
upload_id: upload_id,
|
|
54
|
+
batch_num: batch_num,
|
|
55
|
+
final: final,
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Serialize service version to JSON.
|
|
60
|
+
# @return [String] JSON string representation
|
|
61
|
+
def to_json(_state = nil)
|
|
62
|
+
JSON.generate(to_h)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
# Represents a symbol (variable, parameter, field, constant) within a scope.
|
|
8
|
+
#
|
|
9
|
+
# Symbols are the actual identifiers extracted from Ruby code:
|
|
10
|
+
# - Instance variables (@var) - FIELD type
|
|
11
|
+
# - Class variables (@@var) - STATIC_FIELD type
|
|
12
|
+
# - Constants (CONST) - STATIC_FIELD type
|
|
13
|
+
# - Method parameters (arg) - ARG type
|
|
14
|
+
# - Local variables (var) - LOCAL type (not yet implemented)
|
|
15
|
+
#
|
|
16
|
+
# Created by: Extractor (during class/method introspection)
|
|
17
|
+
# Contained in: Scope objects (symbols array)
|
|
18
|
+
# Serialized to: JSON via to_h/to_json
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
class Symbol
|
|
22
|
+
attr_reader :symbol_type, :name, :line, :type, :language_specifics
|
|
23
|
+
|
|
24
|
+
# Initialize a new Symbol
|
|
25
|
+
# @param symbol_type [String] Type: FIELD, STATIC_FIELD, ARG, LOCAL
|
|
26
|
+
# @param name [String] Symbol name (variable name, parameter name)
|
|
27
|
+
# @param line [Integer] Line number (UNKNOWN_MIN_LINE for entire scope, UNKNOWN_MAX_LINE for method-level only)
|
|
28
|
+
# @param type [String, nil] Type annotation (optional, Ruby is dynamic)
|
|
29
|
+
# @param language_specifics [Hash, nil] Symbol-specific metadata
|
|
30
|
+
def initialize(
|
|
31
|
+
symbol_type:,
|
|
32
|
+
name:,
|
|
33
|
+
line:,
|
|
34
|
+
type: nil,
|
|
35
|
+
language_specifics: nil
|
|
36
|
+
)
|
|
37
|
+
@symbol_type = symbol_type
|
|
38
|
+
@name = name
|
|
39
|
+
@line = line
|
|
40
|
+
@type = type
|
|
41
|
+
@language_specifics = language_specifics
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Convert symbol to Hash for JSON serialization.
|
|
45
|
+
# The `type` key is always present per the symdb JSON schema — emit nil
|
|
46
|
+
# when the type cannot be determined (the common case in Ruby since
|
|
47
|
+
# parameters and instance variables carry no declared type).
|
|
48
|
+
# `language_specifics` is omitted when nil to reduce payload size.
|
|
49
|
+
# @return [Hash] Symbol as hash with symbol keys
|
|
50
|
+
def to_h
|
|
51
|
+
# @type var h: Hash[::Symbol, untyped]
|
|
52
|
+
h = {
|
|
53
|
+
symbol_type: symbol_type,
|
|
54
|
+
name: name,
|
|
55
|
+
line: line,
|
|
56
|
+
type: type,
|
|
57
|
+
}
|
|
58
|
+
h[:language_specifics] = language_specifics if language_specifics
|
|
59
|
+
h
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Serialize symbol to JSON.
|
|
63
|
+
# @return [String] JSON string representation
|
|
64
|
+
def to_json(_state = nil)
|
|
65
|
+
JSON.generate(to_h)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../../core/transport/http/api/endpoint'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module SymbolDatabase
|
|
7
|
+
module Transport
|
|
8
|
+
module HTTP
|
|
9
|
+
module API
|
|
10
|
+
# POST endpoint for symbol database uploads. Multipart form-data
|
|
11
|
+
# is triggered by setting `env.form` on the request (handled in
|
|
12
|
+
# `Core::Transport::HTTP::Adapters::Net`); the multipart library
|
|
13
|
+
# sets Content-Type itself.
|
|
14
|
+
class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
|
|
15
|
+
attr_reader :encoder
|
|
16
|
+
|
|
17
|
+
# @param path [String] URL path for the endpoint
|
|
18
|
+
# @param encoder [#encode] Encoder for request data
|
|
19
|
+
def initialize(path, encoder)
|
|
20
|
+
super(:post, path)
|
|
21
|
+
@encoder = encoder
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../core/encoding'
|
|
4
|
+
require_relative '../../core/transport/http'
|
|
5
|
+
require_relative 'http/endpoint'
|
|
6
|
+
require_relative '../transport'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module SymbolDatabase
|
|
10
|
+
module Transport
|
|
11
|
+
# Namespace for HTTP transport components
|
|
12
|
+
module HTTP
|
|
13
|
+
# POST endpoint for the agent's symbol database intake.
|
|
14
|
+
# Multipart form-data is dispatched via `env.form` from the
|
|
15
|
+
# `Symbols::Client` subclass.
|
|
16
|
+
SYMBOLS_ENDPOINT = API::Endpoint.new(
|
|
17
|
+
'/symdb/v1/input',
|
|
18
|
+
Datadog::Core::Encoding::JSONEncoder,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Builds a transport for the symbols upload endpoint.
|
|
22
|
+
# @param agent_settings [Core::Configuration::AgentSettingsResolver::AgentSettings]
|
|
23
|
+
# Agent connection settings (host, port, timeout, etc.)
|
|
24
|
+
# @param logger [Logger] Logger instance
|
|
25
|
+
# @param headers [Hash, nil] Optional additional headers
|
|
26
|
+
# @return [Symbols::Transport] Transport for the symbols endpoint
|
|
27
|
+
def self.symbols(
|
|
28
|
+
agent_settings:,
|
|
29
|
+
logger:,
|
|
30
|
+
headers: nil
|
|
31
|
+
)
|
|
32
|
+
Core::Transport::HTTP.build(
|
|
33
|
+
logger: logger,
|
|
34
|
+
agent_settings: agent_settings,
|
|
35
|
+
headers: headers,
|
|
36
|
+
) do |transport|
|
|
37
|
+
transport.api 'symbols', SYMBOLS_ENDPOINT, default: true
|
|
38
|
+
|
|
39
|
+
yield(transport) if block_given?
|
|
40
|
+
end.to_transport(SymbolDatabase::Transport::Symbols::Transport)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../core/transport/request'
|
|
4
|
+
require_relative '../core/transport/transport'
|
|
5
|
+
require_relative '../core/transport/http/client'
|
|
6
|
+
require_relative '../core/transport/http/env'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module SymbolDatabase
|
|
10
|
+
module Transport
|
|
11
|
+
# Transport classes for the symbols upload endpoint.
|
|
12
|
+
# Mirrors the per-purpose split used by DI (`DI::Transport::Input::*`).
|
|
13
|
+
module Symbols
|
|
14
|
+
# Request wrapper carrying the multipart form for a symbols upload.
|
|
15
|
+
class Request < Core::Transport::Request
|
|
16
|
+
attr_reader :form
|
|
17
|
+
|
|
18
|
+
# @param form [Hash] Multipart form data with UploadIO objects
|
|
19
|
+
def initialize(form)
|
|
20
|
+
@form = form
|
|
21
|
+
# Multipart upload — no parcel; the Net adapter reads form data
|
|
22
|
+
# off the env directly.
|
|
23
|
+
super(nil)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# HTTP client for symbol database uploads.
|
|
28
|
+
# Extends Core::Transport::HTTP::Client to set `env.form`, which the
|
|
29
|
+
# Net adapter (lib/datadog/core/transport/http/adapters/net.rb) detects
|
|
30
|
+
# and dispatches as multipart/form-data.
|
|
31
|
+
class Client < Core::Transport::HTTP::Client
|
|
32
|
+
# @param request [Request] Symbols upload request
|
|
33
|
+
# @return [Core::Transport::HTTP::Env] Env with form data set
|
|
34
|
+
def build_env(request)
|
|
35
|
+
Core::Transport::HTTP::Env.new(request, form: request.form)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Transport for the symbols upload endpoint.
|
|
40
|
+
class Transport < Core::Transport::Transport
|
|
41
|
+
self.http_client_class = Client
|
|
42
|
+
|
|
43
|
+
# Send a symbols upload to the agent.
|
|
44
|
+
# @param form [Hash] Multipart form data with UploadIO objects
|
|
45
|
+
# @return [Core::Transport::Response] Response from agent
|
|
46
|
+
def send_symbols(form)
|
|
47
|
+
request = Request.new(form)
|
|
48
|
+
client.send_request(:symbols, request)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'securerandom'
|
|
5
|
+
require 'zlib'
|
|
6
|
+
require 'stringio'
|
|
7
|
+
require_relative '../core/environment/identity'
|
|
8
|
+
require_relative '../core/vendor/multipart-post/multipart/post/composite_read_io'
|
|
9
|
+
require_relative '../tracing/ext'
|
|
10
|
+
require_relative 'service_version'
|
|
11
|
+
require_relative 'transport/http'
|
|
12
|
+
require_relative '../di/fatal_exceptions'
|
|
13
|
+
|
|
14
|
+
module Datadog
|
|
15
|
+
module SymbolDatabase
|
|
16
|
+
# Uploads symbol database payloads to the Datadog agent via HTTP multipart.
|
|
17
|
+
#
|
|
18
|
+
# Handles the complete upload process:
|
|
19
|
+
# 1. Wraps scopes in ServiceVersion (adds service/env/version metadata)
|
|
20
|
+
# 2. Serializes to JSON
|
|
21
|
+
# 3. Compresses with GZIP (always, ~40:1 ratio expected)
|
|
22
|
+
# 4. Builds multipart form: event.json (metadata) + symbols_{pid}.json.gz (data)
|
|
23
|
+
# 5. POSTs to agent at /symdb/v1/input via Core::Transport::HTTP
|
|
24
|
+
# No retries — single attempt. Any failure is logged at debug and discarded.
|
|
25
|
+
#
|
|
26
|
+
# Uses Core::Transport::HTTP infrastructure (consistent with DI, Profiling, DataStreams).
|
|
27
|
+
# Headers: DD-API-KEY, Datadog-Container-ID, Datadog-Entity-ID (automatic from transport)
|
|
28
|
+
#
|
|
29
|
+
# Called by: ScopeBatcher.perform_upload (when batch ready)
|
|
30
|
+
# Calls: Transport::HTTP for network, Zlib for compression
|
|
31
|
+
#
|
|
32
|
+
# @api private
|
|
33
|
+
class Uploader
|
|
34
|
+
MAX_PAYLOAD_SIZE = 50 * 1024 * 1024 # 50MB
|
|
35
|
+
|
|
36
|
+
# Initialize uploader.
|
|
37
|
+
# @param settings [Configuration::Settings] Tracer settings (for service, env, version metadata)
|
|
38
|
+
# @param agent_settings [Configuration::AgentSettings] Agent connection settings
|
|
39
|
+
# @param logger [Logger] Logger instance
|
|
40
|
+
# @param telemetry [Telemetry, nil] Optional telemetry component for error reporting
|
|
41
|
+
def initialize(settings:, agent_settings:, logger:, telemetry: nil)
|
|
42
|
+
@settings = settings
|
|
43
|
+
@agent_settings = agent_settings
|
|
44
|
+
@logger = logger
|
|
45
|
+
@telemetry = telemetry
|
|
46
|
+
|
|
47
|
+
@transport = Transport::HTTP.symbols(
|
|
48
|
+
agent_settings: agent_settings,
|
|
49
|
+
logger: @logger,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Protects the lazy initialization of @upload_pid/@upload_id and the
|
|
53
|
+
# @batch_num increment in next_upload_metadata. ScopeBatcher calls
|
|
54
|
+
# upload_scopes outside its own mutex, so two threads (e.g. a size-
|
|
55
|
+
# triggered flush and the timer/shutdown path) can race here.
|
|
56
|
+
@metadata_mutex = Mutex.new
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Upload a batch of scopes to the agent.
|
|
60
|
+
# Wraps in ServiceVersion, serializes to JSON, compresses with GZIP,
|
|
61
|
+
# builds multipart form, and POSTs to /symdb/v1/input via transport.
|
|
62
|
+
# No retries — single attempt, matching Python behavior.
|
|
63
|
+
# @param scopes [Array<Scope>] Scopes to upload
|
|
64
|
+
# @return [void]
|
|
65
|
+
def upload_scopes(scopes)
|
|
66
|
+
return if scopes.empty?
|
|
67
|
+
|
|
68
|
+
upload_id, batch_num = next_upload_metadata
|
|
69
|
+
json_data = build_symbol_payload(scopes, upload_id: upload_id, batch_num: batch_num)
|
|
70
|
+
compressed_data = Zlib.gzip(json_data)
|
|
71
|
+
|
|
72
|
+
# Emitted unconditionally so the rare oversized case is observable.
|
|
73
|
+
@telemetry&.distribution(
|
|
74
|
+
Tracing::Ext::TELEMETRY_METRICS_NAMESPACE,
|
|
75
|
+
'symbol_database.payload_size',
|
|
76
|
+
compressed_data.bytesize
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Symbols for very large applications (>50MB after gzip) are dropped:
|
|
80
|
+
# the upload is skipped and the customer sees no autocomplete /
|
|
81
|
+
# symbol probe results for those classes. Java handles the same case
|
|
82
|
+
# by splitting the payload across multiple requests; we have not
|
|
83
|
+
# implemented splitting here. Deferred for a post-MVP follow-up.
|
|
84
|
+
if compressed_data.bytesize > MAX_PAYLOAD_SIZE
|
|
85
|
+
@logger.debug { "symdb: payload too large: #{compressed_data.bytesize}/#{MAX_PAYLOAD_SIZE} bytes, skipping" }
|
|
86
|
+
return
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
perform_http_upload(compressed_data, scopes.size, upload_id: upload_id, batch_num: batch_num)
|
|
90
|
+
rescue Exception => e # standard:disable Lint/RescueException
|
|
91
|
+
Datadog::DI.reraise_if_fatal(e)
|
|
92
|
+
@logger.debug { "symdb: upload failed: #{e.class}: #{e.message}" }
|
|
93
|
+
@telemetry&.report(e, description: 'symdb: upload failed')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
# Build JSON payload from scopes.
|
|
99
|
+
# @param scopes [Array<Scope>] Scopes to serialize
|
|
100
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
101
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
102
|
+
# @return [String] JSON string
|
|
103
|
+
def build_symbol_payload(scopes, upload_id:, batch_num:)
|
|
104
|
+
ServiceVersion.new(
|
|
105
|
+
service: @settings.service,
|
|
106
|
+
env: @settings.env,
|
|
107
|
+
version: @settings.version,
|
|
108
|
+
scopes: scopes,
|
|
109
|
+
upload_id: upload_id,
|
|
110
|
+
batch_num: batch_num,
|
|
111
|
+
# Always false: the Ruby tracer continuously uploads new code
|
|
112
|
+
# as files are loaded; there is no defined end-of-upload point.
|
|
113
|
+
final: false,
|
|
114
|
+
).to_json
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Perform HTTP POST with multipart form-data via transport layer.
|
|
118
|
+
# @param compressed_data [String] GZIP compressed JSON payload
|
|
119
|
+
# @param scope_count [Integer] Number of scopes (for logging)
|
|
120
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
121
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
122
|
+
# @return [void]
|
|
123
|
+
def perform_http_upload(compressed_data, scope_count, upload_id:, batch_num:)
|
|
124
|
+
form = build_multipart_form(compressed_data, upload_id: upload_id, batch_num: batch_num)
|
|
125
|
+
response = @transport.send_symbols(form)
|
|
126
|
+
handle_response(response, scope_count)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Build multipart form-data with event metadata and compressed symbols.
|
|
130
|
+
# @param compressed_data [String] GZIP compressed JSON payload
|
|
131
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
132
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
133
|
+
# @return [Hash] Form data hash with UploadIO objects
|
|
134
|
+
def build_multipart_form(compressed_data, upload_id:, batch_num:)
|
|
135
|
+
event_io = StringIO.new(
|
|
136
|
+
build_event_metadata(compressed_data.bytesize, upload_id: upload_id, batch_num: batch_num),
|
|
137
|
+
)
|
|
138
|
+
file_io = StringIO.new(compressed_data)
|
|
139
|
+
|
|
140
|
+
event_upload = Datadog::Core::Vendor::Multipart::Post::UploadIO.new(
|
|
141
|
+
event_io,
|
|
142
|
+
'application/json',
|
|
143
|
+
'event.json',
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
file_upload = Datadog::Core::Vendor::Multipart::Post::UploadIO.new(
|
|
147
|
+
file_io,
|
|
148
|
+
'application/gzip',
|
|
149
|
+
"symbols_#{Process.pid}.json.gz",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
{
|
|
153
|
+
'event' => event_upload,
|
|
154
|
+
'file' => file_upload,
|
|
155
|
+
}
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Build event.json metadata part.
|
|
159
|
+
# @param attachment_size [Integer] Size of the compressed attachment in bytes
|
|
160
|
+
# @param upload_id [String] UUID identifying the logical upload
|
|
161
|
+
# @param batch_num [Integer] 1-indexed batch number within the upload
|
|
162
|
+
# @return [String] JSON string for event metadata
|
|
163
|
+
def build_event_metadata(attachment_size, upload_id:, batch_num:)
|
|
164
|
+
JSON.generate(
|
|
165
|
+
ddsource: 'ruby',
|
|
166
|
+
service: @settings.service,
|
|
167
|
+
version: @settings.version,
|
|
168
|
+
language: 'ruby',
|
|
169
|
+
runtimeId: Datadog::Core::Environment::Identity.id,
|
|
170
|
+
parentId: nil, # Fork tracking deferred for MVP
|
|
171
|
+
type: 'symdb',
|
|
172
|
+
uploadId: upload_id,
|
|
173
|
+
batchNum: batch_num,
|
|
174
|
+
# Always false: the Ruby tracer continuously uploads new code
|
|
175
|
+
# as files are loaded; there is no defined end-of-upload point.
|
|
176
|
+
final: false,
|
|
177
|
+
attachmentSize: attachment_size,
|
|
178
|
+
)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Return [upload_id, batch_num] for the current process. upload_id is
|
|
182
|
+
# generated lazily on first use and shared by all batches uploaded from
|
|
183
|
+
# the process. A forked child observes a different Process.pid and
|
|
184
|
+
# therefore gets a fresh upload_id and batch counter.
|
|
185
|
+
# Synchronized: ScopeBatcher releases its mutex before calling
|
|
186
|
+
# upload_scopes, so this can be entered concurrently.
|
|
187
|
+
# @return [Array<(String, Integer)>]
|
|
188
|
+
def next_upload_metadata
|
|
189
|
+
@metadata_mutex.synchronize do
|
|
190
|
+
if @upload_pid != Process.pid
|
|
191
|
+
@upload_pid = Process.pid
|
|
192
|
+
@upload_id = SecureRandom.uuid.freeze
|
|
193
|
+
@batch_num = 0
|
|
194
|
+
end
|
|
195
|
+
@batch_num += 1 # steep:ignore NoMethod
|
|
196
|
+
# @upload_id and @batch_num are non-nil after the branch above; refine for Steep.
|
|
197
|
+
upload_id = @upload_id or raise('unreachable: @upload_id should be set')
|
|
198
|
+
batch_num = @batch_num or raise('unreachable: @batch_num should be set')
|
|
199
|
+
[upload_id, batch_num]
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Handle HTTP response and track metrics.
|
|
204
|
+
# @param response [Core::Transport::Response] HTTP response from agent
|
|
205
|
+
# @param scope_count [Integer] Number of scopes uploaded
|
|
206
|
+
# @return [Boolean] true if successful, false otherwise
|
|
207
|
+
def handle_response(response, scope_count)
|
|
208
|
+
if response.internal_error?
|
|
209
|
+
@logger.debug { "symdb: upload failed: #{response.error.class}: #{response.error}" } # steep:ignore NoMethod
|
|
210
|
+
return false
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
case response.code
|
|
214
|
+
when 200..299
|
|
215
|
+
@logger.debug { "symdb: uploaded #{scope_count} scopes successfully" }
|
|
216
|
+
true
|
|
217
|
+
when 429
|
|
218
|
+
@logger.debug { "symdb: upload rejected: rate limited (429)" }
|
|
219
|
+
false
|
|
220
|
+
when 500..599
|
|
221
|
+
@logger.debug { "symdb: upload rejected: server error (#{response.code})" }
|
|
222
|
+
false
|
|
223
|
+
else
|
|
224
|
+
@logger.debug { "symdb: upload rejected: #{response.code}" }
|
|
225
|
+
false
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'ruby_version'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
# Namespace for Datadog symbol database upload.
|
|
7
|
+
#
|
|
8
|
+
# @api private
|
|
9
|
+
module SymbolDatabase
|
|
10
|
+
# Sentinel value for unknown or unavailable minimum line number.
|
|
11
|
+
#
|
|
12
|
+
# Used for:
|
|
13
|
+
# 1. start_line when exact line cannot be determined (e.g., modules without methods)
|
|
14
|
+
# 2. Symbol line numbers for FIELD, STATIC_FIELD, ARG symbols to indicate
|
|
15
|
+
# the symbol is available throughout the entire enclosing scope
|
|
16
|
+
#
|
|
17
|
+
# Backend behavior: line=0 means symbol completes in every line of the scope
|
|
18
|
+
#
|
|
19
|
+
# Reference: Symbol Database Backend RFC, section "Edge Cases"
|
|
20
|
+
# - "We use 0 for FIELD, STATIC_FIELD and ARG. It means that the symbol
|
|
21
|
+
# will be completed in every line of the enclosing scope (CLASS or METHOD)."
|
|
22
|
+
#
|
|
23
|
+
# @see https://www.postgresql.org/docs/current/datatype-numeric.html
|
|
24
|
+
UNKNOWN_MIN_LINE = 0
|
|
25
|
+
|
|
26
|
+
# Sentinel value for unknown or unavailable maximum line number.
|
|
27
|
+
#
|
|
28
|
+
# Used for:
|
|
29
|
+
# 1. end_line when exact boundaries cannot be determined (e.g., modules, classes
|
|
30
|
+
# without methods, fallback when introspection fails)
|
|
31
|
+
# 2. LOCAL symbol line numbers when exact line is unknown (future feature)
|
|
32
|
+
#
|
|
33
|
+
# Value: 2147483647 (PostgreSQL signed INT_MAX, 2^31 - 1)
|
|
34
|
+
#
|
|
35
|
+
# Backend behavior:
|
|
36
|
+
# - For scopes: indicates "entire file" or "unknown end"
|
|
37
|
+
# - For LOCAL symbols (future): included in method probe completions but excluded
|
|
38
|
+
# from line probe completions
|
|
39
|
+
#
|
|
40
|
+
# Protocol specification:
|
|
41
|
+
# - "If the symbols of the scope should be available to all lines in the
|
|
42
|
+
# source_file of the scope, use start_line = 0 and end_line = 2147483647
|
|
43
|
+
# (maximum signed integer, postgres int max)."
|
|
44
|
+
# - "For LOCAL symbols, we use 2147483647 (signed int max) to avoid completing
|
|
45
|
+
# the symbol for line probes, but keep it in the method for method probe completions."
|
|
46
|
+
#
|
|
47
|
+
# Reference: Symbol Database Backend RFC, section "Scope" and "Edge Cases"
|
|
48
|
+
# @see https://www.postgresql.org/docs/current/datatype-numeric.html
|
|
49
|
+
UNKNOWN_MAX_LINE = 2147483647
|
|
50
|
+
|
|
51
|
+
# Collapses the symbol_database.enabled tri-state setting to a boolean.
|
|
52
|
+
# An explicit true/false wins; nil (unconfigured) yields the caller-supplied
|
|
53
|
+
# fallback.
|
|
54
|
+
# @param setting_value [Boolean, nil] the symbol_database.enabled setting
|
|
55
|
+
# @param di_fallback [Boolean] value used when the setting is unconfigured
|
|
56
|
+
# @return [Boolean]
|
|
57
|
+
def self.resolve_enabled(setting_value, di_fallback)
|
|
58
|
+
setting_value.nil? ? di_fallback : setting_value
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Whether the current Ruby runtime can run symbol database extraction:
|
|
62
|
+
# MRI (CRuby) on Ruby 2.7 or later. Used by the remote-config layer to avoid
|
|
63
|
+
# advertising the product on runtimes where Component.build would return nil
|
|
64
|
+
# (e.g. Ruby 2.6, which Dynamic Instrumentation supports but Symbol Database
|
|
65
|
+
# does not).
|
|
66
|
+
# @return [Boolean]
|
|
67
|
+
def self.supported_runtime?
|
|
68
|
+
RUBY_ENGINE == 'ruby' && RubyVersion.is?('>= 2.7')
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -16,7 +16,7 @@ module Datadog
|
|
|
16
16
|
def set_measured(span_op, value = true)
|
|
17
17
|
return if span_op.nil?
|
|
18
18
|
|
|
19
|
-
value = value == true || value == 1 ? 1 : 0
|
|
19
|
+
value = (value == true || value == 1) ? 1 : 0
|
|
20
20
|
span_op.set_metric(Metadata::Ext::Analytics::TAG_MEASURED, value)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
@@ -54,9 +54,9 @@ module Datadog
|
|
|
54
54
|
@buffer_accepted_lengths += trace.length
|
|
55
55
|
|
|
56
56
|
@buffer_spans += trace.length
|
|
57
|
-
rescue
|
|
57
|
+
rescue => e
|
|
58
58
|
Datadog.logger.debug(
|
|
59
|
-
"Failed to measure queue accept. Cause: #{e.class
|
|
59
|
+
"Failed to measure queue accept. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
60
60
|
)
|
|
61
61
|
end
|
|
62
62
|
|
|
@@ -64,9 +64,9 @@ module Datadog
|
|
|
64
64
|
@buffer_dropped += 1
|
|
65
65
|
|
|
66
66
|
@buffer_spans -= trace.length
|
|
67
|
-
rescue
|
|
67
|
+
rescue => e
|
|
68
68
|
Datadog.logger.debug(
|
|
69
|
-
"Failed to measure queue drop. Cause: #{e.class
|
|
69
|
+
"Failed to measure queue drop. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
70
70
|
)
|
|
71
71
|
end
|
|
72
72
|
|
|
@@ -89,9 +89,9 @@ module Datadog
|
|
|
89
89
|
@buffer_accepted_lengths = 0
|
|
90
90
|
@buffer_dropped = 0
|
|
91
91
|
@buffer_spans = 0
|
|
92
|
-
rescue
|
|
92
|
+
rescue => e
|
|
93
93
|
Datadog.logger.debug(
|
|
94
|
-
"Failed to measure queue. Cause: #{e.class
|
|
94
|
+
"Failed to measure queue. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
|
|
95
95
|
)
|
|
96
96
|
end
|
|
97
97
|
end
|
|
@@ -121,9 +121,9 @@ module Datadog
|
|
|
121
121
|
# TODO We should restructure this module, so that classes are not declared at top-level ::Datadog.
|
|
122
122
|
# TODO Making such a change is potentially breaking for users manually configuring the tracer.
|
|
123
123
|
TraceBuffer = if Core::Environment::Ext::RUBY_ENGINE == 'ruby'
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
CRubyTraceBuffer
|
|
125
|
+
else
|
|
126
|
+
ThreadSafeTraceBuffer
|
|
127
|
+
end
|
|
128
128
|
end
|
|
129
129
|
end
|